diff --git a/Makefile b/Makefile index 573da9136..178f49b62 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ endif PREFIX ?= /usr/local -SRCS := shairport.c rtsp.c mdns.c common.c rtp.c player.c alac.c audio.c audio_dummy.c +SRCS := shairport.c rtsp.c mdns.c common.c rtp.c player.c alac.c audio.c audio_dummy.c audio_pipe.c ifdef CONFIG_AO SRCS += audio_ao.c diff --git a/audio.c b/audio.c index fbb96bd62..d0bcf9880 100644 --- a/audio.c +++ b/audio.c @@ -32,13 +32,14 @@ #ifdef CONFIG_AO extern audio_output audio_ao; #endif -extern audio_output audio_dummy; +extern audio_output audio_dummy, audio_pipe; static audio_output *outputs[] = { #ifdef CONFIG_AO &audio_ao, #endif &audio_dummy, + &audio_pipe, NULL }; diff --git a/audio_pipe.c b/audio_pipe.c new file mode 100644 index 000000000..d6e5dee22 --- /dev/null +++ b/audio_pipe.c @@ -0,0 +1,87 @@ +/* + * pipe output driver. This file is part of Shairport. + * Copyright (c) James Laird 2013 + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include "common.h" +#include "audio.h" + +int fd = -1; + +char *pipename = NULL; + +static void start(int sample_rate) { + fd = open(pipename, O_WRONLY); + if (fd < 0) { + perror("open"); + die("could not open specified pipe for writing"); + } +} + +static void play(short buf[], int samples) { + write(fd, buf, samples*4); +} + +static void stop(void) { + close(fd); +} + +static int init(int argc, char **argv) { + if (argc != 1) + die("bad argument(s) to pipe"); + + pipename = strdup(argv[0]); + + // test open pipe so we error on startup if it's going to fail + start(44100); + stop(); + + return 0; +} + +static void deinit(void) { + if (fd > 0) + close(fd); + if (pipename) + free(pipename); +} + +static void help(void) { + printf("pipe takes 1 argument: the name of the FIFO to write to.\n"); +} + +audio_output audio_pipe = { + .name = "pipe", + .help = &help, + .init = &init, + .deinit = &deinit, + .start = &start, + .stop = &stop, + .play = &play, + .volume = NULL +};