From 9b1095feb5e051f87de6b30e74ff36e0e9b83fa5 Mon Sep 17 00:00:00 2001 From: Palana Date: Sun, 9 Aug 2015 19:23:46 +0200 Subject: [PATCH] coreaudio-encoder: Add bitrate enumeration helper with better logging --- plugins/coreaudio-encoder/encoder.cpp | 65 +++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/plugins/coreaudio-encoder/encoder.cpp b/plugins/coreaudio-encoder/encoder.cpp index 6790fef9a..7d541121c 100644 --- a/plugins/coreaudio-encoder/encoder.cpp +++ b/plugins/coreaudio-encoder/encoder.cpp @@ -332,6 +332,71 @@ static void aac_destroy(void *data) delete ca; } +template +static bool query_converter_property_raw(DStr &log, ca_encoder *ca, + AudioFormatPropertyID property, + const char *get_property_info, const char *get_property, + AudioConverterRef converter, Func &&func) +{ + UInt32 size = 0; + OSStatus code = AudioConverterGetPropertyInfo(converter, property, + &size, nullptr); + if (code) { + log_to_dstr(log, ca, "%s: %s\n", get_property_info, + osstatus_to_dstr(code)->array); + return false; + } + + if (!size) { + log_to_dstr(log, ca, "%s returned 0 size\n", get_property_info); + return false; + } + + vector buffer; + + try { + buffer.resize(size); + } catch (...) { + log_to_dstr(log, ca, "Failed to allocate %u bytes for %s\n", + static_cast(size), get_property); + return false; + } + + code = AudioConverterGetProperty(converter, property, &size, + buffer.data()); + if (code) { + log_to_dstr(log, ca, "%s: %s\n", get_property, + osstatus_to_dstr(code)->array); + return false; + } + + func(size, static_cast(buffer.data())); + + return true; +} + +#define EXPAND_CONVERTER_NAMES(x) x, \ + "AudioConverterGetPropertyInfo(" #x ")", \ + "AudioConverterGetProperty(" #x ")" + +template +static bool enumerate_bitrates(DStr &log, ca_encoder *ca, + AudioConverterRef converter, Func &&func) +{ + auto helper = [&](UInt32 size, void *data) + { + auto range = static_cast(data); + size_t num_ranges = size / sizeof(AudioValueRange); + for (size_t i = 0; i < num_ranges; i++) + func(static_cast(range[i].mMinimum), + static_cast(range[i].mMaximum)); + }; + + return query_converter_property_raw(log, ca, EXPAND_CONVERTER_NAMES( + kAudioConverterApplicableEncodeBitRates), + converter, helper); +} + typedef void (*bitrate_enumeration_func)(void *data, UInt32 min, UInt32 max); static bool enumerate_bitrates(ca_encoder *ca, AudioConverterRef converter,