9 #ifndef miniaudio_libopus_h
10 #define miniaudio_libopus_h
16 #if !defined(MA_NO_LIBOPUS)
28 #if !defined(MA_NO_LIBOPUS)
47 #if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)
80 ma_libopus_ds_get_data_format,
81 ma_libopus_ds_get_cursor,
82 ma_libopus_ds_get_length
86 #if !defined(MA_NO_LIBOPUS)
87 static int ma_libopus_of_callback__read(
void* pUserData,
unsigned char* pBufferOut,
int bytesToRead)
99 return (
int)bytesRead;
102 static int ma_libopus_of_callback__seek(
void* pUserData, ogg_int64_t offset,
int whence)
108 if (whence == SEEK_SET) {
110 }
else if (whence == SEEK_END) {
124 static opus_int64 ma_libopus_of_callback__tell(
void* pUserData)
162 dataSourceConfig.
vtable = &g_ma_libopus_ds_vtable;
176 (void)pAllocationCallbacks;
178 result = ma_libopus_init_internal(pConfig, pOpus);
183 if (onRead ==
NULL || onSeek ==
NULL) {
192 #if !defined(MA_NO_LIBOPUS)
195 OpusFileCallbacks libopusCallbacks;
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;
203 pOpus->
of = op_open_callbacks(pOpus, &libopusCallbacks,
NULL, 0, &libopusResult);
222 (void)pAllocationCallbacks;
224 result = ma_libopus_init_internal(pConfig, pOpus);
229 #if !defined(MA_NO_LIBOPUS)
233 pOpus->
of = op_open_file(pFilePath, &libopusResult);
255 (void)pAllocationCallbacks;
257 #if !defined(MA_NO_LIBOPUS)
277 #if !defined(MA_NO_LIBOPUS)
288 while (totalFramesRead < frameCount) {
293 framesRemaining = (frameCount - totalFramesRead);
295 if (framesToRead > framesRemaining) {
296 framesToRead = (int)framesRemaining;
305 if (libopusResult < 0) {
309 totalFramesRead += libopusResult;
311 if (libopusResult == 0) {
318 if (pFramesRead !=
NULL) {
319 *pFramesRead = totalFramesRead;
344 #if !defined(MA_NO_LIBOPUS)
346 int libopusResult = op_pcm_seek(pOpus->
of, (ogg_int64_t)frameIndex);
347 if (libopusResult != 0) {
348 if (libopusResult == OP_ENOSEEK) {
350 }
else if (libopusResult == OP_EINVAL) {
374 if (pFormat !=
NULL) {
377 if (pChannels !=
NULL) {
380 if (pSampleRate !=
NULL) {
383 if (pChannelMap !=
NULL) {
384 MA_ZERO_MEMORY(pChannelMap,
sizeof(*pChannelMap) * channelMapCap);
391 if (pFormat !=
NULL) {
395 #if !defined(MA_NO_LIBOPUS)
397 ma_uint32 channels = op_channel_count(pOpus->
of, -1);
399 if (pChannels !=
NULL) {
400 *pChannels = channels;
403 if (pSampleRate !=
NULL) {
404 *pSampleRate = 48000;
407 if (pChannelMap !=
NULL) {
424 if (pCursor ==
NULL) {
434 #if !defined(MA_NO_LIBOPUS)
436 ogg_int64_t offset = op_pcm_tell(pOpus->
of);
456 if (pLength ==
NULL) {
466 #if !defined(MA_NO_LIBOPUS)
468 ogg_int64_t length = op_pcm_total(pOpus->
of, -1);