X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Faudio_mapping_view.cc;h=1d9c085355f6a38f7ac27dfc1894256abb7381b6;hb=03b9ef36942b2d3e0b2054f465bcbe8e029069b2;hp=fa8732648008d5823288ea5569dc72762655082a;hpb=54819e695ac39ad62f2633ae10cdcf51adb4d810;p=dcpomatic.git diff --git a/src/wx/audio_mapping_view.cc b/src/wx/audio_mapping_view.cc index fa8732648..1d9c08535 100644 --- a/src/wx/audio_mapping_view.cc +++ b/src/wx/audio_mapping_view.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2019 Carl Hetherington + Copyright (C) 2013-2020 Carl Hetherington This file is part of DCP-o-matic. @@ -55,30 +55,41 @@ using dcp::locale_convert; enum { ID_off = 1, - ID_full = 2, - ID_minus6dB = 3, - ID_edit = 4 + ID_minus6dB = 2, + ID_0dB = 3, + ID_plus3dB = 4, + ID_edit = 5 }; -AudioMappingView::AudioMappingView (wxWindow* parent) +AudioMappingView::AudioMappingView (wxWindow* parent, wxString left_label, wxString from, wxString top_label, wxString to) : wxPanel (parent, wxID_ANY) , _menu_input (0) , _menu_output (1) + , _left_label (left_label) + , _from (from) + , _top_label (top_label) + , _to (to) { _menu = new wxMenu; _menu->Append (ID_off, _("Off")); - _menu->Append (ID_full, _("Full")); _menu->Append (ID_minus6dB, _("-6dB")); + _menu->Append (ID_0dB, _("0dB (unchanged)")); + _menu->Append (ID_plus3dB, _("+3dB")); _menu->Append (ID_edit, _("Edit...")); _body = new wxPanel (this, wxID_ANY); _vertical_scroll = new wxScrollBar (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL); _horizontal_scroll = new wxScrollBar (this, wxID_ANY); +#ifndef __WXOSX__ + SetDoubleBuffered (true); +#endif + Bind (wxEVT_SIZE, boost::bind(&AudioMappingView::size, this, _1)); - Bind (wxEVT_MENU, boost::bind(&AudioMappingView::off, this), ID_off); - Bind (wxEVT_MENU, boost::bind(&AudioMappingView::full, this), ID_full); - Bind (wxEVT_MENU, boost::bind(&AudioMappingView::minus6dB, this), ID_minus6dB); + Bind (wxEVT_MENU, boost::bind(&AudioMappingView::set_gain_from_menu, this, 0), ID_off); + Bind (wxEVT_MENU, boost::bind(&AudioMappingView::set_gain_from_menu, this, db_to_linear(-6)), ID_minus6dB); + Bind (wxEVT_MENU, boost::bind(&AudioMappingView::set_gain_from_menu, this, 1), ID_0dB); + Bind (wxEVT_MENU, boost::bind(&AudioMappingView::set_gain_from_menu, this, db_to_linear(3)), ID_plus3dB); Bind (wxEVT_MENU, boost::bind(&AudioMappingView::edit, this), ID_edit); Bind (wxEVT_MOUSEWHEEL, boost::bind(&AudioMappingView::mouse_wheel, this, _1)); _body->Bind (wxEVT_PAINT, boost::bind(&AudioMappingView::paint, this)); @@ -155,16 +166,12 @@ AudioMappingView::paint_static (wxDC& dc, wxGraphicsContext* gc) wxCoord label_width; wxCoord label_height; - /* DCP label at the top */ - - dc.GetTextExtent (_("DCP"), &label_width, &label_height); - dc.DrawText (_("DCP"), LEFT_WIDTH + (_output_channels.size() * GRID_SPACING - label_width) / 2, (GRID_SPACING - label_height) / 2); + dc.GetTextExtent (_top_label, &label_width, &label_height); + dc.DrawText (_top_label, LEFT_WIDTH + (_output_channels.size() * GRID_SPACING - label_width) / 2, (GRID_SPACING - label_height) / 2); - /* Content label on the left */ - - dc.GetTextExtent (_("Content"), &label_width, &label_height); + dc.GetTextExtent (_left_label, &label_width, &label_height); dc.DrawRotatedText ( - _("Content"), + _left_label, (GRID_SPACING - label_height) / 2, TOP_HEIGHT + (_input_channels.size() * GRID_SPACING + label_width) / 2, 90 @@ -304,14 +311,15 @@ AudioMappingView::paint_indicators (wxDC& dc) ) ); - float const value_dB = 20 * log10 (_map.get(y, x)); + float const value_dB = linear_to_db(_map.get(y, x)); + wxColour const colour = value_dB <= 0 ? wxColour(0, 255, 0) : wxColour(255, 150, 0); int const range = 18; int height = 0; if (value_dB > -range) { - height = INDICATOR_SIZE * (1 + value_dB / range); + height = min(INDICATOR_SIZE, static_cast(INDICATOR_SIZE * (1 + value_dB / range))); } - dc.SetBrush (*wxTheBrushList->FindOrCreateBrush(wxColour (0, 255, 0), wxBRUSHSTYLE_SOLID)); + dc.SetBrush (*wxTheBrushList->FindOrCreateBrush(colour, wxBRUSHSTYLE_SOLID)); dc.DrawRectangle ( wxRect( LEFT_WIDTH + x * GRID_SPACING + (GRID_SPACING - INDICATOR_SIZE) / 2, @@ -484,23 +492,9 @@ AudioMappingView::map_values_changed () } void -AudioMappingView::off () -{ - _map.set (_menu_input, _menu_output, 0); - map_values_changed (); -} - -void -AudioMappingView::full () -{ - _map.set (_menu_input, _menu_output, 1); - map_values_changed (); -} - -void -AudioMappingView::minus6dB () +AudioMappingView::set_gain_from_menu (double linear) { - _map.set (_menu_input, _menu_output, pow (10, -6.0 / 20)); + _map.set (_menu_input, _menu_output, linear); map_values_changed (); } @@ -553,7 +547,7 @@ AudioMappingView::safe_input_channel_name (int n) const } } - if (group) { + if (group && !group->IsEmpty()) { return wxString::Format ("%s/%s", group->data(), std_to_wx(_input_channels[n]).data()); } @@ -580,21 +574,27 @@ AudioMappingView::motion (wxMouseEvent& ev) float const gain = _map.get(channels->first, channels->second); if (gain == 0) { s = wxString::Format ( - _("No audio will be passed from content channel '%s' to DCP channel '%s'."), + _("No audio will be passed from %s channel '%s' to %s channel '%s'."), + _from, safe_input_channel_name(channels->first), + _to, safe_output_channel_name(channels->second) ); } else if (gain == 1) { s = wxString::Format ( - _("Audio will be passed from content channel %s to DCP channel %s unaltered."), + _("Audio will be passed from %s channel %s to %s channel %s unaltered."), + _from, safe_input_channel_name(channels->first), + _to, safe_output_channel_name(channels->second) ); } else { - float const dB = 20 * log10 (gain); + float const dB = linear_to_db(gain); s = wxString::Format ( - _("Audio will be passed from content channel %s to DCP channel %s with gain %.1fdB."), + _("Audio will be passed from %s channel %s to %s channel %s with gain %.1fdB."), + _from, safe_input_channel_name(channels->first), + _to, safe_output_channel_name(channels->second), dB );