mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-22 00:06:59 +02:00
Optimization to ma_deinterleave_pcm_frames() for s32 and s24.
This commit is contained in:
+38
-8
@@ -52905,9 +52905,10 @@ MA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_
|
|||||||
{
|
{
|
||||||
const ma_uint8* pSrcU8 = (const ma_uint8*)pInterleavedPCMFrames;
|
const ma_uint8* pSrcU8 = (const ma_uint8*)pInterleavedPCMFrames;
|
||||||
ma_uint64 iPCMFrame;
|
ma_uint64 iPCMFrame;
|
||||||
for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {
|
|
||||||
|
for (iPCMFrame = 0; iPCMFrame < frameCount; iPCMFrame += 1) {
|
||||||
ma_uint32 iChannel;
|
ma_uint32 iChannel;
|
||||||
for (iChannel = 0; iChannel < channels; ++iChannel) {
|
for (iChannel = 0; iChannel < channels; iChannel += 1) {
|
||||||
ma_uint8* pDstU8 = (ma_uint8*)ppDeinterleavedPCMFrames[iChannel];
|
ma_uint8* pDstU8 = (ma_uint8*)ppDeinterleavedPCMFrames[iChannel];
|
||||||
pDstU8[iPCMFrame] = pSrcU8[iPCMFrame*channels+iChannel];
|
pDstU8[iPCMFrame] = pSrcU8[iPCMFrame*channels+iChannel];
|
||||||
}
|
}
|
||||||
@@ -52918,9 +52919,9 @@ MA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_
|
|||||||
{
|
{
|
||||||
const ma_int16* pSrcS16 = (const ma_int16*)pInterleavedPCMFrames;
|
const ma_int16* pSrcS16 = (const ma_int16*)pInterleavedPCMFrames;
|
||||||
ma_uint64 iPCMFrame;
|
ma_uint64 iPCMFrame;
|
||||||
for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {
|
for (iPCMFrame = 0; iPCMFrame < frameCount; iPCMFrame += 1) {
|
||||||
ma_uint32 iChannel;
|
ma_uint32 iChannel;
|
||||||
for (iChannel = 0; iChannel < channels; ++iChannel) {
|
for (iChannel = 0; iChannel < channels; iChannel += 1) {
|
||||||
ma_int16* pDstS16 = (ma_int16*)ppDeinterleavedPCMFrames[iChannel];
|
ma_int16* pDstS16 = (ma_int16*)ppDeinterleavedPCMFrames[iChannel];
|
||||||
pDstS16[iPCMFrame] = pSrcS16[iPCMFrame*channels+iChannel];
|
pDstS16[iPCMFrame] = pSrcS16[iPCMFrame*channels+iChannel];
|
||||||
}
|
}
|
||||||
@@ -52931,22 +52932,51 @@ MA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_
|
|||||||
{
|
{
|
||||||
const float* pSrcF32 = (const float*)pInterleavedPCMFrames;
|
const float* pSrcF32 = (const float*)pInterleavedPCMFrames;
|
||||||
ma_uint64 iPCMFrame;
|
ma_uint64 iPCMFrame;
|
||||||
for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {
|
for (iPCMFrame = 0; iPCMFrame < frameCount; iPCMFrame += 1) {
|
||||||
ma_uint32 iChannel;
|
ma_uint32 iChannel;
|
||||||
for (iChannel = 0; iChannel < channels; ++iChannel) {
|
for (iChannel = 0; iChannel < channels; iChannel += 1) {
|
||||||
float* pDstF32 = (float*)ppDeinterleavedPCMFrames[iChannel];
|
float* pDstF32 = (float*)ppDeinterleavedPCMFrames[iChannel];
|
||||||
pDstF32[iPCMFrame] = pSrcF32[iPCMFrame*channels+iChannel];
|
pDstF32[iPCMFrame] = pSrcF32[iPCMFrame*channels+iChannel];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case ma_format_s32:
|
||||||
|
{
|
||||||
|
const ma_int32* pSrcS32 = (const ma_int32*)pInterleavedPCMFrames;
|
||||||
|
ma_uint64 iPCMFrame;
|
||||||
|
for (iPCMFrame = 0; iPCMFrame < frameCount; iPCMFrame += 1) {
|
||||||
|
ma_uint32 iChannel;
|
||||||
|
for (iChannel = 0; iChannel < channels; iChannel += 1) {
|
||||||
|
ma_int32* pDstS32 = (ma_int32*)ppDeinterleavedPCMFrames[iChannel];
|
||||||
|
pDstS32[iPCMFrame] = pSrcS32[iPCMFrame*channels+iChannel];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case ma_format_s24:
|
||||||
|
{
|
||||||
|
const ma_uint8* pSrcS24 = (const ma_uint8*)pInterleavedPCMFrames;
|
||||||
|
ma_uint64 iPCMFrame;
|
||||||
|
for (iPCMFrame = 0; iPCMFrame < frameCount; iPCMFrame += 1) {
|
||||||
|
ma_uint32 iChannel;
|
||||||
|
for (iChannel = 0; iChannel < channels; iChannel += 1) {
|
||||||
|
ma_uint8* pDstS24 = (ma_uint8*)ppDeinterleavedPCMFrames[iChannel];
|
||||||
|
pDstS24[iPCMFrame + 0] = pSrcS24[(iPCMFrame*channels+iChannel)*3 + 0];
|
||||||
|
pDstS24[iPCMFrame + 1] = pSrcS24[(iPCMFrame*channels+iChannel)*3 + 1];
|
||||||
|
pDstS24[iPCMFrame + 2] = pSrcS24[(iPCMFrame*channels+iChannel)*3 + 2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
/* Generic fallback. Should never actually hit this. */
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format);
|
ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format);
|
||||||
ma_uint64 iPCMFrame;
|
ma_uint64 iPCMFrame;
|
||||||
for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {
|
for (iPCMFrame = 0; iPCMFrame < frameCount; iPCMFrame += 1) {
|
||||||
ma_uint32 iChannel;
|
ma_uint32 iChannel;
|
||||||
for (iChannel = 0; iChannel < channels; ++iChannel) {
|
for (iChannel = 0; iChannel < channels; iChannel += 1) {
|
||||||
void* pDst = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes);
|
void* pDst = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes);
|
||||||
const void* pSrc = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes);
|
const void* pSrc = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes);
|
||||||
memcpy(pDst, pSrc, sampleSizeInBytes);
|
memcpy(pDst, pSrc, sampleSizeInBytes);
|
||||||
|
|||||||
Reference in New Issue
Block a user