40 static uint32 _play_rate = 11025;
41 static uint32 _max_size = UINT_MAX;
62 return ((b[0] * ((1 << 16) - frac_pos)) + (b[1] * frac_pos)) >> 16;
65 static void mix_int16(
MixerChannel *sc, int16 *buffer, uint samples)
67 if (samples > sc->samples_left) samples = sc->samples_left;
68 sc->samples_left -= samples;
71 const int16 *b = (
const int16 *)sc->memory + sc->pos;
72 uint32 frac_pos = sc->frac_pos;
73 uint32 frac_speed = sc->frac_speed;
74 int volume_left = sc->volume_left;
75 int volume_right = sc->volume_right;
77 if (frac_speed == 0x10000) {
84 }
while (--samples > 0);
91 frac_pos += frac_speed;
94 }
while (--samples > 0);
97 sc->frac_pos = frac_pos;
98 sc->pos = b - (
const int16 *)sc->memory;
101 static void mix_int8_to_int16(
MixerChannel *sc, int16 *buffer, uint samples)
103 if (samples > sc->samples_left) samples = sc->samples_left;
104 sc->samples_left -= samples;
107 const int8 *b = sc->memory + sc->pos;
108 uint32 frac_pos = sc->frac_pos;
109 uint32 frac_speed = sc->frac_speed;
110 int volume_left = sc->volume_left;
111 int volume_right = sc->volume_right;
113 if (frac_speed == 0x10000) {
120 }
while (--samples > 0);
127 frac_pos += frac_speed;
130 }
while (--samples > 0);
133 sc->frac_pos = frac_pos;
134 sc->pos = b - sc->memory;
142 void MxMixSamples(
void *buffer, uint samples)
145 static uint last_samples = 0;
146 if (samples != last_samples) {
148 last_samples = samples;
154 memset(buffer, 0,
sizeof(int16) * 2 * samples);
157 if (_music_stream) _music_stream((int16*)buffer, samples);
160 for (mc = _channels; mc !=
endof(_channels); mc++) {
163 mix_int16(mc, (int16*)buffer, samples);
165 mix_int8_to_int16(mc, (int16*)buffer, samples);
167 if (mc->samples_left == 0) MxCloseChannel(mc);
175 for (mc = _channels; mc !=
endof(_channels); mc++) {
185 void MxSetChannelRawSrc(
MixerChannel *mc, int8 *mem,
size_t size, uint rate,
bool is16bit)
191 mc->frac_speed = (rate << 16) / _play_rate;
193 if (is16bit) size /= 2;
196 while (size >= _max_size) {
198 rate = (rate >> 1) + 1;
201 mc->samples_left = (uint)size * _play_rate / rate;
202 mc->is16bit = is16bit;
215 mc->volume_left = (uint)(sin((1.0 - pan) * M_PI / 2.0) * volume);
216 mc->volume_right = (uint)(sin(pan * M_PI / 2.0) * volume);
232 _music_stream = music_callback;
237 bool MxInitialize(uint rate)
240 _max_size = UINT_MAX / _play_rate;
241 _music_stream = NULL;
Types for recording game performance data.
Definition of base types and functions in a cross-platform compatible way.
A number of safeguards to prevent using unsafe methods.
void MxSetChannelVolume(MixerChannel *mc, uint volume, float pan)
Set volume and pan parameters for a sound.
static int RateConversion(T *b, int frac_pos)
Perform the rate conversion between the input and output.
uint32 MxSetMusicSource(MxStreamCallback music_callback)
Set source of PCM music.
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
void(* MxStreamCallback)(int16 *buffer, size_t samples)
Type of callback functions for supplying PCM music.
#define endof(x)
Get the end element of an fixed size array.
Functions to mix sound samples.
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
static const int MAX_VOLUME
The theoretical maximum volume for a single sound sample.
Speed of mixing audio samples.