Merge branch 'dev' into dev-0.12

This commit is contained in:
David Reid
2025-02-19 12:09:13 +10:00
13 changed files with 101 additions and 65 deletions
+21 -20
View File
@@ -7,8 +7,8 @@ project(miniaudio
# Options # Options
option(MINIAUDIO_BUILD_EXAMPLES "Build miniaudio examples" OFF) option(MINIAUDIO_BUILD_EXAMPLES "Build miniaudio examples" OFF)
option(MINIAUDIO_BUILD_TESTS "Build miniaudio tests" OFF) option(MINIAUDIO_BUILD_TESTS "Build miniaudio tests" OFF)
option(MINIAUDIO_FORCE_CXX "Use C++ compiler for C files" OFF) option(MINIAUDIO_FORCE_CXX "Force compilation as C++" OFF)
option(MINIAUDIO_FORCE_C89 "Use C89 standard" OFF) option(MINIAUDIO_FORCE_C89 "Force compilation as C89" OFF)
option(MINIAUDIO_NO_LIBVORBIS "Disable miniaudio_libvorbis" OFF) option(MINIAUDIO_NO_LIBVORBIS "Disable miniaudio_libvorbis" OFF)
option(MINIAUDIO_NO_LIBOPUS "Disable miniaudio_libopus" OFF) option(MINIAUDIO_NO_LIBOPUS "Disable miniaudio_libopus" OFF)
option(MINIAUDIO_NO_WASAPI "Disable the WASAPI backend" OFF) option(MINIAUDIO_NO_WASAPI "Disable the WASAPI backend" OFF)
@@ -64,19 +64,30 @@ option(MINIAUDIO_DEBUG_OUTPUT "Enable stdout debug output"
# Construct compiler options. # Construct compiler options.
set(COMPILE_OPTIONS) set(COMPILE_OPTIONS)
if(MINIAUDIO_FORCE_CXX AND MINIAUDIO_FORCE_C89)
message(FATAL_ERROR "MINIAUDIO_FORCE_CXX and MINIAUDIO_FORCE_C89 cannot be enabled at the same time.")
endif()
if(MINIAUDIO_FORCE_CXX) if(MINIAUDIO_FORCE_CXX)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
message(STATUS "Compiling as C++ (GNU/Clang)")
list(APPEND COMPILE_OPTIONS -x c++) list(APPEND COMPILE_OPTIONS -x c++)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
message(STATUS "Compiling as C++ (MSVC)")
list(APPEND COMPILE_OPTIONS /TP) list(APPEND COMPILE_OPTIONS /TP)
else()
message(WARNING "MINIAUDIO_FORCE_CXX is enabled but the compiler does not support it. Ignoring.")
endif() endif()
endif() endif()
if(MINIAUDIO_FORCE_C89) if(MINIAUDIO_FORCE_C89)
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
message(STATUS "Compiling as C89")
list(APPEND COMPILE_OPTIONS -std=c89) list(APPEND COMPILE_OPTIONS -std=c89)
elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
# MSVC does not have an option for forcing C89. message(WARNING "MSVC does not support forcing C89. MINIAUDIO_FORCE_C89 ignored.")
else()
message(WARNING "MINIAUDIO_FORCE_C89 is enabled but the compiler does not support it. Ingoring.")
endif() endif()
endif() endif()
@@ -84,7 +95,7 @@ endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
list(APPEND COMPILE_OPTIONS -Wall -Wextra -Wpedantic) list(APPEND COMPILE_OPTIONS -Wall -Wextra -Wpedantic)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
list(APPEND COMPILE_OPTIONS /W4) #list(APPEND COMPILE_OPTIONS /W4)
endif() endif()
@@ -245,8 +256,6 @@ if(NOT MINIAUDIO_NO_LIBVORBIS)
else() else()
message(STATUS "libvorbisfile not found. miniaudio_libvorbis will be excluded.") message(STATUS "libvorbisfile not found. miniaudio_libvorbis will be excluded.")
endif() endif()
endif() endif()
if(NOT MINIAUDIO_NO_LIBOPUS) if(NOT MINIAUDIO_NO_LIBOPUS)
@@ -436,29 +445,21 @@ if (MINIAUDIO_BUILD_EXAMPLES)
add_miniaudio_example(miniaudio_custom_backend custom_backend.c) add_miniaudio_example(miniaudio_custom_backend custom_backend.c)
add_miniaudio_example(miniaudio_custom_decoder_engine custom_decoder_engine.c) add_miniaudio_example(miniaudio_custom_decoder_engine custom_decoder_engine.c)
if(HAS_LIBVORBIS) if(NOT HAS_LIBVORBIS)
target_link_libraries(miniaudio_custom_decoder_engine PRIVATE miniaudio_libvorbis)
else()
target_compile_definitions(miniaudio_custom_decoder_engine PRIVATE MA_NO_LIBVORBIS) target_compile_definitions(miniaudio_custom_decoder_engine PRIVATE MA_NO_LIBVORBIS)
message(STATUS "miniaudio_libvorbis is disabled. Vorbis support is disabled in miniaudio_custom_decoder_engine.") message(STATUS "miniaudio_libvorbis is disabled. Vorbis support is disabled in miniaudio_custom_decoder_engine.")
endif() endif()
if(HAS_LIBOPUS) if(NOT HAS_LIBOPUS)
target_link_libraries(miniaudio_custom_decoder_engine PRIVATE miniaudio_libopus)
else()
target_compile_definitions(miniaudio_custom_decoder_engine PRIVATE MA_NO_LIBOPUS) target_compile_definitions(miniaudio_custom_decoder_engine PRIVATE MA_NO_LIBOPUS)
message(STATUS "miniaudio_libopus is disabled. Opus support is disabled in miniaudio_custom_decoder_engine.") message(STATUS "miniaudio_libopus is disabled. Opus support is disabled in miniaudio_custom_decoder_engine.")
endif() endif()
add_miniaudio_example(miniaudio_custom_decoder custom_decoder.c) add_miniaudio_example(miniaudio_custom_decoder custom_decoder.c)
if(HAS_LIBVORBIS) if(NOT HAS_LIBVORBIS)
target_link_libraries(miniaudio_custom_decoder PRIVATE miniaudio_libvorbis)
else()
target_compile_definitions(miniaudio_custom_decoder PRIVATE MA_NO_LIBVORBIS) target_compile_definitions(miniaudio_custom_decoder PRIVATE MA_NO_LIBVORBIS)
message(STATUS "miniaudio_libvorbis is disabled. Vorbis support is disabled in miniaudio_custom_decoder.") message(STATUS "miniaudio_libvorbis is disabled. Vorbis support is disabled in miniaudio_custom_decoder.")
endif() endif()
if(HAS_LIBOPUS) if(NOT HAS_LIBOPUS)
target_link_libraries(miniaudio_custom_decoder PRIVATE miniaudio_libopus)
else()
target_compile_definitions(miniaudio_custom_decoder PRIVATE MA_NO_LIBOPUS) target_compile_definitions(miniaudio_custom_decoder PRIVATE MA_NO_LIBOPUS)
message(STATUS "miniaudio_libopus is disabled. Opus support is disabled in miniaudio_custom_decoder.") message(STATUS "miniaudio_libopus is disabled. Opus support is disabled in miniaudio_custom_decoder.")
endif() endif()
+2 -2
View File
@@ -29,8 +29,8 @@ The `onInitFile`, `onInitFileW` and `onInitMemory` functions are optional.
For now these need to be declared before miniaudio.c due to some compatibility issues with the old For now these need to be declared before miniaudio.c due to some compatibility issues with the old
MINIAUDIO_IMPLEMENTATION system. This will change from version 0.12. MINIAUDIO_IMPLEMENTATION system. This will change from version 0.12.
*/ */
#include "../extras/decoders/libvorbis/miniaudio_libvorbis.h" #include "../extras/decoders/libvorbis/miniaudio_libvorbis.c"
#include "../extras/decoders/libopus/miniaudio_libopus.h" #include "../extras/decoders/libopus/miniaudio_libopus.c"
#include "../miniaudio.c" #include "../miniaudio.c"
#include <stdio.h> #include <stdio.h>
+2 -2
View File
@@ -10,8 +10,8 @@ example (via libopus).
For now these need to be declared before miniaudio.c due to some compatibility issues with the old For now these need to be declared before miniaudio.c due to some compatibility issues with the old
MINIAUDIO_IMPLEMENTATION system. This will change from version 0.12. MINIAUDIO_IMPLEMENTATION system. This will change from version 0.12.
*/ */
#include "../extras/decoders/libvorbis/miniaudio_libvorbis.h" #include "../extras/decoders/libvorbis/miniaudio_libvorbis.c"
#include "../extras/decoders/libopus/miniaudio_libopus.h" #include "../extras/decoders/libopus/miniaudio_libopus.c"
#include "../miniaudio.c" #include "../miniaudio.c"
#include <stdio.h> #include <stdio.h>
+4 -4
View File
@@ -135,15 +135,15 @@ int main(int argc, char** argv)
deviceConfig.dataCallback = data_callback; deviceConfig.dataCallback = data_callback;
deviceConfig.pUserData = NULL; deviceConfig.pUserData = NULL;
if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS) { result = ma_device_init(NULL, &deviceConfig, &device);
if (result != MA_SUCCESS) {
printf("Failed to open playback device.\n"); printf("Failed to open playback device.\n");
result = -1;
goto done_decoders; goto done_decoders;
} }
if (ma_device_start(&device) != MA_SUCCESS) { result = ma_device_start(&device);
if (result != MA_SUCCESS) {
printf("Failed to start playback device.\n"); printf("Failed to start playback device.\n");
result = -1;
goto done; goto done;
} }
+1 -1
View File
@@ -46,7 +46,7 @@ void capture_data_callback(ma_device* pDevice, void* pFramesOut, const void* pFr
} }
/* Copy the data from the capture buffer to the ring buffer. */ /* Copy the data from the capture buffer to the ring buffer. */
ma_copy_pcm_frames(pMappedBuffer, ma_offset_pcm_frames_const_ptr_f32(pFramesIn, framesWritten, pDevice->capture.channels), framesToWrite, pDevice->capture.format, pDevice->capture.channels); ma_copy_pcm_frames(pMappedBuffer, ma_offset_pcm_frames_const_ptr_f32((const float*)pFramesIn, framesWritten, pDevice->capture.channels), framesToWrite, pDevice->capture.format, pDevice->capture.channels);
result = ma_pcm_rb_commit_write(&rb, framesToWrite); result = ma_pcm_rb_commit_write(&rb, framesToWrite);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
+1 -1
View File
@@ -110,7 +110,7 @@ MA_API ma_result ma_data_source_read_pcm_frames_and_mix_f32(ma_data_source* pDat
result = ma_data_source_read_pcm_frames_f32_ex(pDataSource, temp, framesToRead, &framesJustRead, format, channels); result = ma_data_source_read_pcm_frames_f32_ex(pDataSource, temp, framesToRead, &framesJustRead, format, channels);
ma_mix_pcm_frames_f32(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels), temp, framesJustRead, channels, volume); ma_mix_pcm_frames_f32(ma_offset_pcm_frames_ptr_f32(pFramesOut, totalFramesRead, channels), temp, framesJustRead, channels, volume);
totalFramesRead += framesJustRead; totalFramesRead += framesJustRead;
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
+11 -11
View File
@@ -11,18 +11,18 @@
#if defined(_WIN32) #if defined(_WIN32)
#include <windows.h> /* <-- Just can't get away from this darn thing... Needed for mutexes and file iteration. */ #include <windows.h> /* <-- Just can't get away from this darn thing... Needed for mutexes and file iteration. */
static int fs_result_from_GetLastError(DWORD error) static fs_result fs_result_from_GetLastError(DWORD error)
{ {
switch (error) switch (error)
{ {
case ERROR_SUCCESS: return FS_SUCCESS; case ERROR_SUCCESS: return FS_SUCCESS;
case ERROR_NOT_ENOUGH_MEMORY: return ENOMEM; case ERROR_NOT_ENOUGH_MEMORY: return FS_OUT_OF_MEMORY;
case ERROR_SEM_TIMEOUT: return ETIMEDOUT; case ERROR_BUSY: return FS_BUSY;
case ERROR_BUSY: return EBUSY; case ERROR_SEM_TIMEOUT: return FS_TIMEOUT;
default: break; default: break;
} }
return EINVAL; return FS_ERROR;
} }
#endif #endif
@@ -1376,9 +1376,11 @@ static fs_result fs_file_duplicate_proxy(fs_file* pFile, fs_file* pDuplicatedFil
/* Increment the reference count of the opened archive if necessary. */ /* Increment the reference count of the opened archive if necessary. */
if (fs_file_proxy_get_unref_archive_on_close(pFile)) { if (fs_file_proxy_get_unref_archive_on_close(pFile)) {
fs* pOwnerFS;
fs_file_proxy_set_unref_archive_on_close(pDuplicatedFile, FS_TRUE); fs_file_proxy_set_unref_archive_on_close(pDuplicatedFile, FS_TRUE);
fs* pOwnerFS = fs_proxy_get_owner_fs(pFS); pOwnerFS = fs_proxy_get_owner_fs(pFS);
if (pOwnerFS != NULL) { if (pOwnerFS != NULL) {
fs_increment_opened_archive_ref_count(pOwnerFS, pFS); fs_increment_opened_archive_ref_count(pOwnerFS, pFS);
} }
@@ -4517,7 +4519,7 @@ static fs_uint64 fs_FILETIME_to_unix(const FILETIME* pFT)
li.HighPart = pFT->dwHighDateTime; li.HighPart = pFT->dwHighDateTime;
li.LowPart = pFT->dwLowDateTime; li.LowPart = pFT->dwLowDateTime;
return (fs_uint64)(li.QuadPart / 10000000ULL - 11644473600ULL); /* Convert from Windows epoch to Unix epoch. */ return (fs_uint64)(li.QuadPart / 10000000UL - 11644473600UL); /* Convert from Windows epoch to Unix epoch. */
} }
static fs_file_info fs_file_info_from_WIN32_FIND_DATAW(const WIN32_FIND_DATAW* pFD) static fs_file_info fs_file_info_from_WIN32_FIND_DATAW(const WIN32_FIND_DATAW* pFD)
@@ -5048,7 +5050,7 @@ FS_API fs_result fs_file_duplicate_stdio(fs_file* pFile, fs_file* pDuplicatedFil
return fs_result_from_errno(GetLastError()); return fs_result_from_errno(GetLastError());
} }
fdDuplicate = _open_osfhandle((intptr_t)hFileDuplicate, _O_RDONLY); fdDuplicate = _open_osfhandle((fs_intptr)hFileDuplicate, _O_RDONLY);
if (fdDuplicate == -1) { if (fdDuplicate == -1) {
CloseHandle(hFileDuplicate); CloseHandle(hFileDuplicate);
return fs_result_from_errno(errno); return fs_result_from_errno(errno);
@@ -6003,8 +6005,6 @@ FS_API int fs_path_normalize(char* pDst, size_t dstCap, const char* pPath, size_
/* BEG fs_memory_stream.c */ /* BEG fs_memory_stream.c */
#include <stdint.h>
static fs_result fs_memory_stream_read_internal(fs_stream* pStream, void* pDst, size_t bytesToRead, size_t* pBytesRead) static fs_result fs_memory_stream_read_internal(fs_stream* pStream, void* pDst, size_t bytesToRead, size_t* pBytesRead)
{ {
return fs_memory_stream_read((fs_memory_stream*)pStream, pDst, bytesToRead, pBytesRead); return fs_memory_stream_read((fs_memory_stream*)pStream, pDst, bytesToRead, pBytesRead);
@@ -6030,7 +6030,7 @@ static fs_result fs_memory_stream_tell_internal(fs_stream* pStream, fs_int64* pC
return result; return result;
} }
if (cursor > INT64_MAX) { /* <-- INT64_MAX may not be defined on some compilers. Need to check this. Can easily define this ourselves. */ if (cursor > FS_INT64_MAX) { /* <-- INT64_MAX may not be defined on some compilers. Need to check this. Can easily define this ourselves. */
return FS_ERROR; return FS_ERROR;
} }
+7
View File
@@ -580,8 +580,10 @@ extern "C" {
#if FS_SIZEOF_PTR == 8 #if FS_SIZEOF_PTR == 8
typedef unsigned long long fs_uintptr; typedef unsigned long long fs_uintptr;
typedef long long fs_intptr;
#else #else
typedef unsigned int fs_uintptr; typedef unsigned int fs_uintptr;
typedef int fs_intptr;
#endif #endif
typedef unsigned char fs_bool8; typedef unsigned char fs_bool8;
@@ -590,6 +592,9 @@ typedef unsigned int fs_bool32;
#define FS_FALSE 0 #define FS_FALSE 0
#define FS_INT64_MAX ((fs_int64)(((fs_uint64)0x7FFFFFFF << 32) | 0xFFFFFFFF))
#ifndef FS_API #ifndef FS_API
#define FS_API #define FS_API
#endif #endif
@@ -659,8 +664,10 @@ typedef enum fs_result
FS_IS_DIRECTORY = -15, FS_IS_DIRECTORY = -15,
FS_DIRECTORY_NOT_EMPTY = -16, FS_DIRECTORY_NOT_EMPTY = -16,
FS_AT_END = -17, FS_AT_END = -17,
FS_BUSY = -19,
FS_BAD_SEEK = -25, FS_BAD_SEEK = -25,
FS_NOT_IMPLEMENTED = -29, FS_NOT_IMPLEMENTED = -29,
FS_TIMEOUT = -34,
FS_CHECKSUM_MISMATCH = -100, FS_CHECKSUM_MISMATCH = -100,
FS_NO_BACKEND = -101 FS_NO_BACKEND = -101
} fs_result; } fs_result;
+16 -8
View File
@@ -3,8 +3,12 @@
#include "miniaudio_libopus.h" #include "miniaudio_libopus.h"
#if !defined(MA_NO_LIBOPUS)
#include <opusfile.h> #include <opusfile.h>
#endif
#include <string.h> /* For memset(). */ #include <string.h> /* For memset(). */
#include <assert.h>
static ma_result ma_libopus_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) static ma_result ma_libopus_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{ {
@@ -221,7 +225,7 @@ MA_API void ma_libopus_uninit(ma_libopus* pOpus, const ma_allocation_callbacks*
#else #else
{ {
/* libopus is disabled. Should never hit this since initialization would have failed. */ /* libopus is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
} }
#endif #endif
@@ -296,7 +300,7 @@ MA_API ma_result ma_libopus_read_pcm_frames(ma_libopus* pOpus, void* pFramesOut,
#else #else
{ {
/* libopus is disabled. Should never hit this since initialization would have failed. */ /* libopus is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
(void)pFramesOut; (void)pFramesOut;
(void)frameCount; (void)frameCount;
@@ -331,7 +335,7 @@ MA_API ma_result ma_libopus_seek_to_pcm_frame(ma_libopus* pOpus, ma_uint64 frame
#else #else
{ {
/* libopus is disabled. Should never hit this since initialization would have failed. */ /* libopus is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
(void)frameIndex; (void)frameIndex;
@@ -385,7 +389,7 @@ MA_API ma_result ma_libopus_get_data_format(ma_libopus* pOpus, ma_format* pForma
#else #else
{ {
/* libopus is disabled. Should never hit this since initialization would have failed. */ /* libopus is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
return MA_NOT_IMPLEMENTED; return MA_NOT_IMPLEMENTED;
} }
#endif #endif
@@ -417,7 +421,7 @@ MA_API ma_result ma_libopus_get_cursor_in_pcm_frames(ma_libopus* pOpus, ma_uint6
#else #else
{ {
/* libopus is disabled. Should never hit this since initialization would have failed. */ /* libopus is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
return MA_NOT_IMPLEMENTED; return MA_NOT_IMPLEMENTED;
} }
#endif #endif
@@ -449,7 +453,7 @@ MA_API ma_result ma_libopus_get_length_in_pcm_frames(ma_libopus* pOpus, ma_uint6
#else #else
{ {
/* libopus is disabled. Should never hit this since initialization would have failed. */ /* libopus is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
return MA_NOT_IMPLEMENTED; return MA_NOT_IMPLEMENTED;
} }
#endif #endif
@@ -459,6 +463,7 @@ MA_API ma_result ma_libopus_get_length_in_pcm_frames(ma_libopus* pOpus, ma_uint6
/* /*
The code below defines the vtable that you'll plug into your `ma_decoder_config` object. The code below defines the vtable that you'll plug into your `ma_decoder_config` object.
*/ */
#if !defined(MA_NO_LIBOPUS)
static ma_result ma_decoding_backend_init__libopus(void* pUserData, 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_data_source** ppBackend) static ma_result ma_decoding_backend_init__libopus(void* pUserData, 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_data_source** ppBackend)
{ {
ma_result result; ma_result result;
@@ -535,7 +540,7 @@ static ma_encoding_format ma_decoding_backend_get_encoding_format__libopus(void*
return ma_encoding_format_opus; return ma_encoding_format_opus;
} }
static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_libopus = static ma_decoding_backend_vtable ma_gDecodingBackendVTable_libopus =
{ {
ma_decoding_backend_init__libopus, ma_decoding_backend_init__libopus,
ma_decoding_backend_init_file__libopus, ma_decoding_backend_init_file__libopus,
@@ -544,6 +549,9 @@ static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_libopus =
ma_decoding_backend_uninit__libopus, ma_decoding_backend_uninit__libopus,
ma_decoding_backend_get_encoding_format__libopus ma_decoding_backend_get_encoding_format__libopus
}; };
const ma_decoding_backend_vtable* ma_decoding_backend_libopus = &g_ma_decoding_backend_vtable_libopus; const ma_decoding_backend_vtable* ma_decoding_backend_libopus = &ma_gDecodingBackendVTable_libopus;
#else
const ma_decoding_backend_vtable* ma_decoding_backend_libopus = NULL;
#endif
#endif /* miniaudio_libopus_c */ #endif /* miniaudio_libopus_c */
+27 -13
View File
@@ -11,6 +11,7 @@
#endif #endif
#include <string.h> /* For memset(). */ #include <string.h> /* For memset(). */
#include <assert.h>
static ma_result ma_libvorbis_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) static ma_result ma_libvorbis_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{ {
@@ -135,11 +136,20 @@ static ma_result ma_libvorbis_init_internal(const ma_decoding_backend_config* pC
return result; /* Failed to initialize the base data source. */ return result; /* Failed to initialize the base data source. */
} }
pVorbis->vf = (OggVorbis_File*)ma_malloc(sizeof(OggVorbis_File), pAllocationCallbacks); #if !defined(MA_NO_LIBVORBIS)
if (pVorbis->vf == NULL) { {
ma_data_source_uninit(&pVorbis->ds); pVorbis->vf = (OggVorbis_File*)ma_malloc(sizeof(OggVorbis_File), pAllocationCallbacks);
return MA_OUT_OF_MEMORY; if (pVorbis->vf == NULL) {
ma_data_source_uninit(&pVorbis->ds);
return MA_OUT_OF_MEMORY;
}
} }
#else
{
/* libvorbis is disabled. */
return MA_NOT_IMPLEMENTED;
}
#endif
return MA_SUCCESS; return MA_SUCCESS;
} }
@@ -236,7 +246,7 @@ MA_API void ma_libvorbis_uninit(ma_libvorbis* pVorbis, const ma_allocation_callb
#else #else
{ {
/* libvorbis is disabled. Should never hit this since initialization would have failed. */ /* libvorbis is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
} }
#endif #endif
@@ -298,7 +308,7 @@ MA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFram
} }
} }
} else { } else {
libvorbisResult = ov_read((OggVorbis_File*)pVorbis->vf, ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), framesToRead * ma_get_bytes_per_frame(format, channels), 0, 2, 1, NULL); libvorbisResult = ov_read((OggVorbis_File*)pVorbis->vf, (char*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), framesToRead * ma_get_bytes_per_frame(format, channels), 0, 2, 1, NULL);
if (libvorbisResult < 0) { if (libvorbisResult < 0) {
result = MA_ERROR; /* Error while decoding. */ result = MA_ERROR; /* Error while decoding. */
break; break;
@@ -327,7 +337,7 @@ MA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFram
#else #else
{ {
/* libvorbis is disabled. Should never hit this since initialization would have failed. */ /* libvorbis is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
(void)pFramesOut; (void)pFramesOut;
(void)frameCount; (void)frameCount;
@@ -362,7 +372,7 @@ MA_API ma_result ma_libvorbis_seek_to_pcm_frame(ma_libvorbis* pVorbis, ma_uint64
#else #else
{ {
/* libvorbis is disabled. Should never hit this since initialization would have failed. */ /* libvorbis is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
(void)frameIndex; (void)frameIndex;
@@ -419,7 +429,7 @@ MA_API ma_result ma_libvorbis_get_data_format(ma_libvorbis* pVorbis, ma_format*
#else #else
{ {
/* libvorbis is disabled. Should never hit this since initialization would have failed. */ /* libvorbis is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
return MA_NOT_IMPLEMENTED; return MA_NOT_IMPLEMENTED;
} }
#endif #endif
@@ -451,7 +461,7 @@ MA_API ma_result ma_libvorbis_get_cursor_in_pcm_frames(ma_libvorbis* pVorbis, ma
#else #else
{ {
/* libvorbis is disabled. Should never hit this since initialization would have failed. */ /* libvorbis is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
return MA_NOT_IMPLEMENTED; return MA_NOT_IMPLEMENTED;
} }
#endif #endif
@@ -479,7 +489,7 @@ MA_API ma_result ma_libvorbis_get_length_in_pcm_frames(ma_libvorbis* pVorbis, ma
#else #else
{ {
/* libvorbis is disabled. Should never hit this since initialization would have failed. */ /* libvorbis is disabled. Should never hit this since initialization would have failed. */
MA_ASSERT(MA_FALSE); assert(MA_FALSE);
return MA_NOT_IMPLEMENTED; return MA_NOT_IMPLEMENTED;
} }
#endif #endif
@@ -489,6 +499,7 @@ MA_API ma_result ma_libvorbis_get_length_in_pcm_frames(ma_libvorbis* pVorbis, ma
/* /*
The code below defines the vtable that you'll plug into your `ma_decoder_config` object. The code below defines the vtable that you'll plug into your `ma_decoder_config` object.
*/ */
#if !defined(MA_NO_LIBVORBIS)
static ma_result ma_decoding_backend_init__libvorbis(void* pUserData, 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_data_source** ppBackend) static ma_result ma_decoding_backend_init__libvorbis(void* pUserData, 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_data_source** ppBackend)
{ {
ma_result result; ma_result result;
@@ -565,7 +576,7 @@ static ma_encoding_format ma_decoding_backend_get_encoding_format__libvorbis(voi
return ma_encoding_format_vorbis; return ma_encoding_format_vorbis;
} }
static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_libvorbis = static ma_decoding_backend_vtable ma_gDecodingBackendVTable_libvorbis =
{ {
ma_decoding_backend_init__libvorbis, ma_decoding_backend_init__libvorbis,
ma_decoding_backend_init_file__libvorbis, ma_decoding_backend_init_file__libvorbis,
@@ -574,6 +585,9 @@ static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_libvorbis =
ma_decoding_backend_uninit__libvorbis, ma_decoding_backend_uninit__libvorbis,
ma_decoding_backend_get_encoding_format__libvorbis ma_decoding_backend_get_encoding_format__libvorbis
}; };
const ma_decoding_backend_vtable* ma_decoding_backend_libvorbis = &g_ma_decoding_backend_vtable_libvorbis; const ma_decoding_backend_vtable* ma_decoding_backend_libvorbis = &ma_gDecodingBackendVTable_libvorbis;
#else
const ma_decoding_backend_vtable* ma_decoding_backend_libvorbis = NULL;
#endif
#endif /* miniaudio_libvorbis_c */ #endif /* miniaudio_libvorbis_c */
+1 -1
View File
@@ -334,7 +334,7 @@ MA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFram
} }
} }
} else { } else {
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); libvorbisResult = ov_read(&pVorbis->vf, (char*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), framesToRead * ma_get_bytes_per_frame(format, channels), 0, 2, 1, NULL);
if (libvorbisResult < 0) { if (libvorbisResult < 0) {
result = MA_ERROR; /* Error while decoding. */ result = MA_ERROR; /* Error while decoding. */
break; break;
+3 -1
View File
@@ -14995,7 +14995,9 @@ typedef int ma_atomic_memory_order;
} }
#if defined(__clang__) #if defined(__clang__)
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Watomic-alignment" #if __clang_major__ >= 8
#pragma clang diagnostic ignored "-Watomic-alignment"
#endif
#endif #endif
static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired) static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired)
{ {
+5 -1
View File
@@ -594,7 +594,7 @@ int main(int argc, char** argv)
} }
/* Now we just keep looping and wait for user input. */ /* Now we just keep looping and wait for user input. */
while (!g_State.wantsToClose) { for (;;) {
if (interactive) { if (interactive) {
int c; int c;
@@ -630,6 +630,10 @@ int main(int argc, char** argv)
} }
} else { } else {
/* Running in auto-close mode. Just sleep for a bit. The data callback will control when this loop aborts. */ /* Running in auto-close mode. Just sleep for a bit. The data callback will control when this loop aborts. */
if (g_State.wantsToClose) {
break;
}
ma_sleep(10); ma_sleep(10);
} }
} }