rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c
Go to the documentation of this file.
1 /*
2 USAGE: ma_test_deviceio [input/output file] [mode] [backend] [waveform] [noise]
3 
4 In playback mode the input file is optional, in which case a waveform or noise source will be used instead. For capture and loopback modes
5 it must specify an output parameter, and must be specified. In duplex mode it is optional, but if specified will be an output file that
6 will receive the captured audio.
7 
8 "mode" can be one of the following:
9  playback
10  capture
11  duplex
12  loopback
13 
14 "backend" is one of the miniaudio backends:
15  wasapi
16  dsound
17  winmm
18  coreaudio
19  sndio
20  audio4
21  oss
22  pulseaudio
23  alsa
24  jack
25  aaudio
26  opensl
27  webaudio
28  null
29 
30 "waveform" can be one of the following:
31  sine
32  square
33  triangle
34  sawtooth
35 
36 "noise" can be one of the following:
37  white
38  pink
39  brownian or brown
40 
41 If multiple backends are specified, the priority will be based on the order in which you specify them. If multiple waveform or noise types
42 are specified the last one on the command line will have priority.
43 */
44 
45 #include "../test_common/ma_test_common.c"
46 
47 typedef enum
48 {
52 } source_type;
53 
54 static struct
55 {
63  ma_bool32 hasEncoder; /* Used for duplex mode to determine whether or not audio data should be written to a file. */
64 } g_State;
65 
66 const char* get_mode_description(ma_device_type deviceType)
67 {
68  if (deviceType == ma_device_type_playback) {
69  return "Playback";
70  }
71  if (deviceType == ma_device_type_capture) {
72  return "Capture";
73  }
74  if (deviceType == ma_device_type_duplex) {
75  return "Duplex";
76  }
77  if (deviceType == ma_device_type_loopback) {
78  return "Loopback";
79  }
80 
81  /* Should never get here. */
82  return "Unknown";
83 }
84 
85 ma_bool32 try_parse_mode(const char* arg, ma_device_type* pDeviceType)
86 {
87  MA_ASSERT(arg != NULL);
88  MA_ASSERT(pDeviceType != NULL);
89 
90  if (strcmp(arg, "playback") == 0) {
91  *pDeviceType = ma_device_type_playback;
92  return MA_TRUE;
93  }
94  if (strcmp(arg, "capture") == 0) {
95  *pDeviceType = ma_device_type_capture;
96  return MA_TRUE;
97  }
98  if (strcmp(arg, "duplex") == 0) {
99  *pDeviceType = ma_device_type_duplex;
100  return MA_TRUE;
101  }
102  if (strcmp(arg, "loopback") == 0) {
103  *pDeviceType = ma_device_type_loopback;
104  return MA_TRUE;
105  }
106 
107  return MA_FALSE;
108 }
109 
110 ma_bool32 try_parse_backend(const char* arg, ma_backend* pBackends, ma_uint32 backendCap, ma_uint32* pBackendCount)
111 {
112  ma_uint32 backendCount;
113 
114  MA_ASSERT(arg != NULL);
115  MA_ASSERT(pBackends != NULL);
116  MA_ASSERT(pBackendCount != NULL);
117 
118  backendCount = *pBackendCount;
119  if (backendCount == backendCap) {
120  return MA_FALSE; /* No more room. */
121  }
122 
123  if (strcmp(arg, "wasapi") == 0) {
124  pBackends[backendCount++] = ma_backend_wasapi;
125  goto done;
126  }
127  if (strcmp(arg, "dsound") == 0) {
128  pBackends[backendCount++] = ma_backend_dsound;
129  goto done;
130  }
131  if (strcmp(arg, "winmm") == 0) {
132  pBackends[backendCount++] = ma_backend_winmm;
133  goto done;
134  }
135  if (strcmp(arg, "coreaudio") == 0) {
136  pBackends[backendCount++] = ma_backend_coreaudio;
137  goto done;
138  }
139  if (strcmp(arg, "sndio") == 0) {
140  pBackends[backendCount++] = ma_backend_sndio;
141  goto done;
142  }
143  if (strcmp(arg, "audio4") == 0) {
144  pBackends[backendCount++] = ma_backend_audio4;
145  goto done;
146  }
147  if (strcmp(arg, "oss") == 0) {
148  pBackends[backendCount++] = ma_backend_oss;
149  goto done;
150  }
151  if (strcmp(arg, "pulseaudio") == 0) {
152  pBackends[backendCount++] = ma_backend_pulseaudio;
153  goto done;
154  }
155  if (strcmp(arg, "alsa") == 0) {
156  pBackends[backendCount++] = ma_backend_alsa;
157  goto done;
158  }
159  if (strcmp(arg, "jack") == 0) {
160  pBackends[backendCount++] = ma_backend_jack;
161  goto done;
162  }
163  if (strcmp(arg, "aaudio") == 0) {
164  pBackends[backendCount++] = ma_backend_aaudio;
165  goto done;
166  }
167  if (strcmp(arg, "opensl") == 0) {
168  pBackends[backendCount++] = ma_backend_opensl;
169  goto done;
170  }
171  if (strcmp(arg, "webaudio") == 0) {
172  pBackends[backendCount++] = ma_backend_webaudio;
173  goto done;
174  }
175  if (strcmp(arg, "null") == 0) {
176  pBackends[backendCount++] = ma_backend_null;
177  goto done;
178  }
179 
180 done:
181  if (*pBackendCount < backendCount) {
182  *pBackendCount = backendCount;
183  return MA_TRUE; /* This argument was a backend. */
184  } else {
185  return MA_FALSE; /* This argument was not a backend. */
186  }
187 }
188 
189 ma_bool32 try_parse_waveform(const char* arg, ma_waveform_type* pWaveformType)
190 {
191  MA_ASSERT(arg != NULL);
192  MA_ASSERT(pWaveformType != NULL);
193 
194  if (strcmp(arg, "sine") == 0) {
195  *pWaveformType = ma_waveform_type_sine;
196  return MA_TRUE;
197  }
198  if (strcmp(arg, "square") == 0) {
199  *pWaveformType = ma_waveform_type_square;
200  return MA_TRUE;
201  }
202  if (strcmp(arg, "triangle") == 0) {
203  *pWaveformType = ma_waveform_type_triangle;
204  return MA_TRUE;
205  }
206  if (strcmp(arg, "sawtooth") == 0) {
207  *pWaveformType = ma_waveform_type_sawtooth;
208  return MA_TRUE;
209  }
210 
211  return MA_FALSE;
212 }
213 
214 ma_bool32 try_parse_noise(const char* arg, ma_noise_type* pNoiseType)
215 {
216  MA_ASSERT(arg != NULL);
217  MA_ASSERT(pNoiseType != NULL);
218 
219  if (strcmp(arg, "white") == 0) {
220  *pNoiseType = ma_noise_type_white;
221  return MA_TRUE;
222  }
223  if (strcmp(arg, "pink") == 0) {
224  *pNoiseType = ma_noise_type_pink;
225  return MA_TRUE;
226  }
227  if (strcmp(arg, "brownian") == 0 || strcmp(arg, "brown") == 0) {
228  *pNoiseType = ma_noise_type_brownian;
229  return MA_TRUE;
230  }
231 
232  return MA_FALSE;
233 }
234 
235 ma_result print_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pDeviceInfo)
236 {
237  ma_result result;
238  ma_uint32 iFormat;
239  ma_device_info detailedDeviceInfo;
240 
241  MA_ASSERT(pDeviceInfo != NULL);
242 
243 #if 1
244  result = ma_context_get_device_info(pContext, deviceType, &pDeviceInfo->id, ma_share_mode_shared, &detailedDeviceInfo);
245  if (result != MA_SUCCESS) {
246  return result;
247  }
248 #else
249  detailedDeviceInfo = *pDeviceInfo;
250 #endif
251 
252  printf("%s\n", pDeviceInfo->name);
253  printf(" Default: %s\n", (detailedDeviceInfo.isDefault) ? "Yes" : "No");
254  printf(" Min Channels: %d\n", detailedDeviceInfo.minChannels);
255  printf(" Max Channels: %d\n", detailedDeviceInfo.maxChannels);
256  printf(" Min Sample Rate: %d\n", detailedDeviceInfo.minSampleRate);
257  printf(" Max Sample Rate: %d\n", detailedDeviceInfo.maxSampleRate);
258  printf(" Format Count: %d\n", detailedDeviceInfo.formatCount);
259  for (iFormat = 0; iFormat < detailedDeviceInfo.formatCount; ++iFormat) {
260  printf(" %s\n", ma_get_format_name(detailedDeviceInfo.formats[iFormat]));
261  }
262  printf("\n");
263 
264  return MA_SUCCESS;
265 }
266 
268 {
269  ma_result result;
270  ma_device_info* pPlaybackDevices;
271  ma_uint32 playbackDeviceCount;
272  ma_device_info* pCaptureDevices;
273  ma_uint32 captureDeviceCount;
274  ma_uint32 iDevice;
275 
276  MA_ASSERT(pContext != NULL);
277 
278  result = ma_context_get_devices(pContext, &pPlaybackDevices, &playbackDeviceCount, &pCaptureDevices, &captureDeviceCount);
279  if (result != MA_SUCCESS) {
280  return result;
281  }
282 
283  printf("Playback Devices\n");
284  printf("----------------\n");
285  for (iDevice = 0; iDevice < playbackDeviceCount; iDevice += 1) {
286  printf("%d: ", iDevice);
287  print_device_info(pContext, ma_device_type_playback, &pPlaybackDevices[iDevice]);
288  }
289  printf("\n");
290 
291  printf("Capture Devices\n");
292  printf("---------------\n");
293  for (iDevice = 0; iDevice < captureDeviceCount; iDevice += 1) {
294  printf("%d: ", iDevice);
295  print_device_info(pContext, ma_device_type_capture, &pCaptureDevices[iDevice]);
296  }
297  printf("\n");
298 
299  return MA_SUCCESS;
300 }
301 
302 void on_log(ma_context* pContext, ma_device* pDevice, ma_uint32 logLevel, const char* message)
303 {
304  (void)pContext;
305  (void)pDevice;
306 
307  printf("%s: %s\n", ma_log_level_to_string(logLevel), message);
308 }
309 
310 void on_stop(ma_device* pDevice)
311 {
312  (void)pDevice;
313  printf("Stopped\n");
314 }
315 
316 void on_data(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)
317 {
318  switch (pDevice->type)
319  {
321  {
322  /* In the playback case we just read from our input source. */
323  if (g_State.sourceType == source_type_decoder) {
324  ma_decoder_read_pcm_frames(&g_State.decoder, pFramesOut, frameCount);
325  } else if (g_State.sourceType == source_type_waveform) {
326  ma_waveform_read_pcm_frames(&g_State.waveform, pFramesOut, frameCount);
327  } else if (g_State.sourceType == source_type_noise) {
328  ma_noise_read_pcm_frames(&g_State.noise, pFramesOut, frameCount);
329  }
330  } break;
331 
334  {
335  /* In the capture and loopback cases we just output straight to a file. */
336  ma_encoder_write_pcm_frames(&g_State.encoder, pFramesIn, frameCount);
337  } break;
338 
340  {
341  /* The duplex case is easy. We just move from pFramesIn to pFramesOut. */
342  MA_ASSERT(pDevice->playback.format == pDevice->capture.format);
343  MA_ASSERT(pDevice->playback.channels == pDevice->capture.channels);
344  MA_COPY_MEMORY(pFramesOut, pFramesIn, ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels) * frameCount);
345 
346  /* Also output to the encoder if necessary. */
347  if (g_State.hasEncoder) {
348  ma_encoder_write_pcm_frames(&g_State.encoder, pFramesIn, frameCount);
349  }
350  } break;
351 
352  default:
353  {
354  /* Should never hit this. */
356  } break;
357  }
358 }
359 
360 int main(int argc, char** argv)
361 {
362  int iarg;
363  ma_result result;
364  ma_backend enabledBackends[MA_BACKEND_COUNT];
365  size_t enabledBackendCount;
366  size_t iEnabledBackend;
367  ma_backend backends[MA_BACKEND_COUNT];
368  ma_uint32 backendCount = 0;
369  ma_context_config contextConfig;
371  ma_format deviceFormat = ma_format_unknown;
372  ma_uint32 deviceChannels = 0;
373  ma_uint32 deviceSampleRate = 0;
374  ma_device_config deviceConfig;
377  const char* pFilePath = NULL; /* Input or output file path, depending on the mode. */
378  ma_bool32 enumerate = MA_TRUE;
379 
380  /* Default to a sine wave if nothing is passed into the command line. */
381  waveformType = ma_waveform_type_sine;
382  g_State.sourceType = source_type_waveform;
383 
384  /* We need to iterate over the command line arguments and gather our settings. */
385  for (iarg = 1; iarg < argc; iarg += 1) {
386  /* mode */
387  if (try_parse_mode(argv[iarg], &deviceType)) {
388  continue;
389  }
390 
391  /* backend */
392  if (try_parse_backend(argv[iarg], backends, ma_countof(backends), &backendCount)) {
393  continue;
394  }
395 
396  /* waveform */
397  if (try_parse_waveform(argv[iarg], &waveformType)) {
398  g_State.sourceType = source_type_waveform;
399  continue;
400  }
401 
402  /* noise */
403  if (try_parse_noise(argv[iarg], &noiseType)) {
404  g_State.sourceType = source_type_noise;
405  continue;
406  }
407 
408  /* Getting here means the argument should be considered the input or output file. */
409  pFilePath = argv[iarg];
410  g_State.sourceType = source_type_decoder;
411  }
412 
413  /* Here we'll quickly print the available backends. */
414  printf("Enabled Backends:\n");
415  result = ma_get_enabled_backends(enabledBackends, ma_countof(enabledBackends), &enabledBackendCount);
416  if (result != MA_SUCCESS) {
417  printf("Failed to retrieve available backends.\n");
418  return -1;
419  }
420 
421  for (iEnabledBackend = 0; iEnabledBackend < enabledBackendCount; iEnabledBackend += 1) {
422  printf(" %s\n", ma_get_backend_name(enabledBackends[iEnabledBackend]));
423  }
424  printf("\n");
425 
426 
427  /* Initialize the context first. If no backends were passed into the command line we just use defaults. */
428  contextConfig = ma_context_config_init();
429  contextConfig.logCallback = on_log;
430  result = ma_context_init((backendCount == 0) ? NULL : backends, backendCount, &contextConfig, &g_State.context);
431  if (result != MA_SUCCESS) {
432  printf("Failed to initialize context.\n");
433  return -1;
434  }
435 
436  /* Here we'll print some info about what we're doing. */
437  printf("Backend: %s\n", ma_get_backend_name(g_State.context.backend));
438  printf("Mode: %s\n", get_mode_description(deviceType));
439  printf("\n");
440 
441  /* Enumerate if required. */
442  if (enumerate) {
443  enumerate_devices(&g_State.context);
444  }
445 
446  /*
447  Now that the context has been initialized we can do the device. In duplex mode we want to use the same format for both playback and capture so we don't need
448  to do any data conversion between the two.
449  */
450  if (deviceType == ma_device_type_duplex) {
451  if (deviceFormat == ma_format_unknown) {
452  deviceFormat = ma_format_f32;
453  }
454  if (deviceChannels == 0) {
455  deviceChannels = 0;
456  }
457  if (deviceSampleRate == 0) {
458  deviceSampleRate = 48000;
459  }
460  }
461 
462  deviceConfig = ma_device_config_init(deviceType);
463  deviceConfig.playback.format = deviceFormat;
464  deviceConfig.playback.channels = deviceChannels;
465  deviceConfig.capture.format = deviceFormat;
466  deviceConfig.capture.channels = deviceChannels;
467  deviceConfig.sampleRate = deviceSampleRate;
468  deviceConfig.dataCallback = on_data;
469  deviceConfig.stopCallback = on_stop;
470  result = ma_device_init(&g_State.context, &deviceConfig, &g_State.device);
471  if (result != MA_SUCCESS) {
472  printf("Failed to initialize device.\n");
473  ma_context_uninit(&g_State.context);
474  return -1;
475  }
476 
477  /* We can now initialize our input and output sources. */
478  if (deviceType == ma_device_type_playback) {
479  if (g_State.sourceType == source_type_decoder) {
480  ma_decoder_config decoderConfig;
481  decoderConfig = ma_decoder_config_init(g_State.device.playback.format, g_State.device.playback.channels, g_State.device.sampleRate);
482  result = ma_decoder_init_file(pFilePath, &decoderConfig, &g_State.decoder);
483  if (result != MA_SUCCESS) {
484  printf("Failed to open file for decoding \"%s\".\n", pFilePath);
485  ma_device_uninit(&g_State.device);
486  ma_context_uninit(&g_State.context);
487  return -1;
488  }
489  }
490 
491  if (g_State.sourceType == source_type_waveform) {
492  ma_waveform_config waveformConfig;
493  waveformConfig = ma_waveform_config_init(g_State.device.playback.format, g_State.device.playback.channels, g_State.device.sampleRate, waveformType, 0.1, 220);
494  result = ma_waveform_init(&waveformConfig, &g_State.waveform);
495  if (result != MA_SUCCESS) {
496  printf("Failed to initialize waveform.\n");
497  ma_device_uninit(&g_State.device);
498  ma_context_uninit(&g_State.context);
499  return -1;
500  }
501  }
502 
503  if (g_State.sourceType == source_type_noise) {
504  ma_noise_config noiseConfig;
505  noiseConfig = ma_noise_config_init(g_State.device.playback.format, g_State.device.playback.channels, noiseType, 0, 0.1);
506  result = ma_noise_init(&noiseConfig, &g_State.noise);
507  if (result != MA_SUCCESS) {
508  printf("Failed to initialize noise.\n");
509  ma_device_uninit(&g_State.device);
510  ma_context_uninit(&g_State.context);
511  return -1;
512  }
513  }
514  }
515 
516  if (deviceType == ma_device_type_capture || deviceType == ma_device_type_loopback || (deviceType == ma_device_type_duplex && pFilePath != NULL && pFilePath[0] != '\0')) {
517  ma_encoder_config encoderConfig;
518  encoderConfig = ma_encoder_config_init(ma_resource_format_wav, g_State.device.capture.format, g_State.device.capture.channels, g_State.device.sampleRate);
519  result = ma_encoder_init_file(pFilePath, &encoderConfig, &g_State.encoder);
520  if (result != MA_SUCCESS) {
521  printf("Failed to initialize output file for capture \"%s\".\n", pFilePath);
522  ma_device_uninit(&g_State.device);
523  ma_context_uninit(&g_State.context);
524  return -1;
525  }
526 
527  g_State.hasEncoder = MA_TRUE;
528  }
529 
530 
531  /* Print the name of the device. */
532  if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {
533  printf("Playback Device: %s\n", g_State.device.playback.name);
534  }
535  if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {
536  printf("Capture Device: %s\n", g_State.device.capture.name);
537  }
538 
539 
540  /* Everything should be initialized at this point so we can now print our configuration and start the device. */
541  result = ma_device_start(&g_State.device);
542  if (result != MA_SUCCESS) {
543  printf("Failed to start device.\n");
544  goto done;
545  }
546 
547  /* Now we just keep looping and wait for user input. */
548  for (;;) {
549  int c;
550 
551  if (ma_device_is_started(&g_State.device)) {
552  printf("Press Q to quit, P to pause.\n");
553  } else {
554  printf("Press Q to quit, P to resume.\n");
555  }
556 
557  for (;;) {
558  c = getchar();
559  if (c != '\n') {
560  break;
561  }
562  }
563 
564  if (c == 'q' || c == 'Q') {
565  break;
566  }
567  if (c == 'p' || c == 'P') {
568  if (ma_device_is_started(&g_State.device)) {
569  ma_device_stop(&g_State.device);
570  } else {
571  ma_device_start(&g_State.device);
572  }
573  }
574  }
575 
576 done:
577  ma_device_uninit(&g_State.device);
578  ma_context_uninit(&g_State.context);
579  if (g_State.sourceType == source_type_decoder) {
580  ma_decoder_uninit(&g_State.decoder);
581  }
582  if (g_State.hasEncoder) {
583  ma_encoder_uninit(&g_State.encoder);
584  }
585 
586  return 0;
587 }
ma_backend_audio4
@ ma_backend_audio4
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2800
ma_get_bytes_per_frame
static MA_INLINE ma_uint32 ma_get_bytes_per_frame(ma_format format, ma_uint32 channels)
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2673
ma_noise_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5400
ma_get_backend_name
const char * ma_get_backend_name(ma_backend backend)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:5055
MA_FALSE
#define MA_FALSE
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1531
ma_device_type_loopback
@ ma_device_type_loopback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3015
on_data
void on_data(ma_device *pDevice, void *pFramesOut, const void *pFramesIn, ma_uint32 frameCount)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:316
sourceType
source_type sourceType
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:58
print_device_info
ma_result print_device_info(ma_context *pContext, ma_device_type deviceType, const ma_device_info *pDeviceInfo)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:235
ma_device_uninit
void ma_device_uninit(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27425
ma_noise
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5412
ma_device_start
ma_result ma_device_start(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27485
ma_encoder_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5313
ma_noise_type_brownian
@ ma_noise_type_brownian
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5397
ma_backend_wasapi
@ ma_backend_wasapi
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2795
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
ma_resource_format_wav
@ ma_resource_format_wav
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5147
ma_device_type_capture
@ ma_device_type_capture
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3013
ma_decoder_uninit
ma_result ma_decoder_uninit(ma_decoder *pDecoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:44739
ma_decoder_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5170
ma_device::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3626
MA_BACKEND_COUNT
#define MA_BACKEND_COUNT
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:1661
ma_bool32
ma_uint32 ma_bool32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1529
ma_waveform_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5361
ma_countof
#define ma_countof(x)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:776
ma_format_f32
@ ma_format_f32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1790
enumerate_devices
ma_result enumerate_devices(ma_context *pContext)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:267
ma_backend_opensl
@ ma_backend_opensl
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2806
ma_decoder_config_init
ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:40646
ma_device_stop
ma_result ma_device_stop(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27544
on_stop
void on_stop(ma_device *pDevice)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:310
noise
ma_noise noise
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:60
ma_device_info::minChannels
ma_uint32 minChannels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3089
g_State
static struct @1073 g_State
ma_device_config::stopCallback
ma_stop_proc stopCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3111
ma_format
ma_format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1779
ma_device::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3625
source_type_waveform
@ source_type_waveform
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:49
ma_device_type_playback
@ ma_device_type_playback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3012
source_type_noise
@ source_type_noise
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:50
ma_device_info::minSampleRate
ma_uint32 minSampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3091
ma_device_config::dataCallback
ma_device_callback_proc dataCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3110
source_type
source_type
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:47
ma_noise_read_pcm_frames
ma_uint64 ma_noise_read_pcm_frames(ma_noise *pNoise, void *pFramesOut, ma_uint64 frameCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:46227
ma_format_unknown
@ ma_format_unknown
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1785
ma_device_info::formats
ma_format formats[ma_format_count]
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3088
ma_encoder_write_pcm_frames
ma_uint64 ma_encoder_write_pcm_frames(ma_encoder *pEncoder, const void *pFramesIn, ma_uint64 frameCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45351
try_parse_noise
ma_bool32 try_parse_noise(const char *arg, ma_noise_type *pNoiseType)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:214
ma_waveform_type_sawtooth
@ ma_waveform_type_sawtooth
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5362
source_type
source_type
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:47
ma_context_get_device_info
ma_result ma_context_get_device_info(ma_context *pContext, ma_device_type deviceType, const ma_device_id *pDeviceID, ma_share_mode shareMode, ma_device_info *pDeviceInfo)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:26916
ma_device_config::capture
struct ma_device_config::@98 capture
MA_COPY_MEMORY
#define MA_COPY_MEMORY(dst, src, sz)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:754
ma_noise_type_pink
@ ma_noise_type_pink
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5396
ma_backend_dsound
@ ma_backend_dsound
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2796
ma_context_uninit
ma_result ma_context_uninit(ma_context *pContext)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:26757
ma_device_info::maxChannels
ma_uint32 maxChannels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3090
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
ma_context_config_init
ma_context_config ma_context_config_init(void)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:26542
ma_device_info::id
ma_device_id id
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3076
ma_noise_config_init
ma_noise_config ma_noise_config_init(ma_format format, ma_uint32 channels, ma_noise_type type, ma_int32 seed, double amplitude)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45801
ma_device_info::formatCount
ma_uint32 formatCount
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3087
ma_backend_winmm
@ ma_backend_winmm
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2797
ma_waveform_init
ma_result ma_waveform_init(const ma_waveform_config *pConfig, ma_waveform *pWaveform)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45445
ma_share_mode_shared
@ ma_share_mode_shared
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3020
ma_device_info::maxSampleRate
ma_uint32 maxSampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3092
ma_backend_coreaudio
@ ma_backend_coreaudio
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2798
ma_encoder_uninit
void ma_encoder_uninit(ma_encoder *pEncoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45334
ma_waveform_type_triangle
@ ma_waveform_type_triangle
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5361
ma_encoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5324
ma_device_info
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3073
ma_noise_init
ma_result ma_noise_init(const ma_noise_config *pConfig, ma_noise *pNoise)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45865
decoder
ma_decoder decoder
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:61
hasEncoder
ma_bool32 hasEncoder
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:63
try_parse_waveform
ma_bool32 try_parse_waveform(const char *arg, ma_waveform_type *pWaveformType)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:189
ma_encoder_init_file
ma_result ma_encoder_init_file(const char *pFilePath, const ma_encoder_config *pConfig, ma_encoder *pEncoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45279
ma_encoder_config_init
ma_encoder_config ma_encoder_config_init(ma_resource_format resourceFormat, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45183
ma_decoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5193
MA_ASSERT
#define MA_ASSERT(condition)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:770
on_log
void on_log(ma_context *pContext, ma_device *pDevice, ma_uint32 logLevel, const char *message)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:302
context
ma_context context
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:56
ma_waveform_config_init
ma_waveform_config ma_waveform_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_waveform_type type, double amplitude, double frequency)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45369
try_parse_mode
ma_bool32 try_parse_mode(const char *arg, ma_device_type *pDeviceType)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:85
ma_device_info::name
char name[256]
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3077
ma_context_get_devices
ma_result ma_context_get_devices(ma_context *pContext, ma_device_info **ppPlaybackDeviceInfos, ma_uint32 *pPlaybackDeviceCount, ma_device_info **ppCaptureDeviceInfos, ma_uint32 *pCaptureDeviceCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:26866
ma_waveform_type_sine
@ ma_waveform_type_sine
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5359
ma_device_is_started
ma_bool32 ma_device_is_started(ma_device *pDevice)
ma_backend_sndio
@ ma_backend_sndio
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2799
ma_uint32
uint32_t ma_uint32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1503
device
ma_device device
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:57
ma_waveform
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5373
ma_context_config::logCallback
ma_log_proc logCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3162
ma_device_config::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3128
ma_decoder_read_pcm_frames
ma_uint64 ma_decoder_read_pcm_frames(ma_decoder *pDecoder, void *pFramesOut, ma_uint64 frameCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:44808
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
ma_backend_null
@ ma_backend_null
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2808
ma_device_config::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3129
ma_waveform_read_pcm_frames
ma_uint64 ma_waveform_read_pcm_frames(ma_waveform *pWaveform, void *pFramesOut, ma_uint64 frameCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45751
ma_waveform_type
ma_waveform_type
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5353
ma_decoder_init_file
ma_result ma_decoder_init_file(const char *pFilePath, const ma_decoder_config *pConfig, ma_decoder *pDecoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:44687
python.test_porcupine.argv
argv
Definition: test_porcupine.py:158
ma_context
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3210
ma_backend_pulseaudio
@ ma_backend_pulseaudio
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2802
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_waveform_type_square
@ ma_waveform_type_square
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5360
ma_device::capture
struct ma_device::@116 capture
waveform
ma_waveform waveform
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:59
ma_device_type
ma_device_type
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3010
get_mode_description
const char * get_mode_description(ma_device_type deviceType)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:66
MA_TRUE
#define MA_TRUE
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1530
ma_context_init
ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config *pConfig, ma_context *pContext)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:26550
source_type_decoder
@ source_type_decoder
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:51
MA_SUCCESS
#define MA_SUCCESS
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1659
ma_backend_oss
@ ma_backend_oss
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2801
ma_get_enabled_backends
MA_API ma_result ma_get_enabled_backends(ma_backend *pBackends, size_t backendCap, size_t *pBackendCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:5181
ma_backend_jack
@ ma_backend_jack
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2804
ma_backend_alsa
@ ma_backend_alsa
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2803
main
int main(int argc, char **argv)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:360
ma_log_level_to_string
const char * ma_log_level_to_string(ma_uint32 logLevel)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:1953
ma_noise_type
ma_noise_type
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5393
try_parse_backend
ma_bool32 try_parse_backend(const char *arg, ma_backend *pBackends, ma_uint32 backendCap, ma_uint32 *pBackendCount)
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:110
ma_backend
ma_backend
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2793
ma_noise_type_white
@ ma_noise_type_white
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5395
ma_device_info::isDefault
ma_bool32 isDefault
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3096
ma_backend_webaudio
@ ma_backend_webaudio
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2807
ma_device_config::playback
struct ma_device_config::@97 playback
ma_device_type_duplex
@ ma_device_type_duplex
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3014
ma_device::playback
struct ma_device::@115 playback
ma_backend_aaudio
@ ma_backend_aaudio
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2805
ma_device::type
ma_device_type type
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3587
ma_context_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3160
encoder
ma_encoder encoder
Definition: rhino/demo/c/pvrecorder/src/miniaudio/tests/test_deviceio/ma_test_deviceio.c:62
ma_get_format_name
const char * ma_get_format_name(ma_format format)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:37176


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