From ff0a53fa6f4cf6a3c2840389e88e86a83c0fdcf8 Mon Sep 17 00:00:00 2001 From: David Reid Date: Thu, 29 Feb 2024 20:45:19 +1000 Subject: [PATCH] Implement onGetEncodingFormat for libvorbis and libopus decoders. --- extras/miniaudio_libopus.h | 23 ++++++++++++++++++++++- extras/miniaudio_libvorbis.h | 23 ++++++++++++++++++++++- miniaudio.h | 3 ++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/extras/miniaudio_libopus.h b/extras/miniaudio_libopus.h index fce5fe73..c2d3c682 100644 --- a/extras/miniaudio_libopus.h +++ b/extras/miniaudio_libopus.h @@ -560,13 +560,34 @@ static void ma_decoding_backend_uninit__libopus(void* pUserData, ma_data_source* ma_free(pOpus, pAllocationCallbacks); } +static ma_encoding_format ma_decoding_backend_get_encoding_format__libopus(void* pUserData, ma_data_source* pBackend) +{ + (void)pUserData; + (void)pBackend; + + /* + When pBackend is null, return ma_encoding_format_unknown if the backend supports multiple + formats. An example might be an FFmpeg backend. If the backend only supports a single format, + like this one, return the format directly (if it's not recognized by miniaudio, return + ma_encoding_format_unknown). + + When pBackend is non-null, return the encoded format of the data source. If the format is not + recognized by miniaudio, return ma_encoding_format_unknown. + + Since this backend only operates on Opus streams, we can just return ma_encoding_format_opus + in all cases. + */ + return ma_encoding_format_opus; +} + static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_libopus = { ma_decoding_backend_init__libopus, ma_decoding_backend_init_file__libopus, NULL, /* onInitFileW() */ NULL, /* onInitMemory() */ - ma_decoding_backend_uninit__libopus + ma_decoding_backend_uninit__libopus, + ma_decoding_backend_get_encoding_format__libopus }; const ma_decoding_backend_vtable* ma_decoding_backend_libopus = &g_ma_decoding_backend_vtable_libopus; diff --git a/extras/miniaudio_libvorbis.h b/extras/miniaudio_libvorbis.h index 631afddc..2510e408 100644 --- a/extras/miniaudio_libvorbis.h +++ b/extras/miniaudio_libvorbis.h @@ -580,13 +580,34 @@ static void ma_decoding_backend_uninit__libvorbis(void* pUserData, ma_data_sourc ma_free(pVorbis, pAllocationCallbacks); } +static ma_encoding_format ma_decoding_backend_get_encoding_format__libvorbis(void* pUserData, ma_data_source* pBackend) +{ + (void)pUserData; + (void)pBackend; + + /* + When pBackend is null, return ma_encoding_format_unknown if the backend supports multiple + formats. An example might be an FFmpeg backend. If the backend only supports a single format, + like this one, return the format directly (if it's not recognized by miniaudio, return + ma_encoding_format_unknown). + + When pBackend is non-null, return the encoded format of the data source. If the format is not + recognized by miniaudio, return ma_encoding_format_unknown. + + Since this backend only operates on Vorbis streams, we can just return ma_encoding_format_vorbis + in all cases. + */ + return ma_encoding_format_vorbis; +} + static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_libvorbis = { ma_decoding_backend_init__libvorbis, ma_decoding_backend_init_file__libvorbis, NULL, /* onInitFileW() */ NULL, /* onInitMemory() */ - ma_decoding_backend_uninit__libvorbis + ma_decoding_backend_uninit__libvorbis, + ma_decoding_backend_get_encoding_format__libvorbis }; const ma_decoding_backend_vtable* ma_decoding_backend_libvorbis = &g_ma_decoding_backend_vtable_libvorbis; diff --git a/miniaudio.h b/miniaudio.h index 6b42a203..c4dbe093 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -9993,7 +9993,8 @@ typedef enum ma_encoding_format_wav, ma_encoding_format_flac, ma_encoding_format_mp3, - ma_encoding_format_vorbis + ma_encoding_format_vorbis, + ma_encoding_format_opus } ma_encoding_format; #endif