Basics of allowing setup of DCP audio channels.
authorCarl Hetherington <cth@carlh.net>
Thu, 11 Jul 2013 11:41:09 +0000 (12:41 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 11 Jul 2013 11:41:09 +0000 (12:41 +0100)
src/lib/film.cc
src/lib/film.h
src/wx/audio_mapping_view.cc
src/wx/audio_mapping_view.h
src/wx/film_editor.cc
src/wx/film_editor.h

index dad9d6808464cd8a57af6b2b9ac3125e1c50fe2d..16b34110c932b5dbef96b03f7118f0ecda286309 100644 (file)
@@ -625,6 +625,16 @@ Film::set_dcp_video_frame_rate (int f)
        signal_changed (DCP_VIDEO_FRAME_RATE);
 }
 
+void
+Film::set_dcp_audio_channels (int c)
+{
+       {
+               boost::mutex::scoped_lock lm (_state_mutex);
+               _dcp_audio_channels = c;
+       }
+       signal_changed (DCP_AUDIO_CHANNELS);
+}
+
 void
 Film::signal_changed (Property p)
 {
index 08fdc587b9754262bf40f362291bcb6a227d95ec..2bf1a0e901b6bc15cc150eeffdec81b1815f86ce 100644 (file)
@@ -139,6 +139,7 @@ public:
                J2K_BANDWIDTH,
                DCI_METADATA,
                DCP_VIDEO_FRAME_RATE,
+               DCP_AUDIO_CHANNELS
        };
 
 
@@ -221,6 +222,7 @@ public:
        void set_j2k_bandwidth (int);
        void set_dci_metadata (DCIMetadata);
        void set_dcp_video_frame_rate (int);
+       void set_dcp_audio_channels (int);
        void set_dci_date_today ();
 
        /** Emitted when some property has of the Film has changed */
index 1e938b357d0d943aaf97752cb0a2bc48a02895ce..859c4d54859c3243d89170cd164cb465c8aac339 100644 (file)
@@ -99,15 +99,7 @@ AudioMappingView::AudioMappingView (wxWindow* parent)
        _grid->SetCellHighlightPenWidth (0);
        _grid->SetDefaultRenderer (new NoSelectionStringRenderer);
 
-       _grid->SetColLabelValue (0, _("Content channel"));
-       _grid->SetColLabelValue (1, _("L"));
-       _grid->SetColLabelValue (2, _("R"));
-       _grid->SetColLabelValue (3, _("C"));
-       _grid->SetColLabelValue (4, _("Lfe"));
-       _grid->SetColLabelValue (5, _("Ls"));
-       _grid->SetColLabelValue (6, _("Rs"));
-
-       _grid->AutoSize ();
+       set_column_labels ();
 
        _sizer = new wxBoxSizer (wxVERTICAL);
        _sizer->Add (_grid, 1, wxEXPAND | wxALL);
@@ -129,26 +121,28 @@ AudioMappingView::left_click (wxGridEvent& ev)
                _grid->SetCellValue (ev.GetRow(), ev.GetCol(), wxT("1"));
        }
 
-       AudioMapping mapping;
+       _map = AudioMapping ();
        for (int i = 0; i < _grid->GetNumberRows(); ++i) {
                for (int j = 1; j < _grid->GetNumberCols(); ++j) {
                        if (_grid->GetCellValue (i, j) == wxT ("1")) {
-                               mapping.add (i, static_cast<libdcp::Channel> (j - 1));
+                               _map.add (i, static_cast<libdcp::Channel> (j - 1));
                        }
                }
        }
 
-       Changed (mapping);
+       Changed (_map);
 }
 
 void
 AudioMappingView::set (AudioMapping map)
 {
+       _map = map;
+       
        if (_grid->GetNumberRows ()) {
                _grid->DeleteRows (0, _grid->GetNumberRows ());
        }
 
-       list<int> content_channels = map.content_channels ();
+       list<int> content_channels = _map.content_channels ();
        _grid->InsertRows (0, content_channels.size ());
 
        for (size_t r = 0; r < content_channels.size(); ++r) {
@@ -161,11 +155,62 @@ AudioMappingView::set (AudioMapping map)
        for (list<int>::iterator i = content_channels.begin(); i != content_channels.end(); ++i) {
                _grid->SetCellValue (n, 0, wxString::Format (wxT("%d"), *i + 1));
 
-               list<libdcp::Channel> const d = map.content_to_dcp (*i);
+               list<libdcp::Channel> const d = _map.content_to_dcp (*i);
                for (list<libdcp::Channel>::const_iterator j = d.begin(); j != d.end(); ++j) {
-                       _grid->SetCellValue (n, static_cast<int> (*j) + 1, wxT("1"));
+                       int const c = static_cast<int>(*j) + 1;
+                       if (c < _grid->GetNumberCols ()) {
+                               _grid->SetCellValue (n, c, wxT("1"));
+                       }
                }
                ++n;
        }
 }
 
+void
+AudioMappingView::set_channels (int c)
+{
+       c++;
+
+       if (c < _grid->GetNumberCols ()) {
+               _grid->DeleteCols (c, _grid->GetNumberCols() - c);
+       } else if (c > _grid->GetNumberCols ()) {
+               _grid->InsertCols (_grid->GetNumberCols(), c - _grid->GetNumberCols());
+               set_column_labels ();
+       }
+
+       set (_map);
+}
+
+void
+AudioMappingView::set_column_labels ()
+{
+       int const c = _grid->GetNumberCols ();
+       
+       _grid->SetColLabelValue (0, _("Content channel"));
+       
+       if (c > 0) {
+               _grid->SetColLabelValue (1, _("L"));
+       }
+       
+       if (c > 1) {
+               _grid->SetColLabelValue (2, _("R"));
+       }
+       
+       if (c > 2) {
+               _grid->SetColLabelValue (3, _("C"));
+       }
+       
+       if (c > 3) {
+               _grid->SetColLabelValue (4, _("Lfe"));
+       }
+       
+       if (c > 4) {
+               _grid->SetColLabelValue (5, _("Ls"));
+       }
+       
+       if (c > 5) {
+               _grid->SetColLabelValue (6, _("Rs"));
+       }
+
+       _grid->AutoSize ();
+}
index e0709c8b7abc7d1b72418f403a92238e56ec7834..80534a613004425a83e2ac1eeb2a39011b1e1b5f 100644 (file)
@@ -28,12 +28,15 @@ public:
        AudioMappingView (wxWindow *);
 
        void set (AudioMapping);
+       void set_channels (int);
 
        boost::signals2::signal<void (AudioMapping)> Changed;
 
 private:
        void left_click (wxGridEvent &);
+       void set_column_labels ();
 
        wxGrid* _grid;
        wxSizer* _sizer;
+       AudioMapping _map;
 };
index 8d33b58d677ada5b820ed6c42f127e096e8d5f77..4794a9d3398b8ab5113f7e0134d36b82dc3469b9 100644 (file)
@@ -149,6 +149,11 @@ FilmEditor::make_dcp_panel ()
        }
        ++r;
 
+       add_label_to_grid_bag_sizer (grid, _dcp_panel, _("DCP audio channels"), true, wxGBPosition (r, 0));
+       _dcp_audio_channels = new wxSpinCtrl (_dcp_panel, wxID_ANY);
+       grid->Add (_dcp_audio_channels, wxGBPosition (r, 1));
+       ++r;
+
        {
                add_label_to_grid_bag_sizer (grid, _dcp_panel, _("JPEG2000 bandwidth"), true, wxGBPosition (r, 0));
                wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
@@ -184,6 +189,7 @@ FilmEditor::make_dcp_panel ()
                _dcp_frame_rate->Append (std_to_wx (boost::lexical_cast<string> (*i)));
        }
 
+       _dcp_audio_channels->SetRange (0, MAX_AUDIO_CHANNELS);
        _j2k_bandwidth->SetRange (50, 250);
 }
 
@@ -211,6 +217,7 @@ FilmEditor::connect_to_widgets ()
        _dcp_content_type->Connect       (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED,      wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this);
        _dcp_frame_rate->Connect         (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED,      wxCommandEventHandler (FilmEditor::dcp_frame_rate_changed), 0, this);
        _best_dcp_frame_rate->Connect    (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED,       wxCommandEventHandler (FilmEditor::best_dcp_frame_rate_clicked), 0, this);
+       _dcp_audio_channels->Connect     (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED,     wxCommandEventHandler (FilmEditor::dcp_audio_channels_changed), 0, this);
        _with_subtitles->Connect         (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED,     wxCommandEventHandler (FilmEditor::with_subtitles_toggled), 0, this);
        _subtitle_offset->Connect        (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED,     wxCommandEventHandler (FilmEditor::subtitle_offset_changed), 0, this);
        _subtitle_scale->Connect         (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED,     wxCommandEventHandler (FilmEditor::subtitle_scale_changed), 0, this);
@@ -581,6 +588,16 @@ FilmEditor::dcp_frame_rate_changed (wxCommandEvent &)
                );
 }
 
+void
+FilmEditor::dcp_audio_channels_changed (wxCommandEvent &)
+{
+       if (!_film) {
+               return;
+       }
+
+       _film->set_dcp_audio_channels (_dcp_audio_channels->GetValue ());
+}
+
 
 /** Called when the metadata stored in the Film object has changed;
  *  so that we can update the GUI.
@@ -660,6 +677,10 @@ FilmEditor::film_changed (Film::Property p)
                _best_dcp_frame_rate->Enable (_film->best_dcp_video_frame_rate () != _film->dcp_video_frame_rate ());
                break;
        }
+       case Film::DCP_AUDIO_CHANNELS:
+               _dcp_audio_channels->SetValue (_film->dcp_audio_channels ());
+               _audio_mapping->set_channels (_film->dcp_audio_channels ());
+               break;
        }
 }
 
@@ -868,6 +889,7 @@ FilmEditor::set_film (shared_ptr<Film> f)
        film_changed (Film::J2K_BANDWIDTH);
        film_changed (Film::DCI_METADATA);
        film_changed (Film::DCP_VIDEO_FRAME_RATE);
+       film_changed (Film::DCP_AUDIO_CHANNELS);
 
        wxListEvent ev;
        content_selection_changed (ev);
index fdc6e077dbc7d48ed7a810daf90bc45047cfd428..100e47b5be738d382b4456d0c4fef84b3cad543a 100644 (file)
@@ -97,6 +97,7 @@ private:
        void start_changed ();
        void length_changed ();
        void ratio_changed (wxCommandEvent &);
+       void dcp_audio_channels_changed (wxCommandEvent &);
 
        /* Handle changes to the model */
        void film_changed (Film::Property);
@@ -167,6 +168,7 @@ private:
        wxSpinCtrl* _j2k_bandwidth;
        wxChoice* _dcp_content_type;
        wxChoice* _dcp_frame_rate;
+       wxSpinCtrl* _dcp_audio_channels;
        wxButton* _best_dcp_frame_rate;
        wxChoice* _audio_stream;
        wxStaticText* _audio_description;