rhino/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h
Go to the documentation of this file.
1 /*
2 This implements a data source that decodes Vorbis streams via libvorbis + libvorbisfile
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_libvorbis_h
10 #define miniaudio_libvorbis_h
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 #if !defined(MA_NO_LIBVORBIS)
17 #define OV_EXCLUDE_STATIC_CALLBACKS
18 #include <vorbis/vorbisfile.h>
19 #endif
20 
21 typedef struct
22 {
23  ma_data_source_base ds; /* The libvorbis decoder can be used independently as a data source. */
24  ma_read_proc onRead;
25  ma_seek_proc onSeek;
26  ma_tell_proc onTell;
27  void* pReadSeekTellUserData;
28  ma_format format; /* Will be either f32 or s16. */
29 #if !defined(MA_NO_LIBVORBIS)
30  OggVorbis_File vf;
31 #endif
32 } ma_libvorbis;
33 
34 MA_API ma_result ma_libvorbis_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_libvorbis* pVorbis);
35 MA_API ma_result ma_libvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis);
36 MA_API void ma_libvorbis_uninit(ma_libvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks);
37 MA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);
39 MA_API ma_result ma_libvorbis_get_data_format(ma_libvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);
42 
43 #ifdef __cplusplus
44 }
45 #endif
46 #endif
47 
48 #if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)
49 
50 static ma_result ma_libvorbis_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
51 {
52  return ma_libvorbis_read_pcm_frames((ma_libvorbis*)pDataSource, pFramesOut, frameCount, pFramesRead);
53 }
54 
55 static ma_result ma_libvorbis_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)
56 {
57  return ma_libvorbis_seek_to_pcm_frame((ma_libvorbis*)pDataSource, frameIndex);
58 }
59 
60 static ma_result ma_libvorbis_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate)
61 {
62  return ma_libvorbis_get_data_format((ma_libvorbis*)pDataSource, pFormat, pChannels, pSampleRate, NULL, 0);
63 }
64 
65 static ma_result ma_libvorbis_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)
66 {
67  return ma_libvorbis_get_cursor_in_pcm_frames((ma_libvorbis*)pDataSource, pCursor);
68 }
69 
70 static ma_result ma_libvorbis_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)
71 {
72  return ma_libvorbis_get_length_in_pcm_frames((ma_libvorbis*)pDataSource, pLength);
73 }
74 
75 static ma_data_source_vtable g_ma_libvorbis_ds_vtable =
76 {
77  ma_libvorbis_ds_read,
78  ma_libvorbis_ds_seek,
79  NULL, /* onMap() */
80  NULL, /* onUnmap() */
81  ma_libvorbis_ds_get_data_format,
82  ma_libvorbis_ds_get_cursor,
83  ma_libvorbis_ds_get_length
84 };
85 
86 
87 #if !defined(MA_NO_LIBVORBIS)
88 static size_t ma_libvorbis_vf_callback__read(void* pBufferOut, size_t size, size_t count, void* pUserData)
89 {
90  ma_libvorbis* pVorbis = (ma_libvorbis*)pUserData;
91  ma_result result;
92  size_t bytesToRead;
93  size_t bytesRead;
94 
95  bytesToRead = size * count;
96  result = pVorbis->onRead(pVorbis->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead);
97 
98  return bytesRead / size;
99 }
100 
101 static int ma_libvorbis_vf_callback__seek(void* pUserData, ogg_int64_t offset, int whence)
102 {
103  ma_libvorbis* pVorbis = (ma_libvorbis*)pUserData;
104  ma_result result;
105  ma_seek_origin origin;
106 
107  if (whence == SEEK_SET) {
108  origin = ma_seek_origin_start;
109  } else if (whence == SEEK_END) {
110  origin = ma_seek_origin_end;
111  } else {
112  origin = ma_seek_origin_current;
113  }
114 
115  result = pVorbis->onSeek(pVorbis->pReadSeekTellUserData, offset, origin);
116  if (result != MA_SUCCESS) {
117  return -1;
118  }
119 
120  return 0;
121 }
122 
123 static long ma_libvorbis_vf_callback__tell(void* pUserData)
124 {
125  ma_libvorbis* pVorbis = (ma_libvorbis*)pUserData;
126  ma_result result;
127  ma_int64 cursor;
128 
129  result = pVorbis->onTell(pVorbis->pReadSeekTellUserData, &cursor);
130  if (result != MA_SUCCESS) {
131  return -1;
132  }
133 
134  return (long)cursor;
135 }
136 #endif
137 
138 static ma_result ma_libvorbis_init_internal(const ma_decoding_backend_config* pConfig, ma_libvorbis* pVorbis)
139 {
140  ma_result result;
141  ma_data_source_config dataSourceConfig;
142 
143  if (pVorbis == NULL) {
144  return MA_INVALID_ARGS;
145  }
146 
147  MA_ZERO_OBJECT(pVorbis);
148  pVorbis->format = ma_format_f32; /* f32 by default. */
149 
150  if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16)) {
151  pVorbis->format = pConfig->preferredFormat;
152  } else {
153  /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */
154  }
155 
156  dataSourceConfig = ma_data_source_config_init();
157  dataSourceConfig.vtable = &g_ma_libvorbis_ds_vtable;
158 
159  result = ma_data_source_init(&dataSourceConfig, &pVorbis->ds);
160  if (result != MA_SUCCESS) {
161  return result; /* Failed to initialize the base data source. */
162  }
163 
164  return MA_SUCCESS;
165 }
166 
167 MA_API ma_result ma_libvorbis_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_libvorbis* pVorbis)
168 {
169  ma_result result;
170 
171  (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory allocations in libvorbis. */
172 
173  result = ma_libvorbis_init_internal(pConfig, pVorbis);
174  if (result != MA_SUCCESS) {
175  return result;
176  }
177 
178  if (onRead == NULL || onSeek == NULL) {
179  return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */
180  }
181 
182  pVorbis->onRead = onRead;
183  pVorbis->onSeek = onSeek;
184  pVorbis->onTell = onTell;
185  pVorbis->pReadSeekTellUserData = pReadSeekTellUserData;
186 
187  #if !defined(MA_NO_LIBVORBIS)
188  {
189  int libvorbisResult;
190  ov_callbacks libvorbisCallbacks;
191 
192  /* We can now initialize the vorbis decoder. This must be done after we've set up the callbacks. */
193  libvorbisCallbacks.read_func = ma_libvorbis_vf_callback__read;
194  libvorbisCallbacks.seek_func = ma_libvorbis_vf_callback__seek;
195  libvorbisCallbacks.close_func = NULL;
196  libvorbisCallbacks.tell_func = ma_libvorbis_vf_callback__tell;
197 
198  libvorbisResult = ov_open_callbacks(pVorbis, &pVorbis->vf, NULL, 0, libvorbisCallbacks);
199  if (libvorbisResult < 0) {
200  return MA_INVALID_FILE;
201  }
202 
203  return MA_SUCCESS;
204  }
205  #else
206  {
207  /* libvorbis is disabled. */
208  return MA_NOT_IMPLEMENTED;
209  }
210  #endif
211 }
212 
213 MA_API ma_result ma_libvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis)
214 {
215  ma_result result;
216 
217  (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory allocations in libvorbis. */
218 
219  result = ma_libvorbis_init_internal(pConfig, pVorbis);
220  if (result != MA_SUCCESS) {
221  return result;
222  }
223 
224  #if !defined(MA_NO_LIBVORBIS)
225  {
226  int libvorbisResult;
227 
228  libvorbisResult = ov_fopen(pFilePath, &pVorbis->vf);
229  if (libvorbisResult < 0) {
230  return MA_INVALID_FILE;
231  }
232 
233  return MA_SUCCESS;
234  }
235  #else
236  {
237  /* libvorbis is disabled. */
238  (void)pFilePath;
239  return MA_NOT_IMPLEMENTED;
240  }
241  #endif
242 }
243 
244 MA_API void ma_libvorbis_uninit(ma_libvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks)
245 {
246  if (pVorbis == NULL) {
247  return;
248  }
249 
250  (void)pAllocationCallbacks;
251 
252  #if !defined(MA_NO_LIBVORBIS)
253  {
254  ov_clear(&pVorbis->vf);
255  }
256  #else
257  {
258  /* libvorbis is disabled. Should never hit this since initialization would have failed. */
260  }
261  #endif
262 
263  ma_data_source_uninit(&pVorbis->ds);
264 }
265 
266 MA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
267 {
268  if (pVorbis == NULL) {
269  return MA_INVALID_ARGS;
270  }
271 
272  #if !defined(MA_NO_LIBVORBIS)
273  {
274  /* We always use floating point format. */
275  ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */
276  ma_uint64 totalFramesRead;
277  ma_format format;
278  ma_uint32 channels;
279 
280  ma_libvorbis_get_data_format(pVorbis, &format, &channels, NULL, NULL, 0);
281 
282  totalFramesRead = 0;
283  while (totalFramesRead < frameCount) {
284  long libvorbisResult;
285  int framesToRead;
286  ma_uint64 framesRemaining;
287 
288  framesRemaining = (frameCount - totalFramesRead);
289  framesToRead = 1024;
290  if (framesToRead > framesRemaining) {
291  framesToRead = (int)framesRemaining;
292  }
293 
294  if (format == ma_format_f32) {
295  float** ppFramesF32;
296 
297  libvorbisResult = ov_read_float(&pVorbis->vf, &ppFramesF32, framesToRead, NULL);
298  if (libvorbisResult < 0) {
299  result = MA_ERROR; /* Error while decoding. */
300  break;
301  } else {
302  /* Frames need to be interleaved. */
303  ma_interleave_pcm_frames(format, channels, libvorbisResult, (const void**)ppFramesF32, ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels));
304  totalFramesRead += libvorbisResult;
305 
306  if (libvorbisResult == 0) {
307  result = MA_AT_END;
308  break;
309  }
310  }
311  } else {
312  libvorbisResult = ov_read(&pVorbis->vf, ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), framesToRead * ma_get_bytes_per_frame(format, channels), 0, 2, 1, NULL);
313  if (libvorbisResult < 0) {
314  result = MA_ERROR; /* Error while decoding. */
315  break;
316  } else {
317  /* Conveniently, there's no need to interleaving when using ov_read(). I'm not sure why ov_read_float() is different in that regard... */
318  totalFramesRead += libvorbisResult / ma_get_bytes_per_frame(format, channels);
319 
320  if (libvorbisResult == 0) {
321  result = MA_AT_END;
322  break;
323  }
324  }
325  }
326  }
327 
328  if (pFramesRead != NULL) {
329  *pFramesRead = totalFramesRead;
330  }
331 
332  return result;
333  }
334  #else
335  {
336  /* libvorbis is disabled. Should never hit this since initialization would have failed. */
338 
339  (void)pFramesOut;
340  (void)frameCount;
341  (void)pFramesRead;
342 
343  return MA_NOT_IMPLEMENTED;
344  }
345  #endif
346 }
347 
349 {
350  if (pVorbis == NULL) {
351  return MA_INVALID_ARGS;
352  }
353 
354  #if !defined(MA_NO_LIBVORBIS)
355  {
356  int libvorbisResult = ov_pcm_seek(&pVorbis->vf, (ogg_int64_t)frameIndex);
357  if (libvorbisResult != 0) {
358  if (libvorbisResult == OV_ENOSEEK) {
359  return MA_INVALID_OPERATION; /* Not seekable. */
360  } else if (libvorbisResult == OV_EINVAL) {
361  return MA_INVALID_ARGS;
362  } else {
363  return MA_ERROR;
364  }
365  }
366 
367  return MA_SUCCESS;
368  }
369  #else
370  {
371  /* libvorbis is disabled. Should never hit this since initialization would have failed. */
373 
374  (void)frameIndex;
375 
376  return MA_NOT_IMPLEMENTED;
377  }
378  #endif
379 }
380 
381 MA_API ma_result ma_libvorbis_get_data_format(ma_libvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)
382 {
383  /* Defaults for safety. */
384  if (pFormat != NULL) {
385  *pFormat = ma_format_unknown;
386  }
387  if (pChannels != NULL) {
388  *pChannels = 0;
389  }
390  if (pSampleRate != NULL) {
391  *pSampleRate = 0;
392  }
393  if (pChannelMap != NULL) {
394  MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);
395  }
396 
397  if (pVorbis == NULL) {
398  return MA_INVALID_OPERATION;
399  }
400 
401  if (pFormat != NULL) {
402  *pFormat = pVorbis->format;
403  }
404 
405  #if !defined(MA_NO_LIBVORBIS)
406  {
407  vorbis_info* pInfo = ov_info(&pVorbis->vf, 0);
408  if (pInfo == NULL) {
409  return MA_INVALID_OPERATION;
410  }
411 
412  if (pChannels != NULL) {
413  *pChannels = pInfo->channels;
414  }
415 
416  if (pSampleRate != NULL) {
417  *pSampleRate = pInfo->rate;
418  }
419 
420  if (pChannelMap != NULL) {
421  ma_get_standard_channel_map(ma_standard_channel_map_vorbis, (ma_uint32)ma_min((size_t)pInfo->channels, channelMapCap), pChannelMap);
422  }
423 
424  return MA_SUCCESS;
425  }
426  #else
427  {
428  /* libvorbis is disabled. Should never hit this since initialization would have failed. */
430  return MA_NOT_IMPLEMENTED;
431  }
432  #endif
433 }
434 
436 {
437  if (pCursor == NULL) {
438  return MA_INVALID_ARGS;
439  }
440 
441  *pCursor = 0; /* Safety. */
442 
443  if (pVorbis == NULL) {
444  return MA_INVALID_ARGS;
445  }
446 
447  #if !defined(MA_NO_LIBVORBIS)
448  {
449  ogg_int64_t offset = ov_pcm_tell(&pVorbis->vf);
450  if (offset < 0) {
451  return MA_INVALID_FILE;
452  }
453 
454  *pCursor = (ma_uint64)offset;
455 
456  return MA_SUCCESS;
457  }
458  #else
459  {
460  /* libvorbis is disabled. Should never hit this since initialization would have failed. */
462  return MA_NOT_IMPLEMENTED;
463  }
464  #endif
465 }
466 
468 {
469  if (pLength == NULL) {
470  return MA_INVALID_ARGS;
471  }
472 
473  *pLength = 0; /* Safety. */
474 
475  if (pVorbis == NULL) {
476  return MA_INVALID_ARGS;
477  }
478 
479  #if !defined(MA_NO_LIBVORBIS)
480  {
481  /* I don't know how to reliably retrieve the length in frames using libvorbis, so returning 0 for now. */
482  *pLength = 0;
483 
484  return MA_SUCCESS;
485  }
486  #else
487  {
488  /* libvorbis is disabled. Should never hit this since initialization would have failed. */
490  return MA_NOT_IMPLEMENTED;
491  }
492  #endif
493 }
494 
495 #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_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_libvorbis_init_file
MA_API ma_result ma_libvorbis_init_file(const char *pFilePath, const ma_decoding_backend_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_libvorbis *pVorbis)
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_libvorbis_read_pcm_frames
MA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis *pVorbis, void *pFramesOut, ma_uint64 frameCount, ma_uint64 *pFramesRead)
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_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_libvorbis::pReadSeekTellUserData
void * pReadSeekTellUserData
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:27
ma_format_f32
@ ma_format_f32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1790
ma_libvorbis
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:21
ma_seek_origin_end
@ ma_seek_origin_end
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4640
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_libvorbis_get_length_in_pcm_frames
MA_API ma_result ma_libvorbis_get_length_in_pcm_frames(ma_libvorbis *pVorbis, ma_uint64 *pLength)
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_libvorbis_init
MA_API ma_result ma_libvorbis_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_libvorbis *pVorbis)
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_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
ma_libvorbis_get_data_format
MA_API ma_result ma_libvorbis_get_data_format(ma_libvorbis *pVorbis, ma_format *pFormat, ma_uint32 *pChannels, ma_uint32 *pSampleRate, ma_channel *pChannelMap, size_t channelMapCap)
ma_libvorbis::onSeek
ma_seek_proc onSeek
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:25
count
size_t count
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_common/ma_test_common.c:31
ma_format_s16
@ ma_format_s16
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1787
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_libvorbis::format
ma_format format
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:28
MA_INVALID_OPERATION
#define MA_INVALID_OPERATION
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1662
ma_libvorbis::onRead
ma_read_proc onRead
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:24
MA_ASSERT
#define MA_ASSERT(condition)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:770
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_libvorbis_uninit
MA_API void ma_libvorbis_uninit(ma_libvorbis *pVorbis, const ma_allocation_callbacks *pAllocationCallbacks)
MA_AT_END
#define MA_AT_END
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1712
ma_libvorbis_seek_to_pcm_frame
MA_API ma_result ma_libvorbis_seek_to_pcm_frame(ma_libvorbis *pVorbis, ma_uint64 frameIndex)
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_decoding_backend_config::preferredFormat
ma_format preferredFormat
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4717
MA_ERROR
#define MA_ERROR
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1660
ma_libvorbis_get_cursor_in_pcm_frames
MA_API ma_result ma_libvorbis_get_cursor_in_pcm_frames(ma_libvorbis *pVorbis, ma_uint64 *pCursor)
ma_libvorbis::vf
OggVorbis_File vf
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:30
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_libvorbis::ds
ma_data_source_base ds
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:23
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_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_interleave_pcm_frames
void ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void **ppDeinterleavedPCMFrames, void *pInterleavedPCMFrames)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:30362
MA_ZERO_MEMORY
#define MA_ZERO_MEMORY(p, sz)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:746
ma_libvorbis::onTell
ma_tell_proc onTell
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_libvorbis.h:26


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