From a4063aeb49b09768266e146c7b0ff03b0c6805cc Mon Sep 17 00:00:00 2001 From: David Reid Date: Sun, 25 Mar 2018 16:37:55 +1000 Subject: [PATCH] Add another test case for the format converter. --- tests/mal_test_0.c | 130 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/tests/mal_test_0.c b/tests/mal_test_0.c index 5b8236dc..7ed28c52 100644 --- a/tests/mal_test_0.c +++ b/tests/mal_test_0.c @@ -1127,6 +1127,136 @@ int do_format_converter_tests() + config.formatOut = mal_format_f32; + + // Interleaved/Interleaved f32 to f32. + { + mal_sine_wave_init(amplitude, periodsPerSecond, sampleRate, &sineWave); + result = mal_format_converter_init(&config, converter_test_interleaved_callback, &sineWave, &converter); + if (result != MAL_SUCCESS) { + printf("Failed to initialize converter.\n"); + return -1; + } + + float interleavedFrames[MAL_MAX_CHANNELS * 1024]; + mal_uint64 framesRead = mal_format_converter_read_frames(&converter, 1024, interleavedFrames); + if (framesRead != 1024) { + printf("Failed to read interleaved data from converter.\n"); + return -1; + } + + FILE* pFile = mal_fopen("res/output/converter_f32_to_f32_interleaved_interleaved__stereo_48000.raw", "wb"); + if (pFile == NULL) { + printf("Failed to open output file.\n"); + return -1; + } + + fwrite(interleavedFrames, sizeof(float), framesRead * converter.config.channels, pFile); + fclose(pFile); + } + + // Interleaved/Deinterleaved f32 to f32. + { + mal_sine_wave_init(amplitude, periodsPerSecond, sampleRate, &sineWave); + result = mal_format_converter_init(&config, converter_test_interleaved_callback, &sineWave, &converter); + if (result != MAL_SUCCESS) { + printf("Failed to initialize converter.\n"); + return -1; + } + + float separatedFrames[MAL_MAX_CHANNELS][1024]; + void* ppSeparatedFrames[MAL_MAX_CHANNELS]; + for (mal_uint32 iChannel = 0; iChannel < converter.config.channels; iChannel += 1) { + ppSeparatedFrames[iChannel] = &separatedFrames[iChannel]; + } + + mal_uint64 framesRead = mal_format_converter_read_frames_separated(&converter, 1024, ppSeparatedFrames); + if (framesRead != 1024) { + printf("Failed to read interleaved data from converter.\n"); + return -1; + } + + // Write a separate file for each channel. + for (mal_uint32 iChannel = 0; iChannel < converter.config.channels; iChannel += 1) { + char filePath[256]; + snprintf(filePath, sizeof(filePath), "res/output/converter_f32_to_f32_interleaved_deinterleaved__stereo_48000.raw.%d", iChannel); + + FILE* pFile = mal_fopen(filePath, "wb"); + if (pFile == NULL) { + printf("Failed to open output file.\n"); + return -1; + } + + fwrite(ppSeparatedFrames[iChannel], sizeof(float), framesRead, pFile); + fclose(pFile); + } + } + + // Deinterleaved/Interleaved f32 to f32. + { + mal_sine_wave_init(amplitude, periodsPerSecond, sampleRate, &sineWave); + result = mal_format_converter_init_separated(&config, converter_test_separated_callback, &sineWave, &converter); + if (result != MAL_SUCCESS) { + printf("Failed to initialize converter.\n"); + return -1; + } + + float interleavedFrames[MAL_MAX_CHANNELS * 1024]; + mal_uint64 framesRead = mal_format_converter_read_frames(&converter, 1024, interleavedFrames); + if (framesRead != 1024) { + printf("Failed to read interleaved data from converter.\n"); + return -1; + } + + FILE* pFile = mal_fopen("res/output/converter_f32_to_f32_deinterleaved_interleaved__stereo_48000.raw", "wb"); + if (pFile == NULL) { + printf("Failed to open output file.\n"); + return -1; + } + + fwrite(interleavedFrames, sizeof(float), framesRead * converter.config.channels, pFile); + fclose(pFile); + } + + // Deinterleaved/Deinterleaved f32 to f32. + { + mal_sine_wave_init(amplitude, periodsPerSecond, sampleRate, &sineWave); + result = mal_format_converter_init_separated(&config, converter_test_separated_callback, &sineWave, &converter); + if (result != MAL_SUCCESS) { + printf("Failed to initialize converter.\n"); + return -1; + } + + float separatedFrames[MAL_MAX_CHANNELS][1024]; + void* ppSeparatedFrames[MAL_MAX_CHANNELS]; + for (mal_uint32 iChannel = 0; iChannel < converter.config.channels; iChannel += 1) { + ppSeparatedFrames[iChannel] = &separatedFrames[iChannel]; + } + + mal_uint64 framesRead = mal_format_converter_read_frames_separated(&converter, 1024, ppSeparatedFrames); + if (framesRead != 1024) { + printf("Failed to read interleaved data from converter.\n"); + return -1; + } + + // Write a separate file for each channel. + for (mal_uint32 iChannel = 0; iChannel < converter.config.channels; iChannel += 1) { + char filePath[256]; + snprintf(filePath, sizeof(filePath), "res/output/converter_f32_to_f32_deinterleaved_deinterleaved__stereo_48000.raw.%d", iChannel); + + FILE* pFile = mal_fopen(filePath, "wb"); + if (pFile == NULL) { + printf("Failed to open output file.\n"); + return -1; + } + + fwrite(ppSeparatedFrames[iChannel], sizeof(float), framesRead, pFile); + fclose(pFile); + } + } + + + return 0; }