rhino/demo/c/dr_libs/tests/mp3/dr_mp3_playback.c
Go to the documentation of this file.
1 #include "dr_mp3_common.c"
2 
3 #define MA_NO_DECODING
4 #define MA_NO_ENCODING
5 #define MINIAUDIO_IMPLEMENTATION
6 #include "../external/miniaudio/miniaudio.h"
7 
8 void data_callback(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)
9 {
10  drmp3* pMP3;
11 
12  pMP3 = (drmp3*)pDevice->pUserData;
13  DRMP3_ASSERT(pMP3 != NULL);
14 
15  if (pDevice->playback.format == ma_format_f32) {
16  drmp3_read_pcm_frames_f32(pMP3, frameCount, pFramesOut);
17  } else if (pDevice->playback.format == ma_format_s16) {
18  drmp3_read_pcm_frames_s16(pMP3, frameCount, pFramesOut);
19  } else {
20  DRMP3_ASSERT(DRMP3_FALSE); /* Should never get here. */
21  }
22 
23  (void)pFramesIn;
24 }
25 
26 int do_decoding_validation(const char* pFilePath)
27 {
28  int result = 0;
29  drmp3 mp3Memory;
30  drmp3 mp3File;
31  size_t dataSize;
32  void* pData;
33 
34  /*
35  When opening from a memory buffer, dr_mp3 will take a different path for decoding which is optimized to reduce data movement. Since it's
36  running on a separate path, we need to ensure it's returning consistent results with the other code path which will be used when decoding
37  from a file.
38  */
39 
40  /* Initialize the memory decoder. */
41  pData = dr_open_and_read_file(pFilePath, &dataSize);
42  if (pData == NULL) {
43  printf("Failed to open file \"%s\"", pFilePath);
44  return -1;
45  }
46 
47  if (!drmp3_init_memory(&mp3Memory, pData, dataSize, NULL)) {
48  free(pData);
49  printf("Failed to init MP3 decoder \"%s\"", pFilePath);
50  return -1;
51  }
52 
53 
54  /* Initialize the file decoder. */
55  if (!drmp3_init_file(&mp3File, pFilePath, NULL)) {
56  drmp3_uninit(&mp3Memory);
57  free(pData);
58  printf("Failed to open file \"%s\"", pFilePath);
59  return -1;
60  }
61 
62  DRMP3_ASSERT(mp3Memory.channels == mp3File.channels);
63 
64 
65  /* Compare. */
66  for (;;) {
67  drmp3_uint64 iSample;
68  drmp3_uint64 pcmFrameCountMemory;
69  drmp3_uint64 pcmFrameCountFile;
70  drmp3_int16 pcmFramesMemory[4096];
71  drmp3_int16 pcmFramesFile[4096];
72 
73  pcmFrameCountMemory = drmp3_read_pcm_frames_s16(&mp3Memory, DRMP3_COUNTOF(pcmFramesMemory) / mp3Memory.channels, pcmFramesMemory);
74  pcmFrameCountFile = drmp3_read_pcm_frames_s16(&mp3File, DRMP3_COUNTOF(pcmFramesFile) / mp3File.channels, pcmFramesFile);
75 
76  /* Check the frame count first. */
77  if (pcmFrameCountMemory != pcmFrameCountFile) {
78  printf("Frame counts differ: memory = %d; file = %d\n", (int)pcmFrameCountMemory, (int)pcmFrameCountFile);
79  result = -1;
80  break;
81  }
82 
83  /* Check individual frames. */
84  DRMP3_ASSERT(pcmFrameCountMemory == pcmFrameCountFile);
85  for (iSample = 0; iSample < pcmFrameCountMemory * mp3Memory.channels; iSample += 1) {
86  if (pcmFramesMemory[iSample] != pcmFramesFile[iSample]) {
87  printf("Samples differ: memory = %d; file = %d\n", (int)pcmFramesMemory[iSample], (int)pcmFramesFile[iSample]);
88  result = -1;
89  break;
90  }
91  }
92 
93  /* We've reached the end if we didn't return any PCM frames. */
94  if (pcmFrameCountMemory == 0 || pcmFrameCountFile == 0) {
95  break;
96  }
97  }
98 
99 
100  drmp3_uninit(&mp3File);
101  drmp3_uninit(&mp3Memory);
102  free(pData);
103  return result;
104 }
105 
106 int main(int argc, char** argv)
107 {
108  drmp3 mp3;
109  ma_result resultMA;
110  ma_device_config deviceConfig;
112  const char* pInputFilePath;
113 
114  if (argc < 2) {
115  printf("No input file.\n");
116  return -1;
117  }
118 
119  pInputFilePath = argv[1];
120 
121  /* Quick validation test first. */
122  if (do_decoding_validation(pInputFilePath) != 0) {
123  return -1;
124  }
125 
126 
127  if (!drmp3_init_file(&mp3, pInputFilePath, NULL)) {
128  printf("Failed to open file \"%s\"", pInputFilePath);
129  return -1;
130  }
131 
133  deviceConfig.playback.format = ma_format_s16;
134  deviceConfig.playback.channels = mp3.channels;
135  deviceConfig.sampleRate = mp3.sampleRate;
136  deviceConfig.dataCallback = data_callback;
137  deviceConfig.pUserData = &mp3;
138  resultMA = ma_device_init(NULL, &deviceConfig, &device);
139  if (resultMA != MA_SUCCESS) {
140  drmp3_uninit(&mp3);
141  printf("Failed to initialize playback device: %s.\n", ma_result_description(resultMA));
142  return -1;
143  }
144 
145  resultMA = ma_device_start(&device);
146  if (resultMA != MA_SUCCESS) {
148  drmp3_uninit(&mp3);
149  printf("Failed to start playback device: %s.\n", ma_result_description(resultMA));
150  return -1;
151  }
152 
153  printf("Press Enter to quit...");
154  getchar();
155 
156  /* We're done. */
158  drmp3_uninit(&mp3);
159 
160  return 0;
161 }
drmp3_uninit
DRMP3_API void drmp3_uninit(drmp3 *pMP3)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:61946
drmp3::channels
drmp3_uint32 channels
Definition: porcupine/demo/c/dr_libs/dr_mp3.h:344
ma_device_uninit
void ma_device_uninit(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27425
drmp3_uint64
unsigned long long drmp3_uint64
Definition: porcupine/demo/c/dr_libs/dr_mp3.h:122
ma_device_start
ma_result ma_device_start(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27485
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
drmp3_init_memory
DRMP3_API drmp3_bool32 drmp3_init_memory(drmp3 *pMP3, const void *pData, size_t dataSize, const drmp3_allocation_callbacks *pAllocationCallbacks)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:61387
drmp3_init_file
DRMP3_API drmp3_bool32 drmp3_init_file(drmp3 *pMP3, const char *pFilePath, const drmp3_allocation_callbacks *pAllocationCallbacks)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:61917
ma_format_f32
@ ma_format_f32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1790
ma_device::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3625
ma_device_type_playback
@ ma_device_type_playback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3012
ma_device_config::dataCallback
ma_device_callback_proc dataCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3110
drmp3
Definition: porcupine/demo/c/dr_libs/dr_mp3.h:340
drmp3_read_pcm_frames_s16
DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3 *pMP3, drmp3_uint64 framesToRead, drmp3_int16 *pBufferOut)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:62070
dr_open_and_read_file
void * dr_open_and_read_file(const char *filePath, size_t *pFileSizeOut)
Definition: porcupine/demo/c/dr_libs/tests/common/dr_common.c:675
main
int main(int argc, char **argv)
Definition: rhino/demo/c/dr_libs/tests/mp3/dr_mp3_playback.c:106
device
ma_device device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:57
ma_result_description
const char * ma_result_description(ma_result result)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:37039
DRMP3_ASSERT
#define DRMP3_ASSERT(expression)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:61019
drmp3::sampleRate
drmp3_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/dr_mp3.h:345
DRMP3_COUNTOF
#define DRMP3_COUNTOF(x)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:61037
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
drmp3_int16
signed short drmp3_int16
Definition: porcupine/demo/c/dr_libs/dr_mp3.h:106
ma_format_s16
@ ma_format_s16
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1787
ma_device::pUserData
void * pUserData
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3592
dr_mp3_common.c
ma_uint32
uint32_t ma_uint32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1503
ma_device_config::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3128
ma_device_config_init
ma_device_config ma_device_config_init(ma_device_type deviceType)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27034
DRMP3_FALSE
#define DRMP3_FALSE
Definition: porcupine/demo/c/dr_libs/dr_mp3.h:135
ma_device_config::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3129
drmp3_read_pcm_frames_f32
DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3 *pMP3, drmp3_uint64 framesToRead, float *pBufferOut)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:62041
python.test_porcupine.argv
argv
Definition: test_porcupine.py:158
data_callback
void data_callback(ma_device *pDevice, void *pFramesOut, const void *pFramesIn, ma_uint32 frameCount)
Definition: rhino/demo/c/dr_libs/tests/mp3/dr_mp3_playback.c:8
ma_device_init
ma_result ma_device_init(ma_context *pContext, const ma_device_config *pConfig, ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27048
ma_device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3584
ma_device_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3100
ma_device_config::sampleRate
ma_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3103
MA_SUCCESS
#define MA_SUCCESS
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1659
do_decoding_validation
int do_decoding_validation(const char *pFilePath)
Definition: rhino/demo/c/dr_libs/tests/mp3/dr_mp3_playback.c:26
ma_device_config::playback
struct ma_device_config::@97 playback
ma_device::playback
struct ma_device::@115 playback
ma_device_config::pUserData
void * pUserData
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3112


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:13:54