Doppler Effect
braxtonhall opened this issue ยท 3 comments
Considering the audio output is built on top of OpenAL, which automatically calculates the Doppler Effect, it would be simple to add the Doppler effect just by adding a player's current velocity in addition to their position.
ALSpeaker::setPositionSync
might look something like this
protected void setPositionSync(@Nullable Vec3 soundPos, @Nullable Vec3 soundVel) {
if (soundPos != null && soundVel != null) {
Player player = mc.player;
Vec3 position = player.getEyePosition();
Vec3 look = player.getLookAngle();
Vec3 up = player.getUpVector(1F);
Vec3 vel = player.getDeltaMovement();
AL11.alListener3f(AL11.AL_POSITION, (float) position.x, (float) position.y, (float) position.z);
SoundManager.checkAlError();
AL11.alListenerfv(AL11.AL_ORIENTATION, new float[]{(float) look.x, (float) look.y, (float) look.z, (float) up.x, (float) up.y, (float) up.z});
SoundManager.checkAlError();
AL11.alListener3f(AL11.AL_VELOCITY, (float) vel.x, (float) vel.y, (float) vel.z);
SoundManager.checkAlError();
AL11.alSource3f(source, AL11.AL_POSITION, (float) soundPos.x, (float) soundPos.y, (float) soundPos.z);
SoundManager.checkAlError();
AL11.alSource3f(source, AL11.AL_VELOCITY, (float) soundVel.x, (float) soundVel.y, (float) soundVel.z);
SoundManager.checkAlError();
} else {
// ...
}
}
To make the doppler effect slightly more noticeable, say on horseback on in a minecart, ALSpeaker::openSync
may inclue
AL11.alDopplerFactor(2F);
SoundManager.checkAlError();
I have been using this on my own fork after about 15 minutes of editing and testing, but to be honest it is not pretty at the moment. I'd love to see this officially supported!
I deliberately decided against the doppler effect, since it doesn't fit into the game and also not in the voicechat.
Oh! Are you against making this a config? I could put a PR together with a config defaulting to OFF