mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
osx: Fix latency querying
get_latency_us() used an uninitialized variable, and an incorrect scope for some of the AudioObjectGetPropertyData() calls. As a result, audio would randomly not work at all. BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=65122
This commit is contained in:
parent
dbe7bd6677
commit
a0032eb7f9
1 changed files with 23 additions and 10 deletions
|
|
@ -183,7 +183,7 @@ static pa_usec_t get_latency_us(pa_object *o) {
|
|||
struct userdata *u;
|
||||
pa_sample_spec *ss;
|
||||
bool is_source;
|
||||
UInt32 v, total = 0;
|
||||
UInt32 v = 0, total = 0;
|
||||
UInt32 err, size = sizeof(v);
|
||||
AudioObjectPropertyAddress property_address;
|
||||
AudioObjectID stream_id;
|
||||
|
|
@ -205,26 +205,35 @@ static pa_usec_t get_latency_us(pa_object *o) {
|
|||
|
||||
pa_assert(u);
|
||||
|
||||
property_address.mScope = kAudioObjectPropertyScopeGlobal;
|
||||
property_address.mScope = is_source ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
|
||||
property_address.mElement = kAudioObjectPropertyElementMaster;
|
||||
|
||||
/* get the device latency */
|
||||
property_address.mSelector = kAudioDevicePropertyLatency;
|
||||
size = sizeof(total);
|
||||
AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &total);
|
||||
total += v;
|
||||
size = sizeof(v);
|
||||
err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &v);
|
||||
if (!err)
|
||||
total += v;
|
||||
else
|
||||
pa_log_warn("Failed to get device latency: %i", err);
|
||||
|
||||
/* the IOProc buffer size */
|
||||
property_address.mSelector = kAudioDevicePropertyBufferFrameSize;
|
||||
size = sizeof(v);
|
||||
AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &v);
|
||||
total += v;
|
||||
err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &v);
|
||||
if (!err)
|
||||
total += v;
|
||||
else
|
||||
pa_log_warn("Failed to get buffer frame size: %i", err);
|
||||
|
||||
/* IOProc safety offset - this value is the same for both directions, hence we divide it by 2 */
|
||||
property_address.mSelector = kAudioDevicePropertySafetyOffset;
|
||||
size = sizeof(v);
|
||||
AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &v);
|
||||
total += v / 2;
|
||||
err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &v);
|
||||
if (!err)
|
||||
total += v / 2;
|
||||
else
|
||||
pa_log_warn("Failed to get safety offset: %i", err);
|
||||
|
||||
/* get the stream latency.
|
||||
* FIXME: this assumes the stream latency is the same for all streams */
|
||||
|
|
@ -233,11 +242,15 @@ static pa_usec_t get_latency_us(pa_object *o) {
|
|||
err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &stream_id);
|
||||
if (!err) {
|
||||
property_address.mSelector = kAudioStreamPropertyLatency;
|
||||
property_address.mScope = kAudioObjectPropertyScopeGlobal;
|
||||
size = sizeof(v);
|
||||
err = AudioObjectGetPropertyData(stream_id, &property_address, 0, NULL, &size, &v);
|
||||
if (!err)
|
||||
total += v;
|
||||
}
|
||||
else
|
||||
pa_log_warn("Failed to get stream latency: %i", err);
|
||||
} else
|
||||
pa_log_warn("Failed to get streams: %i", err);
|
||||
|
||||
return pa_bytes_to_usec(total * pa_frame_size(ss), ss);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue