9 #ifndef miniaudio_libvorbis_h
10 #define miniaudio_libvorbis_h
16 #if !defined(MA_NO_LIBVORBIS)
17 #define OV_EXCLUDE_STATIC_CALLBACKS
18 #include <vorbis/vorbisfile.h>
29 #if !defined(MA_NO_LIBVORBIS)
48 #if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)
81 ma_libvorbis_ds_get_data_format,
82 ma_libvorbis_ds_get_cursor,
83 ma_libvorbis_ds_get_length
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)
95 bytesToRead = size *
count;
98 return bytesRead / size;
101 static int ma_libvorbis_vf_callback__seek(
void* pUserData, ogg_int64_t offset,
int whence)
107 if (whence == SEEK_SET) {
109 }
else if (whence == SEEK_END) {
123 static long ma_libvorbis_vf_callback__tell(
void* pUserData)
143 if (pVorbis ==
NULL) {
157 dataSourceConfig.
vtable = &g_ma_libvorbis_ds_vtable;
171 (void)pAllocationCallbacks;
173 result = ma_libvorbis_init_internal(pConfig, pVorbis);
178 if (onRead ==
NULL || onSeek ==
NULL) {
187 #if !defined(MA_NO_LIBVORBIS)
190 ov_callbacks libvorbisCallbacks;
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;
198 libvorbisResult = ov_open_callbacks(pVorbis, &pVorbis->
vf,
NULL, 0, libvorbisCallbacks);
199 if (libvorbisResult < 0) {
217 (void)pAllocationCallbacks;
219 result = ma_libvorbis_init_internal(pConfig, pVorbis);
224 #if !defined(MA_NO_LIBVORBIS)
228 libvorbisResult = ov_fopen(pFilePath, &pVorbis->
vf);
229 if (libvorbisResult < 0) {
246 if (pVorbis ==
NULL) {
250 (void)pAllocationCallbacks;
252 #if !defined(MA_NO_LIBVORBIS)
254 ov_clear(&pVorbis->
vf);
268 if (pVorbis ==
NULL) {
272 #if !defined(MA_NO_LIBVORBIS)
283 while (totalFramesRead < frameCount) {
284 long libvorbisResult;
288 framesRemaining = (frameCount - totalFramesRead);
290 if (framesToRead > framesRemaining) {
291 framesToRead = (int)framesRemaining;
297 libvorbisResult = ov_read_float(&pVorbis->
vf, &ppFramesF32, framesToRead,
NULL);
298 if (libvorbisResult < 0) {
304 totalFramesRead += libvorbisResult;
306 if (libvorbisResult == 0) {
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) {
320 if (libvorbisResult == 0) {
328 if (pFramesRead !=
NULL) {
329 *pFramesRead = totalFramesRead;
350 if (pVorbis ==
NULL) {
354 #if !defined(MA_NO_LIBVORBIS)
356 int libvorbisResult = ov_pcm_seek(&pVorbis->
vf, (ogg_int64_t)frameIndex);
357 if (libvorbisResult != 0) {
358 if (libvorbisResult == OV_ENOSEEK) {
360 }
else if (libvorbisResult == OV_EINVAL) {
384 if (pFormat !=
NULL) {
387 if (pChannels !=
NULL) {
390 if (pSampleRate !=
NULL) {
393 if (pChannelMap !=
NULL) {
394 MA_ZERO_MEMORY(pChannelMap,
sizeof(*pChannelMap) * channelMapCap);
397 if (pVorbis ==
NULL) {
401 if (pFormat !=
NULL) {
402 *pFormat = pVorbis->
format;
405 #if !defined(MA_NO_LIBVORBIS)
407 vorbis_info* pInfo = ov_info(&pVorbis->
vf, 0);
412 if (pChannels !=
NULL) {
413 *pChannels = pInfo->channels;
416 if (pSampleRate !=
NULL) {
417 *pSampleRate = pInfo->rate;
420 if (pChannelMap !=
NULL) {
437 if (pCursor ==
NULL) {
443 if (pVorbis ==
NULL) {
447 #if !defined(MA_NO_LIBVORBIS)
449 ogg_int64_t offset = ov_pcm_tell(&pVorbis->
vf);
469 if (pLength ==
NULL) {
475 if (pVorbis ==
NULL) {
479 #if !defined(MA_NO_LIBVORBIS)