From 91ddce1d170e5e3932025a8b54b453db21accbb1 Mon Sep 17 00:00:00 2001 From: David Reid Date: Thu, 15 Jan 2026 14:42:14 +1000 Subject: [PATCH] PipeWire: Update to the new device info system. --- extras/backends/pipewire/miniaudio_pipewire.c | 20 +++++++------- miniaudio.h | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/extras/backends/pipewire/miniaudio_pipewire.c b/extras/backends/pipewire/miniaudio_pipewire.c index 4ad2084c..80d9dede 100644 --- a/extras/backends/pipewire/miniaudio_pipewire.c +++ b/extras/backends/pipewire/miniaudio_pipewire.c @@ -1693,11 +1693,12 @@ static ma_device_enumeration_result ma_context_enumerate_default_device_by_type_ ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), "Default Capture Device", (size_t)-1); } - /* Data Format. */ - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].format = ma_format_unknown; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].channels = 0; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].sampleRate = 0; - deviceInfo.nativeDataFormatCount += 1; + /* Data Format. PipeWire supports everything. Its maximum channel count is 64. */ + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_f32, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_s16, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_s32, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_s24, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_u8, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); return callback(deviceType, &deviceInfo, pUserData); } @@ -1902,10 +1903,11 @@ static void ma_registry_event_global_add_enumeration_by_type__pipewire(ma_enumer /* Data Format. Just support everything for now. */ /* TODO: See if there's a reasonable way to query the true "native" format. Maybe just initialize a stream and handle the SPA_PARAM_Format parameter in param_changed()? */ - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].format = ma_format_unknown; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].channels = 0; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].sampleRate = 0; - deviceInfo.nativeDataFormatCount += 1; + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_f32, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_s16, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_s32, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_s24, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + ma_device_info_add_native_data_format_2(&deviceInfo, ma_format_u8, 1, 64, ma_standard_sample_rate_min, ma_standard_sample_rate_max); ma_enumerate_devices_data_pipewire_add(pEnumData, deviceType, &deviceInfo); diff --git a/miniaudio.h b/miniaudio.h index 6cd8fabd..d63008c9 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -7580,6 +7580,11 @@ typedef struct } nativeDataFormats[16]; /* Should be big enough for [flags,format] to act as the key. */ } ma_device_info; +MA_API void ma_device_info_add_native_data_format_ex(ma_device_info* pDeviceInfo, ma_uint32 flags, ma_format format, ma_uint32 minChannels, ma_uint32 maxChannels, ma_uint32 minSampleRate, ma_uint32 maxSampleRate); +MA_API void ma_device_info_add_native_data_format_2(ma_device_info* pDeviceInfo, ma_format format, ma_uint32 minChannels, ma_uint32 maxChannels, ma_uint32 minSampleRate, ma_uint32 maxSampleRate); + + + struct ma_device_config { ma_device_type deviceType; @@ -19817,6 +19822,28 @@ MA_API void ma_device_info_add_native_data_format(ma_device_info* pDeviceInfo, m } } +MA_API void ma_device_info_add_native_data_format_ex(ma_device_info* pDeviceInfo, ma_uint32 flags, ma_format format, ma_uint32 minChannels, ma_uint32 maxChannels, ma_uint32 minSampleRate, ma_uint32 maxSampleRate) +{ + if (pDeviceInfo == NULL) { + return; + } + + if (pDeviceInfo->nativeDataFormatCount < ma_countof(pDeviceInfo->nativeDataFormats)) { + pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = flags; + pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = format; + pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].minChannels = minChannels; + pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].maxChannels = maxChannels; + pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].minSampleRate = minSampleRate; + pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].maxSampleRate = maxSampleRate; + pDeviceInfo->nativeDataFormatCount += 1; + } +} + +MA_API void ma_device_info_add_native_data_format_2(ma_device_info* pDeviceInfo, ma_format format, ma_uint32 minChannels, ma_uint32 maxChannels, ma_uint32 minSampleRate, ma_uint32 maxSampleRate) +{ + ma_device_info_add_native_data_format_ex(pDeviceInfo, 0, format, minChannels, maxChannels, minSampleRate, maxSampleRate); +} + #if defined(MA_WIN32) && !defined(MA_XBOX)