From b5213e02659ca36c6c8c261423f10437ae674420 Mon Sep 17 00:00:00 2001 From: David Reid Date: Thu, 15 Jan 2026 19:41:10 +1000 Subject: [PATCH] DirectSound: Update to new device info system. --- miniaudio.h | 49 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/miniaudio.h b/miniaudio.h index 54b6fe08..b54ee9c2 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -25539,6 +25539,9 @@ static BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(GUID* lpGuid, ma_device_info deviceInfo; ma_result result; HRESULT hr; + ma_uint32 iFormat; + ma_uint32 minSampleRate = 0xFFFFFFFF; + ma_uint32 maxSampleRate = 0; (void)lpcstrModule; @@ -25600,25 +25603,21 @@ static BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(GUID* lpGuid, in order to keep the size of this within reason. */ if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) { - /* Multiple sample rates are supported. We'll report in order of our preferred sample rates. */ - size_t iStandardSampleRate; - for (iStandardSampleRate = 0; iStandardSampleRate < ma_countof(ma_standard_sample_rates); iStandardSampleRate += 1) { - ma_uint32 sampleRate = ma_standard_sample_rates[iStandardSampleRate]; - if (sampleRate >= caps.dwMinSecondarySampleRate && sampleRate <= caps.dwMaxSecondarySampleRate) { - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].format = ma_format_unknown; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].channels = channels; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].sampleRate = sampleRate; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].flags = 0; - deviceInfo.nativeDataFormatCount += 1; - } - } + /* A range of sample rates are supported. */ + minSampleRate = caps.dwMinSecondarySampleRate; + maxSampleRate = caps.dwMaxSecondarySampleRate; } else { /* Only a single sample rate is supported. */ - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].format = ma_format_unknown; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].channels = channels; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].sampleRate = caps.dwMaxSecondarySampleRate; - deviceInfo.nativeDataFormats[deviceInfo.nativeDataFormatCount].flags = 0; - deviceInfo.nativeDataFormatCount += 1; + minSampleRate = maxSampleRate = caps.dwMaxSecondarySampleRate; + } + + /* DirectSound will have the minimum sample rate set to something stupidly small like 100. We're going to clamp it. */ + minSampleRate = ma_clamp(minSampleRate, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + maxSampleRate = ma_clamp(maxSampleRate, ma_standard_sample_rate_min, ma_standard_sample_rate_max); + + /* All formats are supported. */ + for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); iFormat += 1) { + ma_device_info_add_native_data_format_2(&deviceInfo, g_maFormatPriorities[iFormat], channels, channels, minSampleRate, maxSampleRate); } ma_IDirectSound_Release(pDirectSound); @@ -25631,6 +25630,7 @@ static BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(GUID* lpGuid, ma_IDirectSoundCapture* pDirectSoundCapture; WORD channels; WORD bitsPerSample; + ma_format format; DWORD sampleRate; result = ma_context_create_IDirectSoundCapture__dsound(pData->pContext, ma_share_mode_shared, &deviceInfo.id, &pDirectSoundCapture); @@ -25648,21 +25648,18 @@ static BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(GUID* lpGuid, /* The format is always an integer format and is based on the bits per sample. */ if (bitsPerSample == 8) { - deviceInfo.nativeDataFormats[0].format = ma_format_u8; + format = ma_format_u8; } else if (bitsPerSample == 16) { - deviceInfo.nativeDataFormats[0].format = ma_format_s16; + format = ma_format_s16; } else if (bitsPerSample == 24) { - deviceInfo.nativeDataFormats[0].format = ma_format_s24; + format = ma_format_s24; } else if (bitsPerSample == 32) { - deviceInfo.nativeDataFormats[0].format = ma_format_s32; + format = ma_format_s32; } else { - deviceInfo.nativeDataFormats[0].format = ma_format_unknown; + format = ma_format_unknown; } - deviceInfo.nativeDataFormats[0].channels = channels; - deviceInfo.nativeDataFormats[0].sampleRate = sampleRate; - deviceInfo.nativeDataFormats[0].flags = 0; - deviceInfo.nativeDataFormatCount = 1; + ma_device_info_add_native_data_format_2(&deviceInfo, format, channels, channels, sampleRate, sampleRate); }