mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-22 00:06:59 +02:00
Move some clipping functions into the main library.
This commit is contained in:
+109
-29
@@ -5889,9 +5889,15 @@ static MA_INLINE const float* ma_offset_pcm_frames_const_ptr_f32(const float* p,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Clips f32 samples.
|
Clips samples.
|
||||||
*/
|
*/
|
||||||
|
MA_API void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count);
|
||||||
|
MA_API void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count);
|
||||||
|
MA_API void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count);
|
||||||
|
MA_API void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count);
|
||||||
MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count);
|
MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count);
|
||||||
|
MA_API void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels);
|
||||||
|
|
||||||
static MA_INLINE void ma_clip_pcm_frames_f32(float* pDst, const float* pSrc, ma_uint64 frameCount, ma_uint32 channels) { ma_clip_samples_f32(pDst, pSrc, frameCount*channels); }
|
static MA_INLINE void ma_clip_pcm_frames_f32(float* pDst, const float* pSrc, ma_uint64 frameCount, ma_uint32 channels) { ma_clip_samples_f32(pDst, pSrc, frameCount*channels); }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -8798,7 +8804,33 @@ MA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Clamps an f32 sample to -1..1 */
|
|
||||||
|
static MA_INLINE ma_uint8 ma_clip_u8(ma_int16 x)
|
||||||
|
{
|
||||||
|
return (ma_uint8)(ma_clamp(x, -128, 127) + 128);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MA_INLINE ma_int16 ma_clip_s16(ma_int32 x)
|
||||||
|
{
|
||||||
|
return (ma_int16)ma_clamp(x, -32768, 32767);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MA_INLINE ma_int64 ma_clip_s24(ma_int64 x)
|
||||||
|
{
|
||||||
|
return (ma_int64)ma_clamp(x, -8388608, 8388607);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MA_INLINE ma_int32 ma_clip_s32(ma_int64 x)
|
||||||
|
{
|
||||||
|
/* This dance is to silence warnings with -std=c89. A good compiler should be able to optimize this away. */
|
||||||
|
ma_int64 clipMin;
|
||||||
|
ma_int64 clipMax;
|
||||||
|
clipMin = -((ma_int64)2147483647 + 1);
|
||||||
|
clipMax = (ma_int64)2147483647;
|
||||||
|
|
||||||
|
return (ma_int32)ma_clamp(x, clipMin, clipMax);
|
||||||
|
}
|
||||||
|
|
||||||
static MA_INLINE float ma_clip_f32(float x)
|
static MA_INLINE float ma_clip_f32(float x)
|
||||||
{
|
{
|
||||||
if (x < -1) return -1;
|
if (x < -1) return -1;
|
||||||
@@ -8806,6 +8838,7 @@ static MA_INLINE float ma_clip_f32(float x)
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static MA_INLINE float ma_mix_f32(float x, float y, float a)
|
static MA_INLINE float ma_mix_f32(float x, float y, float a)
|
||||||
{
|
{
|
||||||
return x*(1-a) + y*a;
|
return x*(1-a) + y*a;
|
||||||
@@ -34566,6 +34599,57 @@ MA_API const void* ma_offset_pcm_frames_const_ptr(const void* p, ma_uint64 offse
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MA_API void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count)
|
||||||
|
{
|
||||||
|
ma_uint64 iSample;
|
||||||
|
|
||||||
|
MA_ASSERT(pDst != NULL);
|
||||||
|
MA_ASSERT(pSrc != NULL);
|
||||||
|
|
||||||
|
for (iSample = 0; iSample < count; iSample += 1) {
|
||||||
|
pDst[iSample] = ma_clip_u8(pSrc[iSample]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MA_API void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count)
|
||||||
|
{
|
||||||
|
ma_uint64 iSample;
|
||||||
|
|
||||||
|
MA_ASSERT(pDst != NULL);
|
||||||
|
MA_ASSERT(pSrc != NULL);
|
||||||
|
|
||||||
|
for (iSample = 0; iSample < count; iSample += 1) {
|
||||||
|
pDst[iSample] = ma_clip_s16(pSrc[iSample]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MA_API void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count)
|
||||||
|
{
|
||||||
|
ma_uint64 iSample;
|
||||||
|
|
||||||
|
MA_ASSERT(pDst != NULL);
|
||||||
|
MA_ASSERT(pSrc != NULL);
|
||||||
|
|
||||||
|
for (iSample = 0; iSample < count; iSample += 1) {
|
||||||
|
ma_int64 s = ma_clip_s24(pSrc[iSample]);
|
||||||
|
pDst[iSample*3 + 0] = (ma_uint8)((s & 0x000000FF) >> 0);
|
||||||
|
pDst[iSample*3 + 1] = (ma_uint8)((s & 0x0000FF00) >> 8);
|
||||||
|
pDst[iSample*3 + 2] = (ma_uint8)((s & 0x00FF0000) >> 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MA_API void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count)
|
||||||
|
{
|
||||||
|
ma_uint64 iSample;
|
||||||
|
|
||||||
|
MA_ASSERT(pDst != NULL);
|
||||||
|
MA_ASSERT(pSrc != NULL);
|
||||||
|
|
||||||
|
for (iSample = 0; iSample < count; iSample += 1) {
|
||||||
|
pDst[iSample] = ma_clip_s32(pSrc[iSample]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count)
|
MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count)
|
||||||
{
|
{
|
||||||
ma_uint64 iSample;
|
ma_uint64 iSample;
|
||||||
@@ -34578,6 +34662,29 @@ MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MA_API void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels)
|
||||||
|
{
|
||||||
|
ma_uint64 sampleCount;
|
||||||
|
|
||||||
|
MA_ASSERT(pDst != NULL);
|
||||||
|
MA_ASSERT(pSrc != NULL);
|
||||||
|
|
||||||
|
sampleCount = frameCount * channels;
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case ma_format_u8: ma_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount); break;
|
||||||
|
case ma_format_s16: ma_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount); break;
|
||||||
|
case ma_format_s24: ma_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount); break;
|
||||||
|
case ma_format_s32: ma_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount); break;
|
||||||
|
case ma_format_f32: ma_clip_samples_f32(( float*)pDst, (const float*)pSrc, sampleCount); break;
|
||||||
|
|
||||||
|
/* Do nothing if we don't know the format. We're including these here to silence a compiler warning about enums not being handled by the switch. */
|
||||||
|
case ma_format_unknown:
|
||||||
|
case ma_format_count:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MA_API void ma_copy_and_apply_volume_factor_u8(ma_uint8* pSamplesOut, const ma_uint8* pSamplesIn, ma_uint64 sampleCount, float factor)
|
MA_API void ma_copy_and_apply_volume_factor_u8(ma_uint8* pSamplesOut, const ma_uint8* pSamplesIn, ma_uint64 sampleCount, float factor)
|
||||||
{
|
{
|
||||||
@@ -35061,33 +35168,6 @@ static MA_INLINE void ma_pcm_sample_s32_to_s24_no_scale(ma_int64 x, ma_uint8* s2
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static MA_INLINE ma_uint8 ma_clip_u8(ma_int16 x)
|
|
||||||
{
|
|
||||||
return (ma_uint8)(ma_clamp(x, -128, 127) + 128);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MA_INLINE ma_int16 ma_clip_s16(ma_int32 x)
|
|
||||||
{
|
|
||||||
return (ma_int16)ma_clamp(x, -32768, 32767);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MA_INLINE ma_int64 ma_clip_s24(ma_int64 x)
|
|
||||||
{
|
|
||||||
return (ma_int64)ma_clamp(x, -8388608, 8388607);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MA_INLINE ma_int32 ma_clip_s32(ma_int64 x)
|
|
||||||
{
|
|
||||||
/* This dance is to silence warnings with -std=c89. A good compiler should be able to optimize this away. */
|
|
||||||
ma_int64 clipMin;
|
|
||||||
ma_int64 clipMax;
|
|
||||||
clipMin = -((ma_int64)2147483647 + 1);
|
|
||||||
clipMax = (ma_int64)2147483647;
|
|
||||||
|
|
||||||
return (ma_int32)ma_clamp(x, clipMin, clipMax);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* u8 */
|
/* u8 */
|
||||||
MA_API void ma_pcm_u8_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)
|
MA_API void ma_pcm_u8_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4599,60 +4599,6 @@ MA_API void ma_splitter_node_uninit(ma_splitter_node* pSplitterNode, const ma_al
|
|||||||
#define MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS 1000
|
#define MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS 1000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count)
|
|
||||||
{
|
|
||||||
ma_uint64 iSample;
|
|
||||||
|
|
||||||
MA_ASSERT(pDst != NULL);
|
|
||||||
MA_ASSERT(pSrc != NULL);
|
|
||||||
|
|
||||||
for (iSample = 0; iSample < count; iSample += 1) {
|
|
||||||
pDst[iSample] = ma_clip_u8(pSrc[iSample]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count)
|
|
||||||
{
|
|
||||||
ma_uint64 iSample;
|
|
||||||
|
|
||||||
MA_ASSERT(pDst != NULL);
|
|
||||||
MA_ASSERT(pSrc != NULL);
|
|
||||||
|
|
||||||
for (iSample = 0; iSample < count; iSample += 1) {
|
|
||||||
pDst[iSample] = ma_clip_s16(pSrc[iSample]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count)
|
|
||||||
{
|
|
||||||
ma_uint64 iSample;
|
|
||||||
|
|
||||||
MA_ASSERT(pDst != NULL);
|
|
||||||
MA_ASSERT(pSrc != NULL);
|
|
||||||
|
|
||||||
for (iSample = 0; iSample < count; iSample += 1) {
|
|
||||||
ma_int64 s = ma_clip_s24(pSrc[iSample]);
|
|
||||||
pDst[iSample*3 + 0] = (ma_uint8)((s & 0x000000FF) >> 0);
|
|
||||||
pDst[iSample*3 + 1] = (ma_uint8)((s & 0x0000FF00) >> 8);
|
|
||||||
pDst[iSample*3 + 2] = (ma_uint8)((s & 0x00FF0000) >> 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count)
|
|
||||||
{
|
|
||||||
ma_uint64 iSample;
|
|
||||||
|
|
||||||
MA_ASSERT(pDst != NULL);
|
|
||||||
MA_ASSERT(pSrc != NULL);
|
|
||||||
|
|
||||||
for (iSample = 0; iSample < count; iSample += 1) {
|
|
||||||
pDst[iSample] = ma_clip_s32(pSrc[iSample]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ma_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume)
|
static void ma_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume)
|
||||||
{
|
{
|
||||||
ma_uint64 iSample;
|
ma_uint64 iSample;
|
||||||
@@ -4730,29 +4676,6 @@ static void ma_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels)
|
|
||||||
{
|
|
||||||
ma_uint64 sampleCount;
|
|
||||||
|
|
||||||
MA_ASSERT(pDst != NULL);
|
|
||||||
MA_ASSERT(pSrc != NULL);
|
|
||||||
|
|
||||||
sampleCount = frameCount * channels;
|
|
||||||
|
|
||||||
switch (format) {
|
|
||||||
case ma_format_u8: ma_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount); break;
|
|
||||||
case ma_format_s16: ma_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount); break;
|
|
||||||
case ma_format_s24: ma_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount); break;
|
|
||||||
case ma_format_s32: ma_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount); break;
|
|
||||||
case ma_format_f32: ma_clip_samples_f32(( float*)pDst, (const float*)pSrc, sampleCount); break;
|
|
||||||
|
|
||||||
/* Do nothing if we don't know the format. We're including these here to silence a compiler warning about enums not being handled by the switch. */
|
|
||||||
case ma_format_unknown:
|
|
||||||
case ma_format_count:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ma_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume)
|
static void ma_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume)
|
||||||
{
|
{
|
||||||
MA_ASSERT(pDst != NULL);
|
MA_ASSERT(pDst != NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user