bsnes/higan/target-bsnes/program/audio.cpp

80 lines
2.3 KiB
C++

auto Program::updateAudioDriver(Window parent) -> void {
auto changed = (bool)audio;
audio.create(settings.audio.driver);
audio.setContext(presentation.viewport.handle());
audio.setChannels(2);
if(changed) {
settings.audio.device = audio.device();
settings.audio.frequency = audio.frequency();
settings.audio.latency = audio.latency();
}
updateAudioExclusive();
updateAudioDevice();
updateAudioBlocking();
updateAudioDynamic();
if(!audio.ready()) {
MessageDialog({
"Error: failed to initialize [", settings.audio.driver, "] audio driver."
}).setParent(parent).error();
settings.audio.driver = "None";
return updateAudioDriver(parent);
}
}
auto Program::updateAudioExclusive() -> void {
audio.setExclusive(settings.audio.exclusive);
updateAudioFrequency();
updateAudioLatency();
}
auto Program::updateAudioDevice() -> void {
audio.clear();
if(!audio.hasDevice(settings.audio.device)) {
settings.audio.device = audio.device();
}
audio.setDevice(settings.audio.device);
updateAudioFrequency();
updateAudioLatency();
}
auto Program::updateAudioBlocking() -> void {
audio.clear();
audio.setBlocking(settings.audio.blocking);
}
auto Program::updateAudioDynamic() -> void {
audio.setDynamic(settings.audio.dynamic);
}
auto Program::updateAudioFrequency() -> void {
audio.clear();
if(!audio.hasFrequency(settings.audio.frequency)) {
settings.audio.frequency = audio.frequency();
}
audio.setFrequency(settings.audio.frequency);
double frequency = settings.audio.frequency + settings.audio.skew;
if(!settings.video.blocking && settings.audio.blocking) {
for(auto item : presentation.speedGroup.objects<MenuRadioItem>()) {
if(item.checked()) frequency *= item.property("multiplier").real();
}
}
Emulator::audio.setFrequency(frequency);
}
auto Program::updateAudioLatency() -> void {
audio.clear();
if(!audio.hasLatency(settings.audio.latency)) {
settings.audio.latency = audio.latency();
}
audio.setLatency(settings.audio.latency);
}
auto Program::updateAudioEffects() -> void {
double volume = settings.audio.mute ? 0.0 : settings.audio.volume * 0.01;
Emulator::audio.setVolume(volume);
double balance = max(-1.0, min(+1.0, (settings.audio.balance - 50) / 50.0));
Emulator::audio.setBalance(balance);
}