diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-12-18 01:09:25 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-12-19 22:11:47 +0100 |
| commit | e0b2ef3dbac6fc4900cad6fea4395c212578602b (patch) | |
| tree | 9ff34490552015577080f0d9bbe4d54b87e5d327 /src/lib | |
| parent | 30c9ecad729397574754163d13253c54a2285a6a (diff) | |
Add an output audio matrix (#1482).
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/config.cc | 60 | ||||
| -rw-r--r-- | src/lib/config.h | 10 |
2 files changed, 69 insertions, 1 deletions
diff --git a/src/lib/config.cc b/src/lib/config.cc index 581620f83..7f32320df 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -53,6 +53,7 @@ using std::cout; using std::ifstream; using std::string; using std::list; +using std::min; using std::max; using std::remove; using std::exception; @@ -173,6 +174,7 @@ Config::set_defaults () _player_content_directory = boost::none; _player_playlist_directory = boost::none; _player_kdm_directory = boost::none; + _audio_mapping = boost::none; #ifdef DCPOMATIC_VARIANT_SWAROOP _player_background_image = boost::none; _kdm_server_url = "http://localhost:8000/{CPL}"; @@ -590,6 +592,11 @@ try _player_content_directory = f.optional_string_child("PlayerContentDirectory"); _player_playlist_directory = f.optional_string_child("PlayerPlaylistDirectory"); _player_kdm_directory = f.optional_string_child("PlayerKDMDirectory"); + + if (f.optional_node_child("AudioMapping")) { + _audio_mapping = AudioMapping (f.node_child("AudioMapping"), Film::current_state_version); + } + #ifdef DCPOMATIC_VARIANT_SWAROOP _player_background_image = f.optional_string_child("PlayerBackgroundImage"); _kdm_server_url = f.optional_string_child("KDMServerURL").get_value_or("http://localhost:8000/{CPL}"); @@ -1037,6 +1044,9 @@ Config::write_config () const /* [XML] PlayerKDMDirectory Directory to use for player KDMs in the dual-screen mode. */ root->add_child("PlayerKDMDirectory")->add_child_text(_player_kdm_directory->string()); } + if (_audio_mapping) { + _audio_mapping->as_xml (root->add_child("AudioMapping")); + } #ifdef DCPOMATIC_VARIANT_SWAROOP if (_player_background_image) { root->add_child("PlayerBackgroundImage")->add_child_text(_player_background_image->string()); @@ -1395,3 +1405,53 @@ Config::have_write_permission () const fclose (f); return true; } + +/** @param output_channels Number of output channels in use. + * @return Audio mapping for this output channel count (may be a default). + */ +AudioMapping +Config::audio_mapping (int output_channels) +{ + if (!_audio_mapping || _audio_mapping->output_channels() != output_channels) { + /* Set up a default */ + _audio_mapping = AudioMapping (MAX_DCP_AUDIO_CHANNELS, output_channels); + if (output_channels == 2) { + /* Special case for stereo output. + Map so that Lt = L(-3dB) + Ls(-3dB) + C(-6dB) + Lfe(-10dB) + Rt = R(-3dB) + Rs(-3dB) + C(-6dB) + Lfe(-10dB) + */ + _audio_mapping->set (dcp::LEFT, 0, 1 / sqrt(2)); // L -> Lt + _audio_mapping->set (dcp::RIGHT, 1, 1 / sqrt(2)); // R -> Rt + _audio_mapping->set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt + _audio_mapping->set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt + _audio_mapping->set (dcp::LFE, 0, 1 / sqrt(10)); // Lfe -> Lt + _audio_mapping->set (dcp::LFE, 1, 1 / sqrt(10)); // Lfe -> Rt + _audio_mapping->set (dcp::LS, 0, 1 / sqrt(2)); // Ls -> Lt + _audio_mapping->set (dcp::RS, 1, 1 / sqrt(2)); // Rs -> Rt + } else { + /* 1:1 mapping */ + for (int i = 0; i < min (MAX_DCP_AUDIO_CHANNELS, output_channels); ++i) { + _audio_mapping->set (i, i, 1); + } + } + } + + return *_audio_mapping; +} + +void +Config::set_audio_mapping (AudioMapping m) +{ + _audio_mapping = m; + changed (AUDIO_MAPPING); +} + +void +Config::set_audio_mapping_to_default () +{ + DCPOMATIC_ASSERT (_audio_mapping); + int const ch = _audio_mapping->output_channels (); + _audio_mapping = boost::none; + _audio_mapping = audio_mapping (ch); + changed (AUDIO_MAPPING); +} diff --git a/src/lib/config.h b/src/lib/config.h index ff7a0fe39..061d6ee7c 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -29,6 +29,7 @@ #include "types.h" #include "state.h" #include "edid.h" +#include "audio_mapping.h" #include <dcp/name_format.h> #include <dcp/certificate_chain.h> #include <dcp/encrypted_kdm.h> @@ -83,6 +84,7 @@ public: PLAYER_DEBUG_LOG, HISTORY, SHOW_EXPERIMENTAL_AUDIO_PROCESSORS, + AUDIO_MAPPING, #ifdef DCPOMATIC_VARIANT_SWAROOP PLAYER_BACKGROUND_IMAGE, #endif @@ -522,6 +524,8 @@ public: return _player_kdm_directory; } + AudioMapping audio_mapping (int output_channels); + #ifdef DCPOMATIC_VARIANT_SWAROOP boost::optional<boost::filesystem::path> player_background_image () const { return _player_background_image; @@ -1036,6 +1040,9 @@ public: changed (); } + void set_audio_mapping (AudioMapping m); + void set_audio_mapping_to_default (); + #ifdef DCPOMATIC_VARIANT_SWAROOP void set_player_background_image (boost::filesystem::path p) { maybe_set (_player_background_image, p, PLAYER_BACKGROUND_IMAGE); @@ -1293,6 +1300,7 @@ private: boost::optional<boost::filesystem::path> _player_content_directory; boost::optional<boost::filesystem::path> _player_playlist_directory; boost::optional<boost::filesystem::path> _player_kdm_directory; + boost::optional<AudioMapping> _audio_mapping; #ifdef DCPOMATIC_VARIANT_SWAROOP boost::optional<boost::filesystem::path> _player_background_image; std::string _kdm_server_url; |
