Add NamedChannel and use it to hide the never-used channels
authorCarl Hetherington <cth@carlh.net>
Fri, 25 Sep 2020 20:51:18 +0000 (22:51 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 25 Sep 2020 20:51:18 +0000 (22:51 +0200)
when mapping into a DCP.

19 files changed:
cscript
src/lib/audio_content.cc
src/lib/audio_content.h
src/lib/audio_processor.h
src/lib/film.cc
src/lib/film.h
src/lib/mid_side_decoder.cc
src/lib/mid_side_decoder.h
src/lib/types.cc
src/lib/types.h
src/lib/upmixer_a.cc
src/lib/upmixer_a.h
src/lib/upmixer_b.cc
src/lib/upmixer_b.h
src/lib/util.cc
src/wx/audio_mapping_view.cc
src/wx/audio_mapping_view.h
src/wx/config_dialog.cc
test/isdcf_name_test.cc

diff --git a/cscript b/cscript
index ed8e84d58b67a2f01498c90efdb469062997f363..d18015b47c5902c6d2a03b68f7eaa9ec2ac87187 100644 (file)
--- a/cscript
+++ b/cscript
@@ -375,8 +375,8 @@ def dependencies(target, options):
             (target.platform == 'osx' and target.bits == 64) or
             (target.platform == 'windows')) else {}
 
             (target.platform == 'osx' and target.bits == 64) or
             (target.platform == 'windows')) else {}
 
-    deps.append(('libdcp', '38864bb', cpp_lib_options))
-    deps.append(('libsub', '308476c', cpp_lib_options))
+    deps.append(('libdcp', '25526a5', cpp_lib_options))
+    deps.append(('libsub', '3286d3a', cpp_lib_options))
     deps.append(('leqm-nrt', 'carl'))
     deps.append(('rtaudio', 'carl'))
     # We get our OpenSSL libraries from the environment, but we
     deps.append(('leqm-nrt', 'carl'))
     deps.append(('rtaudio', 'carl'))
     # We get our OpenSSL libraries from the environment, but we
index 014221f2e892afc95ef5f31d57aa3f4e44bea997..22521c9e9b8be6ab6a263ef44b62b7ed22302e5f 100644 (file)
@@ -265,17 +265,18 @@ AudioContent::processing_description (shared_ptr<const Film> film) const
 }
 
 /** @return User-visible names of each of our audio channels */
 }
 
 /** @return User-visible names of each of our audio channels */
-vector<string>
+vector<NamedChannel>
 AudioContent::channel_names () const
 {
 AudioContent::channel_names () const
 {
-       vector<string> n;
+       vector<NamedChannel> n;
 
 
-       int t = 1;
+       int index = 0;
+       int stream = 1;
        BOOST_FOREACH (AudioStreamPtr i, streams ()) {
                for (int j = 0; j < i->channels(); ++j) {
        BOOST_FOREACH (AudioStreamPtr i, streams ()) {
                for (int j = 0; j < i->channels(); ++j) {
-                       n.push_back (String::compose ("%1:%2", t, j + 1));
+                       n.push_back (NamedChannel(String::compose ("%1:%2", stream, j + 1), index++));
                }
                }
-               ++t;
+               ++stream;
        }
 
        return n;
        }
 
        return n;
index 504c2aecfffde3b2719eff1789babcd3639a010a..b109cc15e199b43b96f69626e062f5ea0b244287 100644 (file)
@@ -53,7 +53,7 @@ public:
        AudioMapping mapping () const;
        void set_mapping (AudioMapping);
        int resampled_frame_rate (boost::shared_ptr<const Film> film) const;
        AudioMapping mapping () const;
        void set_mapping (AudioMapping);
        int resampled_frame_rate (boost::shared_ptr<const Film> film) const;
-       std::vector<std::string> channel_names () const;
+       std::vector<NamedChannel> channel_names () const;
 
        void set_gain (double);
        void set_delay (int);
 
        void set_gain (double);
        void set_delay (int);
index 78a3efb58fd6ec0d745b747d7d835628a78e5a25..194c9bf0e63d46b523ff0917ed3f21408e4365a5 100644 (file)
@@ -25,6 +25,7 @@
 #ifndef DCPOMATIC_AUDIO_PROCESSOR_H
 #define DCPOMATIC_AUDIO_PROCESSOR_H
 
 #ifndef DCPOMATIC_AUDIO_PROCESSOR_H
 #define DCPOMATIC_AUDIO_PROCESSOR_H
 
+#include "types.h"
 #include <boost/shared_ptr.hpp>
 #include <list>
 #include <string>
 #include <boost/shared_ptr.hpp>
 #include <list>
 #include <string>
@@ -58,7 +59,7 @@ public:
        /** Make the supplied audio mapping into a sensible default for this processor */
        virtual void make_audio_mapping_default (AudioMapping& mapping) const = 0;
        /** @return the user-visible (translated) names of each of our inputs, in order */
        /** Make the supplied audio mapping into a sensible default for this processor */
        virtual void make_audio_mapping_default (AudioMapping& mapping) const = 0;
        /** @return the user-visible (translated) names of each of our inputs, in order */
-       virtual std::vector<std::string> input_names () const = 0;
+       virtual std::vector<NamedChannel> input_names () const = 0;
 
        static std::list<AudioProcessor const *> all ();
        static std::list<AudioProcessor const *> visible ();
 
        static std::list<AudioProcessor const *> all ();
        static std::list<AudioProcessor const *> visible ();
index ea0a2bdd7d7ab7059fe884a788bad37e84f6a59c..e2e77cce2b757ea2be3514186be7321ebb009088 100644 (file)
@@ -1707,7 +1707,7 @@ Film::subtitle_language () const
 /** @return The names of the channels that audio contents' outputs are passed into;
  *  this is either the DCP or a AudioProcessor.
  */
 /** @return The names of the channels that audio contents' outputs are passed into;
  *  this is either the DCP or a AudioProcessor.
  */
-vector<string>
+vector<NamedChannel>
 Film::audio_output_names () const
 {
        if (audio_processor ()) {
 Film::audio_output_names () const
 {
        if (audio_processor ()) {
@@ -1716,10 +1716,12 @@ Film::audio_output_names () const
 
        DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 16);
 
 
        DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 16);
 
-       vector<string> n;
+       vector<NamedChannel> n;
 
        for (int i = 0; i < audio_channels(); ++i) {
 
        for (int i = 0; i < audio_channels(); ++i) {
-               n.push_back (short_audio_channel_name (i));
+               if (i != 8 && i != 9 && i != 15) {
+                       n.push_back (NamedChannel(short_audio_channel_name(i), i));
+               }
        }
 
        return n;
        }
 
        return n;
index 66bcce80628830db9d977a1c4dcd3b42ecb7da7e..887433bea2456b3f9b271ff386b423c7ec7622bf 100644 (file)
@@ -177,7 +177,7 @@ public:
 
        std::string subtitle_language () const;
 
 
        std::string subtitle_language () const;
 
-       std::vector<std::string> audio_output_names () const;
+       std::vector<NamedChannel> audio_output_names () const;
 
        void repeat_content (ContentList, int);
 
 
        void repeat_content (ContentList, int);
 
index b9b8dd098c9459e2524de2633c36520632631956..fd80937ed2b3a5c7a96a3a24bfc9ee7ff92fe22d 100644 (file)
@@ -90,13 +90,11 @@ MidSideDecoder::make_audio_mapping_default (AudioMapping& mapping) const
        }
 }
 
        }
 }
 
-vector<string>
+vector<NamedChannel>
 MidSideDecoder::input_names () const
 {
 MidSideDecoder::input_names () const
 {
-       vector<string> n;
-
-       n.push_back (_("Left"));
-       n.push_back (_("Right"));
-
+       vector<NamedChannel> n;
+       n.push_back (NamedChannel(_("Left"), 0));
+       n.push_back (NamedChannel(_("Right"), 1));
        return n;
 }
        return n;
 }
index a4c7e22637fe9809c1488c1b2f23e0a061059861..e5c1e0a05fa6067afc8016c3ae5baa5c6c9959bb 100644 (file)
@@ -29,5 +29,5 @@ public:
        boost::shared_ptr<AudioProcessor> clone (int) const;
        boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers>, int channels);
        void make_audio_mapping_default (AudioMapping& mapping) const;
        boost::shared_ptr<AudioProcessor> clone (int) const;
        boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers>, int channels);
        void make_audio_mapping_default (AudioMapping& mapping) const;
-       std::vector<std::string> input_names () const;
+       std::vector<NamedChannel> input_names () const;
 };
 };
index df57f2d47143a470b1ed88ae11a6e0ac699abf4b..e7acf6992eec60d128be640525ba4b32680abc3a 100644 (file)
@@ -222,3 +222,10 @@ CPLSummary::CPLSummary (boost::filesystem::path p)
 
        last_write_time = boost::filesystem::last_write_time (p);
 }
 
        last_write_time = boost::filesystem::last_write_time (p);
 }
+
+
+bool operator== (NamedChannel const& a, NamedChannel const& b)
+{
+       return a.name == b.name && a.index == b.index;
+}
+
index 50eed9aa1033debe460be604cfb4421a480c5461..2ba0408adb3019b2f59c6b6569948be117f7a27e 100644 (file)
@@ -259,4 +259,20 @@ enum EmailProtocol {
        EMAIL_PROTOCOL_SSL
 };
 
        EMAIL_PROTOCOL_SSL
 };
 
+
+class NamedChannel
+{
+public:
+       NamedChannel (std::string name_, int index_)
+               : name(name_)
+               , index(index_)
+       {}
+
+       std::string name;
+       int index;
+};
+
+
+bool operator== (NamedChannel const& a, NamedChannel const& b);
+
 #endif
 #endif
index ca42cd3867ab7e935b1713ea83d36f51a810a7c9..fc92b081d2812943f577e72589d06583b3ad40b8 100644 (file)
@@ -120,11 +120,11 @@ UpmixerA::make_audio_mapping_default (AudioMapping& mapping) const
        }
 }
 
        }
 }
 
-vector<string>
+vector<NamedChannel>
 UpmixerA::input_names () const
 {
 UpmixerA::input_names () const
 {
-       vector<string> n;
-       n.push_back (_("Upmix L"));
-       n.push_back (_("Upmix R"));
+       vector<NamedChannel> n;
+       n.push_back (NamedChannel(_("Upmix L"), 0));
+       n.push_back (NamedChannel(_("Upmix R"), 1));
        return n;
 }
        return n;
 }
index fe6a373ca44afb27ac231ce577f566c72acc55fb..18569dcfadc957845aead7ca26a722c7214afa43 100644 (file)
@@ -40,7 +40,7 @@ public:
        boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers>, int channels);
        void flush ();
        void make_audio_mapping_default (AudioMapping& mapping) const;
        boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers>, int channels);
        void flush ();
        void make_audio_mapping_default (AudioMapping& mapping) const;
-       std::vector<std::string> input_names () const;
+       std::vector<NamedChannel> input_names () const;
 
 private:
        BandPassAudioFilter _left;
 
 private:
        BandPassAudioFilter _left;
index 2847da03b520341a1f557a1bab5b04285421a084..dfc9d67d589210052b9ed842eea74f62c01d35fa 100644 (file)
@@ -130,11 +130,11 @@ UpmixerB::make_audio_mapping_default (AudioMapping& mapping) const
        }
 }
 
        }
 }
 
-vector<string>
+vector<NamedChannel>
 UpmixerB::input_names () const
 {
 UpmixerB::input_names () const
 {
-       vector<string> n;
-       n.push_back (_("Upmix L"));
-       n.push_back (_("Upmix R"));
+       vector<NamedChannel> n;
+       n.push_back (NamedChannel(_("Upmix L"), 0));
+       n.push_back (NamedChannel(_("Upmix R"), 1));
        return n;
 }
        return n;
 }
index 47b4fadef1c9ef440a087d572e91b432f9539ed6..221be16158c1d913c9aeab169d46d97ac462bd1d 100644 (file)
@@ -38,7 +38,7 @@ public:
        boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers>, int channels);
        void flush ();
        void make_audio_mapping_default (AudioMapping& mapping) const;
        boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers>, int channels);
        void flush ();
        void make_audio_mapping_default (AudioMapping& mapping) const;
-       std::vector<std::string> input_names () const;
+       std::vector<NamedChannel> input_names () const;
 
 private:
        LowPassAudioFilter _lfe;
 
 private:
        LowPassAudioFilter _lfe;
index 32deac2e8f56fc824e42aaa05472c66b6acacca2..7c0d1dc4e8b820f26888836db6a1e49cec61b76e 100644 (file)
@@ -825,8 +825,6 @@ audio_channel_types (list<int> mapped, int channels)
                case dcp::CENTRE:
                case dcp::LS:
                case dcp::RS:
                case dcp::CENTRE:
                case dcp::LS:
                case dcp::RS:
-               case dcp::LC:
-               case dcp::RC:
                case dcp::BSL:
                case dcp::BSR:
                        ++non_lfe;
                case dcp::BSL:
                case dcp::BSR:
                        ++non_lfe;
@@ -836,7 +834,6 @@ audio_channel_types (list<int> mapped, int channels)
                case dcp::MOTION_DATA:
                case dcp::SYNC_SIGNAL:
                case dcp::SIGN_LANGUAGE:
                case dcp::MOTION_DATA:
                case dcp::SYNC_SIGNAL:
                case dcp::SIGN_LANGUAGE:
-               case dcp::UNUSED:
                case dcp::CHANNEL_COUNT:
                        break;
                }
                case dcp::CHANNEL_COUNT:
                        break;
                }
index 438b1e8569037ba557d192191f3f74792e28656f..da08b66adbd375e3169034c3c68290666aeb9672 100644 (file)
@@ -191,9 +191,9 @@ AudioMappingView::paint_column_labels (wxDC& dc)
        wxCoord label_width;
        wxCoord label_height;
        int N = 0;
        wxCoord label_width;
        wxCoord label_height;
        int N = 0;
-       BOOST_FOREACH (string i, _output_channels) {
-               dc.GetTextExtent (std_to_wx(i), &label_width, &label_height);
-               dc.DrawText (std_to_wx(i), LEFT_WIDTH + GRID_SPACING * N + (GRID_SPACING - label_width) / 2, GRID_SPACING + (GRID_SPACING - label_height) / 2);
+       BOOST_FOREACH (NamedChannel const& i, _output_channels) {
+               dc.GetTextExtent (std_to_wx(i.name), &label_width, &label_height);
+               dc.DrawText (std_to_wx(i.name), LEFT_WIDTH + GRID_SPACING * N + (GRID_SPACING - label_width) / 2, GRID_SPACING + (GRID_SPACING - label_height) / 2);
                ++N;
        }
 
                ++N;
        }
 
@@ -226,9 +226,9 @@ AudioMappingView::paint_row_labels (wxDC& dc)
        /* Row channel labels */
 
        int N = 0;
        /* Row channel labels */
 
        int N = 0;
-       BOOST_FOREACH (string i, _input_channels) {
-               dc.GetTextExtent (std_to_wx(i), &label_width, &label_height);
-               dc.DrawText (std_to_wx(i), GRID_SPACING * 2 + (GRID_SPACING - label_width) / 2, TOP_HEIGHT + GRID_SPACING * N + (GRID_SPACING - label_height) / 2);
+       BOOST_FOREACH (NamedChannel const& i, _input_channels) {
+               dc.GetTextExtent (std_to_wx(i.name), &label_width, &label_height);
+               dc.DrawText (std_to_wx(i.name), GRID_SPACING * 2 + (GRID_SPACING - label_width) / 2, TOP_HEIGHT + GRID_SPACING * N + (GRID_SPACING - label_height) / 2);
                ++N;
        }
 
                ++N;
        }
 
@@ -305,7 +305,7 @@ AudioMappingView::paint_indicators (wxDC& dc)
                                        )
                                );
 
                                        )
                                );
 
-                       float const value_dB = linear_to_db(_map.get(y, x));
+                       float const value_dB = linear_to_db(_map.get(_input_channels[y].index, _output_channels[x].index));
                        wxColour const colour = value_dB <= 0 ? wxColour(0, 255, 0) : wxColour(255, 150, 0);
                        int const range = 18;
                        int height = 0;
                        wxColour const colour = value_dB <= 0 ? wxColour(0, 255, 0) : wxColour(255, 150, 0);
                        int const range = 18;
                        int height = 0;
@@ -410,24 +410,24 @@ AudioMappingView::paint ()
        restore (dc);
 }
 
        restore (dc);
 }
 
-optional<pair<int, int> >
+optional<pair<NamedChannel, NamedChannel> >
 AudioMappingView::mouse_event_to_channels (wxMouseEvent& ev) const
 {
        int const x = ev.GetX() + _horizontal_scroll->GetThumbPosition();
        int const y = ev.GetY() + _vertical_scroll->GetThumbPosition();
 
        if (x <= LEFT_WIDTH || y < TOP_HEIGHT) {
 AudioMappingView::mouse_event_to_channels (wxMouseEvent& ev) const
 {
        int const x = ev.GetX() + _horizontal_scroll->GetThumbPosition();
        int const y = ev.GetY() + _vertical_scroll->GetThumbPosition();
 
        if (x <= LEFT_WIDTH || y < TOP_HEIGHT) {
-               return optional<pair<int, int> >();
+               return optional<pair<NamedChannel, NamedChannel> >();
        }
 
        int const input = (y - TOP_HEIGHT) / GRID_SPACING;
        int const output = (x - LEFT_WIDTH) / GRID_SPACING;
 
        if (input >= int(_input_channels.size()) || output >= int(_output_channels.size())) {
        }
 
        int const input = (y - TOP_HEIGHT) / GRID_SPACING;
        int const output = (x - LEFT_WIDTH) / GRID_SPACING;
 
        if (input >= int(_input_channels.size()) || output >= int(_output_channels.size())) {
-               return optional<pair<int, int> >();
+               return optional<pair<NamedChannel, NamedChannel> >();
        }
 
        }
 
-       return make_pair (input, output);
+       return make_pair (_input_channels[input], _output_channels[output]);
 }
 
 optional<string>
 }
 
 optional<string>
@@ -451,15 +451,15 @@ AudioMappingView::mouse_event_to_input_group_name (wxMouseEvent& ev) const
 void
 AudioMappingView::left_down (wxMouseEvent& ev)
 {
 void
 AudioMappingView::left_down (wxMouseEvent& ev)
 {
-       optional<pair<int, int> > channels = mouse_event_to_channels (ev);
+       optional<pair<NamedChannel, NamedChannel> > channels = mouse_event_to_channels (ev);
        if (!channels) {
                return;
        }
 
        if (!channels) {
                return;
        }
 
-       if (_map.get(channels->first, channels->second) > 0) {
-               _map.set (channels->first, channels->second, 0);
+       if (_map.get(channels->first.index, channels->second.index) > 0) {
+               _map.set (channels->first.index, channels->second.index, 0);
        } else {
        } else {
-               _map.set (channels->first, channels->second, 1);
+               _map.set (channels->first.index, channels->second.index, 1);
        }
 
        map_values_changed ();
        }
 
        map_values_changed ();
@@ -468,13 +468,13 @@ AudioMappingView::left_down (wxMouseEvent& ev)
 void
 AudioMappingView::right_down (wxMouseEvent& ev)
 {
 void
 AudioMappingView::right_down (wxMouseEvent& ev)
 {
-       optional<pair<int, int> > channels = mouse_event_to_channels (ev);
+       optional<pair<NamedChannel, NamedChannel> > channels = mouse_event_to_channels (ev);
        if (!channels) {
                return;
        }
 
        if (!channels) {
                return;
        }
 
-       _menu_input = channels->first;
-       _menu_output = channels->second;
+       _menu_input = channels->first.index;
+       _menu_output = channels->second.index;
        PopupMenu (_menu, ev.GetPosition());
 }
 
        PopupMenu (_menu, ev.GetPosition());
 }
 
@@ -499,7 +499,7 @@ void
 AudioMappingView::map_values_changed ()
 {
        Changed (_map);
 AudioMappingView::map_values_changed ()
 {
        Changed (_map);
-       _last_tooltip_channels = optional<pair<int, int> >();
+       _last_tooltip_channels = optional<pair<NamedChannel, NamedChannel> >();
        Refresh ();
 }
 
        Refresh ();
 }
 
@@ -530,84 +530,72 @@ AudioMappingView::set (AudioMapping map)
 }
 
 void
 }
 
 void
-AudioMappingView::set_input_channels (vector<string> const & names)
+AudioMappingView::set_input_channels (vector<NamedChannel> const& channels)
 {
 {
-       _input_channels = names;
+       _input_channels = channels;
        setup ();
        Refresh ();
 }
 
 void
        setup ();
        Refresh ();
 }
 
 void
-AudioMappingView::set_output_channels (vector<string> const & names)
+AudioMappingView::set_output_channels (vector<NamedChannel> const & channels)
 {
 {
-       _output_channels = names;
+       _output_channels = channels;
        setup ();
        Refresh ();
 }
 
        setup ();
        Refresh ();
 }
 
+
 wxString
 wxString
-AudioMappingView::safe_input_channel_name (int n) const
+AudioMappingView::input_channel_name_with_group (NamedChannel const& n) const
 {
 {
-       if (n >= int(_input_channels.size())) {
-               return wxString::Format ("%d", n + 1);
-       }
-
        optional<wxString> group;
        BOOST_FOREACH (Group i, _input_groups) {
        optional<wxString> group;
        BOOST_FOREACH (Group i, _input_groups) {
-               if (i.from <= n && n <= i.to) {
+               if (i.from <= n.index && n.index <= i.to) {
                        group = std_to_wx (i.name);
                }
        }
 
        if (group && !group->IsEmpty()) {
                        group = std_to_wx (i.name);
                }
        }
 
        if (group && !group->IsEmpty()) {
-               return wxString::Format ("%s/%s", group->data(), std_to_wx(_input_channels[n]).data());
+               return wxString::Format ("%s/%s", group->data(), std_to_wx(n.name).data());
        }
 
        }
 
-       return std_to_wx(_input_channels[n]);
+       return std_to_wx(n.name);
 }
 
 }
 
-wxString
-AudioMappingView::safe_output_channel_name (int n) const
-{
-       if (n >= int(_output_channels.size())) {
-               return wxString::Format ("%d", n + 1);
-       }
-
-       return std_to_wx(_output_channels[n]);
-}
 
 void
 AudioMappingView::motion (wxMouseEvent& ev)
 {
 
 void
 AudioMappingView::motion (wxMouseEvent& ev)
 {
-       optional<pair<int, int> > channels = mouse_event_to_channels (ev);
+       optional<pair<NamedChannel, NamedChannel> > channels = mouse_event_to_channels (ev);
        if (channels) {
                if (channels != _last_tooltip_channels) {
                        wxString s;
        if (channels) {
                if (channels != _last_tooltip_channels) {
                        wxString s;
-                       float const gain = _map.get(channels->first, channels->second);
+                       float const gain = _map.get(channels->first.index, channels->second.index);
                        if (gain == 0) {
                                s = wxString::Format (
                                        _("No audio will be passed from %s channel '%s' to %s channel '%s'."),
                                        _from,
                        if (gain == 0) {
                                s = wxString::Format (
                                        _("No audio will be passed from %s channel '%s' to %s channel '%s'."),
                                        _from,
-                                       safe_input_channel_name(channels->first),
+                                       input_channel_name_with_group(channels->first),
                                        _to,
                                        _to,
-                                       safe_output_channel_name(channels->second)
+                                       std_to_wx(channels->second.name)
                                        );
                        } else if (gain == 1) {
                                s = wxString::Format (
                                        _("Audio will be passed from %s channel %s to %s channel %s unaltered."),
                                        _from,
                                        );
                        } else if (gain == 1) {
                                s = wxString::Format (
                                        _("Audio will be passed from %s channel %s to %s channel %s unaltered."),
                                        _from,
-                                       safe_input_channel_name(channels->first),
+                                       input_channel_name_with_group(channels->first),
                                        _to,
                                        _to,
-                                       safe_output_channel_name(channels->second)
+                                       std_to_wx(channels->second.name)
                                        );
                        } else {
                                float const dB = linear_to_db(gain);
                                s = wxString::Format (
                                        _("Audio will be passed from %s channel %s to %s channel %s with gain %.1fdB."),
                                        _from,
                                        );
                        } else {
                                float const dB = linear_to_db(gain);
                                s = wxString::Format (
                                        _("Audio will be passed from %s channel %s to %s channel %s with gain %.1fdB."),
                                        _from,
-                                       safe_input_channel_name(channels->first),
+                                       input_channel_name_with_group(channels->first),
                                        _to,
                                        _to,
-                                       safe_output_channel_name(channels->second),
+                                       std_to_wx(channels->second.name),
                                        dB
                                        );
                        }
                                        dB
                                        );
                        }
index c65df4dafcb6eed51839ae56a78ab0c74e98e912..f5626e524d66020e44c544a65f1570cba888f404 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include "lib/audio_mapping.h"
  */
 
 #include "lib/audio_mapping.h"
+#include "lib/types.h"
 #include "lib/warnings.h"
 DCPOMATIC_DISABLE_WARNINGS
 #include <wx/wx.h>
 #include "lib/warnings.h"
 DCPOMATIC_DISABLE_WARNINGS
 #include <wx/wx.h>
@@ -51,8 +52,8 @@ public:
        AudioMappingView (wxWindow *, wxString left_label, wxString from, wxString top_label, wxString to);
 
        void set (AudioMapping);
        AudioMappingView (wxWindow *, wxString left_label, wxString from, wxString top_label, wxString to);
 
        void set (AudioMapping);
-       void set_input_channels (std::vector<std::string> const & names);
-       void set_output_channels (std::vector<std::string> const & names);
+       void set_input_channels (std::vector<NamedChannel> const& channels);
+       void set_output_channels (std::vector<NamedChannel> const& channels);
 
        struct Group
        {
 
        struct Group
        {
@@ -90,11 +91,10 @@ private:
        void right_down (wxMouseEvent &);
        void motion (wxMouseEvent &);
        void mouse_wheel (wxMouseEvent &);
        void right_down (wxMouseEvent &);
        void motion (wxMouseEvent &);
        void mouse_wheel (wxMouseEvent &);
-       boost::optional<std::pair<int, int> > mouse_event_to_channels (wxMouseEvent& ev) const;
+       boost::optional<std::pair<NamedChannel, NamedChannel> > mouse_event_to_channels (wxMouseEvent& ev) const;
        boost::optional<std::string> mouse_event_to_input_group_name (wxMouseEvent& ev) const;
        void setup ();
        boost::optional<std::string> mouse_event_to_input_group_name (wxMouseEvent& ev) const;
        void setup ();
-       wxString safe_input_channel_name (int n) const;
-       wxString safe_output_channel_name (int n) const;
+       wxString input_channel_name_with_group (NamedChannel const& n) const;
 
        void set_gain_from_menu (double linear);
        void edit ();
 
        void set_gain_from_menu (double linear);
        void edit ();
@@ -113,9 +113,9 @@ private:
        wxString _top_label;
        wxString _to;
 
        wxString _top_label;
        wxString _to;
 
-       std::vector<std::string> _input_channels;
-       std::vector<std::string> _output_channels;
+       std::vector<NamedChannel> _input_channels;
+       std::vector<NamedChannel> _output_channels;
        std::vector<Group> _input_groups;
 
        std::vector<Group> _input_groups;
 
-       boost::optional<std::pair<int, int> > _last_tooltip_channels;
+       boost::optional<std::pair<NamedChannel, NamedChannel> > _last_tooltip_channels;
 };
 };
index fe8e847951fc1d74aaa3baf758d2d45f24a68d99..40bb4340761c432fb6a13cb61a5ff00845852e25 100644 (file)
@@ -1016,15 +1016,15 @@ SoundPage::config_changed ()
 
        _map->set (Config::instance()->audio_mapping(channels));
 
 
        _map->set (Config::instance()->audio_mapping(channels));
 
-       vector<string> input;
+       vector<NamedChannel> input;
        for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
        for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
-               input.push_back (short_audio_channel_name(i));
+               input.push_back (NamedChannel(short_audio_channel_name(i), i));
        }
        _map->set_input_channels (input);
 
        }
        _map->set_input_channels (input);
 
-       vector<string> output;
+       vector<NamedChannel> output;
        for (int i = 0; i < channels; ++i) {
        for (int i = 0; i < channels; ++i) {
-               output.push_back (dcp::raw_convert<string>(i));
+               output.push_back (NamedChannel(dcp::raw_convert<string>(i), i));
        }
        _map->set_output_channels (output);
 
        }
        _map->set_output_channels (output);
 
index 487f80ea21e04aa85546c5c1dc23a42336387f26..e298114fcecc0bd377087fcc5723dbbf4ec5ae38 100644 (file)
@@ -190,8 +190,6 @@ BOOST_AUTO_TEST_CASE (isdcf_name_test)
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
 
        film->set_audio_channels(10);
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
 
        film->set_audio_channels(10);
-       mapping.set (0, dcp::LC, 1.0);
-       mapping.set (0, dcp::RC, 1.0);
        mapping.set (0, dcp::HI, 0.0);
        mapping.set (0, dcp::VI, 0.0);
        sound->audio->set_mapping (mapping);
        mapping.set (0, dcp::HI, 0.0);
        mapping.set (0, dcp::VI, 0.0);
        sound->audio->set_mapping (mapping);
@@ -204,8 +202,6 @@ BOOST_AUTO_TEST_CASE (isdcf_name_test)
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
 
        film->set_audio_channels(12);
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
 
        film->set_audio_channels(12);
-       mapping.set (0, dcp::LC, 0.0);
-       mapping.set (0, dcp::RC, 0.0);
        mapping.set (0, dcp::BSL, 1.0);
        mapping.set (0, dcp::BSR, 1.0);
        mapping.set (0, dcp::HI, 0.0);
        mapping.set (0, dcp::BSL, 1.0);
        mapping.set (0, dcp::BSR, 1.0);
        mapping.set (0, dcp::HI, 0.0);