diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-03-02 12:19:40 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-03-02 19:22:59 +0100 |
| commit | 68a61d00f3754f6fc473f6ac86fb3abfe670d190 (patch) | |
| tree | f68c4eca132739b1e9183ecdaf4a87c1e60de2a3 /src | |
| parent | 5950dd7e8de1a50f6b22760ab8811239dacd84cb (diff) | |
Move Sound preferences to its own file.
Diffstat (limited to 'src')
| -rw-r--r-- | src/wx/config_dialog.cc | 163 | ||||
| -rw-r--r-- | src/wx/config_dialog.h | 34 | ||||
| -rw-r--r-- | src/wx/full_config_dialog.cc | 1 | ||||
| -rw-r--r-- | src/wx/player_config_dialog.cc | 1 | ||||
| -rw-r--r-- | src/wx/sound_preferences_page.cc | 222 | ||||
| -rw-r--r-- | src/wx/sound_preferences_page.h | 60 | ||||
| -rw-r--r-- | src/wx/wscript | 1 |
7 files changed, 285 insertions, 197 deletions
diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index e36608fd0..178e8fca8 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -327,166 +327,3 @@ GeneralPage::check_for_test_updates_changed() } -wxString -SoundPage::GetName() const -{ - return _("Sound"); -} - -void -SoundPage::setup() -{ - auto table = new wxGridBagSizer(DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); - _panel->GetSizer()->Add(table, 1, wxALL | wxEXPAND, _border); - - int r = 0; - - _sound = new CheckBox(_panel, _("Play sound via")); - table->Add(_sound, wxGBPosition(r, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - wxBoxSizer* s = new wxBoxSizer(wxHORIZONTAL); - _sound_output = new wxChoice(_panel, wxID_ANY); - s->Add(_sound_output, 0); - _sound_output_details = new wxStaticText(_panel, wxID_ANY, {}); - s->Add(_sound_output_details, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, DCPOMATIC_SIZER_X_GAP); - table->Add(s, wxGBPosition(r, 1)); - ++r; - - add_label_to_sizer(table, _panel, _("Mapping"), true, wxGBPosition(r, 0)); - _map = new AudioMappingView(_panel, _("DCP"), _("DCP"), _("Output"), _("output")); - table->Add(_map, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); - ++r; - - _reset_to_default = new Button(_panel, _("Reset to default")); - table->Add(_reset_to_default, wxGBPosition(r, 1)); - ++r; - - wxFont font = _sound_output_details->GetFont(); - font.SetStyle(wxFONTSTYLE_ITALIC); - font.SetPointSize(font.GetPointSize() - 1); - _sound_output_details->SetFont(font); - - for (auto name: AudioBackend::instance()->output_device_names()) { - _sound_output->Append(std_to_wx(name)); - } - - _sound->bind(&SoundPage::sound_changed, this); - _sound_output->Bind(wxEVT_CHOICE, bind(&SoundPage::sound_output_changed, this)); - _map->Changed.connect(bind(&SoundPage::map_changed, this, _1)); - _reset_to_default->Bind(wxEVT_BUTTON, bind(&SoundPage::reset_to_default, this)); -} - -void -SoundPage::reset_to_default() -{ - Config::instance()->set_audio_mapping_to_default(); -} - -void -SoundPage::map_changed(AudioMapping m) -{ - Config::instance()->set_audio_mapping(m); -} - -void -SoundPage::sound_changed() -{ - Config::instance()->set_sound(_sound->GetValue()); -} - -void -SoundPage::sound_output_changed() -{ - auto const so = get_sound_output(); - auto default_device = AudioBackend::instance()->default_device_name(); - - if (!so || so == default_device) { - Config::instance()->unset_sound_output(); - } else { - Config::instance()->set_sound_output(*so); - } -} - -void -SoundPage::config_changed() -{ - auto config = Config::instance(); - - checked_set(_sound, config->sound()); - - auto const current_so = get_sound_output(); - optional<string> configured_so; - - auto& audio = AudioBackend::instance()->rtaudio(); - - if (config->sound_output()) { - configured_so = config->sound_output().get(); - } else { - /* No configured output means we should use the default */ - configured_so = AudioBackend::instance()->default_device_name(); - } - - if (configured_so && current_so != configured_so) { - /* Update _sound_output with the configured value */ - unsigned int i = 0; - while (i < _sound_output->GetCount()) { - if (_sound_output->GetString(i) == std_to_wx(*configured_so)) { - _sound_output->SetSelection(i); - break; - } - ++i; - } - } - - map<int, wxString> apis; - apis[RtAudio::MACOSX_CORE] = _("CoreAudio"); - apis[RtAudio::WINDOWS_ASIO] = _("ASIO"); - apis[RtAudio::WINDOWS_DS] = _("Direct Sound"); - apis[RtAudio::WINDOWS_WASAPI] = _("WASAPI"); - apis[RtAudio::UNIX_JACK] = _("JACK"); - apis[RtAudio::LINUX_ALSA] = _("ALSA"); - apis[RtAudio::LINUX_PULSE] = _("PulseAudio"); - apis[RtAudio::LINUX_OSS] = _("OSS"); - apis[RtAudio::RTAUDIO_DUMMY] = _("Dummy"); - - int const channels = configured_so ? AudioBackend::instance()->device_output_channels(*configured_so).get_value_or(0) : 0; - - _sound_output_details->SetLabel( - wxString::Format(_("%d channels on %s"), channels, apis[audio.getCurrentApi()]) - ); - - _map->set(Config::instance()->audio_mapping(channels)); - - vector<NamedChannel> input; - for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) { - input.push_back(NamedChannel(short_audio_channel_name(i), i)); - } - _map->set_input_channels(input); - - vector<NamedChannel> output; - for (int i = 0; i < channels; ++i) { - output.push_back(NamedChannel(fmt::to_string(i), i)); - } - _map->set_output_channels(output); - - setup_sensitivity(); -} - -void -SoundPage::setup_sensitivity() -{ - _sound_output->Enable(_sound->GetValue()); -} - -/** @return Currently-selected preview sound output in the dialogue */ -optional<string> -SoundPage::get_sound_output() -{ - int const sel = _sound_output->GetSelection(); - if (sel == wxNOT_FOUND) { - return {}; - } - - return wx_to_std(_sound_output->GetString(sel)); -} - - diff --git a/src/wx/config_dialog.h b/src/wx/config_dialog.h index d810ead5d..33ffcc515 100644 --- a/src/wx/config_dialog.h +++ b/src/wx/config_dialog.h @@ -121,40 +121,6 @@ private: }; -class SoundPage : public Page -{ -public: - SoundPage(wxSize panel_size, int border) - : Page(panel_size, border) - {} - - wxString GetName() const override; - -#ifdef DCPOMATIC_OSX - wxBitmap GetLargeIcon() const override - { - return wxBitmap(icon_path("sound"), wxBITMAP_TYPE_PNG); - } -#endif - -private: - - void setup() override; - void config_changed() override; - boost::optional<std::string> get_sound_output(); - void sound_changed(); - void sound_output_changed(); - void setup_sensitivity(); - void map_changed(AudioMapping m); - void reset_to_default(); - - CheckBox* _sound; - wxChoice* _sound_output; - wxStaticText* _sound_output_details; - AudioMappingView* _map; - Button* _reset_to_default; -}; - } } diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc index 821390022..7dbe0fb85 100644 --- a/src/wx/full_config_dialog.cc +++ b/src/wx/full_config_dialog.cc @@ -47,6 +47,7 @@ #include "region_subtag_widget.h" #include "send_test_email_dialog.h" #include "server_dialog.h" +#include "sound_preferences_page.h" #include "static_text.h" #ifdef DCPOMATIC_GROK #include "grok/gpu_config_panel.h" diff --git a/src/wx/player_config_dialog.cc b/src/wx/player_config_dialog.cc index 30b7ebfeb..cb9a55e01 100644 --- a/src/wx/player_config_dialog.cc +++ b/src/wx/player_config_dialog.cc @@ -37,6 +37,7 @@ #include "nag_dialog.h" #include "name_format_editor.h" #include "server_dialog.h" +#include "sound_preferences_page.h" #include "static_text.h" #include "wx_util.h" #include "wx_variant.h" diff --git a/src/wx/sound_preferences_page.cc b/src/wx/sound_preferences_page.cc new file mode 100644 index 000000000..6018c795f --- /dev/null +++ b/src/wx/sound_preferences_page.cc @@ -0,0 +1,222 @@ +/* + Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "audio_backend.h" +#include "audio_mapping_view.h" +#include "check_box.h" +#include "config_dialog.h" +#include "sound_preferences_page.h" +#include "wx_util.h" +#include "lib/constants.h" +#include "lib/util.h" +#include <fmt/format.h> + + +using std::map; +using std::string; +using std::vector; +using boost::bind; +using boost::optional; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif +using namespace dcpomatic::preferences; + + +SoundPage::SoundPage(wxSize panel_size, int border) + : Page(panel_size, border) +{ + +} + + +#ifdef DCPOMATIC_OSX +wxBitmap +SoundPage::GetLargeIcon() const +{ + return wxBitmap(icon_path("sound"), wxBITMAP_TYPE_PNG); +} +#endif + + +wxString +SoundPage::GetName() const +{ + return _("Sound"); +} + +void +SoundPage::setup() +{ + auto table = new wxGridBagSizer(DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); + _panel->GetSizer()->Add(table, 1, wxALL | wxEXPAND, _border); + + int r = 0; + + _sound = new CheckBox(_panel, _("Play sound via")); + table->Add(_sound, wxGBPosition(r, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + wxBoxSizer* s = new wxBoxSizer(wxHORIZONTAL); + _sound_output = new wxChoice(_panel, wxID_ANY); + s->Add(_sound_output, 0); + _sound_output_details = new wxStaticText(_panel, wxID_ANY, {}); + s->Add(_sound_output_details, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, DCPOMATIC_SIZER_X_GAP); + table->Add(s, wxGBPosition(r, 1)); + ++r; + + add_label_to_sizer(table, _panel, _("Mapping"), true, wxGBPosition(r, 0)); + _map = new AudioMappingView(_panel, _("DCP"), _("DCP"), _("Output"), _("output")); + table->Add(_map, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); + ++r; + + _reset_to_default = new Button(_panel, _("Reset to default")); + table->Add(_reset_to_default, wxGBPosition(r, 1)); + ++r; + + wxFont font = _sound_output_details->GetFont(); + font.SetStyle(wxFONTSTYLE_ITALIC); + font.SetPointSize(font.GetPointSize() - 1); + _sound_output_details->SetFont(font); + + for (auto name: AudioBackend::instance()->output_device_names()) { + _sound_output->Append(std_to_wx(name)); + } + + _sound->bind(&SoundPage::sound_changed, this); + _sound_output->Bind(wxEVT_CHOICE, bind(&SoundPage::sound_output_changed, this)); + _map->Changed.connect(bind(&SoundPage::map_changed, this, _1)); + _reset_to_default->Bind(wxEVT_BUTTON, bind(&SoundPage::reset_to_default, this)); +} + +void +SoundPage::reset_to_default() +{ + Config::instance()->set_audio_mapping_to_default(); +} + +void +SoundPage::map_changed(AudioMapping m) +{ + Config::instance()->set_audio_mapping(m); +} + +void +SoundPage::sound_changed() +{ + Config::instance()->set_sound(_sound->GetValue()); +} + +void +SoundPage::sound_output_changed() +{ + auto const so = get_sound_output(); + auto default_device = AudioBackend::instance()->default_device_name(); + + if (!so || so == default_device) { + Config::instance()->unset_sound_output(); + } else { + Config::instance()->set_sound_output(*so); + } +} + +void +SoundPage::config_changed() +{ + auto config = Config::instance(); + + checked_set(_sound, config->sound()); + + auto const current_so = get_sound_output(); + optional<string> configured_so; + + auto& audio = AudioBackend::instance()->rtaudio(); + + if (config->sound_output()) { + configured_so = config->sound_output().get(); + } else { + /* No configured output means we should use the default */ + configured_so = AudioBackend::instance()->default_device_name(); + } + + if (configured_so && current_so != configured_so) { + /* Update _sound_output with the configured value */ + unsigned int i = 0; + while (i < _sound_output->GetCount()) { + if (_sound_output->GetString(i) == std_to_wx(*configured_so)) { + _sound_output->SetSelection(i); + break; + } + ++i; + } + } + + map<int, wxString> apis; + apis[RtAudio::MACOSX_CORE] = _("CoreAudio"); + apis[RtAudio::WINDOWS_ASIO] = _("ASIO"); + apis[RtAudio::WINDOWS_DS] = _("Direct Sound"); + apis[RtAudio::WINDOWS_WASAPI] = _("WASAPI"); + apis[RtAudio::UNIX_JACK] = _("JACK"); + apis[RtAudio::LINUX_ALSA] = _("ALSA"); + apis[RtAudio::LINUX_PULSE] = _("PulseAudio"); + apis[RtAudio::LINUX_OSS] = _("OSS"); + apis[RtAudio::RTAUDIO_DUMMY] = _("Dummy"); + + int const channels = configured_so ? AudioBackend::instance()->device_output_channels(*configured_so).get_value_or(0) : 0; + + _sound_output_details->SetLabel( + wxString::Format(_("%d channels on %s"), channels, apis[audio.getCurrentApi()]) + ); + + _map->set(Config::instance()->audio_mapping(channels)); + + vector<NamedChannel> input; + for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) { + input.push_back(NamedChannel(short_audio_channel_name(i), i)); + } + _map->set_input_channels(input); + + vector<NamedChannel> output; + for (int i = 0; i < channels; ++i) { + output.push_back(NamedChannel(fmt::to_string(i), i)); + } + _map->set_output_channels(output); + + setup_sensitivity(); +} + +void +SoundPage::setup_sensitivity() +{ + _sound_output->Enable(_sound->GetValue()); +} + +/** @return Currently-selected preview sound output in the dialogue */ +optional<string> +SoundPage::get_sound_output() +{ + int const sel = _sound_output->GetSelection(); + if (sel == wxNOT_FOUND) { + return {}; + } + + return wx_to_std(_sound_output->GetString(sel)); +} + + diff --git a/src/wx/sound_preferences_page.h b/src/wx/sound_preferences_page.h new file mode 100644 index 000000000..47bba4c53 --- /dev/null +++ b/src/wx/sound_preferences_page.h @@ -0,0 +1,60 @@ +/* + Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "config_dialog.h" + + +namespace dcpomatic { +namespace preferences { + + +class SoundPage : public Page +{ +public: + SoundPage(wxSize panel_size, int border); + + wxString GetName() const override; + +#ifdef DCPOMATIC_OSX + wxBitmap GetLargeIcon() const override; +#endif + +private: + void setup() override; + void config_changed() override; + boost::optional<std::string> get_sound_output(); + void sound_changed(); + void sound_output_changed(); + void setup_sensitivity(); + void map_changed(AudioMapping m); + void reset_to_default(); + + CheckBox* _sound; + wxChoice* _sound_output; + wxStaticText* _sound_output_details; + AudioMappingView* _map; + Button* _reset_to_default; +}; + + +} +} + diff --git a/src/wx/wscript b/src/wx/wscript index 17cf1ad9e..d7b7bac89 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -161,6 +161,7 @@ sources = """ short_kdm_output_panel.cc simple_video_view.cc smpte_metadata_dialog.cc + sound_preferences_page.cc standard_controls.cc static_text.cc subtag_list_ctrl.cc |
