mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 09:14:04 +02:00
WinMM: Optimize some memory allocations.
This commit is contained in:
+19
-8
@@ -27278,6 +27278,8 @@ static ma_result ma_device_init__winmm(ma_device* pDevice, const void* pDeviceBa
|
|||||||
The heap allocated data is allocated like so:
|
The heap allocated data is allocated like so:
|
||||||
|
|
||||||
[Capture WAVEHDRs][Playback WAVEHDRs][Capture Intermediary Buffer][Playback Intermediary Buffer]
|
[Capture WAVEHDRs][Playback WAVEHDRs][Capture Intermediary Buffer][Playback Intermediary Buffer]
|
||||||
|
|
||||||
|
We attach this to the end of the device state struct.
|
||||||
*/
|
*/
|
||||||
heapSize = 0;
|
heapSize = 0;
|
||||||
if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {
|
if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {
|
||||||
@@ -27287,13 +27289,24 @@ static ma_result ma_device_init__winmm(ma_device* pDevice, const void* pDeviceBa
|
|||||||
heapSize += sizeof(MA_WAVEHDR)*pDescriptorPlayback->periodCount + (pDescriptorPlayback->periodSizeInFrames * pDescriptorPlayback->periodCount * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels));
|
heapSize += sizeof(MA_WAVEHDR)*pDescriptorPlayback->periodCount + (pDescriptorPlayback->periodSizeInFrames * pDescriptorPlayback->periodCount * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels));
|
||||||
}
|
}
|
||||||
|
|
||||||
pDeviceStateWinMM->_pHeapData = (ma_uint8*)ma_calloc(heapSize, ma_device_get_allocation_callbacks(pDevice));
|
{
|
||||||
if (pDeviceStateWinMM->_pHeapData == NULL) {
|
size_t newDeviceStateAllocSize;
|
||||||
errorMsg = "[WinMM] Failed to allocate memory for the intermediary buffer.", errorCode = MA_OUT_OF_MEMORY;
|
ma_device_state_winmm* pNewDeviceStateWinMM;
|
||||||
goto on_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
MA_ZERO_MEMORY(pDeviceStateWinMM->_pHeapData, heapSize);
|
newDeviceStateAllocSize = 0;
|
||||||
|
newDeviceStateAllocSize += ma_align_64(sizeof(*pDeviceStateWinMM));
|
||||||
|
newDeviceStateAllocSize += ma_align_64(heapSize);
|
||||||
|
|
||||||
|
pNewDeviceStateWinMM = (ma_device_state_winmm*)ma_realloc(pDeviceStateWinMM, newDeviceStateAllocSize, ma_device_get_allocation_callbacks(pDevice));
|
||||||
|
if (pNewDeviceStateWinMM == NULL) {
|
||||||
|
goto on_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
pDeviceStateWinMM = pNewDeviceStateWinMM;
|
||||||
|
|
||||||
|
pDeviceStateWinMM->_pHeapData = (ma_uint8*)ma_offset_ptr(pDeviceStateWinMM, ma_align_64(sizeof(*pDeviceStateWinMM)));
|
||||||
|
MA_ZERO_MEMORY(pDeviceStateWinMM->_pHeapData, heapSize);
|
||||||
|
}
|
||||||
|
|
||||||
if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {
|
if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {
|
||||||
ma_uint32 iPeriod;
|
ma_uint32 iPeriod;
|
||||||
@@ -27374,7 +27387,6 @@ on_error:
|
|||||||
pContextStateWinMM->waveOutClose(pDeviceStateWinMM->hDevicePlayback);
|
pContextStateWinMM->waveOutClose(pDeviceStateWinMM->hDevicePlayback);
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_free(pDeviceStateWinMM->_pHeapData, ma_device_get_allocation_callbacks(pDevice));
|
|
||||||
ma_free(pDeviceStateWinMM, ma_device_get_allocation_callbacks(pDevice));
|
ma_free(pDeviceStateWinMM, ma_device_get_allocation_callbacks(pDevice));
|
||||||
|
|
||||||
if (errorMsg != NULL && errorMsg[0] != '\0') {
|
if (errorMsg != NULL && errorMsg[0] != '\0') {
|
||||||
@@ -27401,7 +27413,6 @@ static void ma_device_uninit__winmm(ma_device* pDevice)
|
|||||||
CloseHandle(pDeviceStateWinMM->hEventPlayback);
|
CloseHandle(pDeviceStateWinMM->hEventPlayback);
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_free(pDeviceStateWinMM->_pHeapData, ma_device_get_allocation_callbacks(pDevice));
|
|
||||||
ma_free(pDeviceStateWinMM, ma_device_get_allocation_callbacks(pDevice));
|
ma_free(pDeviceStateWinMM, ma_device_get_allocation_callbacks(pDevice));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user