mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-22 08:14:04 +02:00
Resampling testing.
This commit is contained in:
@@ -1,11 +1,122 @@
|
||||
#define DR_FLAC_IMPLEMENTATION
|
||||
#include "../../extras/dr_flac.h" /* Enables FLAC decoding. */
|
||||
#define DR_MP3_IMPLEMENTATION
|
||||
#include "../../extras/dr_mp3.h" /* Enables MP3 decoding. */
|
||||
#define DR_WAV_IMPLEMENTATION
|
||||
#include "../../../../dr_libs/dr_wav.h"
|
||||
#include "../../extras/dr_wav.h" /* Enables WAV decoding. */
|
||||
|
||||
|
||||
#define MA_DEBUG_OUTPUT
|
||||
#define MINIAUDIO_IMPLEMENTATION
|
||||
#include "../../miniaudio.h"
|
||||
#include "../ma_resampler.h"
|
||||
|
||||
#define USE_NEW_RESAMPLER 1
|
||||
|
||||
ma_uint64 g_outputFrameCount;
|
||||
void* g_pRunningFrameData;
|
||||
|
||||
void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
|
||||
{
|
||||
ma_uint32 framesToCopy;
|
||||
|
||||
framesToCopy = frameCount;
|
||||
if (framesToCopy > (ma_uint32)g_outputFrameCount) {
|
||||
framesToCopy = (ma_uint32)g_outputFrameCount;
|
||||
}
|
||||
|
||||
MA_COPY_MEMORY(pOutput, g_pRunningFrameData, framesToCopy * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels));
|
||||
|
||||
g_pRunningFrameData = ma_offset_ptr(g_pRunningFrameData, framesToCopy * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels));
|
||||
g_outputFrameCount -= framesToCopy;
|
||||
|
||||
(void)pInput;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
ma_result result;
|
||||
ma_decoder_config decoderConfig;
|
||||
ma_uint64 inputFrameCount;
|
||||
void* pInputFrameData;
|
||||
ma_uint64 outputFrameCount = 0;
|
||||
void* pOutputFrameData = NULL;
|
||||
ma_device_config deviceConfig;
|
||||
ma_device device;
|
||||
ma_backend backend;
|
||||
|
||||
/* This example just resamples the input file to an exclusive device's native sample rate. */
|
||||
if (argc < 2) {
|
||||
printf("No input file.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
decoderConfig = ma_decoder_config_init(ma_format_f32, 1, 0);
|
||||
|
||||
result = ma_decode_file(argv[1], &decoderConfig, &inputFrameCount, &pInputFrameData);
|
||||
if (result != MA_SUCCESS) {
|
||||
return (int)result;
|
||||
}
|
||||
|
||||
backend = ma_backend_wasapi;
|
||||
|
||||
deviceConfig = ma_device_config_init(ma_device_type_playback);
|
||||
#if USE_NEW_RESAMPLER
|
||||
deviceConfig.playback.shareMode = ma_share_mode_exclusive; /* <-- We need to use exclusive mode to ensure there's no resampling going on by the OS. */
|
||||
deviceConfig.sampleRate = 0; /* <-- Always use the device's native sample rate. */
|
||||
#else
|
||||
deviceConfig.playback.shareMode = ma_share_mode_shared; /* <-- We need to use exclusive mode to ensure there's no resampling going on by the OS. */
|
||||
deviceConfig.sampleRate = decoderConfig.sampleRate;
|
||||
#endif
|
||||
deviceConfig.playback.format = decoderConfig.format;
|
||||
deviceConfig.playback.channels = decoderConfig.channels;
|
||||
deviceConfig.dataCallback = data_callback;
|
||||
deviceConfig.pUserData = NULL;
|
||||
|
||||
if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS) {
|
||||
printf("Failed to open playback device.\n");
|
||||
ma_free(pInputFrameData);
|
||||
return -3;
|
||||
}
|
||||
|
||||
#if USE_NEW_RESAMPLER
|
||||
/* Resample. */
|
||||
outputFrameCount = ma_calculate_frame_count_after_src(device.sampleRate, decoderConfig.sampleRate, inputFrameCount);
|
||||
pOutputFrameData = ma_malloc((size_t)(outputFrameCount * ma_get_bytes_per_frame(device.playback.format, device.playback.channels)));
|
||||
if (pOutputFrameData == NULL) {
|
||||
printf("Out of memory.\n");
|
||||
ma_free(pInputFrameData);
|
||||
ma_device_uninit(&device);
|
||||
}
|
||||
|
||||
ma_resample_f32(ma_resample_algorithm_sinc, device.playback.internalSampleRate, decoderConfig.sampleRate, outputFrameCount, pOutputFrameData, inputFrameCount, pInputFrameData);
|
||||
|
||||
g_pRunningFrameData = pOutputFrameData;
|
||||
g_outputFrameCount = outputFrameCount;
|
||||
#else
|
||||
g_pRunningFrameData = pInputFrameData;
|
||||
g_outputFrameCount = inputFrameCount;
|
||||
#endif
|
||||
|
||||
if (ma_device_start(&device) != MA_SUCCESS) {
|
||||
printf("Failed to start playback device.\n");
|
||||
ma_device_uninit(&device);
|
||||
ma_free(pInputFrameData);
|
||||
ma_free(pOutputFrameData);
|
||||
return -4;
|
||||
}
|
||||
|
||||
printf("Press Enter to quit...");
|
||||
getchar();
|
||||
|
||||
ma_device_uninit(&device);
|
||||
ma_free(pInputFrameData);
|
||||
ma_free(pOutputFrameData);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#define SAMPLE_RATE_IN 44100
|
||||
#define SAMPLE_RATE_OUT 44100
|
||||
#define CHANNELS 1
|
||||
@@ -71,4 +182,5 @@ int main(int argc, char** argv)
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user