mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 01:04:02 +02:00
Add some basic infrastructure for Core Audio.
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
// - WASAPI
|
// - WASAPI
|
||||||
// - DirectSound
|
// - DirectSound
|
||||||
// - WinMM
|
// - WinMM
|
||||||
|
// - Core Audio (macOS, iOS)
|
||||||
// - ALSA
|
// - ALSA
|
||||||
// - PulseAudio
|
// - PulseAudio
|
||||||
// - JACK
|
// - JACK
|
||||||
@@ -24,8 +25,6 @@
|
|||||||
// - OpenAL
|
// - OpenAL
|
||||||
// - SDL
|
// - SDL
|
||||||
// - Null (Silence)
|
// - Null (Silence)
|
||||||
// - ... and more in the future.
|
|
||||||
// - Core Audio (OSX, iOS)
|
|
||||||
//
|
//
|
||||||
// Supported Formats:
|
// Supported Formats:
|
||||||
// - Unsigned 8-bit PCM
|
// - Unsigned 8-bit PCM
|
||||||
@@ -47,7 +46,7 @@
|
|||||||
// the development packages for any particular backend you can disable it by #define-ing the appropriate MAL_NO_*
|
// the development packages for any particular backend you can disable it by #define-ing the appropriate MAL_NO_*
|
||||||
// option before the implementation.
|
// option before the implementation.
|
||||||
//
|
//
|
||||||
// Note that GCC and Clang requires "-msse2", "-mavx", etc. for SIMD optimizations.
|
// Note that GCC and Clang requires "-msse2", "-mavx2", etc. for SIMD optimizations.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Building for Windows
|
// Building for Windows
|
||||||
@@ -55,6 +54,9 @@
|
|||||||
// The Windows build should compile clean on all popular compilers without the need to configure any include paths
|
// The Windows build should compile clean on all popular compilers without the need to configure any include paths
|
||||||
// nor link to any libraries.
|
// nor link to any libraries.
|
||||||
//
|
//
|
||||||
|
// Building for macOS
|
||||||
|
// ------------------
|
||||||
|
//
|
||||||
// Building for Linux
|
// Building for Linux
|
||||||
// ------------------
|
// ------------------
|
||||||
// The Linux build only requires linking to -ldl, -lpthread and -lm. You do not need any development packages for any
|
// The Linux build only requires linking to -ldl, -lpthread and -lm. You do not need any development packages for any
|
||||||
@@ -174,6 +176,9 @@
|
|||||||
// #define MAL_NO_JACK
|
// #define MAL_NO_JACK
|
||||||
// Disables the JACK backend.
|
// Disables the JACK backend.
|
||||||
//
|
//
|
||||||
|
// #define MAL_NO_COREAUDIO
|
||||||
|
// Disables the Core Audio backend.
|
||||||
|
//
|
||||||
// #define MAL_NO_OSS
|
// #define MAL_NO_OSS
|
||||||
// Disables the OSS backend.
|
// Disables the OSS backend.
|
||||||
//
|
//
|
||||||
@@ -278,9 +283,6 @@ extern "C" {
|
|||||||
#define MAL_SUPPORT_PULSEAUDIO
|
#define MAL_SUPPORT_PULSEAUDIO
|
||||||
#define MAL_SUPPORT_JACK
|
#define MAL_SUPPORT_JACK
|
||||||
#endif
|
#endif
|
||||||
#if defined(MAL_APPLE)
|
|
||||||
#define MAL_SUPPORT_COREAUDIO
|
|
||||||
#endif
|
|
||||||
#if defined(MAL_ANDROID)
|
#if defined(MAL_ANDROID)
|
||||||
#define MAL_SUPPORT_OPENSL
|
#define MAL_SUPPORT_OPENSL
|
||||||
#endif
|
#endif
|
||||||
@@ -288,6 +290,9 @@ extern "C" {
|
|||||||
#define MAL_SUPPORT_OSS
|
#define MAL_SUPPORT_OSS
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MAL_APPLE)
|
||||||
|
#define MAL_SUPPORT_COREAUDIO
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAL_SUPPORT_SDL // All platforms support SDL.
|
#define MAL_SUPPORT_SDL // All platforms support SDL.
|
||||||
|
|
||||||
@@ -661,6 +666,7 @@ typedef enum
|
|||||||
mal_backend_alsa,
|
mal_backend_alsa,
|
||||||
mal_backend_pulseaudio,
|
mal_backend_pulseaudio,
|
||||||
mal_backend_jack,
|
mal_backend_jack,
|
||||||
|
mal_backend_coreaudio,
|
||||||
mal_backend_oss,
|
mal_backend_oss,
|
||||||
mal_backend_opensl,
|
mal_backend_opensl,
|
||||||
mal_backend_openal,
|
mal_backend_openal,
|
||||||
@@ -754,7 +760,7 @@ typedef union
|
|||||||
int jack; // JACK always uses default devices.
|
int jack; // JACK always uses default devices.
|
||||||
#endif
|
#endif
|
||||||
#ifdef MAL_SUPPORT_COREAUDIO
|
#ifdef MAL_SUPPORT_COREAUDIO
|
||||||
// TODO: Implement me.
|
int coreaudio;
|
||||||
#endif
|
#endif
|
||||||
#ifdef MAL_SUPPORT_OSS
|
#ifdef MAL_SUPPORT_OSS
|
||||||
char oss[64]; // "dev/dsp0", etc. "dev/dsp" for the default device.
|
char oss[64]; // "dev/dsp0", etc. "dev/dsp" for the default device.
|
||||||
@@ -1589,6 +1595,7 @@ MAL_ALIGNED_STRUCT(MAL_SIMD_ALIGNMENT) mal_device
|
|||||||
// - WASAPI
|
// - WASAPI
|
||||||
// - DirectSound
|
// - DirectSound
|
||||||
// - WinMM
|
// - WinMM
|
||||||
|
// - Core Audio (macOS, iOS)
|
||||||
// - OSS
|
// - OSS
|
||||||
// - PulseAudio
|
// - PulseAudio
|
||||||
// - ALSA
|
// - ALSA
|
||||||
@@ -3487,7 +3494,7 @@ double mal_timer_get_time_in_seconds(mal_timer* pTimer)
|
|||||||
return (double)(counter.QuadPart - pTimer->counter) / g_mal_TimerFrequency.QuadPart;
|
return (double)(counter.QuadPart - pTimer->counter) / g_mal_TimerFrequency.QuadPart;
|
||||||
}
|
}
|
||||||
#elif defined(MAL_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200)
|
#elif defined(MAL_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200)
|
||||||
uint64_t g_mal_TimerFrequency = 0;
|
mal_uint64 g_mal_TimerFrequency = 0;
|
||||||
void mal_timer_init(mal_timer* pTimer)
|
void mal_timer_init(mal_timer* pTimer)
|
||||||
{
|
{
|
||||||
mach_timebase_info_data_t baseTime;
|
mach_timebase_info_data_t baseTime;
|
||||||
@@ -3499,8 +3506,8 @@ void mal_timer_init(mal_timer* pTimer)
|
|||||||
|
|
||||||
double mal_timer_get_time_in_seconds(mal_timer* pTimer)
|
double mal_timer_get_time_in_seconds(mal_timer* pTimer)
|
||||||
{
|
{
|
||||||
uint64_t newTimeCounter = mach_absolute_time();
|
mal_uint64 newTimeCounter = mach_absolute_time();
|
||||||
uint64_t oldTimeCounter = pTimer->counter;
|
mal_uint64 oldTimeCounter = pTimer->counter;
|
||||||
|
|
||||||
return (newTimeCounter - oldTimeCounter) / g_mal_TimerFrequency;
|
return (newTimeCounter - oldTimeCounter) / g_mal_TimerFrequency;
|
||||||
}
|
}
|
||||||
@@ -12473,7 +12480,97 @@ mal_result mal_device__stop_backend__jack(mal_device* pDevice)
|
|||||||
|
|
||||||
return MAL_SUCCESS;
|
return MAL_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // Jack
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Core Audio Backend
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#ifdef MAL_HAS_COREAUDIO
|
||||||
|
|
||||||
|
mal_bool32 mal_context_is_device_id_equal__coreaudio(mal_context* pContext, const mal_device_id* pID0, const mal_device_id* pID1)
|
||||||
|
{
|
||||||
|
mal_assert(pContext != NULL);
|
||||||
|
mal_assert(pID0 != NULL);
|
||||||
|
mal_assert(pID1 != NULL);
|
||||||
|
(void)pContext;
|
||||||
|
|
||||||
|
return pID0->coreaudio == pID1->coreaudio;
|
||||||
|
}
|
||||||
|
|
||||||
|
mal_result mal_context_enumerate_devices__coreaudio(mal_context* pContext, mal_enum_devices_callback_proc callback, void* pUserData)
|
||||||
|
{
|
||||||
|
mal_assert(pContext != NULL);
|
||||||
|
mal_assert(callback != NULL);
|
||||||
|
|
||||||
|
(void)pContext;
|
||||||
|
(void)callback;
|
||||||
|
(void)pUserData;
|
||||||
|
|
||||||
|
// TODO: Implement me.
|
||||||
|
return MAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mal_result mal_context_get_device_info__coreaudio(mal_context* pContext, mal_device_type deviceType, const mal_device_id* pDeviceID, mal_share_mode shareMode, mal_device_info* pDeviceInfo)
|
||||||
|
{
|
||||||
|
mal_assert(pContext != NULL);
|
||||||
|
(void)pContext;
|
||||||
|
(void)deviceType;
|
||||||
|
(void)pDeviceID;
|
||||||
|
(void)shareMode;
|
||||||
|
(void)pDeviceInfo;
|
||||||
|
|
||||||
|
// TODO: Implement me.
|
||||||
|
return MAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mal_result mal_context_init__coreaudio(mal_context* pContext)
|
||||||
|
{
|
||||||
|
mal_assert(pContext != NULL);
|
||||||
|
(void)pContext;
|
||||||
|
|
||||||
|
pContext->onDeviceIDEqual = mal_context_is_device_id_equal__coreaudio;
|
||||||
|
pContext->onEnumDevices = mal_context_enumerate_devices__coreaudio;
|
||||||
|
pContext->onGetDeviceInfo = mal_context_get_device_info__coreaudio;
|
||||||
|
|
||||||
|
// TODO: Implement me.
|
||||||
|
return MAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mal_result mal_context_uninit__coreaudio(mal_context* pContext)
|
||||||
|
{
|
||||||
|
mal_assert(pContext != NULL);
|
||||||
|
mal_assert(pContext->backend == mal_backend_coreaudio);
|
||||||
|
|
||||||
|
// TODO: Implement me.
|
||||||
|
(void)pContext;
|
||||||
|
return MAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mal_device_uninit__coreaudio(mal_device* pDevice)
|
||||||
|
{
|
||||||
|
mal_assert(pDevice != NULL);
|
||||||
|
|
||||||
|
// TODO: Implement me.
|
||||||
|
(void)pDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
mal_result mal_device_init__coreaudio(mal_context* pContext, mal_device_type type, mal_device_id* pDeviceID, const mal_device_config* pConfig, mal_device* pDevice)
|
||||||
|
{
|
||||||
|
(void)pContext;
|
||||||
|
(void)type;
|
||||||
|
(void)pDeviceID;
|
||||||
|
(void)pConfig;
|
||||||
|
(void)pDevice;
|
||||||
|
|
||||||
|
// TODO: Implement me.
|
||||||
|
return MAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Core Audio
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -15742,6 +15839,7 @@ const mal_backend g_malDefaultBackends[] = {
|
|||||||
mal_backend_wasapi,
|
mal_backend_wasapi,
|
||||||
mal_backend_dsound,
|
mal_backend_dsound,
|
||||||
mal_backend_winmm,
|
mal_backend_winmm,
|
||||||
|
mal_backend_coreaudio,
|
||||||
mal_backend_oss,
|
mal_backend_oss,
|
||||||
mal_backend_pulseaudio,
|
mal_backend_pulseaudio,
|
||||||
mal_backend_alsa,
|
mal_backend_alsa,
|
||||||
@@ -15831,6 +15929,12 @@ mal_result mal_context_init(const mal_backend backends[], mal_uint32 backendCoun
|
|||||||
result = mal_context_init__jack(pContext);
|
result = mal_context_init__jack(pContext);
|
||||||
} break;
|
} break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef MAL_HAS_COREAUDIO
|
||||||
|
case mal_backend_coreaudio:
|
||||||
|
{
|
||||||
|
result = mal_context_init__coreaudio(pContext);
|
||||||
|
} break;
|
||||||
|
#endif
|
||||||
#ifdef MAL_HAS_OSS
|
#ifdef MAL_HAS_OSS
|
||||||
case mal_backend_oss:
|
case mal_backend_oss:
|
||||||
{
|
{
|
||||||
@@ -15929,6 +16033,12 @@ mal_result mal_context_uninit(mal_context* pContext)
|
|||||||
mal_context_uninit__jack(pContext);
|
mal_context_uninit__jack(pContext);
|
||||||
} break;
|
} break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef MAL_HAS_COREAUDIO
|
||||||
|
case mal_backend_coreaudio:
|
||||||
|
{
|
||||||
|
mal_context_uninit__coreaudio(pContext);
|
||||||
|
} break;
|
||||||
|
#endif
|
||||||
#ifdef MAL_HAS_OSS
|
#ifdef MAL_HAS_OSS
|
||||||
case mal_backend_oss:
|
case mal_backend_oss:
|
||||||
{
|
{
|
||||||
@@ -16269,6 +16379,12 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi
|
|||||||
result = mal_device_init__jack(pContext, type, pDeviceID, &config, pDevice);
|
result = mal_device_init__jack(pContext, type, pDeviceID, &config, pDevice);
|
||||||
} break;
|
} break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef MAL_HAS_COREAUDIO
|
||||||
|
case mal_backend_coreaudio:
|
||||||
|
{
|
||||||
|
result = mal_device_init__coreaudio(pContext, type, pDeviceID, &config, pDevice);
|
||||||
|
} break;
|
||||||
|
#endif
|
||||||
#ifdef MAL_HAS_OSS
|
#ifdef MAL_HAS_OSS
|
||||||
case mal_backend_oss:
|
case mal_backend_oss:
|
||||||
{
|
{
|
||||||
@@ -16484,6 +16600,11 @@ void mal_device_uninit(mal_device* pDevice)
|
|||||||
mal_device_uninit__jack(pDevice);
|
mal_device_uninit__jack(pDevice);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef MAL_HAS_COREAUDIO
|
||||||
|
if (pDevice->pContext->backend == mal_backend_coreaudio) {
|
||||||
|
mal_device_uninit__coreaudio(pDevice);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef MAL_HAS_OSS
|
#ifdef MAL_HAS_OSS
|
||||||
if (pDevice->pContext->backend == mal_backend_oss) {
|
if (pDevice->pContext->backend == mal_backend_oss) {
|
||||||
mal_device_uninit__oss(pDevice);
|
mal_device_uninit__oss(pDevice);
|
||||||
@@ -22251,7 +22372,7 @@ const char* mal_get_backend_name(mal_backend backend)
|
|||||||
case mal_backend_alsa: return "ALSA";
|
case mal_backend_alsa: return "ALSA";
|
||||||
case mal_backend_pulseaudio: return "PulseAudio";
|
case mal_backend_pulseaudio: return "PulseAudio";
|
||||||
case mal_backend_jack: return "JACK";
|
case mal_backend_jack: return "JACK";
|
||||||
//case mal_backend_coreaudio: return "Core Audio";
|
case mal_backend_coreaudio: return "Core Audio";
|
||||||
case mal_backend_oss: return "OSS";
|
case mal_backend_oss: return "OSS";
|
||||||
case mal_backend_opensl: return "OpenSL|ES";
|
case mal_backend_opensl: return "OpenSL|ES";
|
||||||
case mal_backend_openal: return "OpenAL";
|
case mal_backend_openal: return "OpenAL";
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ mal_backend g_Backends[] = {
|
|||||||
mal_backend_wasapi,
|
mal_backend_wasapi,
|
||||||
mal_backend_dsound,
|
mal_backend_dsound,
|
||||||
mal_backend_winmm,
|
mal_backend_winmm,
|
||||||
|
mal_backend_coreaudio,
|
||||||
mal_backend_oss,
|
mal_backend_oss,
|
||||||
mal_backend_pulseaudio,
|
mal_backend_pulseaudio,
|
||||||
mal_backend_alsa,
|
mal_backend_alsa,
|
||||||
|
|||||||
Reference in New Issue
Block a user