|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int pulse_open() |
|
|
|
|
|
|
|
|
static int pulse_open(const char *device) |
|
|
{ |
|
|
{ |
|
|
pa_sample_spec ss; |
|
|
pa_sample_spec ss; |
|
|
pa_operation *o = NULL; |
|
|
pa_operation *o = NULL; |
|
|
|
|
|
|
|
|
a_attr.minreq = MINREQ; |
|
|
a_attr.minreq = MINREQ; |
|
|
a_attr.fragsize = 0; |
|
|
a_attr.fragsize = 0; |
|
|
|
|
|
|
|
|
if (pa_stream_connect_playback(stream, NULL, &a_attr, (pa_stream_flags_t)(PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE), NULL, NULL) < 0) { |
|
|
|
|
|
|
|
|
if (pa_stream_connect_playback(stream, device, &a_attr, (pa_stream_flags_t)(PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE), NULL, NULL) < 0) { |
|
|
fprintf(stderr, "Failed to connect stream: %s", pa_strerror(pa_context_errno(context))); |
|
|
fprintf(stderr, "Failed to connect stream: %s", pa_strerror(pa_context_errno(context))); |
|
|
goto unlock_and_fail; |
|
|
goto unlock_and_fail; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void *wave_open(int srate, const char *device) |
|
|
void *wave_open(int srate, const char *device) |
|
|
{ |
|
|
{ |
|
|
(void)device; // unused |
|
|
|
|
|
|
|
|
|
|
|
stream = NULL; |
|
|
stream = NULL; |
|
|
wave_samplerate = srate; |
|
|
wave_samplerate = srate; |
|
|
|
|
|
|
|
|
if (pulse_open() != PULSE_OK) |
|
|
|
|
|
|
|
|
if (pulse_open(device) != PULSE_OK) |
|
|
return NULL; |
|
|
return NULL; |
|
|
|
|
|
|
|
|
return (void *)1; |
|
|
return (void *)1; |