72 lines
2.1 KiB
C++
Raw Permalink Normal View History

2024-05-19 07:14:35 +08:00
#define MINIAUDIO_IMPLEMENTATION
#include <miniaudio.h>
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount)
{
ma_decoder *pDecoder = (ma_decoder *)pDevice->pUserData;
if (pDecoder == NULL)
{
return;
}
ma_decoder_read_pcm_frames(pDecoder, pOutput, frameCount, NULL);
(void)pInput;
}
extern "C" __declspec(dllexport) void PlayAudioInMem_Stop(ma_decoder *decoder, ma_device *device)
{
ma_device_stop(device);
ma_device_uninit(device);
ma_decoder_uninit(decoder);
delete decoder;
delete device;
}
extern "C" __declspec(dllexport) int PlayAudioInMem(void *ptr, size_t len, float volume, ma_decoder **decoderet, ma_device **deviceret, float *duration)
{
ma_result result;
ma_decoder *decoder = new ma_decoder;
ma_device_config deviceConfig;
ma_device *device = new ma_device;
ZeroMemory(device, sizeof(ma_device));
ZeroMemory(decoder, sizeof(ma_decoder));
result = ma_decoder_init_memory(ptr, len, NULL, decoder);
if (result != MA_SUCCESS)
{
delete decoder;
delete device;
return -2;
}
deviceConfig = ma_device_config_init(ma_device_type_playback);
deviceConfig.playback.format = decoder->outputFormat;
deviceConfig.playback.channels = decoder->outputChannels;
deviceConfig.sampleRate = decoder->outputSampleRate;
deviceConfig.dataCallback = data_callback;
deviceConfig.pUserData = decoder;
if (ma_device_init(NULL, &deviceConfig, device) != MA_SUCCESS)
{
ma_decoder_uninit(decoder);
delete decoder;
delete device;
return -3;
}
ma_device_set_master_volume(device, volume);
if (ma_device_start(device) != MA_SUCCESS)
{
ma_device_uninit(device);
ma_decoder_uninit(decoder);
delete decoder;
delete device;
return -4;
}
*decoderet = decoder;
*deviceret = device;
ma_uint64 frames;
ma_decoder_get_length_in_pcm_frames(decoder, &frames);
*duration = 1.0f * frames / (decoder->outputSampleRate);
return 0;
}