void SoundSource::MixMonoToStereoIP(Sound* sound, int* dest, unsigned samples, int mixRate) { float totalGain = masterGain_ * attenuation_ * gain_; int leftVol = (int)((-panning_ + 1.0f) * (256.0f * totalGain + 0.5f)); int rightVol = (int)((panning_ + 1.0f) * (256.0f * totalGain + 0.5f)); if (!leftVol && !rightVol) { 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(); *dest = *dest + (s * leftVol) / 256; ++dest; *dest = *dest + (s * rightVol) / 256; ++dest; INC_POS_LOOPED(); } position_ = (signed char*)pos; } else { while (samples--) { int s = GET_IP_SAMPLE(); *dest = *dest + (s * leftVol) / 256; ++dest; *dest = *dest + (s * rightVol) / 256; ++dest; INC_POS_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(); *dest = *dest + s * leftVol; ++dest; *dest = *dest + s * rightVol; ++dest; INC_POS_LOOPED(); } position_ = pos; } else { while (samples--) { int s = GET_IP_SAMPLE(); *dest = *dest + s * leftVol; ++dest; *dest = *dest + s * rightVol; ++dest; INC_POS_ONESHOT(); } position_ = pos; } } fractPosition_ = fractPos; }
void SoundSource::MixMonoToMonoIP(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--) { *dest = *dest + (GET_IP_SAMPLE() * vol) / 256; ++dest; INC_POS_LOOPED(); } position_ = (signed char*)pos; } else { while (samples--) { *dest = *dest + (GET_IP_SAMPLE() * vol) / 256; ++dest; INC_POS_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 + GET_IP_SAMPLE() * vol; ++dest; INC_POS_LOOPED(); } position_ = pos; } else { while (samples--) { *dest = *dest + GET_IP_SAMPLE() * vol; ++dest; INC_POS_ONESHOT(); } position_ = pos; } } fractPosition_ = fractPos; }