Commit 64a1941f authored by David Reid's avatar David Reid

Reduce some stack allocation space.

parent 11e1be78
...@@ -3899,7 +3899,7 @@ struct ma_device ...@@ -3899,7 +3899,7 @@ struct ma_device
ma_uint32 currentPeriodFramesRemainingPlayback; ma_uint32 currentPeriodFramesRemainingPlayback;
ma_uint32 currentPeriodFramesRemainingCapture; ma_uint32 currentPeriodFramesRemainingCapture;
ma_uint64 lastProcessedFramePlayback; ma_uint64 lastProcessedFramePlayback;
ma_uint32 lastProcessedFrameCapture; ma_uint64 lastProcessedFrameCapture;
ma_bool32 isStarted; ma_bool32 isStarted;
} null_device; } null_device;
#endif #endif
...@@ -11032,6 +11032,10 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice) ...@@ -11032,6 +11032,10 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice)
{ {
ma_result result = MA_SUCCESS; ma_result result = MA_SUCCESS;
ma_bool32 exitLoop = MA_FALSE; ma_bool32 exitLoop = MA_FALSE;
ma_uint8 capturedDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];
ma_uint8 playbackDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];
ma_uint32 capturedDeviceDataCapInFrames = sizeof(capturedDeviceData) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);
ma_uint32 playbackDeviceDataCapInFrames = sizeof(playbackDeviceData) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);
MA_ASSERT(pDevice != NULL); MA_ASSERT(pDevice != NULL);
...@@ -11053,10 +11057,6 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice) ...@@ -11053,10 +11057,6 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice)
ma_uint32 capturedDevicePeriodSizeInFrames = ma_min(pDevice->capture.internalPeriodSizeInFrames, pDevice->playback.internalPeriodSizeInFrames); ma_uint32 capturedDevicePeriodSizeInFrames = ma_min(pDevice->capture.internalPeriodSizeInFrames, pDevice->playback.internalPeriodSizeInFrames);
while (totalCapturedDeviceFramesProcessed < capturedDevicePeriodSizeInFrames) { while (totalCapturedDeviceFramesProcessed < capturedDevicePeriodSizeInFrames) {
ma_uint8 capturedDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];
ma_uint8 playbackDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];
ma_uint32 capturedDeviceDataCapInFrames = sizeof(capturedDeviceData) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);
ma_uint32 playbackDeviceDataCapInFrames = sizeof(playbackDeviceData) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);
ma_uint32 capturedDeviceFramesRemaining; ma_uint32 capturedDeviceFramesRemaining;
ma_uint32 capturedDeviceFramesProcessed; ma_uint32 capturedDeviceFramesProcessed;
ma_uint32 capturedDeviceFramesToProcess; ma_uint32 capturedDeviceFramesToProcess;
...@@ -11137,26 +11137,23 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice) ...@@ -11137,26 +11137,23 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice)
case ma_device_type_capture: case ma_device_type_capture:
{ {
/* We read in chunks of the period size, but use a stack allocated buffer for the intermediary. */
ma_uint8 intermediaryBuffer[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];
ma_uint32 intermediaryBufferSizeInFrames = sizeof(intermediaryBuffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);
ma_uint32 periodSizeInFrames = pDevice->capture.internalPeriodSizeInFrames; ma_uint32 periodSizeInFrames = pDevice->capture.internalPeriodSizeInFrames;
ma_uint32 framesReadThisPeriod = 0; ma_uint32 framesReadThisPeriod = 0;
while (framesReadThisPeriod < periodSizeInFrames) { while (framesReadThisPeriod < periodSizeInFrames) {
ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesReadThisPeriod; ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesReadThisPeriod;
ma_uint32 framesProcessed; ma_uint32 framesProcessed;
ma_uint32 framesToReadThisIteration = framesRemainingInPeriod; ma_uint32 framesToReadThisIteration = framesRemainingInPeriod;
if (framesToReadThisIteration > intermediaryBufferSizeInFrames) { if (framesToReadThisIteration > capturedDeviceDataCapInFrames) {
framesToReadThisIteration = intermediaryBufferSizeInFrames; framesToReadThisIteration = capturedDeviceDataCapInFrames;
} }
result = ma_device_read__null(pDevice, intermediaryBuffer, framesToReadThisIteration, &framesProcessed); result = ma_device_read__null(pDevice, capturedDeviceData, framesToReadThisIteration, &framesProcessed);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
exitLoop = MA_TRUE; exitLoop = MA_TRUE;
break; break;
} }
ma_device__send_frames_to_client(pDevice, framesProcessed, intermediaryBuffer); ma_device__send_frames_to_client(pDevice, framesProcessed, capturedDeviceData);
framesReadThisPeriod += framesProcessed; framesReadThisPeriod += framesProcessed;
} }
...@@ -11165,21 +11162,19 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice) ...@@ -11165,21 +11162,19 @@ static ma_result ma_device_main_loop__null(ma_device* pDevice)
case ma_device_type_playback: case ma_device_type_playback:
{ {
/* We write in chunks of the period size, but use a stack allocated buffer for the intermediary. */ /* We write in chunks of the period size, but use a stack allocated buffer for the intermediary. */
ma_uint8 intermediaryBuffer[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];
ma_uint32 intermediaryBufferSizeInFrames = sizeof(intermediaryBuffer) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);
ma_uint32 periodSizeInFrames = pDevice->playback.internalPeriodSizeInFrames; ma_uint32 periodSizeInFrames = pDevice->playback.internalPeriodSizeInFrames;
ma_uint32 framesWrittenThisPeriod = 0; ma_uint32 framesWrittenThisPeriod = 0;
while (framesWrittenThisPeriod < periodSizeInFrames) { while (framesWrittenThisPeriod < periodSizeInFrames) {
ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesWrittenThisPeriod; ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesWrittenThisPeriod;
ma_uint32 framesProcessed; ma_uint32 framesProcessed;
ma_uint32 framesToWriteThisIteration = framesRemainingInPeriod; ma_uint32 framesToWriteThisIteration = framesRemainingInPeriod;
if (framesToWriteThisIteration > intermediaryBufferSizeInFrames) { if (framesToWriteThisIteration > playbackDeviceDataCapInFrames) {
framesToWriteThisIteration = intermediaryBufferSizeInFrames; framesToWriteThisIteration = playbackDeviceDataCapInFrames;
} }
ma_device__read_frames_from_client(pDevice, framesToWriteThisIteration, intermediaryBuffer); ma_device__read_frames_from_client(pDevice, framesToWriteThisIteration, playbackDeviceData);
result = ma_device_write__null(pDevice, intermediaryBuffer, framesToWriteThisIteration, &framesProcessed); result = ma_device_write__null(pDevice, playbackDeviceData, framesToWriteThisIteration, &framesProcessed);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
exitLoop = MA_TRUE; exitLoop = MA_TRUE;
break; break;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment