Don't rely on PulseAudio to wake us up using early requests

This commit is contained in:
Chris Robinson
2012-03-02 04:51:29 -08:00
parent b571926a6d
commit 2a9012c94d
+14 -54
View File
@@ -338,25 +338,13 @@ static void stream_state_callback(pa_stream *stream, void *pdata) //{{{
pa_threaded_mainloop_signal(loop, 0);
}//}}}
static void stream_signal_callback(pa_stream *stream, void *pdata) //{{{
{
ALCdevice *Device = pdata;
pulse_data *data = Device->ExtraData;
(void)stream;
pa_threaded_mainloop_signal(data->loop, 0);
}//}}}
static void stream_buffer_attr_callback(pa_stream *stream, void *pdata) //{{{
{
ALCdevice *device = pdata;
pulse_data *data = device->ExtraData;
data->attr = *pa_stream_get_buffer_attr(stream);
WARN("PulseAudio modified buffer length: minreq=%d, tlength=%d\n", data->attr.minreq, data->attr.tlength);
device->UpdateSize = data->attr.minreq / pa_frame_size(&data->spec);
device->NumUpdates = data->attr.tlength / data->attr.minreq;
TRACE("PulseAudio modified buffer length: minreq=%d, tlength=%d\n", data->attr.minreq, data->attr.tlength);
}//}}}
static void context_state_callback2(pa_context *context, void *pdata) //{{{
@@ -767,35 +755,32 @@ static void probe_devices(ALboolean capture)
}
static void stream_write_callback(pa_stream *stream, size_t len, void *pdata)
{
ALCdevice *Device = pdata;
pulse_data *data = Device->ExtraData;
(void)stream;
(void)len;
pa_threaded_mainloop_signal(data->loop, 0);
}
static ALuint PulseProc(ALvoid *param)
{
ALCdevice *Device = param;
pulse_data *data = Device->ExtraData;
ALuint buffer_size;
ALint update_size;
size_t frame_size;
size_t len;
ssize_t len;
SetRTPriority();
frame_size = pa_frame_size(&data->spec);
pa_threaded_mainloop_lock(data->loop);
frame_size = pa_frame_size(&data->spec);
update_size = Device->UpdateSize * frame_size;
buffer_size = update_size * Device->NumUpdates;
do {
len = pa_stream_writable_size(data->stream);
if(len < data->attr.minreq)
len = pa_stream_writable_size(data->stream) - data->attr.tlength +
buffer_size;
if(len < update_size)
{
pa_threaded_mainloop_wait(data->loop);
pa_threaded_mainloop_unlock(data->loop);
Sleep(1);
pa_threaded_mainloop_lock(data->loop);
continue;
}
len -= len%data->attr.minreq;
len -= len%update_size;
while(len > 0)
{
@@ -988,7 +973,6 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
if(!(device->Flags&DEVICE_FREQUENCY_REQUEST))
flags |= PA_STREAM_FIX_RATE;
flags |= PA_STREAM_EARLY_REQUESTS;
flags |= PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE;
flags |= PA_STREAM_DONT_MOVE;
@@ -1048,7 +1032,6 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
pa_threaded_mainloop_unlock(data->loop);
return ALC_FALSE;
}
pa_stream_set_state_callback(data->stream, stream_state_callback2, device);
data->spec = *(pa_stream_get_sample_spec(data->stream));
@@ -1075,28 +1058,7 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
if(pa_stream_set_buffer_attr_callback)
pa_stream_set_buffer_attr_callback(data->stream, stream_buffer_attr_callback, device);
#endif
pa_stream_set_write_callback(data->stream, stream_write_callback, device);
pa_stream_set_underflow_callback(data->stream, stream_signal_callback, device);
data->attr = *(pa_stream_get_buffer_attr(data->stream));
device->UpdateSize = data->attr.minreq / pa_frame_size(&data->spec);
device->NumUpdates = data->attr.tlength / data->attr.minreq;
if(device->NumUpdates <= 1)
{
pa_operation *o;
ERR("PulseAudio returned minreq=%d, tlength=%d; expect lag or break up\n", data->attr.minreq, data->attr.tlength);
/* Server gave a comparatively large minreq, so modify the tlength. */
device->NumUpdates = 2;
data->attr.tlength = data->attr.minreq * device->NumUpdates;
o = pa_stream_set_buffer_attr(data->stream, &data->attr,
stream_success_callback, device);
while(pa_operation_get_state(o) == PA_OPERATION_RUNNING)
pa_threaded_mainloop_wait(data->loop);
pa_operation_unref(o);
}
data->thread = StartThread(PulseProc, device);
if(!data->thread)
@@ -1105,8 +1067,6 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
if(pa_stream_set_buffer_attr_callback)
pa_stream_set_buffer_attr_callback(data->stream, NULL, NULL);
#endif
pa_stream_set_write_callback(data->stream, NULL, NULL);
pa_stream_set_underflow_callback(data->stream, NULL, NULL);
pa_stream_disconnect(data->stream);
pa_stream_unref(data->stream);
data->stream = NULL;