void SoundSource::MixStereoToStereo(Sound* sound, int* dest, unsigned samples, int mixRate) { float totalGain = masterGain_ * attenuation_ * gain_; int vol = (int)(256.0f * totalGain + 0.5f); if (!vol) { MixZeroVolume(sound, samples, mixRate); return; } float add = frequency_ / (float)mixRate; int intAdd = (int)add; int fractAdd = (int)((add - floorf(add)) * 65536.0f); int fractPos = fractPosition_; if (sound->IsSixteenBit()) { short* pos = (short*)position_; short* end = (short*)sound->GetEnd(); short* repeat = (short*)sound->GetRepeat(); if (sound->IsLooped()) { while (samples--) { *dest = *dest + (pos[0] * vol) / 256; ++dest; *dest = *dest + (pos[1] * vol) / 256; ++dest; INC_POS_STEREO_LOOPED(); } position_ = (signed char*)pos; } else { while (samples--) { *dest = *dest + (pos[0] * vol) / 256; ++dest; *dest = *dest + (pos[1] * vol) / 256; ++dest; INC_POS_STEREO_ONESHOT(); } position_ = (signed char*)pos; } } else { signed char* pos = (signed char*)position_; signed char* end = sound->GetEnd(); signed char* repeat = sound->GetRepeat(); if (sound->IsLooped()) { while (samples--) { *dest = *dest + pos[0] * vol; ++dest; *dest = *dest + pos[1] * vol; ++dest; INC_POS_STEREO_LOOPED(); } position_ = pos; } else { while (samples--) { *dest = *dest + pos[0] * vol; ++dest; *dest = *dest + pos[1] * vol; ++dest; INC_POS_STEREO_ONESHOT(); } position_ = pos; } } fractPosition_ = fractPos; }
void SoundSource::MixStereoToMonoIP(Sound* sound, int* dest, unsigned samples, int mixRate) { float totalGain = audio_->GetSoundSourceMasterGain(soundType_) * attenuation_ * gain_; int vol = (int)(256.0f * totalGain + 0.5f); if (!vol) { MixZeroVolume(sound, samples, mixRate); return; } float add = frequency_ / (float)mixRate; int intAdd = (int)add; int fractAdd = (int)((add - floorf(add)) * 65536.0f); int fractPos = fractPosition_; if (sound->IsSixteenBit()) { short* pos = (short*)position_; short* end = (short*)sound->GetEnd(); short* repeat = (short*)sound->GetRepeat(); if (sound->IsLooped()) { while (--samples) { int s = (GET_IP_SAMPLE_LEFT() + GET_IP_SAMPLE_RIGHT()) / 2; *dest = *dest + (s * vol) / 256; ++dest; INC_POS_STEREO_LOOPED(); } position_ = (signed char*)pos; } else { while (--samples) { int s = (GET_IP_SAMPLE_LEFT() + GET_IP_SAMPLE_RIGHT()) / 2; *dest = *dest + (s * vol) / 256; ++dest; INC_POS_STEREO_ONESHOT(); } position_ = (signed char*)pos; } } else { signed char* pos = (signed char*)position_; signed char* end = sound->GetEnd(); signed char* repeat = sound->GetRepeat(); if (sound->IsLooped()) { while (--samples) { int s = (GET_IP_SAMPLE_LEFT() + GET_IP_SAMPLE_RIGHT()) / 2; *dest = *dest + s * vol; ++dest; INC_POS_STEREO_LOOPED(); } position_ = pos; } else { while (--samples) { int s = (GET_IP_SAMPLE_LEFT() + GET_IP_SAMPLE_RIGHT()) / 2; *dest = *dest + s * vol; ++dest; INC_POS_STEREO_ONESHOT(); } position_ = pos; } } fractPosition_ = fractPos; }