38 static uint32 _play_rate = 11025;
39 static uint32 _max_size = UINT_MAX;
59 return ((b[0] * ((1 << 16) - frac_pos)) + (b[1] * frac_pos)) >> 16;
62 static void mix_int16(
MixerChannel *sc, int16 *buffer, uint samples)
64 if (samples > sc->samples_left) samples = sc->samples_left;
65 sc->samples_left -= samples;
68 const int16 *b = (
const int16 *)sc->memory + sc->pos;
69 uint32 frac_pos = sc->frac_pos;
70 uint32 frac_speed = sc->frac_speed;
71 int volume_left = sc->volume_left;
72 int volume_right = sc->volume_right;
74 if (frac_speed == 0x10000) {
81 }
while (--samples > 0);
88 frac_pos += frac_speed;
91 }
while (--samples > 0);
94 sc->frac_pos = frac_pos;
95 sc->pos = b - (
const int16 *)sc->memory;
98 static void mix_int8_to_int16(
MixerChannel *sc, int16 *buffer, uint samples)
100 if (samples > sc->samples_left) samples = sc->samples_left;
101 sc->samples_left -= samples;
104 const int8 *b = sc->memory + sc->pos;
105 uint32 frac_pos = sc->frac_pos;
106 uint32 frac_speed = sc->frac_speed;
107 int volume_left = sc->volume_left;
108 int volume_right = sc->volume_right;
110 if (frac_speed == 0x10000) {
117 }
while (--samples > 0);
124 frac_pos += frac_speed;
127 }
while (--samples > 0);
130 sc->frac_pos = frac_pos;
131 sc->pos = b - sc->memory;
139 void MxMixSamples(
void *buffer, uint samples)
144 memset(buffer, 0,
sizeof(int16) * 2 * samples);
147 for (mc = _channels; mc !=
endof(_channels); mc++) {
150 mix_int16(mc, (int16*)buffer, samples);
152 mix_int8_to_int16(mc, (int16*)buffer, samples);
154 if (mc->samples_left == 0) MxCloseChannel(mc);
162 for (mc = _channels; mc !=
endof(_channels); mc++) {
172 void MxSetChannelRawSrc(
MixerChannel *mc, int8 *mem,
size_t size, uint rate,
bool is16bit)
178 mc->frac_speed = (rate << 16) / _play_rate;
180 if (is16bit) size /= 2;
183 while (size >= _max_size) {
185 rate = (rate >> 1) + 1;
188 mc->samples_left = (uint)size * _play_rate / rate;
189 mc->is16bit = is16bit;
202 mc->volume_left = (uint)(sin((1.0 - pan) * M_PI / 2.0) * volume);
203 mc->volume_right = (uint)(sin(pan * M_PI / 2.0) * volume);
213 bool MxInitialize(uint rate)
216 _max_size = UINT_MAX / _play_rate;