Fix pulse audio output driver in daemon mode.

libpulse was initialized before the fork. This caused calls to libpulse
made after the fork fail.
Now initialize lib pulse when we need it, after the fork.
This commit is contained in:
Paul Lietar
2013-06-11 16:47:41 +02:00
parent a69c5f20f5
commit 8045e00d4f
+22 -23
View File
@@ -33,8 +33,10 @@
#include "common.h"
#include "audio.h"
pa_simple *pa_dev = NULL;
int pa_error;
static pa_simple *pa_dev = NULL;
static int pa_error;
static const char *pa_server = NULL;
static const char *pa_sink = NULL;
static void help(void) {
printf(" -a server set the server name\n"
@@ -43,8 +45,6 @@ static void help(void) {
}
static int init(int argc, char **argv) {
const char *server = NULL;
const char *sink = NULL;
optind = 0;
// some platforms apparently require optreset = 1; - which?
@@ -53,10 +53,10 @@ static int init(int argc, char **argv) {
while ((opt = getopt(argc, argv, "a:s:")) > 0) {
switch (opt) {
case 'a':
server = optarg;
pa_server = optarg;
break;
case 's':
sink = optarg;
pa_sink = optarg;
break;
default:
help();
@@ -64,37 +64,36 @@ static int init(int argc, char **argv) {
}
}
static const pa_sample_spec ss = {
.format = PA_SAMPLE_S16LE,
.rate = 44100,
.channels = 2
};
pa_dev = pa_simple_new(server, "shairport", PA_STREAM_PLAYBACK, sink, "shairport", &ss, NULL, NULL, &pa_error);
return pa_dev ? 0 : 1;
return 0;
}
static void deinit(void) {
if (pa_dev)
pa_simple_free(pa_dev);
pa_dev = NULL;
}
static void start(int sample_rate) {
if (sample_rate != 44100)
die("unexpected sample rate!");
const pa_sample_spec ss = {
.format = PA_SAMPLE_S16LE,
.rate = sample_rate,
.channels = 2
};
pa_dev = pa_simple_new(pa_server, "shairport", PA_STREAM_PLAYBACK, pa_sink, "shairport", &ss, NULL, NULL, &pa_error);
if (!pa_dev)
die("Could not connect to pulseaudio server: %s", pa_strerror(pa_error));
}
static void play(short buf[], int samples) {
if( pa_simple_write(pa_dev, (char *)buf, (size_t)samples * 4, &pa_error) < 0 )
fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(pa_error));
warn("pa_simple_write() failed: %s\n", pa_strerror(pa_error));
}
static void stop(void) {
if (pa_simple_drain(pa_dev, &pa_error) < 0)
fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(pa_error));
warn("pa_simple_drain() failed: %s\n", pa_strerror(pa_error));
if (pa_dev)
pa_simple_free(pa_dev);
pa_dev = NULL;
}
audio_output audio_pulse = {