diff options
author | wm4 <wm4@nowhere> | 2015-07-03 18:07:58 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-07-03 19:28:00 +0200 |
commit | ec21be498fe8b30756949df42322333f8a60a3da (patch) | |
tree | 3892ab8d7eadc8c52681e3d1a0640dacb20a1c9d /audio/out | |
parent | 8a20e5306c2f054609a8c0cd806f1926e1b33063 (diff) | |
download | mpv-ec21be498fe8b30756949df42322333f8a60a3da.tar.bz2 mpv-ec21be498fe8b30756949df42322333f8a60a3da.tar.xz |
ao_coreaudio_exclusive: factor format selection
Diffstat (limited to 'audio/out')
-rw-r--r-- | audio/out/ao_coreaudio_exclusive.c | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/audio/out/ao_coreaudio_exclusive.c b/audio/out/ao_coreaudio_exclusive.c index 7a845ff573..4f6eae7ac6 100644 --- a/audio/out/ao_coreaudio_exclusive.c +++ b/audio/out/ao_coreaudio_exclusive.c @@ -207,6 +207,45 @@ coreaudio_error: return -1; } +static int find_best_format(struct ao *ao, AudioStreamBasicDescription *out_fmt) +{ + struct priv *p = ao->priv; + + // Build ASBD for the input format + AudioStreamBasicDescription asbd; + ca_fill_asbd(ao, &asbd); + + *out_fmt = (AudioStreamBasicDescription){0}; + + AudioStreamRangedDescription *formats; + size_t n_formats; + OSStatus err; + + err = CA_GET_ARY(p->stream, kAudioStreamPropertyAvailablePhysicalFormats, + &formats, &n_formats); + CHECK_CA_ERROR("could not get number of stream formats"); + + for (int j = 0; j < n_formats; j++) { + AudioStreamBasicDescription *stream_asbd = &formats[j].mFormat; + + ca_print_asbd(ao, "- ", stream_asbd); + + if (!out_fmt->mFormatID || ca_asbd_is_better(&asbd, out_fmt, stream_asbd)) + *out_fmt = *stream_asbd; + } + + talloc_free(formats); + + if (!out_fmt->mFormatID) { + MP_ERR(ao, "no format found\n"); + return -1; + } + + return 0; +coreaudio_error: + return -1; +} + static int init(struct ao *ao) { struct priv *p = ao->priv; @@ -226,10 +265,6 @@ static int init(struct ao *ao) goto coreaudio_error_nounlock; } - // Build ASBD for the input format - AudioStreamBasicDescription asbd; - ca_fill_asbd(ao, &asbd); - uint32_t is_alive = 1; err = CA_GET(p->device, kAudioDevicePropertyDeviceIsAlive, &is_alive); CHECK_CA_WARN("could not check whether device is alive"); @@ -246,43 +281,17 @@ static int init(struct ao *ao) if (select_stream(ao) < 0) goto coreaudio_error; - AudioStreamRangedDescription *formats; - size_t n_formats; - - err = CA_GET_ARY(p->stream, kAudioStreamPropertyAvailablePhysicalFormats, - &formats, &n_formats); - CHECK_CA_ERROR("could not get number of stream formats"); - - int req_rate_format = -1; - int max_rate_format = -1; - - for (int j = 0; j < n_formats; j++) { - if (ca_formatid_is_compressed(formats[j].mFormat.mFormatID)) { - // select the compressed format that has exactly the same - // samplerate. If an exact match cannot be found, select - // the format with highest samplerate as backup. - if (formats[j].mFormat.mSampleRate == asbd.mSampleRate) { - req_rate_format = j; - break; - } else if (max_rate_format < 0 || - formats[j].mFormat.mSampleRate > - formats[max_rate_format].mFormat.mSampleRate) - max_rate_format = j; - } - } - - if (req_rate_format >= 0) - p->stream_asbd = formats[req_rate_format].mFormat; - else - p->stream_asbd = formats[max_rate_format].mFormat; + AudioStreamBasicDescription hwfmt; + if (find_best_format(ao, &hwfmt) < 0) + goto coreaudio_error; - talloc_free(formats); + p->stream_asbd = hwfmt; err = CA_GET(p->stream, kAudioStreamPropertyPhysicalFormat, &p->original_asbd); CHECK_CA_ERROR("could not get stream's original physical format"); - if (!ca_change_physical_format_sync(ao, p->stream, p->stream_asbd)) + if (!ca_change_physical_format_sync(ao, p->stream, hwfmt)) goto coreaudio_error; err = enable_property_listener(ao, true); |