Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
miniaudio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
miniaudio
Commits
5bf26d35
Commit
5bf26d35
authored
Apr 01, 2018
by
David Reid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove some bloat from mal_dsp.
parent
165350e7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
43 additions
and
45 deletions
+43
-45
mini_al.h
mini_al.h
+43
-45
No files found.
mini_al.h
View file @
5bf26d35
...
@@ -815,10 +815,8 @@ typedef struct
...
@@ -815,10 +815,8 @@ typedef struct
struct mal_dsp
struct mal_dsp
{
{
mal_dsp_config
config
;
// TODO: Remove this.
mal_dsp_read_proc onRead;
void* pUserData;
//mal_dsp_read_proc onRead;
//void* pUserDataForOnRead;
mal_format_converter formatConverterIn; // For converting data to f32 in preparation for further processing.
mal_format_converter formatConverterIn; // For converting data to f32 in preparation for further processing.
mal_format_converter formatConverterOut; // For converting data to the requested output format. Used as the final step in the processing pipeline.
mal_format_converter formatConverterOut; // For converting data to the requested output format. Used as the final step in the processing pipeline.
mal_channel_router channelRouter; // For channel conversion.
mal_channel_router channelRouter; // For channel conversion.
...
@@ -3320,7 +3318,7 @@ static inline mal_uint32 mal_device__read_frames_from_client(mal_device* pDevice
...
@@ -3320,7 +3318,7 @@ static inline mal_uint32 mal_device__read_frames_from_client(mal_device* pDevice
mal_assert(frameCount > 0);
mal_assert(frameCount > 0);
mal_assert(pSamples != NULL);
mal_assert(pSamples != NULL);
mal_uint32
framesRead
=
(
mal_uint32
)
mal_dsp_read
(
&
pDevice
->
dsp
,
frameCount
,
pSamples
,
pDevice
->
dsp
.
config
.
pUserData
);
mal_uint32 framesRead = (mal_uint32)mal_dsp_read(&pDevice->dsp, frameCount, pSamples, pDevice->dsp.pUserData);
mal_uint32 samplesRead = framesRead * pDevice->internalChannels;
mal_uint32 samplesRead = framesRead * pDevice->internalChannels;
mal_uint32 sampleSize = mal_get_bytes_per_sample(pDevice->internalFormat);
mal_uint32 sampleSize = mal_get_bytes_per_sample(pDevice->internalFormat);
mal_uint32 consumedBytes = samplesRead*sampleSize;
mal_uint32 consumedBytes = samplesRead*sampleSize;
...
@@ -3346,7 +3344,7 @@ static inline void mal_device__send_frames_to_client(mal_device* pDevice, mal_ui
...
@@ -3346,7 +3344,7 @@ static inline void mal_device__send_frames_to_client(mal_device* pDevice, mal_ui
mal_uint32 chunkFrameCount = sizeof(chunkBuffer) / mal_get_bytes_per_sample(pDevice->format) / pDevice->channels;
mal_uint32 chunkFrameCount = sizeof(chunkBuffer) / mal_get_bytes_per_sample(pDevice->format) / pDevice->channels;
for (;;) {
for (;;) {
mal_uint32
framesJustRead
=
(
mal_uint32
)
mal_dsp_read
(
&
pDevice
->
dsp
,
chunkFrameCount
,
chunkBuffer
,
pDevice
->
dsp
.
config
.
pUserData
);
mal_uint32 framesJustRead = (mal_uint32)mal_dsp_read(&pDevice->dsp, chunkFrameCount, chunkBuffer, pDevice->dsp.pUserData);
if (framesJustRead == 0) {
if (framesJustRead == 0) {
break;
break;
}
}
...
@@ -18660,7 +18658,7 @@ mal_uint32 mal_dsp__pre_format_converter_on_read(mal_format_converter* pConverte
...
@@ -18660,7 +18658,7 @@ mal_uint32 mal_dsp__pre_format_converter_on_read(mal_format_converter* pConverte
mal_dsp* pDSP = pData->pDSP;
mal_dsp* pDSP = pData->pDSP;
mal_assert(pDSP != NULL);
mal_assert(pDSP != NULL);
return
pDSP
->
config
.
onRead
(
pDSP
,
frameCount
,
pFramesOut
,
pData
->
pUserDataForClient
);
return pDSP->onRead(pDSP, frameCount, pFramesOut, pData->pUserDataForClient);
}
}
mal_uint32 mal_dsp__post_format_converter_on_read(mal_format_converter* pConverter, mal_uint32 frameCount, void* pFramesOut, void* pUserData)
mal_uint32 mal_dsp__post_format_converter_on_read(mal_format_converter* pConverter, mal_uint32 frameCount, void* pFramesOut, void* pUserData)
...
@@ -18678,7 +18676,7 @@ mal_uint32 mal_dsp__post_format_converter_on_read(mal_format_converter* pConvert
...
@@ -18678,7 +18676,7 @@ mal_uint32 mal_dsp__post_format_converter_on_read(mal_format_converter* pConvert
mal_assert(pDSP->isChannelRoutingRequired == MAL_FALSE);
mal_assert(pDSP->isChannelRoutingRequired == MAL_FALSE);
mal_assert(pDSP->isSRCRequired == MAL_FALSE);
mal_assert(pDSP->isSRCRequired == MAL_FALSE);
return
pDSP
->
config
.
onRead
(
pDSP
,
frameCount
,
pFramesOut
,
pData
->
pUserDataForClient
);
return pDSP->onRead(pDSP, frameCount, pFramesOut, pData->pUserDataForClient);
}
}
mal_uint32 mal_dsp__post_format_converter_on_read_deinterleaved(mal_format_converter* pConverter, mal_uint32 frameCount, void** ppSamplesOut, void* pUserData)
mal_uint32 mal_dsp__post_format_converter_on_read_deinterleaved(mal_format_converter* pConverter, mal_uint32 frameCount, void** ppSamplesOut, void* pUserData)
...
@@ -18709,7 +18707,7 @@ mal_uint32 mal_dsp__src_on_read(mal_src* pSRC, mal_uint32 frameCount, void* pFra
...
@@ -18709,7 +18707,7 @@ mal_uint32 mal_dsp__src_on_read(mal_src* pSRC, mal_uint32 frameCount, void* pFra
mal_dsp* pDSP = (mal_dsp*)pUserData;
mal_dsp* pDSP = (mal_dsp*)pUserData;
mal_assert(pDSP != NULL);
mal_assert(pDSP != NULL);
return
pDSP
->
config
.
onRead
(
pDSP
,
frameCount
,
pFramesOut
,
pDSP
->
config
.
pUserData
);
return pDSP->
onRead(pDSP, frameCount, pFramesOut, pDSP->
pUserData);
}
}
mal_uint32 mal_dsp__src_on_read_deinterleaved(mal_src* pSRC, mal_uint32 frameCount, void** ppSamplesOut, void* pUserData)
mal_uint32 mal_dsp__src_on_read_deinterleaved(mal_src* pSRC, mal_uint32 frameCount, void** ppSamplesOut, void* pUserData)
...
@@ -18759,13 +18757,8 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
...
@@ -18759,13 +18757,8 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
}
}
mal_zero_object(pDSP);
mal_zero_object(pDSP);
pDSP
->
config
=
*
pConfig
;
pDSP->onRead = pConfig->onRead;
//pDSP->onRead = onRead;
pDSP->pUserData = pConfig->pUserData;
//pDSP->pUserData = pUserData;
if
(
pDSP
->
config
.
cacheSizeInFrames
>
MAL_SRC_CACHE_SIZE_IN_FRAMES
||
pDSP
->
config
.
cacheSizeInFrames
==
0
)
{
pDSP
->
config
.
cacheSizeInFrames
=
MAL_SRC_CACHE_SIZE_IN_FRAMES
;
}
// This is generally the pipeline used for data conversion. Note that this can actually change which is explained later.
// This is generally the pipeline used for data conversion. Note that this can actually change which is explained later.
//
//
...
@@ -18774,7 +18767,7 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
...
@@ -18774,7 +18767,7 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
// Pre Format Conversion
// Pre Format Conversion
// ---------------------
// ---------------------
// This is where the sample data is converted to a format that's usable by the later stages in the pipeline. Input data
// This is where the sample data is converted to a format that's usable by the later stages in the pipeline. Input data
// is converted
from the original input data
to deinterleaved floating-point.
// is converted to deinterleaved floating-point.
//
//
// Channel Routing
// Channel Routing
// ---------------
// ---------------
...
@@ -18816,6 +18809,8 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
...
@@ -18816,6 +18809,8 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
// will look like this:
// will look like this:
//
//
// Pre Format Conversion -> Channel Routing -> Sample Rate Conversion -> Post Format Conversion
// Pre Format Conversion -> Channel Routing -> Sample Rate Conversion -> Post Format Conversion
//
// Notice how the Channel Routing and Sample Rate Conversion stages are swapped so that the SRC stage has less data to process.
// First we need to determin what's required and what's not.
// First we need to determin what's required and what's not.
if (pConfig->sampleRateIn != pConfig->sampleRateOut) {
if (pConfig->sampleRateIn != pConfig->sampleRateOut) {
...
@@ -18885,7 +18880,7 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
...
@@ -18885,7 +18880,7 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
postFormatConverterConfig.formatIn = mal_format_f32;
postFormatConverterConfig.formatIn = mal_format_f32;
}
}
result
=
mal_format_converter_init
(
&
postFormatConverterConfig
,
&
pDSP
->
formatConverter
In
);
result = mal_format_converter_init(&postFormatConverterConfig, &pDSP->formatConverter
Out
);
if (result != MAL_SUCCESS) {
if (result != MAL_SUCCESS) {
return result;
return result;
}
}
...
@@ -18902,6 +18897,9 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
...
@@ -18902,6 +18897,9 @@ mal_result mal_dsp_init(const mal_dsp_config* pConfig, mal_dsp* pDSP)
srcConfig.channels = pConfig->channelsIn;
srcConfig.channels = pConfig->channelsIn;
srcConfig.algorithm = pConfig->srcAlgorithm;
srcConfig.algorithm = pConfig->srcAlgorithm;
srcConfig.cacheSizeInFrames = pConfig->cacheSizeInFrames;
srcConfig.cacheSizeInFrames = pConfig->cacheSizeInFrames;
if (srcConfig.cacheSizeInFrames > MAL_SRC_CACHE_SIZE_IN_FRAMES || srcConfig.cacheSizeInFrames == 0) {
srcConfig.cacheSizeInFrames = MAL_SRC_CACHE_SIZE_IN_FRAMES;
}
result = mal_src_init(&srcConfig, mal_dsp__src_on_read, pDSP, &pDSP->src);
result = mal_src_init(&srcConfig, mal_dsp__src_on_read, pDSP, &pDSP->src);
if (result != MAL_SUCCESS) {
if (result != MAL_SUCCESS) {
return result;
return result;
...
@@ -18987,25 +18985,25 @@ mal_result mal_dsp_refresh_sample_rate(mal_dsp* pDSP)
...
@@ -18987,25 +18985,25 @@ mal_result mal_dsp_refresh_sample_rate(mal_dsp* pDSP)
// If we already have an SRC pipeline initialized we do _not_ want to re-create it. Instead we adjust it. If we didn't previously
// If we already have an SRC pipeline initialized we do _not_ want to re-create it. Instead we adjust it. If we didn't previously
// have an SRC pipeline in place we'll need to initialize it.
// have an SRC pipeline in place we'll need to initialize it.
if (pDSP->isSRCRequired) {
if (pDSP->isSRCRequired) {
if
(
pDSP
->
config
.
sampleRateIn
!=
pDSP
->
config
.
sampleRateOut
)
{
if (pDSP->
src.config.sampleRateIn != pDSP->src.
config.sampleRateOut) {
mal_src_set_input_sample_rate
(
&
pDSP
->
src
,
pDSP
->
config
.
sampleRateIn
);
mal_src_set_input_sample_rate(&pDSP->src, pDSP->
src.
config.sampleRateIn);
mal_src_set_output_sample_rate
(
&
pDSP
->
src
,
pDSP
->
config
.
sampleRateOut
);
mal_src_set_output_sample_rate(&pDSP->src, pDSP->
src.
config.sampleRateOut);
} else {
} else {
pDSP->isSRCRequired = MAL_FALSE;
pDSP->isSRCRequired = MAL_FALSE;
}
}
} else {
} else {
// We may need a new SRC pipeline.
// We may need a new SRC pipeline.
if
(
pDSP
->
config
.
sampleRateIn
!=
pDSP
->
config
.
sampleRateOut
)
{
if (pDSP->
src.config.sampleRateIn != pDSP->src.
config.sampleRateOut) {
pDSP->isSRCRequired = MAL_TRUE;
pDSP->isSRCRequired = MAL_TRUE;
mal_src_config srcConfig;
mal_src_config srcConfig;
srcConfig
.
sampleRateIn
=
pDSP
->
config
.
sampleRateIn
;
srcConfig.sampleRateIn = pDSP->
src.
config.sampleRateIn;
srcConfig
.
sampleRateOut
=
pDSP
->
config
.
sampleRateOut
;
srcConfig.sampleRateOut = pDSP->
src.
config.sampleRateOut;
srcConfig
.
formatIn
=
pDSP
->
config
.
formatIn
;
srcConfig.formatIn = pDSP->
src.
config.formatIn;
srcConfig.formatOut = mal_format_f32;
srcConfig.formatOut = mal_format_f32;
srcConfig
.
channels
=
pDSP
->
config
.
channelsIn
;
srcConfig.channels = pDSP->c
hannelRouter.c
onfig.channelsIn;
srcConfig
.
algorithm
=
pDSP
->
config
.
srcA
lgorithm
;
srcConfig.algorithm = pDSP->
src.config.a
lgorithm;
srcConfig
.
cacheSizeInFrames
=
pDSP
->
config
.
cacheSizeInFrames
;
srcConfig.cacheSizeInFrames = pDSP->
src.
config.cacheSizeInFrames;
mal_result result = mal_src_init(&srcConfig, mal_dsp__src_on_read, pDSP, &pDSP->src);
mal_result result = mal_src_init(&srcConfig, mal_dsp__src_on_read, pDSP, &pDSP->src);
if (result != MAL_SUCCESS) {
if (result != MAL_SUCCESS) {
return result;
return result;
...
@@ -19016,7 +19014,7 @@ mal_result mal_dsp_refresh_sample_rate(mal_dsp* pDSP)
...
@@ -19016,7 +19014,7 @@ mal_result mal_dsp_refresh_sample_rate(mal_dsp* pDSP)
}
}
// Update whether or not the pipeline is a passthrough.
// Update whether or not the pipeline is a passthrough.
if
(
pDSP
->
config
.
formatIn
==
pDSP
->
config
.
formatOut
&&
pDSP
->
config
.
channelsIn
==
pDSP
->
config
.
channelsOut
&&
pDSP
->
config
.
sampleRateIn
==
pDSP
->
config
.
sampleRateOut
&&
!
pDSP
->
isChannelMappingRequired
)
{
if (pDSP->
formatConverterIn.config.formatIn == pDSP->formatConverterOut.config.formatOut && pDSP->channelRouter.config.channelsIn == pDSP->channelRouter.config.channelsOut && pDSP->src.config.sampleRateIn == pDSP->src.
config.sampleRateOut && !pDSP->isChannelMappingRequired) {
pDSP->isPassthrough = MAL_TRUE;
pDSP->isPassthrough = MAL_TRUE;
} else {
} else {
pDSP->isPassthrough = MAL_FALSE;
pDSP->isPassthrough = MAL_FALSE;
...
@@ -19036,7 +19034,7 @@ mal_result mal_dsp_set_input_sample_rate(mal_dsp* pDSP, mal_uint32 sampleRateIn)
...
@@ -19036,7 +19034,7 @@ mal_result mal_dsp_set_input_sample_rate(mal_dsp* pDSP, mal_uint32 sampleRateIn)
return MAL_INVALID_ARGS;
return MAL_INVALID_ARGS;
}
}
pDSP
->
config
.
sampleRateIn
=
sampleRateIn
;
pDSP->
src.
config.sampleRateIn = sampleRateIn;
return mal_dsp_refresh_sample_rate(pDSP);
return mal_dsp_refresh_sample_rate(pDSP);
}
}
...
@@ -19051,7 +19049,7 @@ mal_result mal_dsp_set_output_sample_rate(mal_dsp* pDSP, mal_uint32 sampleRateOu
...
@@ -19051,7 +19049,7 @@ mal_result mal_dsp_set_output_sample_rate(mal_dsp* pDSP, mal_uint32 sampleRateOu
return MAL_INVALID_ARGS;
return MAL_INVALID_ARGS;
}
}
pDSP
->
config
.
sampleRateOut
=
sampleRateOut
;
pDSP->
src.
config.sampleRateOut = sampleRateOut;
return mal_dsp_refresh_sample_rate(pDSP);
return mal_dsp_refresh_sample_rate(pDSP);
}
}
...
@@ -19067,7 +19065,7 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
...
@@ -19067,7 +19065,7 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
// Fast path.
// Fast path.
if (pDSP->isPassthrough) {
if (pDSP->isPassthrough) {
if (frameCount <= UINT32_MAX) {
if (frameCount <= UINT32_MAX) {
return
(
mal_uint32
)
pDSP
->
config
.
onRead
(
pDSP
,
(
mal_uint32
)
frameCount
,
pFramesOut
,
pUserData
);
return (mal_uint32)pDSP->onRead(pDSP, (mal_uint32)frameCount, pFramesOut, pUserData);
} else {
} else {
mal_uint64 totalFramesRead = 0;
mal_uint64 totalFramesRead = 0;
while (frameCount > 0) {
while (frameCount > 0) {
...
@@ -19076,12 +19074,12 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
...
@@ -19076,12 +19074,12 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
framesToReadRightNow = (mal_uint32)frameCount;
framesToReadRightNow = (mal_uint32)frameCount;
}
}
mal_uint32
framesRead
=
pDSP
->
config
.
onRead
(
pDSP
,
framesToReadRightNow
,
pFramesOut
,
pUserData
);
mal_uint32 framesRead = pDSP->onRead(pDSP, framesToReadRightNow, pFramesOut, pUserData);
if (framesRead == 0) {
if (framesRead == 0) {
break;
break;
}
}
pFramesOut
=
(
mal_uint8
*
)
pFramesOut
+
(
framesRead
*
pDSP
->
c
onfig
.
channelsOut
*
mal_get_bytes_per_sample
(
pDSP
->
config
.
formatOut
));
pFramesOut = (mal_uint8*)pFramesOut + (framesRead * pDSP->c
hannelRouter.config.channelsOut * mal_get_bytes_per_sample(pDSP->formatConverterOut.
config.formatOut));
frameCount -= framesRead;
frameCount -= framesRead;
totalFramesRead += framesRead;
totalFramesRead += framesRead;
}
}
...
@@ -19099,7 +19097,7 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
...
@@ -19099,7 +19097,7 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
while (frameCount > 0) {
while (frameCount > 0) {
mal_uint32 iFrames = 0; // <-- Used as an index into pFrames and cycles between 0 and 1.
mal_uint32 iFrames = 0; // <-- Used as an index into pFrames and cycles between 0 and 1.
mal_uint32
framesToRead
=
mal_countof
(
pFrames
[
0
])
/
(
mal_max
(
pDSP
->
c
onfig
.
channelsIn
,
pDSP
->
config
.
channelsOut
)
*
MAL_MAX_PCM_SAMPLE_SIZE_IN_BYTES
);
mal_uint32 framesToRead = mal_countof(pFrames[0]) / (mal_max(pDSP->c
hannelRouter.config.channelsIn, pDSP->channelRouter.
config.channelsOut) * MAL_MAX_PCM_SAMPLE_SIZE_IN_BYTES);
if (framesToRead > frameCount) {
if (framesToRead > frameCount) {
framesToRead = (mal_uint32)frameCount;
framesToRead = (mal_uint32)frameCount;
}
}
...
@@ -19110,8 +19108,8 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
...
@@ -19110,8 +19108,8 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
framesRead = (mal_uint32)mal_src_read_ex(&pDSP->src, framesToRead, pFrames[iFrames], flush);
framesRead = (mal_uint32)mal_src_read_ex(&pDSP->src, framesToRead, pFrames[iFrames], flush);
pFramesFormat[iFrames] = pDSP->src.config.formatOut; // Should always be f32.
pFramesFormat[iFrames] = pDSP->src.config.formatOut; // Should always be f32.
} else {
} else {
framesRead
=
pDSP
->
config
.
onRead
(
pDSP
,
framesToRead
,
pFrames
[
iFrames
],
pUserData
);
framesRead = pDSP->onRead(pDSP, framesToRead, pFrames[iFrames], pUserData);
pFramesFormat
[
iFrames
]
=
pDSP
->
config
.
formatIn
;
pFramesFormat[iFrames] = pDSP->
formatConverterIn.
config.formatIn;
}
}
if (framesRead == 0) {
if (framesRead == 0) {
...
@@ -19120,14 +19118,14 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
...
@@ -19120,14 +19118,14 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
// Channel mixing. The input format must be in f32 which may require a conversion.
// Channel mixing. The input format must be in f32 which may require a conversion.
if
(
pDSP
->
c
onfig
.
channelsIn
!=
pDSP
->
config
.
channelsOut
)
{
if (pDSP->c
hannelRouter.config.channelsIn != pDSP->channelRouter.
config.channelsOut) {
if (pFramesFormat[iFrames] != mal_format_f32) {
if (pFramesFormat[iFrames] != mal_format_f32) {
mal_pcm_convert
(
pFrames
[(
iFrames
+
1
)
%
2
],
mal_format_f32
,
pFrames
[
iFrames
],
pDSP
->
config
.
formatIn
,
framesRead
*
pDSP
->
config
.
channelsIn
,
mal_dither_mode_none
);
mal_pcm_convert(pFrames[(iFrames + 1) % 2], mal_format_f32, pFrames[iFrames], pDSP->
formatConverterIn.config.formatIn, framesRead * pDSP->channelRouter.
config.channelsIn, mal_dither_mode_none);
iFrames = (iFrames + 1) % 2;
iFrames = (iFrames + 1) % 2;
pFramesFormat[iFrames] = mal_format_f32;
pFramesFormat[iFrames] = mal_format_f32;
}
}
mal_dsp_mix_channels
((
float
*
)(
pFrames
[(
iFrames
+
1
)
%
2
]),
pDSP
->
c
onfig
.
channelsOut
,
pDSP
->
config
.
channelMapOut
,
(
const
float
*
)(
pFrames
[
iFrames
]),
pDSP
->
config
.
channelsIn
,
pDSP
->
config
.
channelMapIn
,
framesRead
,
pDSP
->
config
.
channelMix
Mode
);
mal_dsp_mix_channels((float*)(pFrames[(iFrames + 1) % 2]), pDSP->c
hannelRouter.config.channelsOut, pDSP->channelRouter.config.channelMapOut, (const float*)(pFrames[iFrames]), pDSP->channelRouter.config.channelsIn, pDSP->channelRouter.config.channelMapIn, framesRead, pDSP->channelRouter.config.mixing
Mode);
iFrames = (iFrames + 1) % 2;
iFrames = (iFrames + 1) % 2;
pFramesFormat[iFrames] = mal_format_f32;
pFramesFormat[iFrames] = mal_format_f32;
}
}
...
@@ -19136,15 +19134,15 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
...
@@ -19136,15 +19134,15 @@ mal_uint64 mal_dsp_read_ex(mal_dsp* pDSP, mal_uint64 frameCount, void* pFramesOu
// Channel mapping.
// Channel mapping.
if (pDSP->isChannelMappingRequired) {
if (pDSP->isChannelMappingRequired) {
for (mal_uint32 i = 0; i < framesRead; ++i) {
for (mal_uint32 i = 0; i < framesRead; ++i) {
mal_rearrange_channels
(
pFrames
[
iFrames
]
+
(
i
*
pDSP
->
c
onfig
.
channelsOut
*
mal_get_bytes_per_sample
(
pFramesFormat
[
iFrames
])),
pDSP
->
config
.
channelsOut
,
pDSP
->
channelShuffleTable
,
pFramesFormat
[
iFrames
]);
mal_rearrange_channels(pFrames[iFrames] + (i * pDSP->c
hannelRouter.config.channelsOut * mal_get_bytes_per_sample(pFramesFormat[iFrames])), pDSP->channelRouter.
config.channelsOut, pDSP->channelShuffleTable, pFramesFormat[iFrames]);
}
}
}
}
// Final conversion to output format.
// Final conversion to output format.
mal_pcm_convert
(
pFramesOut
,
pDSP
->
config
.
formatOut
,
pFrames
[
iFrames
],
pFramesFormat
[
iFrames
],
framesRead
*
pDSP
->
config
.
channelsOut
,
mal_dither_mode_none
);
mal_pcm_convert(pFramesOut, pDSP->
formatConverterOut.config.formatOut, pFrames[iFrames], pFramesFormat[iFrames], framesRead * pDSP->channelRouter.
config.channelsOut, mal_dither_mode_none);
pFramesOut
=
(
mal_uint8
*
)
pFramesOut
+
(
framesRead
*
pDSP
->
c
onfig
.
channelsOut
*
mal_get_bytes_per_sample
(
pDSP
->
config
.
formatOut
));
pFramesOut = (mal_uint8*)pFramesOut + (framesRead * pDSP->c
hannelRouter.config.channelsOut * mal_get_bytes_per_sample(pDSP->formatConverterOut.
config.formatOut));
frameCount -= framesRead;
frameCount -= framesRead;
totalFramesRead += framesRead;
totalFramesRead += framesRead;
}
}
...
@@ -19232,7 +19230,7 @@ mal_uint64 mal_convert_frames(void* pOut, mal_format formatOut, mal_uint32 chann
...
@@ -19232,7 +19230,7 @@ mal_uint64 mal_convert_frames(void* pOut, mal_format formatOut, mal_uint32 chann
return 0;
return 0;
}
}
return
mal_dsp_read_ex
(
&
dsp
,
frameCountOut
,
pOut
,
MAL_TRUE
,
dsp
.
config
.
pUserData
);
return mal_dsp_read_ex(&dsp, frameCountOut, pOut, MAL_TRUE, dsp.pUserData);
}
}
mal_dsp_config mal_dsp_config_init(mal_format formatIn, mal_uint32 channelsIn, mal_uint32 sampleRateIn, mal_format formatOut, mal_uint32 channelsOut, mal_uint32 sampleRateOut, mal_dsp_read_proc onRead, void* pUserData)
mal_dsp_config mal_dsp_config_init(mal_format formatIn, mal_uint32 channelsIn, mal_uint32 sampleRateIn, mal_format formatOut, mal_uint32 channelsOut, mal_uint32 sampleRateOut, mal_dsp_read_proc onRead, void* pUserData)
...
@@ -20445,7 +20443,7 @@ mal_uint64 mal_decoder_read(mal_decoder* pDecoder, mal_uint64 frameCount, void*
...
@@ -20445,7 +20443,7 @@ mal_uint64 mal_decoder_read(mal_decoder* pDecoder, mal_uint64 frameCount, void*
{
{
if (pDecoder == NULL) return 0;
if (pDecoder == NULL) return 0;
return
mal_dsp_read_ex
(
&
pDecoder
->
dsp
,
frameCount
,
pFramesOut
,
MAL_TRUE
,
pDecoder
->
dsp
.
config
.
pUserData
);
return mal_dsp_read_ex(&pDecoder->dsp, frameCount, pFramesOut, MAL_TRUE, pDecoder->dsp.pUserData);
}
}
mal_result mal_decoder_seek_to_frame(mal_decoder* pDecoder, mal_uint64 frameIndex)
mal_result mal_decoder_seek_to_frame(mal_decoder* pDecoder, mal_uint64 frameIndex)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment