From 666f39c93fb492f8a063c5cdb18e3c53d26cad49 Mon Sep 17 00:00:00 2001 From: David Reid Date: Mon, 10 Dec 2018 20:56:30 +1000 Subject: [PATCH] Initial work on a basic test program for the resampler. This test will be replaced later with something better. --- research/tests/mal_resampler_test_0.c | 66 +++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/research/tests/mal_resampler_test_0.c b/research/tests/mal_resampler_test_0.c index 8b1cc2a4..765bf18a 100644 --- a/research/tests/mal_resampler_test_0.c +++ b/research/tests/mal_resampler_test_0.c @@ -1,14 +1,74 @@ +#define DR_WAV_IMPLEMENTATION +#include "../../../../dr_libs/dr_wav.h" + #define MAL_DEBUG_OUTPUT #define MINI_AL_IMPLEMENTATION #include "../../mini_al.h" #include "../mal_resampler.h" +#define SAMPLE_RATE_IN 44100 +#define SAMPLE_RATE_OUT 44100 +#define CHANNELS 1 +#define OUTPUT_FILE "output.wav" + +mal_sine_wave sineWave; + +mal_uint32 on_read(mal_resampler* pResampler, mal_uint32 frameCount, void** ppFramesOut) +{ + mal_assert(pResampler->config.format == mal_format_f32); + + return (mal_uint32)mal_sine_wave_read_ex(&sineWave, frameCount, pResampler->config.channels, pResampler->config.layout, (float**)ppFramesOut); +} + int main(int argc, char** argv) { + mal_result result; + mal_resampler_config resamplerConfig; + mal_resampler resampler; + + mal_zero_object(&resamplerConfig); + resamplerConfig.format = mal_format_f32; + resamplerConfig.channels = CHANNELS; + resamplerConfig.sampleRateIn = SAMPLE_RATE_IN; + resamplerConfig.sampleRateOut = SAMPLE_RATE_OUT; + resamplerConfig.algorithm = mal_resampler_algorithm_linear; + resamplerConfig.endOfInputMode = mal_resampler_end_of_input_mode_consume; + resamplerConfig.layout = mal_stream_layout_interleaved; + resamplerConfig.onRead = on_read; + resamplerConfig.pUserData = NULL; + + result = mal_resampler_init(&resamplerConfig, &resampler); + if (result != MAL_SUCCESS) { + printf("Failed to initialize resampler.\n"); + return -1; + } + + mal_sine_wave_init(0.5, 400, resamplerConfig.sampleRateIn, &sineWave); + + + // Write to a WAV file. We'll do about 10 seconds worth, making sure we read in chunks to make sure everything is seamless. + drwav_data_format format; + format.container = drwav_container_riff; + format.format = DR_WAVE_FORMAT_IEEE_FLOAT; + format.channels = resampler.config.channels; + format.sampleRate = resampler.config.sampleRateOut; + format.bitsPerSample = 32; + drwav* pWavWriter = drwav_open_file_write(OUTPUT_FILE, &format); + + float buffer[SAMPLE_RATE_IN*CHANNELS]; + float* pBuffer = buffer; + mal_uint32 iterations = 10; + mal_uint32 framesToReadPerIteration = mal_countof(buffer)/CHANNELS; + for (mal_uint32 i = 0; i < iterations; ++i) { + mal_uint32 framesRead = (mal_uint32)mal_resampler_read(&resampler, framesToReadPerIteration, &pBuffer); + drwav_write(pWavWriter, framesRead*CHANNELS, buffer); + } + + //float** test = &buffer; + + drwav_close(pWavWriter); + (void)argc; (void)argv; - - - return 0; } \ No newline at end of file