diff options
author | Chris Robinson <[email protected]> | 2012-08-17 13:38:52 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2012-08-17 13:38:52 -0700 |
commit | ac4fc4026c3b1b0b9487216399bef04d419b04b8 (patch) | |
tree | 730148652e49723e644f7df8107c0c3be3c19821 /Alc/backends/pulseaudio.c | |
parent | 9737f683150180a5531d276959030ffa0bd35492 (diff) |
Add a device method to retrieve the active latency
This is effectively the time until the next update will be heard by the user,
or the closest approximation thereof, in nanoseconds.
Diffstat (limited to 'Alc/backends/pulseaudio.c')
-rw-r--r-- | Alc/backends/pulseaudio.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/Alc/backends/pulseaudio.c b/Alc/backends/pulseaudio.c index 2621e334..87a04946 100644 --- a/Alc/backends/pulseaudio.c +++ b/Alc/backends/pulseaudio.c @@ -66,6 +66,7 @@ MAKE_FUNC(pa_stream_is_corked); MAKE_FUNC(pa_stream_cork); MAKE_FUNC(pa_stream_is_suspended); MAKE_FUNC(pa_stream_get_device_name); +MAKE_FUNC(pa_stream_get_latency); MAKE_FUNC(pa_path_get_filename); MAKE_FUNC(pa_get_binary_name); MAKE_FUNC(pa_threaded_mainloop_free); @@ -138,6 +139,7 @@ MAKE_FUNC(pa_stream_begin_write); #define pa_stream_cork ppa_stream_cork #define pa_stream_is_suspended ppa_stream_is_suspended #define pa_stream_get_device_name ppa_stream_get_device_name +#define pa_stream_get_latency ppa_stream_get_latency #define pa_path_get_filename ppa_path_get_filename #define pa_get_binary_name ppa_get_binary_name #define pa_threaded_mainloop_free ppa_threaded_mainloop_free @@ -273,6 +275,7 @@ static ALCboolean pulse_load(void) LOAD_FUNC(pa_stream_cork); LOAD_FUNC(pa_stream_is_suspended); LOAD_FUNC(pa_stream_get_device_name); + LOAD_FUNC(pa_stream_get_latency); LOAD_FUNC(pa_path_get_filename); LOAD_FUNC(pa_get_binary_name); LOAD_FUNC(pa_threaded_mainloop_free); @@ -1375,6 +1378,23 @@ static ALCuint pulse_available_samples(ALCdevice *device) } +static ALint64 pulse_get_latency(ALCdevice *device) +{ + pulse_data *data = device->ExtraData; + pa_usec_t latency = 0; + int neg; + + if(pa_stream_get_latency(data->stream, &latency, &neg) == 0) + { + if(neg) + latency = 0; + return (ALint64)minu64(latency, (((ALuint64)0x7fffffff << 32)|0xffffffff)/1000) * 1000; + } + ERR("Failed to get stream latency!\n"); + return 0; +} + + static const BackendFuncs pulse_funcs = { pulse_open_playback, pulse_close_playback, @@ -1386,7 +1406,8 @@ static const BackendFuncs pulse_funcs = { pulse_start_capture, pulse_stop_capture, pulse_capture_samples, - pulse_available_samples + pulse_available_samples, + pulse_get_latency }; ALCboolean alc_pulse_init(BackendFuncs *func_list) |