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
aae9a16c
Commit
aae9a16c
authored
Jul 17, 2021
by
David Reid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move some functions over to the main library.
parent
42d82c98
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
148 additions
and
143 deletions
+148
-143
miniaudio.h
miniaudio.h
+146
-2
research/miniaudio_engine.h
research/miniaudio_engine.h
+2
-141
No files found.
miniaudio.h
View file @
aae9a16c
...
@@ -5932,6 +5932,14 @@ MA_API void ma_apply_volume_factor_pcm_frames(void* pFrames, ma_uint64 frameCoun
...
@@ -5932,6 +5932,14 @@ MA_API void ma_apply_volume_factor_pcm_frames(void* pFrames, ma_uint64 frameCoun
MA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float* pChannelGains);
MA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float* pChannelGains);
MA_API void ma_copy_and_apply_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume);
MA_API void ma_copy_and_apply_volume_and_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count, float volume);
MA_API void ma_copy_and_apply_volume_and_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count, float volume);
MA_API void ma_copy_and_apply_volume_and_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count, float volume);
MA_API void ma_copy_and_apply_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count, float volume);
MA_API void ma_copy_and_apply_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume);
/*
/*
Helper for converting a linear factor to gain in decibels.
Helper for converting a linear factor to gain in decibels.
*/
*/
...
@@ -8801,8 +8809,6 @@ MA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat
...
@@ -8801,8 +8809,6 @@ MA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat
static MA_INLINE ma_uint8 ma_clip_u8(ma_int16 x)
static MA_INLINE ma_uint8 ma_clip_u8(ma_int16 x)
{
{
return (ma_uint8)(ma_clamp(x, -128, 127) + 128);
return (ma_uint8)(ma_clamp(x, -128, 127) + 128);
...
@@ -8917,6 +8923,12 @@ static ma_uint32 ma_ffs_32(ma_uint32 x)
...
@@ -8917,6 +8923,12 @@ static ma_uint32 ma_ffs_32(ma_uint32 x)
return i;
return i;
}
}
static MA_INLINE ma_int16 ma_float_to_fixed_16(float x)
{
return (ma_int16)(x * (1 << 8));
}
/*
/*
Random Number Generation
Random Number Generation
...
@@ -34873,6 +34885,138 @@ MA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, c
...
@@ -34873,6 +34885,138 @@ MA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, c
static MA_INLINE ma_int16 ma_apply_volume_unclipped_u8(ma_int16 x, ma_int16 volume)
{
return (ma_int16)(((ma_int32)x * (ma_int32)volume) >> 8);
}
static MA_INLINE ma_int32 ma_apply_volume_unclipped_s16(ma_int32 x, ma_int16 volume)
{
return (ma_int32)((x * volume) >> 8);
}
static MA_INLINE ma_int64 ma_apply_volume_unclipped_s24(ma_int64 x, ma_int16 volume)
{
return (ma_int64)((x * volume) >> 8);
}
static MA_INLINE ma_int64 ma_apply_volume_unclipped_s32(ma_int64 x, ma_int16 volume)
{
return (ma_int64)((x * volume) >> 8);
}
static MA_INLINE float ma_apply_volume_unclipped_f32(float x, float volume)
{
return x * volume;
}
MA_API void ma_copy_and_apply_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume)
{
ma_uint64 iSample;
ma_int16 volumeFixed;
MA_ASSERT(pDst != NULL);
MA_ASSERT(pSrc != NULL);
volumeFixed = ma_float_to_fixed_16(volume);
for (iSample = 0; iSample < count; iSample += 1) {
pDst[iSample] = ma_clip_u8(ma_apply_volume_unclipped_u8(pSrc[iSample], volumeFixed));
}
}
MA_API void ma_copy_and_apply_volume_and_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count, float volume)
{
ma_uint64 iSample;
ma_int16 volumeFixed;
MA_ASSERT(pDst != NULL);
MA_ASSERT(pSrc != NULL);
volumeFixed = ma_float_to_fixed_16(volume);
for (iSample = 0; iSample < count; iSample += 1) {
pDst[iSample] = ma_clip_s16(ma_apply_volume_unclipped_s16(pSrc[iSample], volumeFixed));
}
}
MA_API void ma_copy_and_apply_volume_and_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count, float volume)
{
ma_uint64 iSample;
ma_int16 volumeFixed;
MA_ASSERT(pDst != NULL);
MA_ASSERT(pSrc != NULL);
volumeFixed = ma_float_to_fixed_16(volume);
for (iSample = 0; iSample < count; iSample += 1) {
ma_int64 s = ma_clip_s24(ma_apply_volume_unclipped_s24(pSrc[iSample], volumeFixed));
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_copy_and_apply_volume_and_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count, float volume)
{
ma_uint64 iSample;
ma_int16 volumeFixed;
MA_ASSERT(pDst != NULL);
MA_ASSERT(pSrc != NULL);
volumeFixed = ma_float_to_fixed_16(volume);
for (iSample = 0; iSample < count; iSample += 1) {
pDst[iSample] = ma_clip_s32(ma_apply_volume_unclipped_s32(pSrc[iSample], volumeFixed));
}
}
MA_API void ma_copy_and_apply_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count, float volume)
{
ma_uint64 iSample;
MA_ASSERT(pDst != NULL);
MA_ASSERT(pSrc != NULL);
/* For the f32 case we need to make sure this supports in-place processing where the input and output buffers are the same. */
for (iSample = 0; iSample < count; iSample += 1) {
pDst[iSample] = ma_clip_f32(ma_apply_volume_unclipped_f32(pSrc[iSample], volume));
}
}
MA_API void ma_copy_and_apply_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(pSrc != NULL);
if (volume == 1) {
ma_clip_pcm_frames(pDst, pSrc, frameCount, format, channels); /* Optimized case for volume = 1. */
} else if (volume == 0) {
ma_silence_pcm_frames(pDst, frameCount, format, channels); /* Optimized case for volume = 0. */
} else {
ma_uint64 sampleCount = frameCount * channels;
switch (format) {
case ma_format_u8: ma_copy_and_apply_volume_and_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount, volume); break;
case ma_format_s16: ma_copy_and_apply_volume_and_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount, volume); break;
case ma_format_s24: ma_copy_and_apply_volume_and_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount, volume); break;
case ma_format_s32: ma_copy_and_apply_volume_and_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount, volume); break;
case ma_format_f32: ma_copy_and_apply_volume_and_clip_samples_f32(( float*)pDst, (const float*)pSrc, sampleCount, volume); 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 float ma_factor_to_gain_db(float factor)
MA_API float ma_factor_to_gain_db(float factor)
{
{
return 20*ma_log10f(factor);
return 20*ma_log10f(factor);
research/miniaudio_engine.h
View file @
aae9a16c
...
@@ -2359,38 +2359,6 @@ MA_API void ma_debug_fill_pcm_frames_with_sine_wave(float* pFramesOut, ma_uint32
...
@@ -2359,38 +2359,6 @@ MA_API void ma_debug_fill_pcm_frames_with_sine_wave(float* pFramesOut, ma_uint32
static
MA_INLINE
ma_int16
ma_float_to_fixed_16
(
float
x
)
{
return
(
ma_int16
)(
x
*
(
1
<<
8
));
}
static
MA_INLINE
ma_int16
ma_apply_volume_unclipped_u8
(
ma_int16
x
,
ma_int16
volume
)
{
return
(
ma_int16
)(((
ma_int32
)
x
*
(
ma_int32
)
volume
)
>>
8
);
}
static
MA_INLINE
ma_int32
ma_apply_volume_unclipped_s16
(
ma_int32
x
,
ma_int16
volume
)
{
return
(
ma_int32
)((
x
*
volume
)
>>
8
);
}
static
MA_INLINE
ma_int64
ma_apply_volume_unclipped_s24
(
ma_int64
x
,
ma_int16
volume
)
{
return
(
ma_int64
)((
x
*
volume
)
>>
8
);
}
static
MA_INLINE
ma_int64
ma_apply_volume_unclipped_s32
(
ma_int64
x
,
ma_int16
volume
)
{
return
(
ma_int64
)((
x
*
volume
)
>>
8
);
}
static
MA_INLINE
float
ma_apply_volume_unclipped_f32
(
float
x
,
float
volume
)
{
return
x
*
volume
;
}
static
ma_result
ma_channel_map_build_shuffle_table
(
const
ma_channel
*
pChannelMapIn
,
ma_uint32
channelCountIn
,
const
ma_channel
*
pChannelMapOut
,
ma_uint32
channelCountOut
,
ma_uint8
*
pShuffleTable
)
static
ma_result
ma_channel_map_build_shuffle_table
(
const
ma_channel
*
pChannelMapIn
,
ma_uint32
channelCountIn
,
const
ma_channel
*
pChannelMapOut
,
ma_uint32
channelCountOut
,
ma_uint8
*
pShuffleTable
)
...
@@ -4599,113 +4567,6 @@ MA_API void ma_splitter_node_uninit(ma_splitter_node* pSplitterNode, const ma_al
...
@@ -4599,113 +4567,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_volume_and_clip_samples_u8
(
ma_uint8
*
pDst
,
const
ma_int16
*
pSrc
,
ma_uint64
count
,
float
volume
)
{
ma_uint64
iSample
;
ma_int16
volumeFixed
;
MA_ASSERT
(
pDst
!=
NULL
);
MA_ASSERT
(
pSrc
!=
NULL
);
volumeFixed
=
ma_float_to_fixed_16
(
volume
);
for
(
iSample
=
0
;
iSample
<
count
;
iSample
+=
1
)
{
pDst
[
iSample
]
=
ma_clip_u8
(
ma_apply_volume_unclipped_u8
(
pSrc
[
iSample
],
volumeFixed
));
}
}
static
void
ma_volume_and_clip_samples_s16
(
ma_int16
*
pDst
,
const
ma_int32
*
pSrc
,
ma_uint64
count
,
float
volume
)
{
ma_uint64
iSample
;
ma_int16
volumeFixed
;
MA_ASSERT
(
pDst
!=
NULL
);
MA_ASSERT
(
pSrc
!=
NULL
);
volumeFixed
=
ma_float_to_fixed_16
(
volume
);
for
(
iSample
=
0
;
iSample
<
count
;
iSample
+=
1
)
{
pDst
[
iSample
]
=
ma_clip_s16
(
ma_apply_volume_unclipped_s16
(
pSrc
[
iSample
],
volumeFixed
));
}
}
static
void
ma_volume_and_clip_samples_s24
(
ma_uint8
*
pDst
,
const
ma_int64
*
pSrc
,
ma_uint64
count
,
float
volume
)
{
ma_uint64
iSample
;
ma_int16
volumeFixed
;
MA_ASSERT
(
pDst
!=
NULL
);
MA_ASSERT
(
pSrc
!=
NULL
);
volumeFixed
=
ma_float_to_fixed_16
(
volume
);
for
(
iSample
=
0
;
iSample
<
count
;
iSample
+=
1
)
{
ma_int64
s
=
ma_clip_s24
(
ma_apply_volume_unclipped_s24
(
pSrc
[
iSample
],
volumeFixed
));
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_volume_and_clip_samples_s32
(
ma_int32
*
pDst
,
const
ma_int64
*
pSrc
,
ma_uint64
count
,
float
volume
)
{
ma_uint64
iSample
;
ma_int16
volumeFixed
;
MA_ASSERT
(
pDst
!=
NULL
);
MA_ASSERT
(
pSrc
!=
NULL
);
volumeFixed
=
ma_float_to_fixed_16
(
volume
);
for
(
iSample
=
0
;
iSample
<
count
;
iSample
+=
1
)
{
pDst
[
iSample
]
=
ma_clip_s32
(
ma_apply_volume_unclipped_s32
(
pSrc
[
iSample
],
volumeFixed
));
}
}
static
void
ma_volume_and_clip_samples_f32
(
float
*
pDst
,
const
float
*
pSrc
,
ma_uint64
count
,
float
volume
)
{
ma_uint64
iSample
;
MA_ASSERT
(
pDst
!=
NULL
);
MA_ASSERT
(
pSrc
!=
NULL
);
/* For the f32 case we need to make sure this supports in-place processing where the input and output buffers are the same. */
for
(
iSample
=
0
;
iSample
<
count
;
iSample
+=
1
)
{
pDst
[
iSample
]
=
ma_clip_f32
(
ma_apply_volume_unclipped_f32
(
pSrc
[
iSample
],
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
(
pSrc
!=
NULL
);
if
(
volume
==
1
)
{
ma_clip_pcm_frames
(
pDst
,
pSrc
,
frameCount
,
format
,
channels
);
/* Optimized case for volume = 1. */
}
else
if
(
volume
==
0
)
{
ma_silence_pcm_frames
(
pDst
,
frameCount
,
format
,
channels
);
/* Optimized case for volume = 0. */
}
else
{
ma_uint64
sampleCount
=
frameCount
*
channels
;
switch
(
format
)
{
case
ma_format_u8
:
ma_volume_and_clip_samples_u8
(
(
ma_uint8
*
)
pDst
,
(
const
ma_int16
*
)
pSrc
,
sampleCount
,
volume
);
break
;
case
ma_format_s16
:
ma_volume_and_clip_samples_s16
((
ma_int16
*
)
pDst
,
(
const
ma_int32
*
)
pSrc
,
sampleCount
,
volume
);
break
;
case
ma_format_s24
:
ma_volume_and_clip_samples_s24
((
ma_uint8
*
)
pDst
,
(
const
ma_int64
*
)
pSrc
,
sampleCount
,
volume
);
break
;
case
ma_format_s32
:
ma_volume_and_clip_samples_s32
((
ma_int32
*
)
pDst
,
(
const
ma_int64
*
)
pSrc
,
sampleCount
,
volume
);
break
;
case
ma_format_f32
:
ma_volume_and_clip_samples_f32
((
float
*
)
pDst
,
(
const
float
*
)
pSrc
,
sampleCount
,
volume
);
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
ma_result
ma_async_notification_signal
(
ma_async_notification
*
pNotification
)
MA_API
ma_result
ma_async_notification_signal
(
ma_async_notification
*
pNotification
)
{
{
ma_async_notification_callbacks
*
pNotificationCallbacks
=
(
ma_async_notification_callbacks
*
)
pNotification
;
ma_async_notification_callbacks
*
pNotificationCallbacks
=
(
ma_async_notification_callbacks
*
)
pNotification
;
...
@@ -9361,13 +9222,13 @@ MA_API ma_result ma_fader_process_pcm_frames(ma_fader* pFader, void* pFramesOut,
...
@@ -9361,13 +9222,13 @@ MA_API ma_result ma_fader_process_pcm_frames(ma_fader* pFader, void* pFramesOut,
ma_copy_pcm_frames
(
pFramesOut
,
pFramesIn
,
frameCount
,
pFader
->
config
.
format
,
pFader
->
config
.
channels
);
ma_copy_pcm_frames
(
pFramesOut
,
pFramesIn
,
frameCount
,
pFader
->
config
.
format
,
pFader
->
config
.
channels
);
}
else
{
}
else
{
/* Copy with volume. */
/* Copy with volume. */
ma_volume_and_clip_pcm_frames
(
pFramesOut
,
pFramesIn
,
frameCount
,
pFader
->
config
.
format
,
pFader
->
config
.
channels
,
pFader
->
volumeEnd
);
ma_
copy_and_apply_
volume_and_clip_pcm_frames
(
pFramesOut
,
pFramesIn
,
frameCount
,
pFader
->
config
.
format
,
pFader
->
config
.
channels
,
pFader
->
volumeEnd
);
}
}
}
else
{
}
else
{
/* Slower path. Volumes are different, so may need to do an interpolation. */
/* Slower path. Volumes are different, so may need to do an interpolation. */
if
(
pFader
->
cursorInFrames
>=
pFader
->
lengthInFrames
)
{
if
(
pFader
->
cursorInFrames
>=
pFader
->
lengthInFrames
)
{
/* Fast path. We've gone past the end of the fade period so just apply the end volume to all samples. */
/* Fast path. We've gone past the end of the fade period so just apply the end volume to all samples. */
ma_volume_and_clip_pcm_frames
(
pFramesOut
,
pFramesIn
,
frameCount
,
pFader
->
config
.
format
,
pFader
->
config
.
channels
,
pFader
->
volumeEnd
);
ma_
copy_and_apply_
volume_and_clip_pcm_frames
(
pFramesOut
,
pFramesIn
,
frameCount
,
pFader
->
config
.
format
,
pFader
->
config
.
channels
,
pFader
->
volumeEnd
);
}
else
{
}
else
{
/* Slow path. This is where we do the actual fading. */
/* Slow path. This is where we do the actual fading. */
ma_uint64
iFrame
;
ma_uint64
iFrame
;
...
...
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