mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05: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