Add mal_decoder_init_file_wav/flac/vorbis/mp3().

This commit also fixes a bad bug where initialization will always fail
when initializing from memory.
This commit is contained in:
David Reid
2018-03-11 06:20:47 +10:00
parent 03ccc5b8b7
commit adeda6ea95
+67 -15
View File
@@ -1875,6 +1875,7 @@ mal_result mal_decoder_init_memory_mp3(const void* pData, size_t dataSize, const
#ifndef MAL_NO_STDIO #ifndef MAL_NO_STDIO
mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder); mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder);
mal_result mal_decoder_init_file_wav(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder);
#endif #endif
mal_result mal_decoder_uninit(mal_decoder* pDecoder); mal_result mal_decoder_uninit(mal_decoder* pDecoder);
@@ -15585,8 +15586,8 @@ mal_result mal_decoder__preinit_memory(const void* pData, size_t dataSize, const
mal_result mal_decoder_init_memory(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder) mal_result mal_decoder_init_memory(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{ {
mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder); mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return MAL_SUCCESS; return result;
} }
return mal_decoder_init(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder); return mal_decoder_init(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder);
@@ -15595,8 +15596,8 @@ mal_result mal_decoder_init_memory(const void* pData, size_t dataSize, const mal
mal_result mal_decoder_init_memory_wav(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder) mal_result mal_decoder_init_memory_wav(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{ {
mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder); mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return MAL_SUCCESS; return result;
} }
return mal_decoder_init_wav(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder); return mal_decoder_init_wav(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder);
@@ -15605,8 +15606,8 @@ mal_result mal_decoder_init_memory_wav(const void* pData, size_t dataSize, const
mal_result mal_decoder_init_memory_flac(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder) mal_result mal_decoder_init_memory_flac(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{ {
mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder); mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return MAL_SUCCESS; return result;
} }
return mal_decoder_init_flac(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder); return mal_decoder_init_flac(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder);
@@ -15615,8 +15616,8 @@ mal_result mal_decoder_init_memory_flac(const void* pData, size_t dataSize, cons
mal_result mal_decoder_init_memory_vorbis(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder) mal_result mal_decoder_init_memory_vorbis(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{ {
mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder); mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return MAL_SUCCESS; return result;
} }
return mal_decoder_init_vorbis(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder); return mal_decoder_init_vorbis(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder);
@@ -15625,8 +15626,8 @@ mal_result mal_decoder_init_memory_vorbis(const void* pData, size_t dataSize, co
mal_result mal_decoder_init_memory_mp3(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder) mal_result mal_decoder_init_memory_mp3(const void* pData, size_t dataSize, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{ {
mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder); mal_result result = mal_decoder__preinit_memory(pData, dataSize, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result != MAL_SUCCESS) {
return MAL_SUCCESS; return result;
} }
return mal_decoder_init_mp3(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder); return mal_decoder_init_mp3(mal_decoder__on_read_memory, mal_decoder__on_seek_memory, NULL, pConfig, pDecoder);
@@ -15711,7 +15712,7 @@ static mal_bool32 mal_decoder__on_seek_stdio(mal_decoder* pDecoder, int byteOffs
return fseek((FILE*)pDecoder->pUserData, byteOffset, (origin == mal_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; return fseek((FILE*)pDecoder->pUserData, byteOffset, (origin == mal_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;
} }
mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder) mal_result mal_decoder__preinit_file(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{ {
if (pDecoder == NULL) return MAL_INVALID_ARGS; if (pDecoder == NULL) return MAL_INVALID_ARGS;
mal_zero_object(pDecoder); mal_zero_object(pDecoder);
@@ -15735,9 +15736,20 @@ mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config
// We need to manually set the user data so the calls to mal_decoder__on_seek_stdio() succeed. // We need to manually set the user data so the calls to mal_decoder__on_seek_stdio() succeed.
pDecoder->pUserData = pFile; pDecoder->pUserData = pFile;
(void)pConfig;
return MAL_SUCCESS;
}
mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{
mal_result result = mal_decoder__preinit_file(pFilePath, pConfig, pDecoder); // This sets pDecoder->pUserData to a FILE*.
if (result != MAL_SUCCESS) {
return result;
}
// WAV // WAV
if (mal_path_extension_equal(pFilePath, "wav")) { if (mal_path_extension_equal(pFilePath, "wav")) {
mal_result result = mal_decoder_init_wav(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, (void*)pFile, pConfig, pDecoder); result = mal_decoder_init_wav(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result == MAL_SUCCESS) {
return MAL_SUCCESS; return MAL_SUCCESS;
} }
@@ -15747,7 +15759,7 @@ mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config
// FLAC // FLAC
if (mal_path_extension_equal(pFilePath, "flac")) { if (mal_path_extension_equal(pFilePath, "flac")) {
mal_result result = mal_decoder_init_flac(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, (void*)pFile, pConfig, pDecoder); result = mal_decoder_init_flac(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result == MAL_SUCCESS) {
return MAL_SUCCESS; return MAL_SUCCESS;
} }
@@ -15757,7 +15769,7 @@ mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config
// MP3 // MP3
if (mal_path_extension_equal(pFilePath, "mp3")) { if (mal_path_extension_equal(pFilePath, "mp3")) {
mal_result result = mal_decoder_init_mp3(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, (void*)pFile, pConfig, pDecoder); result = mal_decoder_init_mp3(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
if (result == MAL_SUCCESS) { if (result == MAL_SUCCESS) {
return MAL_SUCCESS; return MAL_SUCCESS;
} }
@@ -15766,7 +15778,47 @@ mal_result mal_decoder_init_file(const char* pFilePath, const mal_decoder_config
} }
// Trial and error. // Trial and error.
return mal_decoder_init(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, (void*)pFile, pConfig, pDecoder); return mal_decoder_init(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
}
mal_result mal_decoder_init_file_wav(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{
mal_result result = mal_decoder__preinit_file(pFilePath, pConfig, pDecoder);
if (result != MAL_SUCCESS) {
return result;
}
return mal_decoder_init_wav(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
}
mal_result mal_decoder_init_file_flac(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{
mal_result result = mal_decoder__preinit_file(pFilePath, pConfig, pDecoder);
if (result != MAL_SUCCESS) {
return result;
}
return mal_decoder_init_flac(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
}
mal_result mal_decoder_init_file_vorbis(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{
mal_result result = mal_decoder__preinit_file(pFilePath, pConfig, pDecoder);
if (result != MAL_SUCCESS) {
return result;
}
return mal_decoder_init_vorbis(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
}
mal_result mal_decoder_init_file_mp3(const char* pFilePath, const mal_decoder_config* pConfig, mal_decoder* pDecoder)
{
mal_result result = mal_decoder__preinit_file(pFilePath, pConfig, pDecoder);
if (result != MAL_SUCCESS) {
return result;
}
return mal_decoder_init_mp3(mal_decoder__on_read_stdio, mal_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);
} }
#endif #endif