From 5172328ad943d26c71dba51c3af75942b60f87d2 Mon Sep 17 00:00:00 2001 From: Palana Date: Mon, 10 Aug 2015 13:35:18 +0200 Subject: [PATCH] coreaudio-encoder: Add AudioFormat property enumeration helpers --- plugins/coreaudio-encoder/encoder.cpp | 87 +++++++++++++++++++++ plugins/coreaudio-encoder/windows-imports.h | 10 +++ 2 files changed, 97 insertions(+) diff --git a/plugins/coreaudio-encoder/encoder.cpp b/plugins/coreaudio-encoder/encoder.cpp index c33076a9a..2296b0aeb 100644 --- a/plugins/coreaudio-encoder/encoder.cpp +++ b/plugins/coreaudio-encoder/encoder.cpp @@ -1036,6 +1036,93 @@ static void aac_defaults(obs_data_t *settings) obs_data_set_default_bool(settings, "allow he-aac", true); } +template +static bool query_property_raw(DStr &log, ca_encoder *ca, + AudioFormatPropertyID property, + const char *get_property_info, const char *get_property, + AudioStreamBasicDescription &desc, Func &&func) +{ + UInt32 size = 0; + OSStatus code = AudioFormatGetPropertyInfo(property, + sizeof(AudioStreamBasicDescription), &desc, &size); + 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 = AudioFormatGetProperty(property, + sizeof(AudioStreamBasicDescription), &desc, &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_PROPERTY_NAMES(x) x, \ + "AudioFormatGetPropertyInfo(" #x ")", \ + "AudioFormatGetProperty(" #x ")" + +template +static bool enumerate_samplerates(DStr &log, ca_encoder *ca, + AudioStreamBasicDescription &desc, 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(range[i]); + }; + + return query_property_raw(log, ca, EXPAND_PROPERTY_NAMES( + kAudioFormatProperty_AvailableEncodeSampleRates), + desc, helper); +} + +#if 0 +// Unused because it returns bitrates that aren't actually usable, i.e. +// Available bitrates vs Applicable bitrates + +template +static bool enumerate_bitrates(DStr &log, ca_encoder *ca, + AudioStreamBasicDescription &desc, 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(range[i]); + }; + + return query_property_raw(log, ca, EXPAND_PROPERTY_NAMES( + kAudioFormatProperty_AvailableEncodeBitRates), + desc, helper); +} +#endif + static vector get_bitrates(DStr &log, ca_encoder *ca, Float64 samplerate) { diff --git a/plugins/coreaudio-encoder/windows-imports.h b/plugins/coreaudio-encoder/windows-imports.h index 3ca366338..37e31b167 100644 --- a/plugins/coreaudio-encoder/windows-imports.h +++ b/plugins/coreaudio-encoder/windows-imports.h @@ -362,6 +362,13 @@ typedef OSStatus (*AudioFormatGetProperty_t) ( void *outPropertyData ); +typedef OSStatus (*AudioFormatGetPropertyInfo_t) ( + AudioFormatPropertyID inPropertyID, + UInt32 inSpecifierSize, + const void *inSpecifier, + UInt32 *outPropertyDataSize +); + static AudioConverterNew_t AudioConverterNew = NULL; static AudioConverterDispose_t AudioConverterDispose = NULL; static AudioConverterReset_t AudioConverterReset = NULL; @@ -370,6 +377,7 @@ static AudioConverterGetPropertyInfo_t AudioConverterGetPropertyInfo = NULL; static AudioConverterSetProperty_t AudioConverterSetProperty = NULL; static AudioConverterFillComplexBuffer_t AudioConverterFillComplexBuffer = NULL; static AudioFormatGetProperty_t AudioFormatGetProperty = NULL; +static AudioFormatGetPropertyInfo_t AudioFormatGetPropertyInfo = NULL; static HMODULE audio_toolbox = NULL; @@ -429,6 +437,7 @@ static void unload_core_audio(void) AudioConverterSetProperty = NULL; AudioConverterFillComplexBuffer = NULL; AudioFormatGetProperty = NULL; + AudioFormatGetPropertyInfo = NULL; release_lib(); } @@ -460,6 +469,7 @@ static bool load_core_audio(void) LOAD_SYM(AudioConverterSetProperty); LOAD_SYM(AudioConverterFillComplexBuffer); LOAD_SYM(AudioFormatGetProperty); + LOAD_SYM(AudioFormatGetPropertyInfo); #undef LOAD_SYM return true;