mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 01:04:02 +02:00
Core Audio: Potential fix for incorrect deinterleaving.
This commit is contained in:
+16
-1
@@ -19392,8 +19392,15 @@ OSStatus ma_on_output__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pA
|
||||
}
|
||||
} else {
|
||||
/* This is the deinterleaved case. We need to update each buffer in groups of internalChannels. This assumes each buffer is the same size. */
|
||||
|
||||
/*
|
||||
For safety we'll check that the internal channels is a multiple of the buffer count. If it's not it means something
|
||||
very strange has happened and we're not going to support it.
|
||||
*/
|
||||
if ((pBufferList->mNumberBuffers % pDevice->playback.internalChannels) == 0) {
|
||||
ma_uint8 tempBuffer[4096];
|
||||
UInt32 iBuffer;
|
||||
|
||||
for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; iBuffer += pDevice->playback.internalChannels) {
|
||||
ma_uint32 frameCountPerBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_sample(pDevice->playback.internalFormat);
|
||||
ma_uint32 framesRemaining = frameCountPerBuffer;
|
||||
@@ -19413,7 +19420,7 @@ OSStatus ma_on_output__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pA
|
||||
}
|
||||
|
||||
for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) {
|
||||
ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pBufferList->mBuffers[iBuffer].mData, (frameCountPerBuffer - framesRemaining) * ma_get_bytes_per_sample(pDevice->playback.internalFormat));
|
||||
ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pBufferList->mBuffers[iBuffer+iChannel].mData, (frameCountPerBuffer - framesRemaining) * ma_get_bytes_per_sample(pDevice->playback.internalFormat));
|
||||
}
|
||||
|
||||
ma_deinterleave_pcm_frames(pDevice->playback.internalFormat, pDevice->playback.internalChannels, framesToRead, tempBuffer, ppDeinterleavedBuffers);
|
||||
@@ -19422,6 +19429,7 @@ OSStatus ma_on_output__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pA
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(void)pActionFlags;
|
||||
(void)pTimeStamp;
|
||||
@@ -19505,6 +19513,12 @@ OSStatus ma_on_input__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pAc
|
||||
}
|
||||
} else {
|
||||
/* This is the deinterleaved case. We need to interleave the audio data before sending it to the client. This assumes each buffer is the same size. */
|
||||
|
||||
/*
|
||||
For safety we'll check that the internal channels is a multiple of the buffer count. If it's not it means something
|
||||
very strange has happened and we're not going to support it.
|
||||
*/
|
||||
if ((pRenderedBufferList->mNumberBuffers % pDevice->capture.internalChannels) == 0) {
|
||||
ma_uint8 tempBuffer[4096];
|
||||
UInt32 iBuffer;
|
||||
for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; iBuffer += pDevice->capture.internalChannels) {
|
||||
@@ -19533,6 +19547,7 @@ OSStatus ma_on_input__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pAc
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(void)pActionFlags;
|
||||
(void)pTimeStamp;
|
||||
|
||||
Reference in New Issue
Block a user