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;