support more than 2 output channels

up to 16 on JACK
to-do: add more mixer settings
This commit is contained in:
tildearrow 2023-01-05 02:40:17 -05:00
parent 77f7fcd555
commit 71e40dc015
11 changed files with 127 additions and 42 deletions

View file

@ -73,6 +73,22 @@ const char* audioBackends[]={
"SDL"
};
const bool isProAudio[]={
true,
false
};
const char* nonProAudioOuts[]={
"Mono",
"Stereo",
"What?",
"Quadraphonic",
"What?",
"5.1 Surround",
"What?",
"7.1 Surround"
};
const char* audioQualities[]={
"High",
"Low"
@ -192,6 +208,11 @@ const char* specificControls[18]={
settings.audioBufSize=x; \
}
#define CHANS_SELECTABLE(x) \
if (ImGui::Selectable(nonProAudioOuts[x-1],settings.audioChans==x)) { \
settings.audioChans=x; \
}
#define UI_COLOR_CONFIG(what,label) \
if (ImGui::ColorEdit4(label "##CC_" #what,(float*)&uiColors[what])) { \
applyUISettings(false); \
@ -676,9 +697,16 @@ void FurnaceGUI::drawSettings() {
ImVec2 settingsViewSize=ImGui::GetContentRegionAvail();
settingsViewSize.y-=ImGui::GetFrameHeight()+ImGui::GetStyle().WindowPadding.y;
if (ImGui::BeginChild("SettingsView",settingsViewSize)) {
#ifdef HAVE_JACK
ImGui::Text("Backend");
ImGui::SameLine();
ImGui::Combo("##Backend",&settings.audioEngine,audioBackends,2);
int prevAudioEngine=settings.audioEngine;
if (ImGui::Combo("##Backend",&settings.audioEngine,audioBackends,2)) {
if (settings.audioEngine!=prevAudioEngine) {
if (!isProAudio[settings.audioEngine]) settings.audioChans=2;
}
}
#endif
ImGui::Text("Device");
ImGui::SameLine();
@ -711,6 +739,27 @@ void FurnaceGUI::drawSettings() {
ImGui::EndCombo();
}
if (isProAudio[settings.audioEngine]) {
ImGui::Text("Outputs");
ImGui::SameLine();
if (ImGui::InputInt("##AudioChansI",&settings.audioChans,1,1)) {
if (settings.audioChans<1) settings.audioChans=1;
if (settings.audioChans>16) settings.audioChans=16;
}
} else {
ImGui::Text("Channels");
ImGui::SameLine();
String chStr=(settings.audioChans<1 || settings.audioChans>8)?"What?":nonProAudioOuts[settings.audioChans-1];
if (ImGui::BeginCombo("##AudioChans",chStr.c_str())) {
CHANS_SELECTABLE(1);
CHANS_SELECTABLE(2);
CHANS_SELECTABLE(4);
CHANS_SELECTABLE(6);
CHANS_SELECTABLE(8);
ImGui::EndCombo();
}
}
ImGui::Text("Buffer size");
ImGui::SameLine();
String bs=fmt::sprintf("%d (latency: ~%.1fms)",settings.audioBufSize,2000.0*(double)settings.audioBufSize/(double)MAX(1,settings.audioRate));
@ -757,8 +806,8 @@ void FurnaceGUI::drawSettings() {
TAAudioDesc& audioWant=e->getAudioDescWant();
TAAudioDesc& audioGot=e->getAudioDescGot();
ImGui::Text("want: %d samples @ %.0fHz",audioWant.bufsize,audioWant.rate);
ImGui::Text("got: %d samples @ %.0fHz",audioGot.bufsize,audioGot.rate);
ImGui::Text("want: %d samples @ %.0fHz (%d channels)",audioWant.bufsize,audioWant.rate,audioWant.outChans);
ImGui::Text("got: %d samples @ %.0fHz (%d channels)",audioGot.bufsize,audioGot.rate,audioWant.outChans);
ImGui::Separator();
@ -2343,6 +2392,7 @@ void FurnaceGUI::syncSettings() {
settings.iconSize=e->getConfInt("iconSize",16);
settings.audioEngine=(e->getConfString("audioEngine","SDL")=="SDL")?1:0;
settings.audioDevice=e->getConfString("audioDevice","");
settings.audioChans=e->getConfInt("audioChans",2);
settings.midiInDevice=e->getConfString("midiInDevice","");
settings.midiOutDevice=e->getConfString("midiOutDevice","");
settings.c163Name=e->getConfString("c163Name",DIV_C163_DEFAULT_NAME);
@ -2476,6 +2526,7 @@ void FurnaceGUI::syncSettings() {
clampSetting(settings.audioQuality,0,1);
clampSetting(settings.audioBufSize,32,4096);
clampSetting(settings.audioRate,8000,384000);
clampSetting(settings.audioChans,1,16);
clampSetting(settings.arcadeCore,0,1);
clampSetting(settings.ym2612Core,0,1);
clampSetting(settings.snCore,0,1);
@ -2643,6 +2694,7 @@ void FurnaceGUI::commitSettings() {
e->setConf("audioQuality",settings.audioQuality);
e->setConf("audioBufSize",settings.audioBufSize);
e->setConf("audioRate",settings.audioRate);
e->setConf("audioChans",settings.audioChans);
e->setConf("arcadeCore",settings.arcadeCore);
e->setConf("ym2612Core",settings.ym2612Core);
e->setConf("snCore",settings.snCore);