diff --git a/src/musikbox/app/layout/SettingsLayout.cpp b/src/musikbox/app/layout/SettingsLayout.cpp index 05dcbb667..53e3b289f 100755 --- a/src/musikbox/app/layout/SettingsLayout.cpp +++ b/src/musikbox/app/layout/SettingsLayout.cpp @@ -123,27 +123,31 @@ void SettingsLayout::OnOutputDropdownActivated(cursespp::TextLabel* label) { std::shared_ptr currentPlugin = outputs::SelectedOutput(); currentName = currentPlugin ? currentPlugin->Name() : currentName; - PlaybackOverlays::ShowOutputOverlay([this, currentName] { - std::string newName; - std::shared_ptr newPlugin = outputs::SelectedOutput(); - newName = newPlugin ? newPlugin->Name() : newName; + PlaybackOverlays::ShowOutputOverlay( + this->transport.GetType(), + [this, currentName] { + std::string newName; + std::shared_ptr newPlugin = outputs::SelectedOutput(); + newName = newPlugin ? newPlugin->Name() : newName; - if (currentName != newName) { - this->LoadPreferences(); - this->transport.ReloadOutput(); - } - }); + if (currentName != newName) { + this->LoadPreferences(); + this->transport.ReloadOutput(); + } + }); } void SettingsLayout::OnTransportDropdownActivate(cursespp::TextLabel* label) { const MasterTransport::Type current = this->transport.GetType(); - PlaybackOverlays::ShowTransportOverlay([this, current](int selected) { - if (selected != current) { - this->transport.SwitchTo((MasterTransport::Type) selected); - this->LoadPreferences(); - } - }); + PlaybackOverlays::ShowTransportOverlay( + this->transport.GetType(), + [this, current](int selected) { + if (selected != current) { + this->transport.SwitchTo((MasterTransport::Type) selected); + this->LoadPreferences(); + } + }); } void SettingsLayout::OnLayout() { diff --git a/src/musikbox/app/overlay/PlaybackOverlays.cpp b/src/musikbox/app/overlay/PlaybackOverlays.cpp index b4bcab82e..32808ac93 100644 --- a/src/musikbox/app/overlay/PlaybackOverlays.cpp +++ b/src/musikbox/app/overlay/PlaybackOverlays.cpp @@ -43,8 +43,6 @@ #include #include -#include - #include using namespace musik::box; @@ -87,7 +85,10 @@ static void showOutputCannotCrossfadeMessage(const std::string& outputName) { PlaybackOverlays::PlaybackOverlays() { } -void PlaybackOverlays::ShowOutputOverlay(std::function callback) { +void PlaybackOverlays::ShowOutputOverlay( + MasterTransport::Type transportType, + std::function callback) +{ plugins = outputs::GetAllOutputs(); if (!plugins.size()) { @@ -98,9 +99,17 @@ void PlaybackOverlays::ShowOutputOverlay(std::function callback) { using Adapter = cursespp::SimpleScrollAdapter; using ListOverlay = cursespp::ListOverlay; + std::string currentOutput = outputs::SelectedOutput()->Name(); + size_t selectedIndex = 0; + std::shared_ptr adapter(new Adapter()); for (size_t i = 0; i < plugins.size(); i++) { - adapter->AddEntry(plugins[i]->Name()); + const std::string name = plugins[i]->Name(); + adapter->AddEntry(name); + + if (name == currentOutput) { + selectedIndex = i; + } } adapter->SetSelectable(true); @@ -109,9 +118,20 @@ void PlaybackOverlays::ShowOutputOverlay(std::function callback) { dialog->SetAdapter(adapter) .SetTitle("output plugins") + .SetSelectedIndex(selectedIndex) .SetItemSelectedCallback( - [callback](cursespp::IScrollAdapterPtr adapter, size_t index) { + [callback, transportType](cursespp::IScrollAdapterPtr adapter, size_t index) { + + if (transportType == MasterTransport::Crossfade) { + std::string output = outputs::GetAllOutputs().at(index)->Name(); + if (invalidCrossfadeOutputs.find(output) != invalidCrossfadeOutputs.end()) { + showOutputCannotCrossfadeMessage(output); + return; + } + } + outputs::SelectOutput(plugins[index]); + if (callback) { callback(); } @@ -120,7 +140,10 @@ void PlaybackOverlays::ShowOutputOverlay(std::function callback) { cursespp::App::Overlays().Push(dialog); } -void PlaybackOverlays::ShowTransportOverlay(std::function callback) { +void PlaybackOverlays::ShowTransportOverlay( + MasterTransport::Type transportType, + std::function callback) +{ using Adapter = cursespp::SimpleScrollAdapter; using ListOverlay = cursespp::ListOverlay; @@ -129,10 +152,13 @@ void PlaybackOverlays::ShowTransportOverlay(std::function callback) { adapter->AddEntry("crossfade"); adapter->SetSelectable(true); + size_t selectedIndex = (transportType == MasterTransport::Gapless) ? 0 : 1; + std::shared_ptr dialog(new ListOverlay()); dialog->SetAdapter(adapter) .SetTitle("playback transport") + .SetSelectedIndex(selectedIndex) .SetItemSelectedCallback( [callback](cursespp::IScrollAdapterPtr adapter, size_t index) { int result = (index == 0) diff --git a/src/musikbox/app/overlay/PlaybackOverlays.h b/src/musikbox/app/overlay/PlaybackOverlays.h index f343a9d18..851d48537 100644 --- a/src/musikbox/app/overlay/PlaybackOverlays.h +++ b/src/musikbox/app/overlay/PlaybackOverlays.h @@ -35,13 +35,19 @@ #pragma once #include +#include namespace musik { namespace box { class PlaybackOverlays { public: - static void ShowOutputOverlay(std::function callback); - static void ShowTransportOverlay(std::function callback); + static void ShowOutputOverlay( + musik::box::audio::MasterTransport::Type transportType, + std::function callback); + + static void ShowTransportOverlay( + musik::box::audio::MasterTransport::Type transportType, + std::function callback); private: PlaybackOverlays();