rhino/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h
Go to the documentation of this file.
1 /*
2 This implements a data source that decodes Opus streams via libopus + libopusfile
3 
4 This object can be plugged into any `ma_data_source_*()` API and can also be used as a custom
5 decoding backend. See the custom_decoder example.
6 
7 You need to include this file after miniaudio.h.
8 */
9 #ifndef miniaudio_libopus_h
10 #define miniaudio_libopus_h
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 #if !defined(MA_NO_LIBOPUS)
17 #include <opusfile.h>
18 #endif
19 
20 typedef struct
21 {
22  ma_data_source_base ds; /* The libopus decoder can be used independently as a data source. */
23  ma_read_proc onRead;
24  ma_seek_proc onSeek;
25  ma_tell_proc onTell;
26  void* pReadSeekTellUserData;
27  ma_format format; /* Will be either f32 or s16. */
28 #if !defined(MA_NO_LIBOPUS)
29  OggOpusFile* of;
30 #endif
31 } ma_libopus;
32 
33 MA_API ma_result ma_libopus_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libopus* pOpus);
34 MA_API ma_result ma_libopus_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libopus* pOpus);
35 MA_API void ma_libopus_uninit(ma_libopus* pOpus, const ma_allocation_callbacks* pAllocationCallbacks);
36 MA_API ma_result ma_libopus_read_pcm_frames(ma_libopus* pOpus, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);
38 MA_API ma_result ma_libopus_get_data_format(ma_libopus* pOpus, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);
41 
42 #ifdef __cplusplus
43 }
44 #endif
45 #endif
46 
47 #if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)
48 
49 static ma_result ma_libopus_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
50 {
51  return ma_libopus_read_pcm_frames((ma_libopus*)pDataSource, pFramesOut, frameCount, pFramesRead);
52 }
53 
54 static ma_result ma_libopus_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)
55 {
56  return ma_libopus_seek_to_pcm_frame((ma_libopus*)pDataSource, frameIndex);
57 }
58 
59 static ma_result ma_libopus_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate)
60 {
61  return ma_libopus_get_data_format((ma_libopus*)pDataSource, pFormat, pChannels, pSampleRate, NULL, 0);
62 }
63 
64 static ma_result ma_libopus_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)
65 {
66  return ma_libopus_get_cursor_in_pcm_frames((ma_libopus*)pDataSource, pCursor);
67 }
68 
69 static ma_result ma_libopus_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)
70 {
71  return ma_libopus_get_length_in_pcm_frames((ma_libopus*)pDataSource, pLength);
72 }
73 
74 static ma_data_source_vtable g_ma_libopus_ds_vtable =
75 {
76  ma_libopus_ds_read,
77  ma_libopus_ds_seek,
78  NULL, /* onMap() */
79  NULL, /* onUnmap() */
80  ma_libopus_ds_get_data_format,
81  ma_libopus_ds_get_cursor,
82  ma_libopus_ds_get_length
83 };
84 
85 
86 #if !defined(MA_NO_LIBOPUS)
87 static int ma_libopus_of_callback__read(void* pUserData, unsigned char* pBufferOut, int bytesToRead)
88 {
89  ma_libopus* pOpus = (ma_libopus*)pUserData;
90  ma_result result;
91  size_t bytesRead;
92 
93  result = pOpus->onRead(pOpus->pReadSeekTellUserData, (void*)pBufferOut, bytesToRead, &bytesRead);
94 
95  if (result != MA_SUCCESS) {
96  return -1;
97  }
98 
99  return (int)bytesRead;
100 }
101 
102 static int ma_libopus_of_callback__seek(void* pUserData, ogg_int64_t offset, int whence)
103 {
104  ma_libopus* pOpus = (ma_libopus*)pUserData;
105  ma_result result;
106  ma_seek_origin origin;
107 
108  if (whence == SEEK_SET) {
109  origin = ma_seek_origin_start;
110  } else if (whence == SEEK_END) {
111  origin = ma_seek_origin_end;
112  } else {
113  origin = ma_seek_origin_current;
114  }
115 
116  result = pOpus->onSeek(pOpus->pReadSeekTellUserData, offset, origin);
117  if (result != MA_SUCCESS) {
118  return -1;
119  }
120 
121  return 0;
122 }
123 
124 static opus_int64 ma_libopus_of_callback__tell(void* pUserData)
125 {
126  ma_libopus* pOpus = (ma_libopus*)pUserData;
127  ma_result result;
128  ma_int64 cursor;
129 
130  if (pOpus->onTell == NULL) {
131  return -1;
132  }
133 
134  result = pOpus->onTell(pOpus->pReadSeekTellUserData, &cursor);
135  if (result != MA_SUCCESS) {
136  return -1;
137  }
138 
139  return cursor;
140 }
141 #endif
142 
143 static ma_result ma_libopus_init_internal(const ma_decoding_backend_config* pConfig, ma_libopus* pOpus)
144 {
145  ma_result result;
146  ma_data_source_config dataSourceConfig;
147 
148  if (pOpus == NULL) {
149  return MA_INVALID_ARGS;
150  }
151 
152  MA_ZERO_OBJECT(pOpus);
153  pOpus->format = ma_format_f32; /* f32 by default. */
154 
155  if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16)) {
156  pOpus->format = pConfig->preferredFormat;
157  } else {
158  /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */
159  }
160 
161  dataSourceConfig = ma_data_source_config_init();
162  dataSourceConfig.vtable = &g_ma_libopus_ds_vtable;
163 
164  result = ma_data_source_init(&dataSourceConfig, &pOpus->ds);
165  if (result != MA_SUCCESS) {
166  return result; /* Failed to initialize the base data source. */
167  }
168 
169  return MA_SUCCESS;
170 }
171 
172 MA_API ma_result ma_libopus_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libopus* pOpus)
173 {
174  ma_result result;
175 
176  (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory allocations in libopus. */
177 
178  result = ma_libopus_init_internal(pConfig, pOpus);
179  if (result != MA_SUCCESS) {
180  return result;
181  }
182 
183  if (onRead == NULL || onSeek == NULL) {
184  return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */
185  }
186 
187  pOpus->onRead = onRead;
188  pOpus->onSeek = onSeek;
189  pOpus->onTell = onTell;
190  pOpus->pReadSeekTellUserData = pReadSeekTellUserData;
191 
192  #if !defined(MA_NO_LIBOPUS)
193  {
194  int libopusResult;
195  OpusFileCallbacks libopusCallbacks;
196 
197  /* We can now initialize the Opus decoder. This must be done after we've set up the callbacks. */
198  libopusCallbacks.read = ma_libopus_of_callback__read;
199  libopusCallbacks.seek = ma_libopus_of_callback__seek;
200  libopusCallbacks.close = NULL;
201  libopusCallbacks.tell = ma_libopus_of_callback__tell;
202 
203  pOpus->of = op_open_callbacks(pOpus, &libopusCallbacks, NULL, 0, &libopusResult);
204  if (pOpus->of == NULL) {
205  return MA_INVALID_FILE;
206  }
207 
208  return MA_SUCCESS;
209  }
210  #else
211  {
212  /* libopus is disabled. */
213  return MA_NOT_IMPLEMENTED;
214  }
215  #endif
216 }
217 
218 MA_API ma_result ma_libopus_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libopus* pOpus)
219 {
220  ma_result result;
221 
222  (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory allocations in libopus. */
223 
224  result = ma_libopus_init_internal(pConfig, pOpus);
225  if (result != MA_SUCCESS) {
226  return result;
227  }
228 
229  #if !defined(MA_NO_LIBOPUS)
230  {
231  int libopusResult;
232 
233  pOpus->of = op_open_file(pFilePath, &libopusResult);
234  if (pOpus->of == NULL) {
235  return MA_INVALID_FILE;
236  }
237 
238  return MA_SUCCESS;
239  }
240  #else
241  {
242  /* libopus is disabled. */
243  (void)pFilePath;
244  return MA_NOT_IMPLEMENTED;
245  }
246  #endif
247 }
248 
249 MA_API void ma_libopus_uninit(ma_libopus* pOpus, const ma_allocation_callbacks* pAllocationCallbacks)
250 {
251  if (pOpus == NULL) {
252  return;
253  }
254 
255  (void)pAllocationCallbacks;
256 
257  #if !defined(MA_NO_LIBOPUS)
258  {
259  op_free(pOpus->of);
260  }
261  #else
262  {
263  /* libopus is disabled. Should never hit this since initialization would have failed. */
265  }
266  #endif
267 
268  ma_data_source_uninit(&pOpus->ds);
269 }
270 
271 MA_API ma_result ma_libopus_read_pcm_frames(ma_libopus* pOpus, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
272 {
273  if (pOpus == NULL) {
274  return MA_INVALID_ARGS;
275  }
276 
277  #if !defined(MA_NO_LIBOPUS)
278  {
279  /* We always use floating point format. */
280  ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */
281  ma_uint64 totalFramesRead;
282  ma_format format;
283  ma_uint32 channels;
284 
285  ma_libopus_get_data_format(pOpus, &format, &channels, NULL, NULL, 0);
286 
287  totalFramesRead = 0;
288  while (totalFramesRead < frameCount) {
289  long libopusResult;
290  int framesToRead;
291  ma_uint64 framesRemaining;
292 
293  framesRemaining = (frameCount - totalFramesRead);
294  framesToRead = 1024;
295  if (framesToRead > framesRemaining) {
296  framesToRead = (int)framesRemaining;
297  }
298 
299  if (format == ma_format_f32) {
300  libopusResult = op_read_float(pOpus->of, ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), framesToRead * channels, NULL);
301  } else {
302  libopusResult = op_read (pOpus->of, ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), framesToRead * channels, NULL);
303  }
304 
305  if (libopusResult < 0) {
306  result = MA_ERROR; /* Error while decoding. */
307  break;
308  } else {
309  totalFramesRead += libopusResult;
310 
311  if (libopusResult == 0) {
312  result = MA_AT_END;
313  break;
314  }
315  }
316  }
317 
318  if (pFramesRead != NULL) {
319  *pFramesRead = totalFramesRead;
320  }
321 
322  return result;
323  }
324  #else
325  {
326  /* libopus is disabled. Should never hit this since initialization would have failed. */
328 
329  (void)pFramesOut;
330  (void)frameCount;
331  (void)pFramesRead;
332 
333  return MA_NOT_IMPLEMENTED;
334  }
335  #endif
336 }
337 
339 {
340  if (pOpus == NULL) {
341  return MA_INVALID_ARGS;
342  }
343 
344  #if !defined(MA_NO_LIBOPUS)
345  {
346  int libopusResult = op_pcm_seek(pOpus->of, (ogg_int64_t)frameIndex);
347  if (libopusResult != 0) {
348  if (libopusResult == OP_ENOSEEK) {
349  return MA_INVALID_OPERATION; /* Not seekable. */
350  } else if (libopusResult == OP_EINVAL) {
351  return MA_INVALID_ARGS;
352  } else {
353  return MA_ERROR;
354  }
355  }
356 
357  return MA_SUCCESS;
358  }
359  #else
360  {
361  /* libopus is disabled. Should never hit this since initialization would have failed. */
363 
364  (void)frameIndex;
365 
366  return MA_NOT_IMPLEMENTED;
367  }
368  #endif
369 }
370 
371 MA_API ma_result ma_libopus_get_data_format(ma_libopus* pOpus, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)
372 {
373  /* Defaults for safety. */
374  if (pFormat != NULL) {
375  *pFormat = ma_format_unknown;
376  }
377  if (pChannels != NULL) {
378  *pChannels = 0;
379  }
380  if (pSampleRate != NULL) {
381  *pSampleRate = 0;
382  }
383  if (pChannelMap != NULL) {
384  MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);
385  }
386 
387  if (pOpus == NULL) {
388  return MA_INVALID_OPERATION;
389  }
390 
391  if (pFormat != NULL) {
392  *pFormat = pOpus->format;
393  }
394 
395  #if !defined(MA_NO_LIBOPUS)
396  {
397  ma_uint32 channels = op_channel_count(pOpus->of, -1);
398 
399  if (pChannels != NULL) {
400  *pChannels = channels;
401  }
402 
403  if (pSampleRate != NULL) {
404  *pSampleRate = 48000;
405  }
406 
407  if (pChannelMap != NULL) {
408  ma_get_standard_channel_map(ma_standard_channel_map_vorbis, (ma_uint32)ma_min(channels, channelMapCap), pChannelMap);
409  }
410 
411  return MA_SUCCESS;
412  }
413  #else
414  {
415  /* libopus is disabled. Should never hit this since initialization would have failed. */
417  return MA_NOT_IMPLEMENTED;
418  }
419  #endif
420 }
421 
423 {
424  if (pCursor == NULL) {
425  return MA_INVALID_ARGS;
426  }
427 
428  *pCursor = 0; /* Safety. */
429 
430  if (pOpus == NULL) {
431  return MA_INVALID_ARGS;
432  }
433 
434  #if !defined(MA_NO_LIBOPUS)
435  {
436  ogg_int64_t offset = op_pcm_tell(pOpus->of);
437  if (offset < 0) {
438  return MA_INVALID_FILE;
439  }
440 
441  *pCursor = (ma_uint64)offset;
442 
443  return MA_SUCCESS;
444  }
445  #else
446  {
447  /* libopus is disabled. Should never hit this since initialization would have failed. */
449  return MA_NOT_IMPLEMENTED;
450  }
451  #endif
452 }
453 
455 {
456  if (pLength == NULL) {
457  return MA_INVALID_ARGS;
458  }
459 
460  *pLength = 0; /* Safety. */
461 
462  if (pOpus == NULL) {
463  return MA_INVALID_ARGS;
464  }
465 
466  #if !defined(MA_NO_LIBOPUS)
467  {
468  ogg_int64_t length = op_pcm_total(pOpus->of, -1);
469  if (length < 0) {
470  return MA_ERROR;
471  }
472 
473  *pLength = (ma_uint64)length;
474 
475  return MA_SUCCESS;
476  }
477  #else
478  {
479  /* libopus is disabled. Should never hit this since initialization would have failed. */
481  return MA_NOT_IMPLEMENTED;
482  }
483  #endif
484 }
485 
486 #endif
ma_int64
int64_t ma_int64
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1504
ma_uint64
uint64_t ma_uint64
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1505
ma_data_source_uninit
MA_API void ma_data_source_uninit(ma_data_source *pDataSource)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:37255
MA_FALSE
#define MA_FALSE
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1531
ma_data_source_base
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4523
ma_libopus_get_cursor_in_pcm_frames
MA_API ma_result ma_libopus_get_cursor_in_pcm_frames(ma_libopus *pOpus, ma_uint64 *pCursor)
MA_INVALID_ARGS
#define MA_INVALID_ARGS
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1661
ma_min
#define ma_min(x, y)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:778
ma_tell_proc
ma_result(* ma_tell_proc)(void *pUserData, ma_int64 *pCursor)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4682
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
ma_libopus::onTell
ma_tell_proc onTell
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:25
ma_format_f32
@ ma_format_f32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1790
ma_libopus::pReadSeekTellUserData
void * pReadSeekTellUserData
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:26
ma_seek_origin_end
@ ma_seek_origin_end
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4640
ma_libopus_uninit
MA_API void ma_libopus_uninit(ma_libopus *pOpus, const ma_allocation_callbacks *pAllocationCallbacks)
ma_data_source
void ma_data_source
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4500
MA_INVALID_FILE
#define MA_INVALID_FILE
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1669
ma_format
ma_format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1779
MA_API
#define MA_API
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:174
ma_decoding_backend_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4715
ma_data_source_init
MA_API ma_result ma_data_source_init(const ma_data_source_config *pConfig, ma_data_source *pDataSource)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:37224
ma_allocation_callbacks
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1823
ma_seek_origin
ma_seek_origin
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5139
ma_data_source_vtable
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4502
ma_format_unknown
@ ma_format_unknown
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1785
ma_standard_channel_map_vorbis
@ ma_standard_channel_map_vorbis
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1809
ma_libopus::onRead
ma_read_proc onRead
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:23
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
ma_libopus
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:20
ma_libopus_init_file
MA_API ma_result ma_libopus_init_file(const char *pFilePath, const ma_decoding_backend_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_libopus *pOpus)
ma_format_s16
@ ma_format_s16
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1787
ma_libopus_get_length_in_pcm_frames
MA_API ma_result ma_libopus_get_length_in_pcm_frames(ma_libopus *pOpus, ma_uint64 *pLength)
ma_get_standard_channel_map
void ma_get_standard_channel_map(ma_standard_channel_map standardChannelMap, ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])
MA_INVALID_OPERATION
#define MA_INVALID_OPERATION
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1662
MA_ASSERT
#define MA_ASSERT(condition)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:770
ma_libopus::onSeek
ma_seek_proc onSeek
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:24
ma_offset_pcm_frames_ptr
MA_API void * ma_offset_pcm_frames_ptr(void *p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27802
ma_libopus_seek_to_pcm_frame
MA_API ma_result ma_libopus_seek_to_pcm_frame(ma_libopus *pOpus, ma_uint64 frameIndex)
MA_AT_END
#define MA_AT_END
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1712
ma_libopus::of
OggOpusFile * of
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:29
ma_read_proc
ma_result(* ma_read_proc)(void *pUserData, void *pBufferOut, size_t bytesToRead, size_t *pBytesRead)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4680
ma_uint32
uint32_t ma_uint32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1503
ma_seek_proc
ma_result(* ma_seek_proc)(void *pUserData, ma_int64 offset, ma_seek_origin origin)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4681
ma_libopus::format
ma_format format
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:27
ma_libopus::ds
ma_data_source_base ds
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libopus.h:22
ma_decoding_backend_config::preferredFormat
ma_format preferredFormat
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4717
ma_libopus_get_data_format
MA_API ma_result ma_libopus_get_data_format(ma_libopus *pOpus, ma_format *pFormat, ma_uint32 *pChannels, ma_uint32 *pSampleRate, ma_channel *pChannelMap, size_t channelMapCap)
MA_ERROR
#define MA_ERROR
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1660
ma_libopus_read_pcm_frames
MA_API ma_result ma_libopus_read_pcm_frames(ma_libopus *pOpus, void *pFramesOut, ma_uint64 frameCount, ma_uint64 *pFramesRead)
ma_data_source_config::vtable
const ma_data_source_vtable * vtable
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4517
MA_NOT_IMPLEMENTED
#define MA_NOT_IMPLEMENTED
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1688
ma_seek_origin_current
@ ma_seek_origin_current
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5142
ma_libopus_init
MA_API ma_result ma_libopus_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void *pReadSeekTellUserData, const ma_decoding_backend_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_libopus *pOpus)
MA_SUCCESS
#define MA_SUCCESS
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1659
ma_data_source_config_init
MA_API ma_data_source_config ma_data_source_config_init(void)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:37214
MA_ZERO_OBJECT
#define MA_ZERO_OBJECT(p)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:774
ma_data_source_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4515
ma_seek_origin_start
@ ma_seek_origin_start
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5141
ma_channel
ma_uint8 ma_channel
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1600
MA_ZERO_MEMORY
#define MA_ZERO_MEMORY(p, sz)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:746


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:50