App-MHFS
view release on metacpan or search on metacpan
share/public_html/static/music_inc/src/miniaudio.h view on Meta::CPAN
if (result != MA_SUCCESS) {
return result;
}
MA_ZERO_OBJECT(&caps);
caps.dwSize = sizeof(caps);
hr = ma_IDirectSound_GetCaps(pDirectSound, &caps);
if (FAILED(hr)) {
return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSound_GetCaps() failed for playback device.", ma_result_from_HRESULT(hr));
}
if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) {
/* It supports at least stereo, but could support more. */
WORD channels = 2;
/* Look at the speaker configuration to get a better idea on the channel count. */
DWORD speakerConfig;
hr = ma_IDirectSound_GetSpeakerConfig(pDirectSound, &speakerConfig);
if (SUCCEEDED(hr)) {
ma_get_channels_from_speaker_config__dsound(speakerConfig, &channels, NULL);
}
pDeviceInfo->minChannels = channels;
pDeviceInfo->maxChannels = channels;
} else {
/* It does not support stereo, which means we are stuck with mono. */
pDeviceInfo->minChannels = 1;
pDeviceInfo->maxChannels = 1;
}
/* Sample rate. */
if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) {
pDeviceInfo->minSampleRate = caps.dwMinSecondarySampleRate;
pDeviceInfo->maxSampleRate = caps.dwMaxSecondarySampleRate;
/*
On my machine the min and max sample rates can return 100 and 200000 respectively. I'd rather these be within
the range of our standard sample rates so I'm clamping.
*/
if (caps.dwMinSecondarySampleRate < MA_MIN_SAMPLE_RATE && caps.dwMaxSecondarySampleRate >= MA_MIN_SAMPLE_RATE) {
pDeviceInfo->minSampleRate = MA_MIN_SAMPLE_RATE;
}
if (caps.dwMaxSecondarySampleRate > MA_MAX_SAMPLE_RATE && caps.dwMinSecondarySampleRate <= MA_MAX_SAMPLE_RATE) {
pDeviceInfo->maxSampleRate = MA_MAX_SAMPLE_RATE;
}
} else {
/* Only supports a single sample rate. Set both min an max to the same thing. Do not clamp within the standard rates. */
pDeviceInfo->minSampleRate = caps.dwMaxSecondarySampleRate;
pDeviceInfo->maxSampleRate = caps.dwMaxSecondarySampleRate;
}
/* DirectSound can support all formats. */
pDeviceInfo->formatCount = ma_format_count - 1; /* Minus one because we don't want to include ma_format_unknown. */
for (iFormat = 0; iFormat < pDeviceInfo->formatCount; ++iFormat) {
pDeviceInfo->formats[iFormat] = (ma_format)(iFormat + 1); /* +1 to skip over ma_format_unknown. */
}
ma_IDirectSound_Release(pDirectSound);
} else {
/*
Capture. This is a little different to playback due to the say the supported formats are reported. Technically capture
devices can support a number of different formats, but for simplicity and consistency with ma_device_init() I'm just
reporting the best format.
*/
ma_IDirectSoundCapture* pDirectSoundCapture;
WORD channels;
WORD bitsPerSample;
DWORD sampleRate;
result = ma_context_create_IDirectSoundCapture__dsound(pContext, shareMode, pDeviceID, &pDirectSoundCapture);
if (result != MA_SUCCESS) {
return result;
}
result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pContext, pDirectSoundCapture, &channels, &bitsPerSample, &sampleRate);
if (result != MA_SUCCESS) {
ma_IDirectSoundCapture_Release(pDirectSoundCapture);
return result;
}
pDeviceInfo->minChannels = channels;
pDeviceInfo->maxChannels = channels;
pDeviceInfo->minSampleRate = sampleRate;
pDeviceInfo->maxSampleRate = sampleRate;
pDeviceInfo->formatCount = 1;
if (bitsPerSample == 8) {
pDeviceInfo->formats[0] = ma_format_u8;
} else if (bitsPerSample == 16) {
pDeviceInfo->formats[0] = ma_format_s16;
} else if (bitsPerSample == 24) {
pDeviceInfo->formats[0] = ma_format_s24;
} else if (bitsPerSample == 32) {
pDeviceInfo->formats[0] = ma_format_s32;
} else {
ma_IDirectSoundCapture_Release(pDirectSoundCapture);
return MA_FORMAT_NOT_SUPPORTED;
}
ma_IDirectSoundCapture_Release(pDirectSoundCapture);
}
return MA_SUCCESS;
}
static void ma_device_uninit__dsound(ma_device* pDevice)
{
MA_ASSERT(pDevice != NULL);
if (pDevice->dsound.pCaptureBuffer != NULL) {
ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);
}
if (pDevice->dsound.pCapture != NULL) {
ma_IDirectSoundCapture_Release((ma_IDirectSoundCapture*)pDevice->dsound.pCapture);
}
if (pDevice->dsound.pPlaybackBuffer != NULL) {
ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer);
}
if (pDevice->dsound.pPlaybackPrimaryBuffer != NULL) {
( run in 0.853 second using v1.01-cache-2.11-cpan-9169edd2b0e )