mirror of https://github.com/mpv-player/mpv
ao_coreaudio_exclusive: check new format before waiting for change
It seems if the format was already set, setting the same format will not cause a property change.
This commit is contained in:
parent
4444ff48fa
commit
0ae0e90eb5
|
@ -264,29 +264,30 @@ static bool ca_change_format(struct ao *ao, AudioStreamID stream,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The AudioStreamSetProperty is not only asynchronious,
|
/* The AudioStreamSetProperty is not only asynchronous,
|
||||||
* it is also not Atomic, in its behaviour.
|
* it is also not Atomic, in its behaviour.
|
||||||
* Therefore we check 5 times before we really give up. */
|
* Therefore we check 5 times before we really give up. */
|
||||||
bool format_set = false;
|
bool format_set = false;
|
||||||
for (int i = 0; !format_set && i < 5; i++) {
|
AudioStreamBasicDescription actual_format = {0};
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
err = CA_GET(stream, kAudioStreamPropertyPhysicalFormat, &actual_format);
|
||||||
|
if (!CHECK_CA_WARN("could not retrieve physical format"))
|
||||||
|
break;
|
||||||
|
|
||||||
|
format_set = ca_asbd_equals(&change_format, &actual_format);
|
||||||
|
if (format_set)
|
||||||
|
break;
|
||||||
|
|
||||||
for (int j = 0; !atomic_load(&stream_format_changed) && j < 50; j++)
|
for (int j = 0; !atomic_load(&stream_format_changed) && j < 50; j++)
|
||||||
mp_sleep_us(10000);
|
mp_sleep_us(10000);
|
||||||
|
|
||||||
bool old = true;
|
bool old = true;
|
||||||
if (!atomic_compare_exchange_strong(&stream_format_changed, &old, false))
|
if (!atomic_compare_exchange_strong(&stream_format_changed, &old, false))
|
||||||
MP_VERBOSE(ao, "reached timeout\n");
|
MP_VERBOSE(ao, "reached timeout\n");
|
||||||
|
|
||||||
AudioStreamBasicDescription actual_format;
|
|
||||||
err = CA_GET(stream, kAudioStreamPropertyPhysicalFormat, &actual_format);
|
|
||||||
|
|
||||||
ca_print_asbd(ao, "actual format in use:", &actual_format);
|
|
||||||
if (actual_format.mSampleRate == change_format.mSampleRate &&
|
|
||||||
actual_format.mFormatID == change_format.mFormatID &&
|
|
||||||
actual_format.mFramesPerPacket == change_format.mFramesPerPacket) {
|
|
||||||
format_set = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ca_print_asbd(ao, "actual format in use:", &actual_format);
|
||||||
|
|
||||||
err = AudioObjectRemovePropertyListener(stream, &p_addr, ca_stream_listener,
|
err = AudioObjectRemovePropertyListener(stream, &p_addr, ca_stream_listener,
|
||||||
&stream_format_changed);
|
&stream_format_changed);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue