aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/pulseaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/pulseaudio.c')
-rw-r--r--Alc/pulseaudio.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/Alc/pulseaudio.c b/Alc/pulseaudio.c
index 50dec6ac..a40cfee7 100644
--- a/Alc/pulseaudio.c
+++ b/Alc/pulseaudio.c
@@ -77,7 +77,9 @@ MAKE_FUNC(pa_threaded_mainloop_accept);
MAKE_FUNC(pa_stream_set_write_callback);
MAKE_FUNC(pa_threaded_mainloop_new);
MAKE_FUNC(pa_context_connect);
+MAKE_FUNC(pa_stream_set_buffer_attr);
MAKE_FUNC(pa_stream_get_buffer_attr);
+MAKE_FUNC(pa_stream_get_sample_spec);
MAKE_FUNC(pa_stream_set_buffer_attr_callback);
MAKE_FUNC(pa_stream_set_read_callback);
MAKE_FUNC(pa_stream_set_state_callback);
@@ -86,6 +88,7 @@ MAKE_FUNC(pa_stream_disconnect);
MAKE_FUNC(pa_threaded_mainloop_lock);
MAKE_FUNC(pa_channel_map_init_auto);
MAKE_FUNC(pa_channel_map_parse);
+MAKE_FUNC(pa_operation_unref);
#undef MAKE_FUNC
#ifndef PATH_MAX
@@ -192,7 +195,9 @@ LOAD_FUNC(pa_threaded_mainloop_accept);
LOAD_FUNC(pa_stream_set_write_callback);
LOAD_FUNC(pa_threaded_mainloop_new);
LOAD_FUNC(pa_context_connect);
+LOAD_FUNC(pa_stream_set_buffer_attr);
LOAD_FUNC(pa_stream_get_buffer_attr);
+LOAD_FUNC(pa_stream_get_sample_spec);
LOAD_FUNC(pa_stream_set_buffer_attr_callback);
LOAD_FUNC(pa_stream_set_read_callback);
LOAD_FUNC(pa_stream_set_state_callback);
@@ -201,6 +206,7 @@ LOAD_FUNC(pa_stream_disconnect);
LOAD_FUNC(pa_threaded_mainloop_lock);
LOAD_FUNC(pa_channel_map_init_auto);
LOAD_FUNC(pa_channel_map_parse);
+LOAD_FUNC(pa_operation_unref);
#undef LOAD_FUNC
}
@@ -474,6 +480,7 @@ static void pulse_close_playback(ALCdevice *device) //{{{
static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
{
pulse_data *data = device->ExtraData;
+ pa_stream_flags_t flags = 0;
pa_stream_state_t state;
pa_channel_map chanmap;
@@ -522,6 +529,9 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
}
SetDefaultWFXChannelOrder(device);
+ if(*(GetConfigValue(NULL, "frequency", "")) == '\0')
+ flags |= PA_STREAM_FIX_RATE;
+
data->stream = ppa_stream_new(data->context, data->stream_name, &data->spec, &chanmap);
if(!data->stream)
{
@@ -534,7 +544,7 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
ppa_stream_set_state_callback(data->stream, stream_state_callback, device);
- if(ppa_stream_connect_playback(data->stream, NULL, &data->attr, 0, NULL, NULL) < 0)
+ if(ppa_stream_connect_playback(data->stream, NULL, &data->attr, flags, NULL, NULL) < 0)
{
AL_PRINT("Stream did not connect: %s\n",
ppa_strerror(ppa_context_errno(data->context)));
@@ -564,6 +574,23 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{
}
ppa_stream_set_state_callback(data->stream, stream_state_callback2, device);
+ data->spec = *(ppa_stream_get_sample_spec(data->stream));
+ if(device->Frequency != data->spec.rate)
+ {
+ pa_operation *o;
+
+ /* Server updated our playback rate, so modify the buffer attribs
+ * accordingly. */
+ data->attr.minreq = (data->attr.minreq/data->frame_size) *
+ data->spec.rate / device->Frequency * data->frame_size;
+ data->attr.tlength = data->attr.minreq * device->NumUpdates;
+
+ o = ppa_stream_set_buffer_attr(data->stream, &data->attr, NULL, NULL);
+ ppa_operation_unref(o);
+
+ device->Frequency = data->spec.rate;
+ }
+
stream_buffer_attr_callback(data->stream, device);
ppa_stream_set_buffer_attr_callback(data->stream, stream_buffer_attr_callback, device);