fix conflicts after merge with master

This commit is contained in:
Paul Davis 2013-08-05 14:22:32 -04:00
commit 616f2a0370
116 changed files with 3621 additions and 1742 deletions

View file

@ -42,6 +42,7 @@ using namespace Gtk;
using namespace std; using namespace std;
using namespace PBD; using namespace PBD;
using namespace ARDOUR; using namespace ARDOUR;
using namespace VideoUtils;
#define PREVIEW_WIDTH (240) #define PREVIEW_WIDTH (240)
#define PREVIEW_HEIGHT (180) #define PREVIEW_HEIGHT (180)
@ -482,7 +483,7 @@ AddVideoDialog::harvid_request(std::string u)
harvid_list->clear(); harvid_list->clear();
char *res = curl_http_get(url, &status); char *res = a3_curl_http_get(url, &status);
if (status != 200) { if (status != 200) {
printf("request failed\n"); // XXX printf("request failed\n"); // XXX
harvid_path.set_text(" - request failed -"); harvid_path.set_text(" - request failed -");
@ -662,7 +663,7 @@ AddVideoDialog::request_preview(std::string u)
, (long long) (video_duration * seek_slider.get_value() / 1000.0) , (long long) (video_duration * seek_slider.get_value() / 1000.0)
, clip_width, clip_height, u.c_str()); , clip_width, clip_height, u.c_str());
char *data = curl_http_get(url, NULL); char *data = a3_curl_http_get(url, NULL);
if (!data) { if (!data) {
printf("image preview request failed %s\n", url); printf("image preview request failed %s\n", url);
imgbuf->fill(RGBA_TO_UINT(0,0,0,255)); imgbuf->fill(RGBA_TO_UINT(0,0,0,255));

View file

@ -989,3 +989,25 @@ style "default_toggle_button"
bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator
fg[ACTIVE] = @@COLPREFIX@_darkest fg[ACTIVE] = @@COLPREFIX@_darkest
} }
style "meter_strip_dpm" = "default"
{
}
style "meter_strip_ppm" = "default"
{
bg[NORMAL] = { 0.1, 0.1, 0.1 }
fg[NORMAL] = { 1.0, 1.0, 1.0 }
}
style "meter_strip_vu" = "default"
{
bg[NORMAL] = { .84, .77, .58 }
fg[NORMAL] = { 0.0, 0.0, 0.0 }
}
style "meter_strip_sep" = "default"
{
bg[NORMAL] = { 0.0, 0.0, 0.0 }
}

View file

@ -221,7 +221,8 @@
<Option name="solo safe: led active" value="ff0000ff"/> <Option name="solo safe: led active" value="ff0000ff"/>
<Option name="solo safe: text" value="c7c7d8ff"/> <Option name="solo safe: text" value="c7c7d8ff"/>
<Option name="solo safe: text active" value="c8c8d9ff"/> <Option name="solo safe: text active" value="c8c8d9ff"/>
<Option name="meterbridge peaklabel" value="cc4422ff"/> <Option name="meterbridge peaklabel" value="ff1111ff"/>
<Option name="meter color BBC" value="ffa500ff"/>
<Option name="meterbridge peakindicator: fill start" value="444444ff"/> <Option name="meterbridge peakindicator: fill start" value="444444ff"/>
<Option name="meterbridge peakindicator: fill end" value="333333ff"/> <Option name="meterbridge peakindicator: fill end" value="333333ff"/>
<Option name="meterbridge peakindicator on: fill start" value="ff0000ff"/> <Option name="meterbridge peakindicator on: fill start" value="ff0000ff"/>

View file

@ -290,6 +290,11 @@ widget "*PluginLoadButton" style:highest "small_button"
widget "*PluginLoadButton*" style:highest "small_button" widget "*PluginLoadButton*" style:highest "small_button"
widget "*PluginEditorButton" style:highest "default_toggle_button" widget "*PluginEditorButton" style:highest "default_toggle_button"
widget "*meterstripPPM" style:highest "meter_strip_ppm"
widget "*meterstripDPM" style:highest "meter_strip_dpm"
widget "*meterstripVU" style:highest "meter_strip_vu"
widget "*BlackSeparator" style:highest "meter_strip_sep"
widget "*MetricDialogFrame" style:highest "base_frame" widget "*MetricDialogFrame" style:highest "base_frame"
widget "*MetricEntry" style:highest "medium_bold_entry" widget "*MetricEntry" style:highest "medium_bold_entry"
widget "*MetricButton" style:highest "default_button" widget "*MetricButton" style:highest "default_button"

View file

@ -182,6 +182,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, solo_alert_button (_("solo")) , solo_alert_button (_("solo"))
, feedback_alert_button (_("feedback")) , feedback_alert_button (_("feedback"))
, editor_meter(0)
, editor_meter_peak_display()
, speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) , speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
, theme_manager (X_("theme-manager"), _("Theme Manager")) , theme_manager (X_("theme-manager"), _("Theme Manager"))
, key_editor (X_("key-editor"), _("Key Bindings")) , key_editor (X_("key-editor"), _("Key Bindings"))
@ -1020,6 +1023,15 @@ ARDOUR_UI::every_point_zero_something_seconds ()
// august 2007: actual update frequency: 25Hz (40ms), not 100Hz // august 2007: actual update frequency: 25Hz (40ms), not 100Hz
SuperRapidScreenUpdate(); /* EMIT_SIGNAL */ SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
if (editor_meter && Config->get_show_editor_meter()) {
float mpeak = editor_meter->update_meters();
if (mpeak > editor_meter_max_peak) {
if (mpeak >= Config->get_meter_peak()) {
editor_meter_peak_display.set_name ("meterbridge peakindicator on");
editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
}
}
}
return TRUE; return TRUE;
} }
@ -3479,7 +3491,10 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
return; return;
} }
if (!transcode_video_dialog->get_audiofile().empty()) { if (!transcode_video_dialog->get_audiofile().empty()) {
editor->embed_audio_from_video(transcode_video_dialog->get_audiofile()); editor->embed_audio_from_video(
transcode_video_dialog->get_audiofile(),
video_timeline->get_offset()
);
} }
switch (transcode_video_dialog->import_option()) { switch (transcode_video_dialog->import_option()) {
case VTL_IMPORT_TRANSCODED: case VTL_IMPORT_TRANSCODED:
@ -3543,6 +3558,10 @@ ARDOUR_UI::remove_video ()
video_timeline->close_session(); video_timeline->close_session();
editor->toggle_ruler_video(false); editor->toggle_ruler_video(false);
/* reset state */
video_timeline->set_offset_locked(false);
video_timeline->set_offset(0);
/* delete session state */ /* delete session state */
XMLNode* node = new XMLNode(X_("Videotimeline")); XMLNode* node = new XMLNode(X_("Videotimeline"));
_session->add_extra_xml(*node); _session->add_extra_xml(*node);
@ -4080,3 +4099,32 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat
msg.run (); msg.run ();
} }
void
ARDOUR_UI::reset_peak_display ()
{
if (!_session || !_session->master_out() || !editor_meter) return;
editor_meter->clear_meters();
editor_meter_max_peak = -INFINITY;
editor_meter_peak_display.set_name ("meterbridge peakindicator");
editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
}
void
ARDOUR_UI::reset_group_peak_display (RouteGroup* group)
{
if (!_session || !_session->master_out()) return;
if (group == _session->master_out()->route_group()) {
reset_peak_display ();
}
}
void
ARDOUR_UI::reset_route_peak_display (Route* route)
{
if (!_session || !_session->master_out()) return;
if (_session->master_out().get() == route) {
reset_peak_display ();
}
}

View file

@ -104,6 +104,7 @@ class SpeakerDialog;
class ThemeManager; class ThemeManager;
class TimeInfoBox; class TimeInfoBox;
class MidiTracer; class MidiTracer;
class LevelMeterHBox;
class GlobalPortMatrixWindow; class GlobalPortMatrixWindow;
class GUIObjectState; class GUIObjectState;
@ -281,6 +282,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void get_process_buffers (); void get_process_buffers ();
void drop_process_buffers (); void drop_process_buffers ();
void reset_peak_display ();
void reset_route_peak_display (ARDOUR::Route*);
void reset_group_peak_display (ARDOUR::RouteGroup*);
const std::string& announce_string() const { return _announce_string; } const std::string& announce_string() const { return _announce_string; }
protected: protected:
@ -444,6 +449,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
ArdourButton feedback_alert_button; ArdourButton feedback_alert_button;
Gtk::VBox alert_box; Gtk::VBox alert_box;
Gtk::VBox meter_box;
LevelMeterHBox * editor_meter;
float editor_meter_max_peak;
ArdourButton editor_meter_peak_display;
bool editor_meter_peak_button_release (GdkEventButton*);
void solo_blink (bool); void solo_blink (bool);
void sync_blink (bool); void sync_blink (bool);

View file

@ -144,6 +144,7 @@ ARDOUR_UI::setup_tooltips ()
set_tip (feedback_alert_button, _("When active, there is a feedback loop.")); set_tip (feedback_alert_button, _("When active, there is a feedback loop."));
set_tip (primary_clock, _("<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n")); set_tip (primary_clock, _("<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
set_tip (secondary_clock, _("<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n")); set_tip (secondary_clock, _("<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
set_tip (editor_meter_peak_display, _("Reset Level Meter"));
synchronize_sync_source_and_video_pullup (); synchronize_sync_source_and_video_pullup ();
@ -417,6 +418,8 @@ ARDOUR_UI::setup_transport ()
transport_tearoff_hbox.pack_start (_editor_transport_box, false, false); transport_tearoff_hbox.pack_start (_editor_transport_box, false, false);
} }
transport_tearoff_hbox.pack_start (alert_box, false, false); transport_tearoff_hbox.pack_start (alert_box, false, false);
transport_tearoff_hbox.pack_start (meter_box, false, false);
transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
if (Profile->get_sae()) { if (Profile->get_sae()) {
Image* img = manage (new Image ((::get_icon (X_("sae"))))); Image* img = manage (new Image ((::get_icon (X_("sae")))));

View file

@ -39,6 +39,7 @@
#include "keyeditor.h" #include "keyeditor.h"
#include "location_ui.h" #include "location_ui.h"
#include "main_clock.h" #include "main_clock.h"
#include "meter_patterns.h"
#include "midi_tracer.h" #include "midi_tracer.h"
#include "mixer_ui.h" #include "mixer_ui.h"
#include "public_editor.h" #include "public_editor.h"
@ -52,6 +53,8 @@
#include "theme_manager.h" #include "theme_manager.h"
#include "time_info_box.h" #include "time_info_box.h"
#include <gtkmm2ext/keyboard.h>
#include "i18n.h" #include "i18n.h"
using namespace ARDOUR; using namespace ARDOUR;
@ -186,6 +189,45 @@ ARDOUR_UI::set_session (Session *s)
point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40); point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40);
update_format (); update_format ();
if (editor_meter) {
meter_box.remove(*editor_meter);
delete editor_meter;
editor_meter = 0;
editor_meter_peak_display.hide();
}
if (_session && _session->master_out()) {
editor_meter = new LevelMeterHBox(_session);
editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
editor_meter->clear_meters();
editor_meter->set_type (_session->master_out()->meter_type());
editor_meter->setup_meters (30, 12, 6);
editor_meter->show();
meter_box.pack_start(*editor_meter);
ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
editor_meter_peak_display.set_name ("meterbridge peakindicator");
editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
editor_meter_peak_display.set_size_request(6, -1);
editor_meter_peak_display.set_corner_radius(2);
editor_meter_max_peak = -INFINITY;
editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
if (Config->get_show_editor_meter()) {
meter_box.show();
editor_meter_peak_display.show();
} else {
meter_box.hide();
editor_meter_peak_display.hide();
}
}
} }
int int
@ -225,6 +267,13 @@ ARDOUR_UI::unload_session (bool hide_stuff)
point_one_second_connection.disconnect (); point_one_second_connection.disconnect ();
point_zero_something_second_connection.disconnect(); point_zero_something_second_connection.disconnect();
if (editor_meter) {
meter_box.remove(*editor_meter);
delete editor_meter;
editor_meter = 0;
editor_meter_peak_display.hide();
}
ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false); ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
rec_button.set_sensitive (false); rec_button.set_sensitive (false);
@ -497,3 +546,18 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window
return false; return false;
} }
bool
ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
{
if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
ArdourMeter::ResetAllPeakDisplays ();
} else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
if (_session->master_out()) {
ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
}
} else if (_session->master_out()) {
ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
}
return true;
}

View file

@ -413,6 +413,15 @@ ARDOUR_UI::parameter_changed (std::string p)
} else if (p == "super-rapid-clock-update") { } else if (p == "super-rapid-clock-update") {
stop_clocking (); stop_clocking ();
start_clocking (); start_clocking ();
} else if (p == "show-editor-meter") {
bool show = Config->get_show_editor_meter();
if (editor_meter && show) {
meter_box.show();
editor_meter_peak_display.show();
} else if (editor_meter && !show) {
meter_box.hide();
editor_meter_peak_display.hide();
}
} }
} }

View file

@ -2013,7 +2013,7 @@ framepos_t
AudioClock::frame_duration_from_bbt_string (framepos_t pos, const string& str) const AudioClock::frame_duration_from_bbt_string (framepos_t pos, const string& str) const
{ {
if (_session == 0) { if (_session == 0) {
error << "AudioClock::current_time() called with BBT mode but without session!" << endmsg; error << "AudioClock::frame_duration_from_bbt_string() called with BBT mode but without session!" << endmsg;
return 0; return 0;
} }

View file

@ -65,6 +65,7 @@ CANVAS_VARIABLE(canvasvar_MeasureLineBar, "measure line bar")
CANVAS_VARIABLE(canvasvar_MeasureLineBeat, "measure line beat") CANVAS_VARIABLE(canvasvar_MeasureLineBeat, "measure line beat")
CANVAS_VARIABLE(canvasvar_MeterBar, "meter bar") CANVAS_VARIABLE(canvasvar_MeterBar, "meter bar")
CANVAS_VARIABLE(canvasvar_MeterBridgePeakLabel, "meterbridge peaklabel") CANVAS_VARIABLE(canvasvar_MeterBridgePeakLabel, "meterbridge peaklabel")
CANVAS_VARIABLE(canvasvar_MeterColorBBC, "meter color BBC")
CANVAS_VARIABLE(canvasvar_MeterColor0, "meter fill: 0") CANVAS_VARIABLE(canvasvar_MeterColor0, "meter fill: 0")
CANVAS_VARIABLE(canvasvar_MeterColor1, "meter fill: 1") CANVAS_VARIABLE(canvasvar_MeterColor1, "meter fill: 1")
CANVAS_VARIABLE(canvasvar_MeterColor2, "meter fill: 2") CANVAS_VARIABLE(canvasvar_MeterColor2, "meter fill: 2")

View file

@ -1665,7 +1665,7 @@ VideoTimeLineDrag::motion (GdkEvent* event, bool first_move)
} }
framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame() + _pointer_frame_offset; framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame() + _pointer_frame_offset;
dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(dt); dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(_startdrag_video_offset+dt) - _startdrag_video_offset;
if (_max_backwards_drag >= 0 && dt <= - _max_backwards_drag) { if (_max_backwards_drag >= 0 && dt <= - _max_backwards_drag) {
dt = - _max_backwards_drag; dt = - _max_backwards_drag;
@ -2373,6 +2373,7 @@ CursorDrag::fake_locate (framepos_t t)
framepos_t const f = _editor->playhead_cursor->current_frame; framepos_t const f = _editor->playhead_cursor->current_frame;
s->send_mmc_locate (f); s->send_mmc_locate (f);
s->send_full_time_code (f); s->send_full_time_code (f);
s->send_song_position_pointer (f);
} }
show_verbose_cursor_time (t); show_verbose_cursor_time (t);

View file

@ -6950,7 +6950,7 @@ Editor::uncombine_regions ()
void void
Editor::toggle_midi_input_active (bool flip_others) Editor::toggle_midi_input_active (bool flip_others)
{ {
bool onoff; bool onoff = false;
boost::shared_ptr<RouteList> rl (new RouteList); boost::shared_ptr<RouteList> rl (new RouteList);
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {

View file

@ -111,8 +111,12 @@ EngineControl::EngineControl ()
strings.clear (); strings.clear ();
strings.push_back (_("None")); strings.push_back (_("None"));
#ifdef __APPLE__
strings.push_back (_("coremidi"));
#else
strings.push_back (_("seq")); strings.push_back (_("seq"));
strings.push_back (_("raw")); strings.push_back (_("raw"));
#endif
set_popdown_strings (midi_driver_combo, strings); set_popdown_strings (midi_driver_combo, strings);
midi_driver_combo.set_active_text (strings.front ()); midi_driver_combo.set_active_text (strings.front ());

View file

@ -60,6 +60,7 @@ using namespace Gtk;
using namespace std; using namespace std;
using namespace PBD; using namespace PBD;
using namespace ARDOUR; using namespace ARDOUR;
using namespace VideoUtils;
ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s) ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
: ArdourDialog (_("Export Video File ")) : ArdourDialog (_("Export Video File "))

View file

@ -84,7 +84,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false)); gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false));
} }
level_meter = new LevelMeter(_session); level_meter = new LevelMeterHBox(_session);
level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1)); level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1));
meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press)); meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press));
@ -526,9 +526,12 @@ GainMeterBase::gain_changed ()
void void
GainMeterBase::set_meter_strip_name (const char * name) GainMeterBase::set_meter_strip_name (const char * name)
{ {
char tmp[256];
meter_metric_area.set_name (name); meter_metric_area.set_name (name);
meter_ticks1_area.set_name (name); sprintf(tmp, "Mark%sLeft", name);
meter_ticks2_area.set_name (name); meter_ticks1_area.set_name (tmp);
sprintf(tmp, "Mark%sRight", name);
meter_ticks2_area.set_name (tmp);
} }
void void
@ -1019,21 +1022,30 @@ GainMeter::get_gm_width ()
gint gint
GainMeter::meter_metrics_expose (GdkEventExpose *ev) GainMeter::meter_metrics_expose (GdkEventExpose *ev)
{ {
assert(_route); if (!_route) {
if (_types.empty()) { _types.push_back(DataType::AUDIO); }
return meter_expose_metrics(ev, MeterPeak, _types, &meter_metric_area);
}
return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area);
} }
gint gint
GainMeter::meter_ticks1_expose (GdkEventExpose *ev) GainMeter::meter_ticks1_expose (GdkEventExpose *ev)
{ {
assert(_route); if (!_route) {
if (_types.empty()) { _types.push_back(DataType::AUDIO); }
return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks1_area);
}
return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area);
} }
gint gint
GainMeter::meter_ticks2_expose (GdkEventExpose *ev) GainMeter::meter_ticks2_expose (GdkEventExpose *ev)
{ {
assert(_route); if (!_route) {
if (_types.empty()) { _types.push_back(DataType::AUDIO); }
return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks2_area);
}
return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area);
} }

View file

@ -89,7 +89,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
boost::shared_ptr<PBD::Controllable> get_controllable(); boost::shared_ptr<PBD::Controllable> get_controllable();
LevelMeter& get_level_meter() const { return *level_meter; } LevelMeterHBox& get_level_meter() const { return *level_meter; }
Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; } Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; }
/** Emitted in the GUI thread when a button is pressed over the level meter; /** Emitted in the GUI thread when a button is pressed over the level meter;
@ -117,7 +117,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
Gtk::DrawingArea meter_metric_area; Gtk::DrawingArea meter_metric_area;
Gtk::DrawingArea meter_ticks1_area; Gtk::DrawingArea meter_ticks1_area;
Gtk::DrawingArea meter_ticks2_area; Gtk::DrawingArea meter_ticks2_area;
LevelMeter *level_meter; LevelMeterHBox *level_meter;
sigc::connection gain_watching; sigc::connection gain_watching;

View file

@ -22,7 +22,6 @@
#include "ardour/meter.h" #include "ardour/meter.h"
#include <gtkmm2ext/utils.h> #include <gtkmm2ext/utils.h>
#include <gtkmm2ext/fastmeter.h>
#include <gtkmm2ext/barcontroller.h> #include <gtkmm2ext/barcontroller.h>
#include "midi++/manager.h" #include "midi++/manager.h"
#include "pbd/fastlog.h" #include "pbd/fastlog.h"
@ -44,27 +43,29 @@ using namespace Gtkmm2ext;
using namespace Gtk; using namespace Gtk;
using namespace std; using namespace std;
LevelMeter::LevelMeter (Session* s) LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord* ir, FastMeter::Orientation o)
: _meter (0) : parent_invalidator(ir)
, _meter (0)
, _meter_orientation(o)
, regular_meter_width (6)
, meter_length (0) , meter_length (0)
, thin_meter_width(2) , thin_meter_width(2)
{ {
set_session (s); set_session (s);
set_spacing (1); Config->ParameterChanged.connect (_parameter_connection, parent_invalidator, boost::bind (&LevelMeterBase::parameter_changed, this, _1), gui_context());
Config->ParameterChanged.connect (_parameter_connection, invalidator (*this), boost::bind (&LevelMeter::parameter_changed, this, _1), gui_context()); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeterBase::on_theme_changed));
UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeter::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeterBase::color_handler));
ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeter::color_handler));
max_peak = minus_infinity(); max_peak = minus_infinity();
meter_type = MeterPeak; meter_type = MeterPeak;
} }
void void
LevelMeter::on_theme_changed() LevelMeterBase::on_theme_changed()
{ {
style_changed = true; style_changed = true;
} }
LevelMeter::~LevelMeter () LevelMeterBase::~LevelMeterBase ()
{ {
for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) { for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) {
delete (*i).meter; delete (*i).meter;
@ -72,7 +73,7 @@ LevelMeter::~LevelMeter ()
} }
void void
LevelMeter::set_meter (PeakMeter* meter) LevelMeterBase::set_meter (PeakMeter* meter)
{ {
_configuration_connection.disconnect(); _configuration_connection.disconnect();
_meter_type_connection.disconnect(); _meter_type_connection.disconnect();
@ -80,13 +81,13 @@ LevelMeter::set_meter (PeakMeter* meter)
_meter = meter; _meter = meter;
if (_meter) { if (_meter) {
_meter->ConfigurationChanged.connect (_configuration_connection, invalidator (*this), boost::bind (&LevelMeter::configuration_changed, this, _1, _2), gui_context()); _meter->ConfigurationChanged.connect (_configuration_connection, parent_invalidator, boost::bind (&LevelMeterBase::configuration_changed, this, _1, _2), gui_context());
_meter->TypeChanged.connect (_meter_type_connection, invalidator (*this), boost::bind (&LevelMeter::meter_type_changed, this, _1), gui_context()); _meter->TypeChanged.connect (_meter_type_connection, parent_invalidator, boost::bind (&LevelMeterBase::meter_type_changed, this, _1), gui_context());
} }
} }
static float meter_lineup(float offset) { static float meter_lineup_cfg(MeterLineUp lul, float offset) {
switch (Config->get_meter_line_up_level()) { switch (lul) {
case MeteringLineUp24: case MeteringLineUp24:
return offset + 6.0; return offset + 6.0;
case MeteringLineUp20: case MeteringLineUp20:
@ -101,20 +102,27 @@ static float meter_lineup(float offset) {
return offset; return offset;
} }
static float meter_lineup(float offset) {
return meter_lineup_cfg(Config->get_meter_line_up_level(), offset);
}
static float vu_standard() { static float vu_standard() {
// note - default meter config is +2dB (france) // note - default meter config is +2dB (france)
switch (Config->get_meter_vu_standard()) { switch (Config->get_meter_vu_standard()) {
case MeteringVUfrench: // +2dB default:
case MeteringVUfrench: // 0VU = -2dBu
return 0; return 0;
case MeteringVUamerican: // 0dB case MeteringVUamerican: // 0VU = 0dBu
return -2; return -2;
case MeteringVUstandard: // -4dB case MeteringVUstandard: // 0VU = +4dBu
return -6; return -6;
case MeteringVUeight: // 0VU = +8dBu
return -10;
} }
} }
float float
LevelMeter::update_meters () LevelMeterBase::update_meters ()
{ {
vector<MeterInfo>::iterator i; vector<MeterInfo>::iterator i;
uint32_t n; uint32_t n;
@ -130,7 +138,7 @@ LevelMeter::update_meters ()
const float mpeak = _meter->meter_level(n, MeterMaxPeak); const float mpeak = _meter->meter_level(n, MeterMaxPeak);
if (mpeak > (*i).max_peak) { if (mpeak > (*i).max_peak) {
(*i).max_peak = mpeak; (*i).max_peak = mpeak;
(*i).meter->set_highlight(mpeak > Config->get_meter_peak()); (*i).meter->set_highlight(mpeak >= Config->get_meter_peak());
} }
if (mpeak > max_peak) { if (mpeak > max_peak) {
max_peak = mpeak; max_peak = mpeak;
@ -145,7 +153,7 @@ LevelMeter::update_meters ()
} else if (meter_type == MeterIEC1NOR) { } else if (meter_type == MeterIEC1NOR) {
(*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0))); (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
} else if (meter_type == MeterIEC1DIN) { } else if (meter_type == MeterIEC1DIN) {
(*i).meter->set (meter_deflect_din (peak + meter_lineup(3.0))); (*i).meter->set (meter_deflect_din (peak + meter_lineup_cfg(Config->get_meter_line_up_din(), 3.0)));
} else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) { } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) {
(*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0))); (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0)));
} else if (meter_type == MeterVU) { } else if (meter_type == MeterVU) {
@ -164,9 +172,9 @@ LevelMeter::update_meters ()
} }
void void
LevelMeter::parameter_changed (string p) LevelMeterBase::parameter_changed (string p)
{ {
ENSURE_GUI_THREAD (*this, &LevelMeter::parameter_changed, p) ENSURE_GUI_THREAD (*this, &LevelMeterBase::parameter_changed, p)
if (p == "meter-hold") { if (p == "meter-hold") {
vector<MeterInfo>::iterator i; vector<MeterInfo>::iterator i;
@ -180,6 +188,10 @@ LevelMeter::parameter_changed (string p)
color_changed = true; color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width); setup_meters (meter_length, regular_meter_width, thin_meter_width);
} }
else if (p == "meter-style-led") {
color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
else if (p == "meter-peak") { else if (p == "meter-peak") {
vector<MeterInfo>::iterator i; vector<MeterInfo>::iterator i;
uint32_t n; uint32_t n;
@ -191,14 +203,14 @@ LevelMeter::parameter_changed (string p)
} }
void void
LevelMeter::configuration_changed (ChanCount /*in*/, ChanCount /*out*/) LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
{ {
color_changed = true; color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width); setup_meters (meter_length, regular_meter_width, thin_meter_width);
} }
void void
LevelMeter::meter_type_changed (MeterType t) LevelMeterBase::meter_type_changed (MeterType t)
{ {
meter_type = t; meter_type = t;
color_changed = true; color_changed = true;
@ -207,18 +219,18 @@ LevelMeter::meter_type_changed (MeterType t)
} }
void void
LevelMeter::hide_all_meters () LevelMeterBase::hide_all_meters ()
{ {
for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) { for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) {
if ((*i).packed) { if ((*i).packed) {
remove (*((*i).meter)); mtr_remove (*((*i).meter));
(*i).packed = false; (*i).packed = false;
} }
} }
} }
void void
LevelMeter::setup_meters (int len, int initial_width, int thin_width) LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
{ {
hide_all_meters (); hide_all_meters ();
@ -248,11 +260,17 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
meters.push_back (MeterInfo()); meters.push_back (MeterInfo());
} }
//cerr << "LevelMeter::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG //cerr << "LevelMeterBase::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
uint32_t c[10]; uint32_t c[10];
uint32_t b[4];
float stp[4]; float stp[4];
int styleflags = Config->get_meter_style_led() ? 3 : 1;
b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get();
b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get();
b[2] = 0x991122ff; // red highlight gradient Bot
b[3] = 0x551111ff; // red highlight gradient Top
if (n < nmidi) { if (n < nmidi) {
c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get(); c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get();
c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get(); c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get();
@ -303,30 +321,44 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
c[6] = c[7] = 0xffff00ff; c[6] = c[7] = 0xffff00ff;
c[8] = c[9] = 0xff0000ff; c[8] = c[9] = 0xff0000ff;
break; break;
case MeterIEC2EBU:
case MeterIEC2BBC: case MeterIEC2BBC:
stp[0] = 115.0 * meter_deflect_ppm(-18); c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] =
stp[1] = 115.0 * meter_deflect_ppm(-14); ARDOUR_UI::config()->color_by_name ("meter color BBC");
stp[2] = 115.0 * meter_deflect_ppm(-10); stp[0] = stp[1] = stp[2] = stp[3] = 115.0;
stp[3] = 115.0 * meter_deflect_ppm( -8); break;
case MeterIEC2EBU:
stp[0] = 115.0 * meter_deflect_ppm(-24); // ignored
stp[1] = 115.0 * meter_deflect_ppm(-18);
stp[2] = 115.0 * meter_deflect_ppm( -9);
stp[3] = 115.0 * meter_deflect_ppm( 0); // ignored
c[3] = c[2] = c[1];
c[6] = c[7] = c[8] = c[9];
break; break;
case MeterIEC1NOR: case MeterIEC1NOR:
stp[0] = 115.0 * meter_deflect_nordic(-18); stp[0] = 115.0 * meter_deflect_nordic(-30); // ignored
stp[1] = 115.0 * meter_deflect_nordic(-15); stp[1] = 115.0 * meter_deflect_nordic(-18);
stp[2] = 115.0 * meter_deflect_nordic(-12); stp[2] = 115.0 * meter_deflect_nordic(-12);
stp[3] = 115.0 * meter_deflect_nordic( -9); stp[3] = 115.0 * meter_deflect_nordic( -9); // ignored
//c[2] = c[3] = c[1]; // dark-green
c[0] = c[1] = c[2]; // bright-green
c[6] = c[7] = c[8] = c[9];
break; break;
case MeterIEC1DIN: case MeterIEC1DIN:
stp[0] = 115.0 * meter_deflect_din(-29); stp[0] = 115.0 * meter_deflect_din(-29); // ignored
stp[1] = 115.0 * meter_deflect_din(-18); stp[1] = 115.0 * meter_deflect_din(-18);
stp[2] = 115.0 * meter_deflect_din(-15); stp[2] = 115.0 * meter_deflect_din(-15); // ignored
stp[3] = 115.0 * meter_deflect_din( -9); stp[3] = 115.0 * meter_deflect_din( -9);
c[0] = c[1] = c[2] = c[3] = 0x00aa00ff;
c[4] = c[6];
c[5] = c[7];
break; break;
case MeterVU: case MeterVU:
stp[0] = 115.0 * meter_deflect_vu(-26); // -6 stp[0] = 115.0 * meter_deflect_vu(-26); // -6
stp[1] = 115.0 * meter_deflect_vu(-23); // -3 stp[1] = 115.0 * meter_deflect_vu(-23); // -3
stp[2] = 115.0 * meter_deflect_vu(-20); // 0 stp[2] = 115.0 * meter_deflect_vu(-20); // 0
stp[3] = 115.0 * meter_deflect_vu(-18); // +2 stp[3] = 115.0 * meter_deflect_vu(-18); // +2
c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = 0x00aa00ff;
c[6] = c[7] = c[8] = c[9] = 0xff8800ff;
break; break;
default: // PEAK, RMS default: // PEAK, RMS
stp[1] = 77.5; // 115 * log_meter(-10) stp[1] = 77.5; // 115 * log_meter(-10)
@ -349,56 +381,61 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
} }
} }
} }
if (meters[n].width != width || meters[n].length != len || color_changed) { if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
meters[n].packed = false;
delete meters[n].meter; delete meters[n].meter;
meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, _meter_orientation, len,
c[0], c[1], c[2], c[3], c[4], c[0], c[1], c[2], c[3], c[4],
c[5], c[6], c[7], c[8], c[9], c[5], c[6], c[7], c[8], c[9],
ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(), b[0], b[1], b[2], b[3],
ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(), stp[0], stp[1], stp[2], stp[3],
0x991122ff, 0x551111ff, styleflags
stp[0], stp[1], stp[2], stp[3]
); );
meters[n].meter->set_highlight(hl);
meters[n].width = width; meters[n].width = width;
meters[n].length = len; meters[n].length = len;
meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_press)); meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_press));
meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_release)); meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_release));
} }
pack_end (*meters[n].meter, false, false); //pack_end (*meters[n].meter, false, false);
mtr_pack (*meters[n].meter);
meters[n].meter->show_all (); meters[n].meter->show_all ();
meters[n].packed = true; meters[n].packed = true;
} }
show(); //show();
color_changed = false; color_changed = false;
visible_meter_type = meter_type;
} }
void void
LevelMeter::set_type(MeterType t) LevelMeterBase::set_type(MeterType t)
{ {
meter_type = t; meter_type = t;
_meter->set_type(t); _meter->set_type(t);
} }
bool bool
LevelMeter::meter_button_press (GdkEventButton* ev) LevelMeterBase::meter_button_press (GdkEventButton* ev)
{ {
return ButtonPress (ev); /* EMIT SIGNAL */ return ButtonPress (ev); /* EMIT SIGNAL */
} }
bool bool
LevelMeter::meter_button_release (GdkEventButton* ev) LevelMeterBase::meter_button_release (GdkEventButton* ev)
{ {
if (ev->button == 1) { if (ev->button == 1) {
clear_meters (false); clear_meters (false);
} }
ButtonRelease(ev);
return true; return true;
} }
void LevelMeter::clear_meters (bool reset_highlight) void LevelMeterBase::clear_meters (bool reset_highlight)
{ {
for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) { for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) {
(*i).meter->clear(); (*i).meter->clear();
@ -409,14 +446,53 @@ void LevelMeter::clear_meters (bool reset_highlight)
max_peak = minus_infinity(); max_peak = minus_infinity();
} }
void LevelMeter::hide_meters () void LevelMeterBase::hide_meters ()
{ {
hide_all_meters(); hide_all_meters();
} }
void void
LevelMeter::color_handler () LevelMeterBase::color_handler ()
{ {
color_changed = true; color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width);
} }
LevelMeterHBox::LevelMeterHBox(Session* s)
: LevelMeterBase(s, invalidator(*this))
{
set_spacing(1);
show();
}
LevelMeterHBox::~LevelMeterHBox() {}
void
LevelMeterHBox::mtr_pack(Gtk::Widget &w) {
pack_end (w, false, false);
}
void
LevelMeterHBox::mtr_remove(Gtk::Widget &w) {
remove (w);
}
LevelMeterVBox::LevelMeterVBox(Session* s)
: LevelMeterBase(s, invalidator(*this), FastMeter::Horizontal)
{
set_spacing(1);
show();
}
LevelMeterVBox::~LevelMeterVBox() {}
void
LevelMeterVBox::mtr_pack(Gtk::Widget &w) {
pack_end (w, false, false);
}
void
LevelMeterVBox::mtr_remove(Gtk::Widget &w) {
remove (w);
}

View file

@ -37,6 +37,7 @@
#include <gtkmm2ext/click_box.h> #include <gtkmm2ext/click_box.h>
#include <gtkmm2ext/focus_entry.h> #include <gtkmm2ext/focus_entry.h>
#include <gtkmm2ext/slider_controller.h> #include <gtkmm2ext/slider_controller.h>
#include <gtkmm2ext/fastmeter.h>
#include "enums.h" #include "enums.h"
@ -44,18 +45,16 @@ namespace ARDOUR {
class Session; class Session;
class PeakMeter; class PeakMeter;
} }
namespace Gtkmm2ext {
class FastMeter;
}
namespace Gtk { namespace Gtk {
class Menu; class Menu;
} }
class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr class LevelMeterBase : public ARDOUR::SessionHandlePtr
{ {
public: public:
LevelMeter (ARDOUR::Session*); LevelMeterBase (ARDOUR::Session*, PBD::EventLoop::InvalidationRecord* ir,
~LevelMeter (); Gtkmm2ext::FastMeter::Orientation o = Gtkmm2ext::FastMeter::Vertical);
virtual ~LevelMeterBase ();
virtual void set_meter (ARDOUR::PeakMeter* meter); virtual void set_meter (ARDOUR::PeakMeter* meter);
@ -72,10 +71,17 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
/** Emitted in the GUI thread when a button is pressed over the meter */ /** Emitted in the GUI thread when a button is pressed over the meter */
PBD::Signal1<bool, GdkEventButton *> ButtonPress; PBD::Signal1<bool, GdkEventButton *> ButtonPress;
PBD::Signal1<bool, GdkEventButton *> ButtonRelease;
PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged; PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged;
protected:
virtual void mtr_pack(Gtk::Widget &w) = 0;
virtual void mtr_remove(Gtk::Widget &w) = 0;
private: private:
PBD::EventLoop::InvalidationRecord* parent_invalidator;
ARDOUR::PeakMeter* _meter; ARDOUR::PeakMeter* _meter;
Gtkmm2ext::FastMeter::Orientation _meter_orientation;
Width _width; Width _width;
@ -101,6 +107,7 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
std::vector<MeterInfo> meters; std::vector<MeterInfo> meters;
float max_peak; float max_peak;
ARDOUR::MeterType meter_type; ARDOUR::MeterType meter_type;
ARDOUR::MeterType visible_meter_type;
PBD::ScopedConnection _configuration_connection; PBD::ScopedConnection _configuration_connection;
PBD::ScopedConnection _meter_type_connection; PBD::ScopedConnection _meter_type_connection;
@ -120,5 +127,27 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
void color_handler (); void color_handler ();
}; };
class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox
{
public:
LevelMeterHBox (ARDOUR::Session*);
~LevelMeterHBox();
protected:
void mtr_pack(Gtk::Widget &w);
void mtr_remove(Gtk::Widget &w);
};
class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox
{
public:
LevelMeterVBox (ARDOUR::Session*);
~LevelMeterVBox();
protected:
void mtr_pack(Gtk::Widget &w);
void mtr_remove(Gtk::Widget &w);
};
#endif /* __ardour_gtk_track_meter_h__ */ #endif /* __ardour_gtk_track_meter_h__ */

View file

@ -35,16 +35,16 @@ alt_log_meter (float power)
#endif #endif
/* prototypes - avoid compiler warning */ /* prototypes - avoid compiler warning */
inline float log_meter (float db); static inline float log_meter (float db);
inline float meter_deflect_ppm (float); static inline float meter_deflect_ppm (float);
inline float meter_deflect_din (float); static inline float meter_deflect_din (float);
inline float meter_deflect_nordic (float); static inline float meter_deflect_nordic (float);
inline float meter_deflect_vu (float); static inline float meter_deflect_vu (float);
inline float meter_deflect_k (float, float); static inline float meter_deflect_k (float, float);
inline float static inline float
log_meter (float db) log_meter (float db)
{ {
gfloat def = 0.0f; /* Meter deflection %age */ gfloat def = 0.0f; /* Meter deflection %age */
@ -75,7 +75,7 @@ log_meter (float db)
return def/115.0f; return def/115.0f;
} }
inline float static inline float
meter_deflect_ppm (float db) meter_deflect_ppm (float db)
{ {
if (db < -30) { if (db < -30) {
@ -91,7 +91,7 @@ meter_deflect_ppm (float db)
} }
} }
inline float static inline float
meter_deflect_din (float db) meter_deflect_din (float db)
{ {
float rv = dB_to_coefficient(db); float rv = dB_to_coefficient(db);
@ -103,7 +103,7 @@ meter_deflect_din (float db)
} }
} }
inline float static inline float
meter_deflect_nordic (float db) meter_deflect_nordic (float db)
{ {
if (db < -60) { if (db < -60) {
@ -118,7 +118,7 @@ meter_deflect_nordic (float db)
} }
} }
inline float static inline float
meter_deflect_vu (float db) meter_deflect_vu (float db)
{ {
const float rv = 6.77165f * dB_to_coefficient(db); const float rv = 6.77165f * dB_to_coefficient(db);
@ -126,7 +126,7 @@ meter_deflect_vu (float db)
return rv; return rv;
} }
inline float static inline float
meter_deflect_k (float db, float krange) meter_deflect_k (float db, float krange)
{ {
db+=krange; db+=krange;

View file

@ -184,11 +184,19 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
, _pi(pi) , _pi(pi)
, _lv2(lv2p) , _lv2(lv2p)
, _gui_widget(NULL) , _gui_widget(NULL)
, _ardour_buttons_box(NULL)
, _values(NULL) , _values(NULL)
, _external_ui_ptr(NULL) , _external_ui_ptr(NULL)
, _inst(NULL) , _inst(NULL)
{ {
_ardour_buttons_box.set_spacing (6);
_ardour_buttons_box.set_border_width (6);
_ardour_buttons_box.pack_end (focus_button, false, false);
_ardour_buttons_box.pack_end (bypass_button, false, false, 10);
_ardour_buttons_box.pack_end (delete_button, false, false);
_ardour_buttons_box.pack_end (save_button, false, false);
_ardour_buttons_box.pack_end (add_button, false, false);
_ardour_buttons_box.pack_end (_preset_combo, false, false);
_ardour_buttons_box.pack_end (_preset_modified, false, false);
} }
void void
@ -219,18 +227,11 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
features[features_count - 1] = &_external_ui_feature; features[features_count - 1] = &_external_ui_feature;
features[features_count] = NULL; features[features_count] = NULL;
} else { } else {
_ardour_buttons_box = manage (new Gtk::HBox); if (_ardour_buttons_box.get_parent()) {
_ardour_buttons_box->set_spacing (6); _ardour_buttons_box.get_parent()->remove(_ardour_buttons_box);
_ardour_buttons_box->set_border_width (6); }
_ardour_buttons_box->pack_end (focus_button, false, false); pack_start(_ardour_buttons_box, false, false);
_ardour_buttons_box->pack_end (bypass_button, false, false, 10); _ardour_buttons_box.show_all();
_ardour_buttons_box->pack_end (delete_button, false, false);
_ardour_buttons_box->pack_end (save_button, false, false);
_ardour_buttons_box->pack_end (add_button, false, false);
_ardour_buttons_box->pack_end (_preset_combo, false, false);
_ardour_buttons_box->pack_end (_preset_modified, false, false);
_ardour_buttons_box->show_all();
pack_start(*_ardour_buttons_box, false, false);
_gui_widget = Gtk::manage((container = new Gtk::Alignment())); _gui_widget = Gtk::manage((container = new Gtk::Alignment()));
pack_start(*_gui_widget, true, true); pack_start(*_gui_widget, true, true);

View file

@ -73,7 +73,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox
sigc::connection _screen_update_connection; sigc::connection _screen_update_connection;
Gtk::Widget* _gui_widget; Gtk::Widget* _gui_widget;
/** a box containing the focus, bypass, delete, save / add preset buttons etc. */ /** a box containing the focus, bypass, delete, save / add preset buttons etc. */
Gtk::HBox* _ardour_buttons_box; Gtk::HBox _ardour_buttons_box;
float* _values; float* _values;
std::vector<ControllableRef> _controllables; std::vector<ControllableRef> _controllables;
struct lv2_external_ui_host _external_ui_host; struct lv2_external_ui_host _external_ui_host;

View file

@ -52,15 +52,17 @@ sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> ArdourMeter::Set
/* pattern cache */ /* pattern cache */
struct MeterMatricsMapKey { struct MeterMatricsMapKey {
MeterMatricsMapKey (std::string n, MeterType t) MeterMatricsMapKey (std::string n, MeterType t, int dt)
: _n(n) : _n(n)
, _t(t) , _t(t)
, _dt(dt)
{} {}
inline bool operator<(const MeterMatricsMapKey& rhs) const { inline bool operator<(const MeterMatricsMapKey& rhs) const {
return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t); return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t) || (_n == rhs._n && _t == rhs._t && _dt < rhs._dt);
} }
std::string _n; std::string _n;
MeterType _t; MeterType _t;
int _dt;
}; };
namespace ArdourMeter { namespace ArdourMeter {
@ -108,6 +110,14 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
} }
} }
static inline int types_to_bit (vector<ARDOUR::DataType> types) {
int rv = 0;
for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
rv |= 1 << (*i);
}
return rv;
}
static inline float mtr_col_and_fract( static inline float mtr_col_and_fract(
cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val)
{ {
@ -130,18 +140,12 @@ static inline float mtr_col_and_fract(
case MeterIEC2BBC: case MeterIEC2BBC:
case MeterIEC2EBU: case MeterIEC2EBU:
fraction = meter_deflect_ppm(val); fraction = meter_deflect_ppm(val);
if (val >= -10.0) { cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(peakcolor),
UINT_RGBA_G_FLT(peakcolor),
UINT_RGBA_B_FLT(peakcolor));
} else {
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
}
break; break;
case MeterIEC1NOR: case MeterIEC1NOR:
fraction = meter_deflect_nordic(val); fraction = meter_deflect_nordic(val);
if (val >= -12.0) { #if 0
if (val == -18.0) {
cairo_set_source_rgb (cr, cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(peakcolor), UINT_RGBA_R_FLT(peakcolor),
UINT_RGBA_G_FLT(peakcolor), UINT_RGBA_G_FLT(peakcolor),
@ -149,10 +153,13 @@ static inline float mtr_col_and_fract(
} else { } else {
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
} }
#else
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
#endif
break; break;
case MeterIEC1DIN: case MeterIEC1DIN:
fraction = meter_deflect_din(val); fraction = meter_deflect_din(val);
if (val >= -9.0) { if (val == -9.0 || val == -15 || val == -18) {
cairo_set_source_rgb (cr, cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(peakcolor), UINT_RGBA_R_FLT(peakcolor),
UINT_RGBA_G_FLT(peakcolor), UINT_RGBA_G_FLT(peakcolor),
@ -196,6 +203,65 @@ static inline float mtr_col_and_fract(
return fraction; return fraction;
} }
static void mtr_red_stripe(cairo_t* cr, float l, float w, int h, float top, float bot) {
if (w <= 0) return;
int t = h - floorf (h * (top));
int b = h - floorf (h * (bot));
cairo_set_source_rgba (cr, .75, 0, 0, 0.75);
cairo_rectangle (cr, l, t + .5, w, b - t);
cairo_fill (cr);
}
static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) {
float r,g,b;
switch(type) {
case MeterVU:
if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) {
cairo_set_source_rgb (cr, r, g, b);
} else {
cairo_set_source_rgb (cr, 1.0, 1.0, 0.85);
}
break;
case MeterIEC1DIN:
case MeterIEC1NOR:
case MeterIEC2BBC:
case MeterIEC2EBU:
case MeterK14:
case MeterK20:
if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) {
cairo_set_source_rgb (cr, r, g, b);
} else {
cairo_set_source_rgb (cr, 0.1, 0.1, 0.1);
}
break;
default:
{
Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
}
break;
}
}
static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) {
float r,g,b;
switch(type) {
case MeterVU:
if (rgba_p_from_style("meterstripVU", &r, &g, &b)) {
c->set_rgb_p(r, g, b);
} else {
c->set_rgb_p(0.0, 0.0, 0.0);
}
break;
default:
if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) {
c->set_rgb_p(r, g, b);
} else {
c->set_rgb_p(1.0, 1.0, 1.0);
}
break;
}
}
static cairo_pattern_t* static cairo_pattern_t*
meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> types) meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> types)
@ -203,19 +269,45 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
Glib::RefPtr<Gdk::Window> win (w.get_window()); Glib::RefPtr<Gdk::Window> win (w.get_window());
bool background; bool background;
bool tickleft, tickright;
gint width, height; gint width, height;
win->get_size (width, height); win->get_size (width, height);
background = types.size() == 0 tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
|| w.get_name().substr(w.get_name().length() - 4) == "Left" tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
|| w.get_name().substr(w.get_name().length() - 5) == "Right"; background = types.size() == 0 || tickleft || tickright;
float box_l=0;
float box_w=0;
if (tickleft) {
if (w.get_name().substr(0, 3) == "Bar") {
box_l = width-2; box_w = 2;
} else if (w.get_name().substr(0, 4) == "Mark") {
box_l = width-2; box_w = 2;
background = false;
}
} else if (tickright) {
if (w.get_name().substr(0, 3) == "Bar") {
box_l = 0; box_w = 2;
} else if (w.get_name().substr(0, 4) == "Mark") {
box_l = 0; box_w = 2;
background = false;
}
} else {
box_l = 0; box_w = 3;
}
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
cairo_t* cr = cairo_create (surface); cairo_t* cr = cairo_create (surface);
cairo_move_to (cr, 0, 0); cairo_move_to (cr, 0, 0);
cairo_rectangle (cr, 0, 0, width, height); cairo_rectangle (cr, 0, 0, width, height);
{
Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); if (background) {
/* meterbridge */
set_bg_color(w, cr, type);
} else {
/* mixer */
Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
} }
cairo_fill (cr); cairo_fill (cr);
@ -226,23 +318,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) { for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
Gdk::Color c; Gdk::Color c;
c = w.get_style()->get_fg (Gtk::STATE_NORMAL); if (types.size() > 1 && (*i) == DataType::MIDI) {
if (types.size() > 1) {
/* we're overlaying more than 1 set of marks, so use different colours */ /* we're overlaying more than 1 set of marks, so use different colours */
switch (*i) { c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
case DataType::AUDIO: } else if (background) {
c = w.get_style()->get_fg (Gtk::STATE_NORMAL); set_fg_color(w, type, &c);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
break;
case DataType::MIDI:
c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
break;
}
} else { } else {
c = w.get_style()->get_fg (Gtk::STATE_NORMAL); c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
} }
// tick-maker position in dBFS, line-thickness // tick-maker position in dBFS, line-thickness
@ -259,10 +341,11 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
points.insert (std::pair<float,float>(-24.0f, 1.0)); points.insert (std::pair<float,float>(-24.0f, 1.0));
points.insert (std::pair<float,float>(-20.0f, 1.0)); points.insert (std::pair<float,float>(-20.0f, 1.0));
points.insert (std::pair<float,float>(-17.0f, 1.0)); points.insert (std::pair<float,float>(-17.0f, 1.0));
points.insert (std::pair<float,float>(-14.0f, 1.0)); points.insert (std::pair<float,float>(-14.0f, 1.0)); // 0
points.insert (std::pair<float,float>(-11.0f, 1.0)); points.insert (std::pair<float,float>(-11.0f, 1.0)); // +3
points.insert (std::pair<float,float>( -8.0f, 1.0)); points.insert (std::pair<float,float>(-10.0f, 0.8)); // +4
points.insert (std::pair<float,float>( -4.0f, 1.0)); points.insert (std::pair<float,float>( -8.0f, 1.0)); // +6
points.insert (std::pair<float,float>( -4.0f, 1.0)); // +10
points.insert (std::pair<float,float>( 0.0f, 1.0)); points.insert (std::pair<float,float>( 0.0f, 1.0));
break; break;
case MeterK20: case MeterK20:
@ -272,12 +355,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
points.insert (std::pair<float,float>(-30.0f, 1.0)); points.insert (std::pair<float,float>(-30.0f, 1.0));
points.insert (std::pair<float,float>(-26.0f, 1.0)); points.insert (std::pair<float,float>(-26.0f, 1.0));
points.insert (std::pair<float,float>(-23.0f, 1.0)); points.insert (std::pair<float,float>(-23.0f, 1.0));
points.insert (std::pair<float,float>(-20.0f, 1.0)); points.insert (std::pair<float,float>(-20.0f, 1.0)); // 0
points.insert (std::pair<float,float>(-17.0f, 1.0)); points.insert (std::pair<float,float>(-17.0f, 1.0));
points.insert (std::pair<float,float>(-14.0f, 1.0)); points.insert (std::pair<float,float>(-16.0f, 0.8));
points.insert (std::pair<float,float>(-14.0f, 1.0)); // +6
points.insert (std::pair<float,float>(-10.0f, 1.0)); points.insert (std::pair<float,float>(-10.0f, 1.0));
points.insert (std::pair<float,float>( -5.0f, 1.0)); points.insert (std::pair<float,float>( -5.0f, 1.0));
points.insert (std::pair<float,float>( 0.0f, 1.0)); points.insert (std::pair<float,float>( 0.0f, 1.0)); //+20
break; break;
case MeterIEC2EBU: case MeterIEC2EBU:
points.insert (std::pair<float,float>(-30.0f, 1.0)); points.insert (std::pair<float,float>(-30.0f, 1.0));
@ -291,7 +375,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
points.insert (std::pair<float,float>(-14.0f, 1.0)); points.insert (std::pair<float,float>(-14.0f, 1.0));
points.insert (std::pair<float,float>(-12.0f, 0.5)); points.insert (std::pair<float,float>(-12.0f, 0.5));
points.insert (std::pair<float,float>(-10.0f, 1.0)); points.insert (std::pair<float,float>(-10.0f, 1.0));
points.insert (std::pair<float,float>( -9.0f, 0.5)); points.insert (std::pair<float,float>( -9.0f, 0.8));
points.insert (std::pair<float,float>( -8.0f, 0.5)); points.insert (std::pair<float,float>( -8.0f, 0.5));
points.insert (std::pair<float,float>( -6.0f, 1.0)); points.insert (std::pair<float,float>( -6.0f, 1.0));
break; break;
@ -315,44 +399,66 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
points.insert (std::pair<float,float>(-39.0f, 0.5)); points.insert (std::pair<float,float>(-39.0f, 0.5));
points.insert (std::pair<float,float>(-36.0f, 1.0)); points.insert (std::pair<float,float>(-36.0f, 1.0));
points.insert (std::pair<float,float>(-33.0f, 1.0)); points.insert (std::pair<float,float>(-33.0f, 0.5));
points.insert (std::pair<float,float>(-30.0f, 1.0)); points.insert (std::pair<float,float>(-30.0f, 1.0));
points.insert (std::pair<float,float>(-27.0f, 1.0)); points.insert (std::pair<float,float>(-27.0f, 0.5));
points.insert (std::pair<float,float>(-24.0f, 1.0)); points.insert (std::pair<float,float>(-24.0f, 1.0));
points.insert (std::pair<float,float>(-21.0f, 1.0)); points.insert (std::pair<float,float>(-21.0f, 0.5));
points.insert (std::pair<float,float>(-18.0f, 1.0)); points.insert (std::pair<float,float>(-18.0f, 1.0));
points.insert (std::pair<float,float>(-15.0f, 1.0)); points.insert (std::pair<float,float>(-15.0f, 0.5));
points.insert (std::pair<float,float>(-12.0f, 1.0)); points.insert (std::pair<float,float>(-12.0f, 1.0));
points.insert (std::pair<float,float>( -9.0f, 1.0)); points.insert (std::pair<float,float>( -9.0f, 1.0));
points.insert (std::pair<float,float>( -6.0f, 1.0)); points.insert (std::pair<float,float>( -6.0f, 0.5));
mtr_red_stripe(cr, box_l, box_w, height,
meter_deflect_nordic(-6.0f), meter_deflect_nordic(-12.0f));
break; break;
case MeterIEC1DIN: case MeterIEC1DIN:
points.insert (std::pair<float,float>( -3.0f, 0.5)); // "200%" points.insert (std::pair<float,float>( -3.0f, 0.5)); // "200%"
points.insert (std::pair<float,float>( -4.0f, 1.0)); // "100%" points.insert (std::pair<float,float>( -4.0f, 1.0));
points.insert (std::pair<float,float>( -9.0f, 1.0)); points.insert (std::pair<float,float>( -5.0f, 0.5));
points.insert (std::pair<float,float>( -6.0f, 0.5));
points.insert (std::pair<float,float>( -7.0f, 0.5));
points.insert (std::pair<float,float>( -8.0f, 0.5));
points.insert (std::pair<float,float>( -9.0f, 1.0)); // "100%"
points.insert (std::pair<float,float>(-10.0f, 0.5));
points.insert (std::pair<float,float>(-11.0f, 0.5));
points.insert (std::pair<float,float>(-12.0f, 0.5));
points.insert (std::pair<float,float>(-13.0f, 0.5));
points.insert (std::pair<float,float>(-14.0f, 1.0)); points.insert (std::pair<float,float>(-14.0f, 1.0));
points.insert (std::pair<float,float>(-15.0f, 0.5)); // "50%" points.insert (std::pair<float,float>(-15.0f, 0.8)); // "50%"
points.insert (std::pair<float,float>(-18.0f, 0.5)); // "-9" points.insert (std::pair<float,float>(-18.0f, 0.8)); // "-9"
points.insert (std::pair<float,float>(-19.0f, 1.0)); // "30%" points.insert (std::pair<float,float>(-19.0f, 1.0));
points.insert (std::pair<float,float>(-29.0f, 1.0)); // "10%" points.insert (std::pair<float,float>(-24.0f, 0.5));
points.insert (std::pair<float,float>(-35.0f, 0.5)); // "5%" " -20" points.insert (std::pair<float,float>(-29.0f, 1.0)); // "-20", "10%"
points.insert (std::pair<float,float>(-39.0f, 1.0)); // "3%" points.insert (std::pair<float,float>(-34.0f, 0.5)); // -25
points.insert (std::pair<float,float>(-49.0f, 0.5)); // "1%" //points.insert (std::pair<float,float>(-35.0f, 0.5)); // "5%" " -20"
points.insert (std::pair<float,float>(-39.0f, 1.0));
points.insert (std::pair<float,float>(-49.0f, 1.0));
points.insert (std::pair<float,float>(-54.0f, 0.5));
points.insert (std::pair<float,float>(-59.0f, 1.0)); points.insert (std::pair<float,float>(-59.0f, 1.0));
mtr_red_stripe(cr, box_l, box_w, height,
meter_deflect_din(0.0f), meter_deflect_din(-9.0f));
break; break;
case MeterVU: case MeterVU:
points.insert (std::pair<float,float>(-17.0f, 1.0)); points.insert (std::pair<float,float>(-17.0f, 1.0)); //+3 VU
points.insert (std::pair<float,float>(-18.0f, 1.0)); points.insert (std::pair<float,float>(-18.0f, 1.0));
points.insert (std::pair<float,float>(-19.0f, 1.0)); points.insert (std::pair<float,float>(-19.0f, 1.0));
points.insert (std::pair<float,float>(-20.0f, 1.0)); points.insert (std::pair<float,float>(-19.5f, 0.5));
points.insert (std::pair<float,float>(-20.0f, 1.0)); // 0 VU
points.insert (std::pair<float,float>(-20.5f, 0.5));
points.insert (std::pair<float,float>(-21.0f, 1.0)); points.insert (std::pair<float,float>(-21.0f, 1.0));
points.insert (std::pair<float,float>(-22.0f, 1.0)); points.insert (std::pair<float,float>(-22.0f, 1.0));
points.insert (std::pair<float,float>(-23.0f, 1.0)); points.insert (std::pair<float,float>(-23.0f, 1.0)); //-3 VU
points.insert (std::pair<float,float>(-24.0f, 0.5));
points.insert (std::pair<float,float>(-25.0f, 1.0)); points.insert (std::pair<float,float>(-25.0f, 1.0));
points.insert (std::pair<float,float>(-27.0f, 1.0)); points.insert (std::pair<float,float>(-26.0f, 0.5));
points.insert (std::pair<float,float>(-27.0f, 1.0)); //-7 VU
points.insert (std::pair<float,float>(-30.0f, 1.0)); points.insert (std::pair<float,float>(-30.0f, 1.0));
points.insert (std::pair<float,float>(-35.0f, 0.5));
points.insert (std::pair<float,float>(-40.0f, 1.0)); points.insert (std::pair<float,float>(-40.0f, 1.0));
mtr_red_stripe(cr, box_l, box_w, height,
meter_deflect_vu(-17.0f), meter_deflect_vu(-20.0f));
break; break;
default: default:
@ -433,6 +539,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
fraction = (j->first) / 127.0; fraction = (j->first) / 127.0;
pos = 1 + height - (gint) floor (height * fraction); pos = 1 + height - (gint) floor (height * fraction);
pos = min (pos, height); pos = min (pos, height);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
cairo_arc(cr, 1.5, pos + .5, 1.0, 0, 2 * M_PI); cairo_arc(cr, 1.5, pos + .5, 1.0, 0, 2 * M_PI);
cairo_fill(cr); cairo_fill(cr);
break; break;
@ -455,6 +562,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
bool tickleft, tickright; bool tickleft, tickright;
bool background; bool background;
int overlay_midi = 1;
gint width, height; gint width, height;
win->get_size (width, height); win->get_size (width, height);
@ -500,8 +608,12 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
cairo_move_to (cr, 0, 0); cairo_move_to (cr, 0, 0);
cairo_rectangle (cr, 0, 0, width, height); cairo_rectangle (cr, 0, 0, width, height);
{ if (background) {
Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); /* meterbridge */
set_bg_color(w, cr, type);
} else {
/* mixer */
Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
} }
cairo_fill (cr); cairo_fill (cr);
@ -510,56 +622,52 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
height = min(max_pattern_metric_size, height); height = min(max_pattern_metric_size, height);
uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel"); uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel");
Gdk::Color c; // default text color
for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) { for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
Gdk::Color c; if (types.size() > 1 && (*i) == DataType::MIDI && overlay_midi == 0) {
if (types.size() > 1) { continue;
/* we're overlaying more than 1 set of marks, so use different colours */
switch (*i) {
case DataType::AUDIO:
c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
break;
case DataType::MIDI:
c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
break;
}
} else {
c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
} }
if (types.size() > 1 && (*i) == DataType::MIDI) {
/* we're overlaying more than 1 set of marks, so use different colours */
c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
} else if (background) {
set_fg_color(w, type, &c);
} else {
c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
}
// label-pos in dBFS, label-text std::map<float,string> points; // map: label-pos in dBFS, label-text
std::map<float,string> points;
switch (*i) { switch (*i) {
case DataType::AUDIO: case DataType::AUDIO:
layout->set_attributes (audio_font_attributes); layout->set_attributes (audio_font_attributes);
switch (type) { switch (type) {
case MeterK14: case MeterK14:
overlay_midi = 0;
points.insert (std::pair<float,string>(-54.0f, "-40")); points.insert (std::pair<float,string>(-54.0f, "-40"));
points.insert (std::pair<float,string>(-44.0f, "-30")); points.insert (std::pair<float,string>(-44.0f, "-30"));
points.insert (std::pair<float,string>(-34.0f, "-20")); points.insert (std::pair<float,string>(-34.0f, "-20"));
points.insert (std::pair<float,string>(-24.0f, "-10")); points.insert (std::pair<float,string>(-24.0f, "-10"));
points.insert (std::pair<float,string>(-20.0f, "-6")); points.insert (std::pair<float,string>(-20.0f, "-6"));
points.insert (std::pair<float,string>(-17.0f, "-3")); points.insert (std::pair<float,string>(-17.0f, "-3"));
points.insert (std::pair<float,string>(-14.0f, "0")); points.insert (std::pair<float,string>(-14.0f, " 0"));
points.insert (std::pair<float,string>(-11.0f, "+3")); points.insert (std::pair<float,string>(-11.0f, "+3"));
points.insert (std::pair<float,string>( -8.0f, "+6")); points.insert (std::pair<float,string>( -8.0f, "+6"));
points.insert (std::pair<float,string>( -4.0f, "+10")); points.insert (std::pair<float,string>( -4.0f, "+10"));
points.insert (std::pair<float,string>( 0.0f, "+14")); points.insert (std::pair<float,string>( 0.0f, "+14"));
break; break;
case MeterK20: case MeterK20:
overlay_midi = 0;
points.insert (std::pair<float,string>(-60.0f, "-40")); points.insert (std::pair<float,string>(-60.0f, "-40"));
points.insert (std::pair<float,string>(-50.0f, "-30")); points.insert (std::pair<float,string>(-50.0f, "-30"));
points.insert (std::pair<float,string>(-40.0f, "-20")); points.insert (std::pair<float,string>(-40.0f, "-20"));
points.insert (std::pair<float,string>(-30.0f, "-10")); points.insert (std::pair<float,string>(-30.0f, "-10"));
points.insert (std::pair<float,string>(-26.0f, "-6")); points.insert (std::pair<float,string>(-26.0f, "-6"));
points.insert (std::pair<float,string>(-23.0f, "-3")); points.insert (std::pair<float,string>(-23.0f, "-3"));
points.insert (std::pair<float,string>(-20.0f, "0")); points.insert (std::pair<float,string>(-20.0f, " 0"));
points.insert (std::pair<float,string>(-17.0f, "+3")); points.insert (std::pair<float,string>(-17.0f, "+3"));
points.insert (std::pair<float,string>(-14.0f, "+6")); points.insert (std::pair<float,string>(-14.0f, "+6"));
points.insert (std::pair<float,string>(-10.0f, "+10")); points.insert (std::pair<float,string>(-10.0f, "+10"));
@ -590,6 +698,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
break; break;
case MeterIEC2EBU: case MeterIEC2EBU:
overlay_midi = 3;
points.insert (std::pair<float,string>(-30.0f, "-12")); points.insert (std::pair<float,string>(-30.0f, "-12"));
points.insert (std::pair<float,string>(-26.0f, "-8")); points.insert (std::pair<float,string>(-26.0f, "-8"));
points.insert (std::pair<float,string>(-22.0f, "-4")); points.insert (std::pair<float,string>(-22.0f, "-4"));
@ -600,6 +709,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
break; break;
case MeterIEC2BBC: case MeterIEC2BBC:
overlay_midi = 3;
points.insert (std::pair<float,string>(-30.0f, " 1 ")); points.insert (std::pair<float,string>(-30.0f, " 1 "));
points.insert (std::pair<float,string>(-26.0f, " 2 ")); points.insert (std::pair<float,string>(-26.0f, " 2 "));
points.insert (std::pair<float,string>(-22.0f, " 3 ")); points.insert (std::pair<float,string>(-22.0f, " 3 "));
@ -610,45 +720,48 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
break; break;
case MeterIEC1NOR: case MeterIEC1NOR:
overlay_midi = 0;
//points.insert (std::pair<float,string>(-60.0f, "-42")); //points.insert (std::pair<float,string>(-60.0f, "-42"));
points.insert (std::pair<float,string>(-54.0f, "-36")); points.insert (std::pair<float,string>(-54.0f, "-36"));
points.insert (std::pair<float,string>(-48.0f, "-30")); points.insert (std::pair<float,string>(-48.0f, "-30"));
points.insert (std::pair<float,string>(-42.0f, "-24")); points.insert (std::pair<float,string>(-42.0f, "-24"));
points.insert (std::pair<float,string>(-36.0f, "-18")); points.insert (std::pair<float,string>(-36.0f, "-18"));
points.insert (std::pair<float,string>(-33.0f, "-15")); //points.insert (std::pair<float,string>(-33.0f, "-15"));
points.insert (std::pair<float,string>(-30.0f, "-12")); points.insert (std::pair<float,string>(-30.0f, "-12"));
points.insert (std::pair<float,string>(-27.0f, "-9")); //points.insert (std::pair<float,string>(-27.0f, "-9"));
points.insert (std::pair<float,string>(-24.0f, "-6")); points.insert (std::pair<float,string>(-24.0f, "-6"));
points.insert (std::pair<float,string>(-21.0f, "-3")); //points.insert (std::pair<float,string>(-21.0f, "-3"));
points.insert (std::pair<float,string>(-18.0f, "TST")); points.insert (std::pair<float,string>(-18.0f, "TST"));
points.insert (std::pair<float,string>(-15.0f, "+3")); //points.insert (std::pair<float,string>(-15.0f, "+3"));
points.insert (std::pair<float,string>(-12.0f, "+6")); points.insert (std::pair<float,string>(-12.0f, "+6"));
points.insert (std::pair<float,string>( -9.0f, "+9")); points.insert (std::pair<float,string>( -9.0f, "+9"));
points.insert (std::pair<float,string>( -6.0f, "+12")); //points.insert (std::pair<float,string>( -6.0f, "+12"));
break; break;
case MeterIEC1DIN: case MeterIEC1DIN:
overlay_midi = 2;
//points.insert (std::pair<float,string>( -3.0f, "200%")); //points.insert (std::pair<float,string>( -3.0f, "200%"));
points.insert (std::pair<float,string>( -4.0f, "+5")); // "100%" points.insert (std::pair<float,string>( -4.0f, "+5"));
points.insert (std::pair<float,string>( -9.0f, "0")); points.insert (std::pair<float,string>( -9.0f, "0")); // "100%";
points.insert (std::pair<float,string>(-14.0f, "-5")); points.insert (std::pair<float,string>(-14.0f, "-5"));
//points.insert (std::pair<float,string>(-15.0f, "50%")); //points.insert (std::pair<float,string>(-15.0f, "50%"));
//points.insert (std::pair<float,string>(-18.0f, "-9")); //points.insert (std::pair<float,string>(-18.0f, "-9"));
points.insert (std::pair<float,string>(-19.0f, "-10")); // "30%" points.insert (std::pair<float,string>(-19.0f, "-10")); // "30%"
points.insert (std::pair<float,string>(-29.0f, "-20")); // "10%" points.insert (std::pair<float,string>(-29.0f, "-20")); // "10%"
//points.insert (std::pair<float,string>(-35.0f, "-20")); // "5%" //points.insert (std::pair<float,string>(-35.0f, "5%")); // "5%"
points.insert (std::pair<float,string>(-39.0f, "-30")); // "3%" points.insert (std::pair<float,string>(-39.0f, "-30"));
//points.insert (std::pair<float,string>(-49.0f, "1%")); //points.insert (std::pair<float,string>(-49.0f, "1%"));
points.insert (std::pair<float,string>(-59.0f, "-50")); points.insert (std::pair<float,string>(-59.0f, "-50"));
break; break;
case MeterVU: case MeterVU:
overlay_midi = 0;
points.insert (std::pair<float,string>(-17.0f, "+3")); points.insert (std::pair<float,string>(-17.0f, "+3"));
points.insert (std::pair<float,string>(-18.0f, "+2")); points.insert (std::pair<float,string>(-18.0f, "+2"));
points.insert (std::pair<float,string>(-19.0f, "+1")); points.insert (std::pair<float,string>(-19.0f, "+1"));
points.insert (std::pair<float,string>(-20.0f, "0")); points.insert (std::pair<float,string>(-20.0f, " 0"));
points.insert (std::pair<float,string>(-21.0f, "-1")); points.insert (std::pair<float,string>(-21.0f, "-1"));
points.insert (std::pair<float,string>(-22.0f, "-2")); points.insert (std::pair<float,string>(-22.0f, "-2"));
points.insert (std::pair<float,string>(-23.0f, "-3")); points.insert (std::pair<float,string>(-23.0f, "-3"));
@ -661,8 +774,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
break; break;
case DataType::MIDI: case DataType::MIDI:
layout->set_attributes (midi_font_attributes); layout->set_attributes (midi_font_attributes);
points.insert (std::pair<float,string>( 0, "0"));
if (types.size() == 1) { if (types.size() == 1) {
points.insert (std::pair<float,string>( 0, "0"));
points.insert (std::pair<float,string>( 16, "16")); points.insert (std::pair<float,string>( 16, "16"));
points.insert (std::pair<float,string>( 32, "32")); points.insert (std::pair<float,string>( 32, "32"));
points.insert (std::pair<float,string>( 48, "48")); points.insert (std::pair<float,string>( 48, "48"));
@ -672,16 +785,40 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
points.insert (std::pair<float,string>(100, "100")); points.insert (std::pair<float,string>(100, "100"));
points.insert (std::pair<float,string>(112, "112")); points.insert (std::pair<float,string>(112, "112"));
} else { } else {
/* labels that don't overlay with dB */ switch (overlay_midi) {
points.insert (std::pair<float,string>( 24, "24")); case 1:
points.insert (std::pair<float,string>( 48, "48")); /* labels that don't overlay with dBFS */
points.insert (std::pair<float,string>( 72, "74")); points.insert (std::pair<float,string>( 0, "0"));
points.insert (std::pair<float,string>( 24, "24"));
points.insert (std::pair<float,string>( 48, "48"));
points.insert (std::pair<float,string>( 72, "72"));
points.insert (std::pair<float,string>(127, "127"));
break;
case 2:
/* labels that don't overlay with DIN */
points.insert (std::pair<float,string>( 0, "0"));
points.insert (std::pair<float,string>( 16, "16"));
points.insert (std::pair<float,string>( 40, "40"));
points.insert (std::pair<float,string>( 64, "64"));
points.insert (std::pair<float,string>(112, "112"));
points.insert (std::pair<float,string>(127, "127"));
break;
case 3:
/* labels that don't overlay with BBC nor EBU*/
points.insert (std::pair<float,string>( 0, "0"));
points.insert (std::pair<float,string>( 16, "16"));
points.insert (std::pair<float,string>( 56, "56"));
points.insert (std::pair<float,string>( 72, "72"));
points.insert (std::pair<float,string>(112, "112"));
points.insert (std::pair<float,string>(127, "127"));
default:
break;
}
} }
points.insert (std::pair<float,string>(127, "127"));
break; break;
} }
gint pos; gint pos = -1;
for (std::map<float,string>::const_iterator j = points.begin(); j != points.end(); ++j) { for (std::map<float,string>::const_iterator j = points.begin(); j != points.end(); ++j) {
float fraction = 0; float fraction = 0;
@ -708,6 +845,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
fraction = (j->first) / 127.0; fraction = (j->first) / 127.0;
pos = 1 + height - (gint) rintf (height * fraction); pos = 1 + height - (gint) rintf (height * fraction);
pos = min (pos, height); pos = min (pos, height);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
if (tickleft) { if (tickleft) {
cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
cairo_fill(cr); cairo_fill(cr);
@ -718,6 +856,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
break; break;
} }
if (pos < 0) continue;
layout->set_text(j->second.c_str()); layout->set_text(j->second.c_str());
int tw, th; int tw, th;
@ -732,12 +872,26 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
} else { } else {
cairo_move_to (cr, width-3-tw, p); cairo_move_to (cr, width-3-tw, p);
} }
cairo_set_line_width(cr, 0.12);
cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
pango_cairo_layout_path(cr, layout->gobj());
cairo_stroke_preserve (cr);
cairo_set_line_width(cr, 1.0);
if ((*i) == DataType::AUDIO) {
mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
} else {
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
}
pango_cairo_show_layout (cr, layout->gobj()); pango_cairo_show_layout (cr, layout->gobj());
cairo_new_path(cr);
} }
} }
// add legend // add legend
if (types.size() == 1) { if (types.size() == 1 || overlay_midi == 0) {
int tw, th; int tw, th;
layout->set_attributes (unit_font_attributes); layout->set_attributes (unit_font_attributes);
switch (types.at(0)) { switch (types.at(0)) {
@ -777,7 +931,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
layout->get_pixel_size(tw, th); layout->get_pixel_size(tw, th);
break; break;
} }
Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); if (!background) {
c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
}
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
if (tickleft) { if (tickleft) {
cairo_move_to (cr, width - 2 - tw, height - th - 0.5); cairo_move_to (cr, width - 2 - tw, height - th - 0.5);
@ -809,7 +965,7 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector
cairo_clip (cr); cairo_clip (cr);
cairo_pattern_t* pattern; cairo_pattern_t* pattern;
const MeterMatricsMapKey key (mta->get_name(), type); const MeterMatricsMapKey key (mta->get_name(), type, types_to_bit(types));
MetricPatternMap::iterator i = ticks_patterns.find (key); MetricPatternMap::iterator i = ticks_patterns.find (key);
if (i == ticks_patterns.end()) { if (i == ticks_patterns.end()) {
@ -847,7 +1003,7 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vect
cairo_clip (cr); cairo_clip (cr);
cairo_pattern_t* pattern; cairo_pattern_t* pattern;
const MeterMatricsMapKey key (mma->get_name(), type); const MeterMatricsMapKey key (mma->get_name(), type, types_to_bit(types));
MetricPatternMap::iterator i = metric_patterns.find (key); MetricPatternMap::iterator i = metric_patterns.find (key);
if (i == metric_patterns.end()) { if (i == metric_patterns.end()) {

View file

@ -56,6 +56,7 @@ using namespace ArdourMeter;
PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion; PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion;
PBD::Signal0<void> MeterStrip::MetricChanged; PBD::Signal0<void> MeterStrip::MetricChanged;
PBD::Signal0<void> MeterStrip::ConfigurationChanged;
MeterStrip::MeterStrip (int metricmode, MeterType mt) MeterStrip::MeterStrip (int metricmode, MeterType mt)
: AxisView(0) : AxisView(0)
@ -63,9 +64,14 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt)
{ {
level_meter = 0; level_meter = 0;
_strip_type = 0; _strip_type = 0;
set_spacing(2); _tick_bar = 0;
_metricmode = -1;
metric_type = MeterPeak;
mtr_vbox.set_spacing(2);
nfo_vbox.set_spacing(2);
peakbx.set_size_request(-1, 14); peakbx.set_size_request(-1, 14);
namebx.set_size_request(18, 52); namebx.set_size_request(18, 52);
spacer.set_size_request(-1,0);
set_metric_mode(metricmode, mt); set_metric_mode(metricmode, mt);
@ -76,15 +82,30 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt)
meterbox.pack_start(meter_metric_area, true, false); meterbox.pack_start(meter_metric_area, true, false);
pack_start (peakbx, false, false); mtr_vbox.pack_start (peakbx, false, false);
pack_start (meterbox, true, true); mtr_vbox.pack_start (meterbox, true, true);
pack_start (btnbox, false, false); mtr_vbox.pack_start (spacer, false, false);
pack_start (namebx, false, false); mtr_container.add(mtr_vbox);
mtr_hsep.set_size_request(-1,1);
mtr_hsep.set_name("BlackSeparator");
nfo_vbox.pack_start (mtr_hsep, false, false);
nfo_vbox.pack_start (btnbox, false, false);
nfo_vbox.pack_start (namebx, false, false);
pack_start (mtr_container, true, true);
pack_start (nfo_vbox, false, false);
peakbx.show(); peakbx.show();
btnbox.show(); btnbox.show();
meter_metric_area.show(); meter_metric_area.show();
meterbox.show(); meterbox.show();
spacer.show();
mtr_vbox.show();
mtr_container.show();
mtr_hsep.show();
nfo_vbox.show();
UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed));
ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
@ -97,11 +118,15 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
, _route(rt) , _route(rt)
, peak_display() , peak_display()
{ {
set_spacing(2); mtr_vbox.set_spacing(2);
nfo_vbox.set_spacing(2);
RouteUI::set_route (rt); RouteUI::set_route (rt);
SessionHandlePtr::set_session (sess); SessionHandlePtr::set_session (sess);
_has_midi = false; _has_midi = false;
_tick_bar = 0;
_metricmode = -1;
metric_type = MeterPeak;
int meter_width = 6; int meter_width = 6;
if (_route->shared_peak_meter()->input_streams().n_total() == 1) { if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
@ -109,12 +134,12 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
} }
// level meter + ticks // level meter + ticks
level_meter = new LevelMeter(sess); level_meter = new LevelMeterHBox(sess);
level_meter->set_meter (_route->shared_peak_meter().get()); level_meter->set_meter (_route->shared_peak_meter().get());
level_meter->clear_meters(); level_meter->clear_meters();
level_meter->set_type (_route->meter_type()); level_meter->set_type (_route->meter_type());
level_meter->setup_meters (220, meter_width, 6); level_meter->setup_meters (220, meter_width, 6);
level_meter->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1)); level_meter->ButtonRelease.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_release, this, _1));
level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1)); level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1));
meter_align.set(0.5, 0.5, 0.0, 1.0); meter_align.set(0.5, 0.5, 0.0, 1.0);
@ -147,6 +172,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
name_label.set_size_request(18, 50); name_label.set_size_request(18, 50);
name_label.set_alignment(-1.0, .5); name_label.set_alignment(-1.0, .5);
ARDOUR_UI::instance()->set_tip (name_label, _route->name()); ARDOUR_UI::instance()->set_tip (name_label, _route->name());
ARDOUR_UI::instance()->set_tip (*level_meter, _route->name());
namebx.set_size_request(18, 52); namebx.set_size_request(18, 52);
namebx.pack_start(name_label, true, false, 3); namebx.pack_start(name_label, true, false, 3);
@ -170,24 +196,42 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
mutebox.set_size_request(16, 16); mutebox.set_size_request(16, 16);
solobox.set_size_request(16, 16); solobox.set_size_request(16, 16);
recbox.set_size_request(16, 16); recbox.set_size_request(16, 16);
spacer.set_size_request(-1,0);
update_button_box(); update_button_box();
update_name_box(); update_name_box();
update_background (_route->meter_type());
mtr_vbox.pack_start (peakbx, false, false);
mtr_vbox.pack_start (meterbox, true, true);
mtr_vbox.pack_start (spacer, false, false);
mtr_container.add(mtr_vbox);
mtr_hsep.set_size_request(-1,1);
mtr_hsep.set_name("BlackSeparator");
nfo_vbox.pack_start (mtr_hsep, false, false);
nfo_vbox.pack_start (btnbox, false, false);
nfo_vbox.pack_start (namebx, false, false);
pack_start (mtr_container, true, true);
pack_start (nfo_vbox, false, false);
pack_start (peakbx, false, false);
pack_start (meterbox, true, true);
pack_start (btnbox, false, false);
pack_start (namebx, false, false);
name_label.show(); name_label.show();
peak_display.show(); peak_display.show();
peakbx.show(); peakbx.show();
meter_ticks1_area.show(); meter_ticks1_area.show();
meter_ticks2_area.show(); meter_ticks2_area.show();
meterbox.show(); meterbox.show();
spacer.show();
level_meter->show(); level_meter->show();
meter_align.show(); meter_align.show();
peak_align.show(); peak_align.show();
btnbox.show(); btnbox.show();
mtr_vbox.show();
mtr_container.show();
mtr_hsep.show();
nfo_vbox.show();
_route->shared_peak_meter()->ConfigurationChanged.connect ( _route->shared_peak_meter()->ConfigurationChanged.connect (
route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context() route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context()
@ -210,6 +254,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
_route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&MeterStrip::strip_property_changed, this, _1), gui_context()); _route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&MeterStrip::strip_property_changed, this, _1), gui_context());
peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::peak_button_release), false); peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::peak_button_release), false);
name_label.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::name_label_button_release), false);
UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed));
ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
@ -235,8 +280,10 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
MeterStrip::~MeterStrip () MeterStrip::~MeterStrip ()
{ {
delete level_meter; if (level_meter) {
CatchDeletion (this); delete level_meter;
CatchDeletion (this);
}
} }
void void
@ -303,6 +350,9 @@ MeterStrip::strip_property_changed (const PropertyChange& what_changed)
ENSURE_GUI_THREAD (*this, &MeterStrip::strip_name_changed, what_changed) ENSURE_GUI_THREAD (*this, &MeterStrip::strip_name_changed, what_changed)
name_label.set_text(_route->name()); name_label.set_text(_route->name());
ARDOUR_UI::instance()->set_tip (name_label, _route->name()); ARDOUR_UI::instance()->set_tip (name_label, _route->name());
if (level_meter) {
ARDOUR_UI::instance()->set_tip (*level_meter, _route->name());
}
} }
void void
@ -347,13 +397,13 @@ MeterStrip::meter_configuration_changed (ChanCount c)
if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0 if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
&& boost::dynamic_pointer_cast<MidiTrack>(_route) == 0 && boost::dynamic_pointer_cast<MidiTrack>(_route) == 0
) { ) {
meter_ticks1_area.set_name ("AudioBusMetricsLeft"); meter_ticks1_area.set_name ("MyAudioBusMetricsLeft");
meter_ticks2_area.set_name ("AudioBusMetricsRight"); meter_ticks2_area.set_name ("MyAudioBusMetricsRight");
_has_midi = false; _has_midi = false;
} }
else if (type == (1 << DataType::AUDIO)) { else if (type == (1 << DataType::AUDIO)) {
meter_ticks1_area.set_name ("AudioTrackMetricsLeft"); meter_ticks1_area.set_name ("MyAudioTrackMetricsLeft");
meter_ticks2_area.set_name ("AudioTrackMetricsRight"); meter_ticks2_area.set_name ("MyAudioTrackMetricsRight");
_has_midi = false; _has_midi = false;
} }
else if (type == (1 << DataType::MIDI)) { else if (type == (1 << DataType::MIDI)) {
@ -365,9 +415,40 @@ MeterStrip::meter_configuration_changed (ChanCount c)
meter_ticks2_area.set_name ("AudioMidiTrackMetricsRight"); meter_ticks2_area.set_name ("AudioMidiTrackMetricsRight");
_has_midi = true; _has_midi = true;
} }
set_tick_bar(_tick_bar);
if (old_has_midi != _has_midi) MetricChanged();
on_theme_changed(); on_theme_changed();
if (old_has_midi != _has_midi) MetricChanged();
else ConfigurationChanged();
}
void
MeterStrip::set_tick_bar (int m)
{
std::string n;
_tick_bar = m;
if (_tick_bar & 1) {
n = meter_ticks1_area.get_name();
if (n.substr(0,3) != "Bar") {
meter_ticks1_area.set_name("Bar" + n);
}
} else {
n = meter_ticks1_area.get_name();
if (n.substr(0,3) == "Bar") {
meter_ticks1_area.set_name(n.substr(3,-1));
}
}
if (_tick_bar & 2) {
n = meter_ticks2_area.get_name();
if (n.substr(0,3) != "Bar") {
meter_ticks2_area.set_name("Bar" + n);
}
} else {
n = meter_ticks2_area.get_name();
if (n.substr(0,3) == "Bar") {
meter_ticks2_area.set_name(n.substr(3,-1));
}
}
} }
void void
@ -380,9 +461,31 @@ void
MeterStrip::on_size_allocate (Gtk::Allocation& a) MeterStrip::on_size_allocate (Gtk::Allocation& a)
{ {
const int wh = a.get_height(); const int wh = a.get_height();
int nh = ceilf(wh * .11f); int nh;
if (nh < 52) nh = 52; int mh = 0;
if (nh > 148) nh = 148; if (_session) {
mh = _session->config.get_meterbridge_label_height();
}
switch (mh) {
default:
case 0:
nh = ceilf(wh * .12f);
if (nh < 52) nh = 52;
if (nh > 148) nh = 148;
break;
case 1:
nh = 52;
break;
case 2:
nh = 88;
break;
case 3:
nh = 106;
break;
case 4:
nh = 148;
break;
}
namebx.set_size_request(18, nh); namebx.set_size_request(18, nh);
if (_route) { if (_route) {
name_label.set_size_request(18, nh-2); name_label.set_size_request(18, nh-2);
@ -404,7 +507,12 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
void void
MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt)
{ {
if (metric_type == mt && _metricmode == metricmode) {
return;
}
metric_type = mt; metric_type = mt;
_metricmode = metricmode;
_types.clear (); _types.clear ();
switch(metricmode) { switch(metricmode) {
case 0: case 0:
@ -425,10 +533,30 @@ MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt)
_types.push_back (DataType::AUDIO); _types.push_back (DataType::AUDIO);
break; break;
} }
update_background (mt);
meter_metric_area.queue_draw (); meter_metric_area.queue_draw ();
} }
void
MeterStrip::update_background(MeterType type)
{
switch(type) {
case MeterIEC1DIN:
case MeterIEC1NOR:
case MeterIEC2BBC:
case MeterIEC2EBU:
case MeterK14:
case MeterK20:
mtr_container.set_name ("meterstripPPM");
break;
case MeterVU:
mtr_container.set_name ("meterstripVU");
break;
default:
mtr_container.set_name ("meterstripDPM");
}
}
MeterType MeterType
MeterStrip::meter_type() MeterStrip::meter_type()
{ {
@ -556,11 +684,13 @@ MeterStrip::parameter_changed (std::string const & p)
else if (p == "show-name-on-meterbridge") { else if (p == "show-name-on-meterbridge") {
update_name_box(); update_name_box();
} }
else if (p == "meterbridge-label-height") {
queue_resize();
}
} }
bool bool
MeterStrip::level_meter_button_press (GdkEventButton* ev) MeterStrip::level_meter_button_release (GdkEventButton* ev)
{ {
if (ev->button == 3) { if (ev->button == 3) {
popup_level_meter_menu (ev); popup_level_meter_menu (ev);
@ -581,15 +711,15 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev)
RadioMenuItem::Group group; RadioMenuItem::Group group;
_suspend_menu_callbacks = true; _suspend_menu_callbacks = true;
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14);
add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU);
MeterType cmt = _route->meter_type(); MeterType cmt = _route->meter_type();
const std::string cmn = ArdourMeter::meter_type_string(cmt); const std::string cmn = ArdourMeter::meter_type_string(cmt);
@ -606,8 +736,53 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev)
_suspend_menu_callbacks = false; _suspend_menu_callbacks = false;
} }
bool
MeterStrip::name_label_button_release (GdkEventButton* ev)
{
if (!_session) return true;
if (!_session->config.get_show_name_on_meterbridge()) return true;
if (ev->button == 3) {
popup_name_label_menu (ev);
return true;
}
return false;
}
void void
MeterStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type) MeterStrip::popup_name_label_menu (GdkEventButton* ev)
{
using namespace Gtk::Menu_Helpers;
Gtk::Menu* m = manage (new Menu);
MenuList& items = m->items ();
RadioMenuItem::Group group;
_suspend_menu_callbacks = true;
add_label_height_item (items, group, _("Variable height"), 0);
add_label_height_item (items, group, _("Short"), 1);
add_label_height_item (items, group, _("Tall"), 2);
add_label_height_item (items, group, _("Grande"), 3);
add_label_height_item (items, group, _("Venti"), 4);
m->popup (ev->button, ev->time);
_suspend_menu_callbacks = false;
}
void
MeterStrip::add_label_height_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, uint32_t h)
{
using namespace Menu_Helpers;
items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MeterStrip::set_label_height), h)));
RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
i->set_active (_session && _session->config.get_meterbridge_label_height() == h);
}
void
MeterStrip::add_level_meter_type_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type)
{ {
using namespace Menu_Helpers; using namespace Menu_Helpers;
@ -620,15 +795,25 @@ void
MeterStrip::set_meter_type (MeterType type) MeterStrip::set_meter_type (MeterType type)
{ {
if (_suspend_menu_callbacks) return; if (_suspend_menu_callbacks) return;
if (_route->meter_type() == type) return;
level_meter->set_type (type); level_meter->set_type (type);
} }
void
MeterStrip::set_label_height (uint32_t h)
{
if (_suspend_menu_callbacks) return;
_session->config.set_meterbridge_label_height(h);
}
void void
MeterStrip::meter_type_changed (MeterType type) MeterStrip::meter_type_changed (MeterType type)
{ {
if (_route->meter_type() != type) { if (_route->meter_type() != type) {
_route->set_meter_type(type); _route->set_meter_type(type);
} }
update_background (type);
MetricChanged(); MetricChanged();
} }

View file

@ -56,6 +56,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
static PBD::Signal1<void,MeterStrip*> CatchDeletion; static PBD::Signal1<void,MeterStrip*> CatchDeletion;
static PBD::Signal0<void> MetricChanged; static PBD::Signal0<void> MetricChanged;
static PBD::Signal0<void> ConfigurationChanged;
void reset_peak_display (); void reset_peak_display ();
void reset_route_peak_display (ARDOUR::Route*); void reset_route_peak_display (ARDOUR::Route*);
@ -64,6 +65,9 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType); void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType);
void set_metric_mode (int, ARDOUR::MeterType); void set_metric_mode (int, ARDOUR::MeterType);
int get_metric_mode() { return _metricmode; }
void set_tick_bar (int);
int get_tick_bar() { return _tick_bar; }
bool has_midi() { return _has_midi; } bool has_midi() { return _has_midi; }
bool is_metric_display() { return _strip_type == 0; } bool is_metric_display() { return _strip_type == 0; }
ARDOUR::MeterType meter_type(); ARDOUR::MeterType meter_type();
@ -89,7 +93,12 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void set_button_names (); void set_button_names ();
private: private:
Gtk::VBox mtr_vbox;
Gtk::VBox nfo_vbox;
Gtk::EventBox mtr_container;
Gtk::HSeparator mtr_hsep;
Gtk::HBox meterbox; Gtk::HBox meterbox;
Gtk::HBox spacer;
Gtk::HBox namebx; Gtk::HBox namebx;
ArdourButton name_label; ArdourButton name_label;
Gtk::DrawingArea meter_metric_area; Gtk::DrawingArea meter_metric_area;
@ -111,16 +120,17 @@ class MeterStrip : public Gtk::VBox, public RouteUI
float max_peak; float max_peak;
bool _has_midi; bool _has_midi;
int _tick_bar;
int _strip_type; int _strip_type;
int _metricmode;
LevelMeter *level_meter; LevelMeterHBox *level_meter;
PBD::ScopedConnection _config_connection; PBD::ScopedConnection _config_connection;
void strip_property_changed (const PBD::PropertyChange&); void strip_property_changed (const PBD::PropertyChange&);
void meter_configuration_changed (ARDOUR::ChanCount); void meter_configuration_changed (ARDOUR::ChanCount);
void meter_type_changed (ARDOUR::MeterType); void meter_type_changed (ARDOUR::MeterType);
void update_background (ARDOUR::MeterType);
static int max_pattern_metric_size; // == FastMeter::max_pattern_metric_size
bool peak_button_release (GdkEventButton*); bool peak_button_release (GdkEventButton*);
@ -130,10 +140,16 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void update_name_box (); void update_name_box ();
bool _suspend_menu_callbacks; bool _suspend_menu_callbacks;
bool level_meter_button_press (GdkEventButton* ev); bool level_meter_button_release (GdkEventButton* ev);
void popup_level_meter_menu (GdkEventButton* ev); void popup_level_meter_menu (GdkEventButton* ev);
void add_level_meter_item (Gtk::Menu_Helpers::MenuList& items, Gtk::RadioMenuItem::Group& group, std::string const & name, ARDOUR::MeterType mode); void add_level_meter_type_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, ARDOUR::MeterType);
bool name_label_button_release (GdkEventButton* ev);
void popup_name_label_menu (GdkEventButton* ev);
void add_label_height_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, uint32_t);
void set_meter_type (ARDOUR::MeterType mode); void set_meter_type (ARDOUR::MeterType mode);
void set_label_height (uint32_t);
}; };
#endif /* __ardour_mixer_strip__ */ #endif /* __ardour_mixer_strip__ */

View file

@ -141,6 +141,7 @@ Meterbridge::Meterbridge ()
Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context());
MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context());
MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context());
/* work around ScrolledWindowViewport alignment mess Part one */ /* work around ScrolledWindowViewport alignment mess Part one */
Gtk::HBox * yspc = manage (new Gtk::HBox()); Gtk::HBox * yspc = manage (new Gtk::HBox());
@ -336,9 +337,31 @@ Meterbridge::on_size_request (Gtk::Requisition* r)
Gtk::Window::on_size_request(r); Gtk::Window::on_size_request(r);
Gdk::Geometry geom; Gdk::Geometry geom;
geom.max_width = meterarea.get_width() + metrics_left.get_width() + metrics_right.get_width(); Gtk::Requisition mr = meterarea.size_request();
geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width();
geom.max_height = max_height; geom.max_height = max_height;
#ifndef GTKOSX
/* on OSX this leads to a constant live-loop: show/hide scrollbar
* on Linux, the window is resized IFF the scrollbar was not visible
*/
const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
Glib::RefPtr<Gdk::Screen> screen = get_screen ();
Gdk::Rectangle monitor_rect;
screen->get_monitor_geometry (0, monitor_rect);
const int scr_w = monitor_rect.get_width() - 44;
if (cur_max_width < geom.max_width
&& cur_max_width < scr_w
&& !(scroller.get_hscrollbar_visible() && hsc)) {
int h = r->height;
*r = Gtk::Requisition();
r->width = geom.max_width;
r->height = h;
}
#endif
if (cur_max_width != geom.max_width) { if (cur_max_width != geom.max_width) {
cur_max_width = geom.max_width; cur_max_width = geom.max_width;
geom.height_inc = 16; geom.height_inc = 16;
@ -353,6 +376,10 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a)
const Gtk::Scrollbar * hsc = scroller.get_hscrollbar(); const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
if (scroller.get_hscrollbar_visible() && hsc) { if (scroller.get_hscrollbar_visible() && hsc) {
if (!scroll_connection.connected()) {
scroll_connection = scroller.get_hscrollbar()->get_adjustment()->signal_value_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));
scroller.get_hscrollbar()->get_adjustment()->signal_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));
}
gint scrollbar_spacing; gint scrollbar_spacing;
gtk_widget_style_get (GTK_WIDGET (scroller.gobj()), gtk_widget_style_get (GTK_WIDGET (scroller.gobj()),
"scrollbar-spacing", &scrollbar_spacing, NULL); "scrollbar-spacing", &scrollbar_spacing, NULL);
@ -366,6 +393,41 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a)
Gtk::Window::on_size_allocate(a); Gtk::Window::on_size_allocate(a);
} }
void
Meterbridge::on_scroll()
{
if (!scroller.get_hscrollbar()) return;
Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
int leftend = adj->get_value();
int rightend = scroller.get_width() + leftend;
int mm_left = _mm_left;
int mm_right = _mm_right;
ARDOUR::MeterType mt_left = _mt_left;
ARDOUR::MeterType mt_right = _mt_right;
for (unsigned int i = 0; i < _metrics.size(); ++i) {
int sx, dx, dy;
int mm = _metrics[i]->get_metric_mode();
sx = (mm & 2) ? _metrics[i]->get_width() : 0;
_metrics[i]->translate_coordinates(meterarea, sx, 0, dx, dy);
if (dx < leftend && !(mm&2)) {
mm_left = mm;
mt_left = _metrics[i]->meter_type();
}
if (dx > rightend && (mm&2)) {
mm_right = mm;
mt_right = _metrics[i]->meter_type();
break;
}
}
metrics_left.set_metric_mode(mm_left, mt_left);
metrics_right.set_metric_mode(mm_right, mt_right);
}
void void
Meterbridge::set_session (Session* s) Meterbridge::set_session (Session* s)
{ {
@ -570,10 +632,12 @@ Meterbridge::remove_strip (MeterStrip* strip)
break; break;
} }
} }
resync_order();
} }
void void
Meterbridge::sync_order_keys (RouteSortOrderKey src) Meterbridge::sync_order_keys (RouteSortOrderKey)
{ {
Glib::Threads::Mutex::Lock lm (_resync_mutex); Glib::Threads::Mutex::Lock lm (_resync_mutex);
@ -582,6 +646,7 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
int pos = 0; int pos = 0;
int vis = 0; int vis = 0;
MeterStrip * last = 0;
unsigned int metrics = 0; unsigned int metrics = 0;
MeterType lmt = MeterPeak; MeterType lmt = MeterPeak;
@ -633,14 +698,24 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
vis++; vis++;
} }
(*i).s->set_tick_bar(0);
MeterType nmt = (*i).s->meter_type(); MeterType nmt = (*i).s->meter_type();
if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics
if (pos == 0) {
(*i).s->set_tick_bar(1);
}
if ((*i).visible && nmt != lmt && pos == 0) { if ((*i).visible && nmt != lmt && pos == 0) {
lmt = nmt; lmt = nmt;
metrics_left.set_metric_mode(1, lmt); metrics_left.set_metric_mode(1, lmt);
} else if ((*i).visible && nmt != lmt) { } else if ((*i).visible && nmt != lmt) {
if (last) {
last->set_tick_bar(last->get_tick_bar() | 2);
}
(*i).s->set_tick_bar((*i).s->get_tick_bar() | 1);
if (_metrics.size() <= metrics) { if (_metrics.size() <= metrics) {
_metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt)); _metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt));
meterarea.pack_start (*_metrics[metrics], false, false); meterarea.pack_start (*_metrics[metrics], false, false);
@ -672,6 +747,13 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
} }
meterarea.reorder_child(*((*i).s), pos++); meterarea.reorder_child(*((*i).s), pos++);
if ((*i).visible) {
last = (*i).s;
}
}
if (last) {
last->set_tick_bar(last->get_tick_bar() | 2);
} }
metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt); metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt);
@ -681,6 +763,14 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
delete (_metrics.back()); delete (_metrics.back());
_metrics.pop_back(); _metrics.pop_back();
} }
_mm_left = metrics_left.get_metric_mode();
_mt_left = metrics_left.meter_type();
_mm_right = metrics_right.get_metric_mode();
_mt_right = metrics_right.meter_type();
on_scroll();
queue_resize();
} }
void void
@ -719,6 +809,9 @@ Meterbridge::parameter_changed (std::string const & p)
else if (p == "show-name-on-meterbridge") { else if (p == "show-name-on-meterbridge") {
scroller.queue_resize(); scroller.queue_resize();
} }
else if (p == "meterbridge-label-height") {
scroller.queue_resize();
}
} }
void void

View file

@ -147,6 +147,12 @@ class Meterbridge :
void parameter_changed (std::string const & p); void parameter_changed (std::string const & p);
void on_theme_changed (); void on_theme_changed ();
void on_scroll ();
sigc::connection scroll_connection;
int _mm_left, _mm_right;
ARDOUR::MeterType _mt_left, _mt_right;
}; };
#endif #endif

View file

@ -300,7 +300,11 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
s += snprintf ( s += snprintf (
&buf[s], bufsize, " MTC full frame to %02d:%02d:%02d:%02d\n", msg[5] & 0x1f, msg[6], msg[7], msg[8] &buf[s], bufsize, " MTC full frame to %02d:%02d:%02d:%02d\n", msg[5] & 0x1f, msg[6], msg[7], msg[8]
); );
} else if (len == 3 && msg[0] == MIDI::position) {
/* MIDI Song Position */
int midi_beats = (msg[2] << 7) | msg[1];
s += snprintf (&buf[s], bufsize, "%16s %d\n", "Position", (int) midi_beats);
} else { } else {
/* other sys-ex */ /* other sys-ex */

View file

@ -1926,7 +1926,7 @@ void
Mixer_UI::toggle_midi_input_active (bool flip_others) Mixer_UI::toggle_midi_input_active (bool flip_others)
{ {
boost::shared_ptr<RouteList> rl (new RouteList); boost::shared_ptr<RouteList> rl (new RouteList);
bool onoff; bool onoff = false;
set_route_targets_for_operation (); set_route_targets_for_operation ();

File diff suppressed because it is too large Load diff

View file

@ -564,8 +564,22 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
} }
for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) { for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
if (!extra_other[*i].empty()) { if (extra_other[*i].empty()) continue;
boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_other[*i], *i, inputs); std::string cp;
std::vector<std::string> nb;
for (uint32_t j = 0; j < extra_other[*i].size(); ++j) {
std::string nn = extra_other[*i][j];
std::string pf = nn.substr (0, nn.find_first_of (":") + 1);
if (pf != cp && !nb.empty()) {
boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs);
other->add_bundle (b);
nb.clear();
}
cp = pf;
nb.push_back(extra_other[*i][j]);
}
if (!nb.empty()) {
boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs);
other->add_bundle (b); other->add_bundle (b);
} }
} }

View file

@ -152,6 +152,7 @@ PortMatrix::init ()
/* and also bundles */ /* and also bundles */
_session->BundleAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); _session->BundleAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
_session->BundleRemoved.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
/* and also ports */ /* and also ports */
_session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
@ -180,6 +181,7 @@ PortMatrix::reconnect_to_routes ()
boost::shared_ptr<RouteList> routes = _session->get_routes (); boost::shared_ptr<RouteList> routes = _session->get_routes ();
for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
(*i)->processors_changed.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::route_processors_changed, this, _1), gui_context()); (*i)->processors_changed.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::route_processors_changed, this, _1), gui_context());
(*i)->DropReferences.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::routes_changed, this), gui_context());
} }
} }
@ -198,6 +200,7 @@ PortMatrix::route_processors_changed (RouteProcessorChange c)
void void
PortMatrix::routes_changed () PortMatrix::routes_changed ()
{ {
if (!_session) return;
reconnect_to_routes (); reconnect_to_routes ();
setup_global_ports (); setup_global_ports ();
} }
@ -206,7 +209,10 @@ PortMatrix::routes_changed ()
void void
PortMatrix::setup () PortMatrix::setup ()
{ {
if (!_session) return; // session went away if (!_session) {
_route_connections.drop_connections ();
return; // session went away
}
/* this needs to be done first, as the visible_ports() method uses the /* this needs to be done first, as the visible_ports() method uses the
notebook state to decide which ports are being shown */ notebook state to decide which ports are being shown */
@ -330,6 +336,13 @@ PortMatrix::select_arrangement ()
_vbox.pack_end (_vnotebook, false, false); _vbox.pack_end (_vnotebook, false, false);
_vbox.pack_end (_vspacer, true, true); _vbox.pack_end (_vspacer, true, true);
#define REMOVE_FROM_GTK_PARENT(WGT) if ((WGT).get_parent()) { (WGT).get_parent()->remove(WGT);}
REMOVE_FROM_GTK_PARENT(*_body)
REMOVE_FROM_GTK_PARENT(_vscroll)
REMOVE_FROM_GTK_PARENT(_hscroll)
REMOVE_FROM_GTK_PARENT(_vbox)
REMOVE_FROM_GTK_PARENT(_hbox)
attach (*_body, 2, 3, 1, 2, FILL | EXPAND, FILL | EXPAND); attach (*_body, 2, 3, 1, 2, FILL | EXPAND, FILL | EXPAND);
attach (_vscroll, 3, 4, 1, 2, SHRINK); attach (_vscroll, 3, 4, 1, 2, SHRINK);
attach (_hscroll, 2, 3, 3, 4, FILL | EXPAND, SHRINK); attach (_hscroll, 2, 3, 3, 4, FILL | EXPAND, SHRINK);
@ -349,6 +362,12 @@ PortMatrix::select_arrangement ()
_vbox.pack_end (_vnotebook, false, false); _vbox.pack_end (_vnotebook, false, false);
_vbox.pack_end (_vlabel, false, false); _vbox.pack_end (_vlabel, false, false);
REMOVE_FROM_GTK_PARENT(*_body)
REMOVE_FROM_GTK_PARENT(_vscroll)
REMOVE_FROM_GTK_PARENT(_hscroll)
REMOVE_FROM_GTK_PARENT(_vbox)
REMOVE_FROM_GTK_PARENT(_hbox)
attach (*_body, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND); attach (*_body, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND);
attach (_vscroll, 3, 4, 2, 3, SHRINK); attach (_vscroll, 3, 4, 2, 3, SHRINK);
attach (_hscroll, 1, 2, 3, 4, FILL | EXPAND, SHRINK); attach (_hscroll, 1, 2, 3, 4, FILL | EXPAND, SHRINK);
@ -727,7 +746,7 @@ PortMatrix::remove_channel (ARDOUR::BundleChannel b)
int const r = io->remove_port (p, this); int const r = io->remove_port (p, this);
if (r == -1) { if (r == -1) {
ArdourDialog d (_("Port removal not allowed")); ArdourDialog d (_("Port removal not allowed"));
Label l (_("This port cannot be removed, as the first plugin in the track or buss cannot accept the new number of inputs.")); Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs."));
d.get_vbox()->pack_start (l); d.get_vbox()->pack_start (l);
d.add_button (Stock::OK, RESPONSE_ACCEPT); d.add_button (Stock::OK, RESPONSE_ACCEPT);
d.set_modal (true); d.set_modal (true);

View file

@ -1315,6 +1315,14 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters) sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters)
)); ));
add_option (_("Editor"),
new BoolOption (
"show-editor-meter",
_("Display master-meter in the toolbar"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_editor_meter),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_editor_meter)
));
bco = new BoolComboOption ( bco = new BoolComboOption (
"use-overlap-equivalency", "use-overlap-equivalency",
_("Regions in active edit groups are edited together"), _("Regions in active edit groups are edited together"),
@ -1933,15 +1941,30 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level) sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
); );
mlu->add (MeteringLineUp24, _("-24dBFS")); mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE)")); mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
mlu->add (MeteringLineUp15, _("-15dBFS (DIN)")); mlu->add (MeteringLineUp15, _("-15dBFS (DIN)"));
Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-ticks and color-knee point for dBFS scale DPM, set reference/offset level for IEC PPM.")); Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-marks and color-knee point for dBFS scale DPM, set reference level for IEC1/Nordic, IEC2 PPM and VU meter."));
add_option (S_("Preferences|GUI"), mlu); add_option (S_("Preferences|GUI"), mlu);
ComboOption<MeterLineUp>* mld = new ComboOption<MeterLineUp> (
"meter-line-up-din",
_("IEC1/DIN Meter line-up level; 0dBu"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_din),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_din)
);
mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
mld->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
mld->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
mld->add (MeteringLineUp15, _("-15dBFS (DIN)"));
Gtkmm2ext::UI::instance()->set_tip (mld->tip_widget(), _("Reference level for IEC1/DIN meter."));
add_option (S_("Preferences|GUI"), mld);
ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> ( ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> (
"meter-vu-standard", "meter-vu-standard",
@ -1950,9 +1973,10 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard) sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard)
); );
mvu->add (MeteringVUfrench, _("+2dB (France)")); mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)"));
mvu->add (MeteringVUamerican, _(" 0dB (North America, Australia)")); mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)"));
mvu->add (MeteringVUstandard, _("-4dB (standard)")); mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)"));
mvu->add (MeteringVUeight, _("0VU = +8dBu"));
add_option (S_("Preferences|GUI"), mvu); add_option (S_("Preferences|GUI"), mvu);
@ -1969,6 +1993,15 @@ RCOptionEditor::RCOptionEditor ()
_("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red.")); _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));
add_option (S_("Preferences|GUI"), mpks); add_option (S_("Preferences|GUI"), mpks);
add_option (S_("Preferences|GUI"),
new BoolOption (
"meter-style-led",
_("LED meter style"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_style_led),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_style_led)
));
} }
void void

View file

@ -32,6 +32,7 @@
#include "ardour/return.h" #include "ardour/return.h"
#include "ardour/route.h" #include "ardour/route.h"
#include "ardour/send.h" #include "ardour/send.h"
#include "ardour/internal_send.h"
#include "ardour_ui.h" #include "ardour_ui.h"
#include "gui_thread.h" #include "gui_thread.h"
@ -510,7 +511,12 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
boost::shared_ptr<PluginInsert> plugin_insert; boost::shared_ptr<PluginInsert> plugin_insert;
boost::shared_ptr<PortInsert> port_insert; boost::shared_ptr<PortInsert> port_insert;
if ((send = boost::dynamic_pointer_cast<Send> (proc)) != 0) { if ((boost::dynamic_pointer_cast<InternalSend> (proc)) != 0) {
cleanup_view();
_processor.reset ((Processor*) 0);
update_title();
return;
} else if ((send = boost::dynamic_pointer_cast<Send> (proc)) != 0) {
SendUI *send_ui = new SendUI (this, send, _session); SendUI *send_ui = new SendUI (this, send, _session);

View file

@ -61,7 +61,7 @@ using namespace ARDOUR;
using namespace PBD; using namespace PBD;
uint32_t RouteUI::_max_invert_buttons = 3; uint32_t RouteUI::_max_invert_buttons = 3;
sigc::signal<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged; PBD::Signal1<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged;
boost::weak_ptr<Route> RouteUI::_showing_sends_to; boost::weak_ptr<Route> RouteUI::_showing_sends_to;
RouteUI::RouteUI (ARDOUR::Session* sess) RouteUI::RouteUI (ARDOUR::Session* sess)
@ -171,7 +171,7 @@ RouteUI::init ()
monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press)); monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press));
monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release)); monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release));
BusSendDisplayChanged.connect (sigc::mem_fun (*this, &RouteUI::bus_send_display_changed)); BusSendDisplayChanged.connect_same_thread (*this, boost::bind(&RouteUI::bus_send_display_changed, this, _1));
} }
void void

View file

@ -225,7 +225,7 @@ class RouteUI : public virtual AxisView
* by a click on the `Sends' button. The parameter is the route that the sends are * by a click on the `Sends' button. The parameter is the route that the sends are
* to, or 0 if no route is now in this mode. * to, or 0 if no route is now in this mode.
*/ */
static sigc::signal<void, boost::shared_ptr<ARDOUR::Route> > BusSendDisplayChanged; static PBD::Signal1<void, boost::shared_ptr<ARDOUR::Route> > BusSendDisplayChanged;
protected: protected:
PBD::ScopedConnectionList route_connections; PBD::ScopedConnectionList route_connections;

View file

@ -724,10 +724,8 @@ SystemExec::start (int stderr_mode)
signal(SIGPIPE, SIG_DFL); signal(SIGPIPE, SIG_DFL);
#endif #endif
#ifndef __WIN32__ int good_fds[1] = { -1 };
int good_fds[1] = { 0 };
close_allv(good_fds); close_allv(good_fds);
#endif
::execve(argp[0], argp, envp); ::execve(argp[0], argp, envp);
/* if we reach here something went wrong.. */ /* if we reach here something went wrong.. */

View file

@ -33,6 +33,7 @@
#include "i18n.h" #include "i18n.h"
using namespace PBD; using namespace PBD;
using namespace VideoUtils;
TranscodeFfmpeg::TranscodeFfmpeg (std::string f) TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
: infile(f) : infile(f)

View file

@ -50,6 +50,7 @@ using namespace Gtk;
using namespace std; using namespace std;
using namespace PBD; using namespace PBD;
using namespace ARDOUR; using namespace ARDOUR;
using namespace VideoUtils;
TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile) TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
: ArdourDialog (_("Transcode/Import Video File ")) : ArdourDialog (_("Transcode/Import Video File "))

View file

@ -301,6 +301,53 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, s
} }
} }
bool
rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state)
{
static Gtk::Window* window = 0;
assert (r && g && b);
if (window == 0) {
window = new Window (WINDOW_TOPLEVEL);
}
Gtk::EventBox foo;
window->add (foo);
foo.set_name (style);
foo.ensure_style ();
GtkRcStyle* rc = foo.get_style()->gobj()->rc_style;
if (!rc) {
warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
return false;
}
if (attr == "fg") {
*r = rc->fg[state].red / 65535.0;
*g = rc->fg[state].green / 65535.0;
*b = rc->fg[state].blue / 65535.0;
} else if (attr == "bg") {
*r = rc->bg[state].red / 65535.0;
*g = rc->bg[state].green / 65535.0;
*b = rc->bg[state].blue / 65535.0;
} else if (attr == "base") {
*r = rc->base[state].red / 65535.0;
*g = rc->base[state].green / 65535.0;
*b = rc->base[state].blue / 65535.0;
} else if (attr == "text") {
*r = rc->text[state].red / 65535.0;
*g = rc->text[state].green / 65535.0;
*b = rc->text[state].blue / 65535.0;
} else {
return false;
}
window->remove ();
return true;
}
bool bool
canvas_item_visible (ArdourCanvas::Item* item) canvas_item_visible (ArdourCanvas::Item* item)
{ {

View file

@ -56,6 +56,8 @@ Pango::FontDescription get_font_for_style (std::string widgetname);
uint32_t rgba_from_style (std::string, uint32_t, uint32_t, uint32_t, uint32_t, std::string = "fg", int = Gtk::STATE_NORMAL, bool = true); uint32_t rgba_from_style (std::string, uint32_t, uint32_t, uint32_t, uint32_t, std::string = "fg", int = Gtk::STATE_NORMAL, bool = true);
bool rgba_p_from_style (std::string, float*, float*, float*, std::string = "fg", int = Gtk::STATE_NORMAL);
void decorate (Gtk::Window& w, Gdk::WMDecoration d); void decorate (Gtk::Window& w, Gdk::WMDecoration d);
bool canvas_item_visible (ArdourCanvas::Item* item); bool canvas_item_visible (ArdourCanvas::Item* item);

View file

@ -35,9 +35,10 @@ using namespace Gtk;
using namespace std; using namespace std;
using namespace PBD; using namespace PBD;
using namespace ARDOUR; using namespace ARDOUR;
using namespace VideoUtils;
bool bool
confirm_video_outfn (std::string outfn, std::string docroot) VideoUtils::confirm_video_outfn (std::string outfn, std::string docroot)
{ {
/* replace docroot's '/' to G_DIR_SEPARATOR for the comparison */ /* replace docroot's '/' to G_DIR_SEPARATOR for the comparison */
size_t look_here = 0; size_t look_here = 0;
@ -77,7 +78,7 @@ confirm_video_outfn (std::string outfn, std::string docroot)
} }
std::string std::string
video_dest_dir (const std::string sessiondir, const std::string docroot) VideoUtils::video_dest_dir (const std::string sessiondir, const std::string docroot)
{ {
std::string dir = docroot; std::string dir = docroot;
if (dir.empty() || !dir.compare(0, dir.length(), sessiondir, 0, dir.length())) { if (dir.empty() || !dir.compare(0, dir.length(), sessiondir, 0, dir.length())) {
@ -92,7 +93,7 @@ video_dest_dir (const std::string sessiondir, const std::string docroot)
} }
std::string std::string
video_get_docroot (ARDOUR::RCConfiguration* config) VideoUtils::video_get_docroot (ARDOUR::RCConfiguration* config)
{ {
if (config->get_video_advanced_setup()) { if (config->get_video_advanced_setup()) {
return config->get_video_server_docroot(); return config->get_video_server_docroot();
@ -101,7 +102,7 @@ video_get_docroot (ARDOUR::RCConfiguration* config)
} }
std::string std::string
video_get_server_url (ARDOUR::RCConfiguration* config) VideoUtils::video_get_server_url (ARDOUR::RCConfiguration* config)
{ {
if (config->get_video_advanced_setup()) { if (config->get_video_advanced_setup()) {
return config->get_video_server_url(); return config->get_video_server_url();
@ -111,7 +112,7 @@ video_get_server_url (ARDOUR::RCConfiguration* config)
std::string std::string
strip_file_extension (const std::string infile) VideoUtils::strip_file_extension (const std::string infile)
{ {
std::string rv; std::string rv;
char *ext, *bn = strdup(infile.c_str()); char *ext, *bn = strdup(infile.c_str());
@ -126,7 +127,7 @@ strip_file_extension (const std::string infile)
} }
std::string std::string
get_file_extension (const std::string infile) VideoUtils::get_file_extension (const std::string infile)
{ {
std::string rv = ""; std::string rv = "";
char *ext, *bn = strdup(infile.c_str()); char *ext, *bn = strdup(infile.c_str());
@ -140,13 +141,13 @@ get_file_extension (const std::string infile)
} }
std::string std::string
video_dest_file (const std::string dir, const std::string infile) VideoUtils::video_dest_file (const std::string dir, const std::string infile)
{ {
return dir + "a3_" + strip_file_extension(Glib::path_get_basename(infile)) + ".avi"; return dir + "a3_" + strip_file_extension(Glib::path_get_basename(infile)) + ".avi";
} }
std::string std::string
video_map_path (std::string server_docroot, std::string filepath) VideoUtils::video_map_path (std::string server_docroot, std::string filepath)
{ {
std::string rv = filepath; std::string rv = filepath;
@ -179,7 +180,7 @@ video_map_path (std::string server_docroot, std::string filepath)
} }
void void
ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines) VideoUtils::ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines)
{ {
bool inQuote(false); bool inQuote(false);
bool newLine(false); bool newLine(false);
@ -236,7 +237,7 @@ ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines)
} }
bool bool
video_query_info ( VideoUtils::video_query_info (
std::string video_server_url, std::string video_server_url,
std::string filepath, std::string filepath,
double &video_file_fps, double &video_file_fps,
@ -247,52 +248,32 @@ video_query_info (
{ {
char url[2048]; char url[2048];
snprintf(url, sizeof(url), "%s%sinfo/?file=%s&format=plain" snprintf(url, sizeof(url), "%s%sinfo/?file=%s&format=csv"
, video_server_url.c_str() , video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
, filepath.c_str()); , filepath.c_str());
char *res = curl_http_get(url, NULL); char *res = a3_curl_http_get(url, NULL);
int pid=0; if (!res) {
if (res) {
char *pch, *pst;
int version;
pch = strtok_r(res, "\n", &pst);
while (pch) {
#if 0 /* DEBUG */
printf("VideoFileInfo [%i] -> '%s'\n", pid, pch);
#endif
switch (pid) {
case 0:
version = atoi(pch);
if (version != 1) break;
case 1:
video_file_fps = atof(pch);
break;
case 2:
video_duration = atoll(pch);
break;
case 3:
video_start_offset = atof(pch);
break;
case 4:
video_aspect_ratio = atof(pch);
break;
default:
break;
}
pch = strtok_r(NULL,"\n", &pst);
++pid;
}
free(res);
}
if (pid!=5) {
return false; return false;
} }
std::vector<std::vector<std::string> > lines;
ParseCSV(std::string(res), lines);
free(res);
if (lines.empty() || lines.at(0).empty() || lines.at(0).size() != 6) {
return false;
}
if (atoi(lines.at(0).at(0)) != 1) return false; // version
video_start_offset = 0.0;
video_aspect_ratio = atof (lines.at(0).at(3));
video_file_fps = atof (lines.at(0).at(4));
video_duration = atoll(lines.at(0).at(5));
return true; return true;
} }
void void
video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img) VideoUtils::video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
{ {
int rowstride = img->get_rowstride(); int rowstride = img->get_rowstride();
@ -319,7 +300,7 @@ video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
extern "C" { extern "C" {
#include <curl/curl.h> #include <curl/curl.h>
struct MemoryStruct { struct A3MemoryStruct {
char *data; char *data;
size_t size; size_t size;
}; };
@ -327,7 +308,7 @@ extern "C" {
static size_t static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) { WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) {
size_t realsize = size * nmemb; size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data; struct A3MemoryStruct *mem = (struct A3MemoryStruct *)data;
mem->data = (char *)realloc(mem->data, mem->size + realsize + 1); mem->data = (char *)realloc(mem->data, mem->size + realsize + 1);
if (mem->data) { if (mem->data) {
@ -338,10 +319,10 @@ extern "C" {
return realsize; return realsize;
} }
char *curl_http_get (const char *u, int *status) { char *a3_curl_http_get (const char *u, int *status) {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
struct MemoryStruct chunk; struct A3MemoryStruct chunk;
long int httpstatus; long int httpstatus;
if (status) *status = 0; if (status) *status = 0;
//usleep(500000); return NULL; // TEST & DEBUG //usleep(500000); return NULL; // TEST & DEBUG
@ -370,7 +351,7 @@ extern "C" {
if (status) *status = httpstatus; if (status) *status = httpstatus;
if (res) { if (res) {
#ifdef CURLERRORDEBUG #ifdef CURLERRORDEBUG
printf("curl_http_get() failed: %s\n", curlerror); printf("a3_curl_http_get() failed: %s\n", curlerror);
#endif #endif
return NULL; return NULL;
} }

View file

@ -32,6 +32,8 @@
#include "ardour/template_utils.h" #include "ardour/template_utils.h"
#include "ardour_dialog.h" #include "ardour_dialog.h"
namespace VideoUtils {
bool confirm_video_outfn (std::string, std::string docroot=""); bool confirm_video_outfn (std::string, std::string docroot="");
std::string video_dest_dir (const std::string, const std::string); std::string video_dest_dir (const std::string, const std::string);
std::string video_dest_file (const std::string, const std::string); std::string video_dest_file (const std::string, const std::string);
@ -52,9 +54,10 @@ bool video_query_info (
double &video_start_offset, double &video_start_offset,
double &video_aspect_ratio double &video_aspect_ratio
); );
};
extern "C" { extern "C" {
char *curl_http_get (const char *u, int *status); char *a3_curl_http_get (const char *u, int *status);
} }
#endif /* __gtk_ardour_video_utils_h__ */ #endif /* __gtk_ardour_video_utils_h__ */

View file

@ -36,6 +36,7 @@
using namespace std; using namespace std;
using namespace ARDOUR; using namespace ARDOUR;
using namespace VideoUtils;
VideoImageFrame::VideoImageFrame (PublicEditor& ed, ArdourCanvas::Group& parent, int w, int h, std::string vsurl, std::string vfn) VideoImageFrame::VideoImageFrame (PublicEditor& ed, ArdourCanvas::Group& parent, int w, int h, std::string vsurl, std::string vfn)
: editor (ed) : editor (ed)
@ -196,7 +197,7 @@ http_get_thread (void *arg) {
int timeout = 1000; // * 5ms -> 5sec int timeout = 1000; // * 5ms -> 5sec
char *res = NULL; char *res = NULL;
do { do {
res=curl_http_get(url, &status); res=a3_curl_http_get(url, &status);
if (status == 503) usleep(5000); // try-again if (status == 503) usleep(5000); // try-again
} while (status == 503 && --timeout > 0); } while (status == 503 && --timeout > 0);

View file

@ -37,6 +37,7 @@ using namespace Gtk;
using namespace std; using namespace std;
using namespace PBD; using namespace PBD;
using namespace ARDOUR; using namespace ARDOUR;
using namespace VideoUtils;
VideoServerDialog::VideoServerDialog (Session* s) VideoServerDialog::VideoServerDialog (Session* s)
: ArdourDialog (_("Launch Video Server")) : ArdourDialog (_("Launch Video Server"))

View file

@ -45,6 +45,7 @@ using namespace std;
using namespace ARDOUR; using namespace ARDOUR;
using namespace PBD; using namespace PBD;
using namespace Timecode; using namespace Timecode;
using namespace VideoUtils;
VideoTimeLine::VideoTimeLine (PublicEditor *ed, ArdourCanvas::Group *vbg, int initial_height) VideoTimeLine::VideoTimeLine (PublicEditor *ed, ArdourCanvas::Group *vbg, int initial_height)
: editor (ed) : editor (ed)
@ -502,14 +503,18 @@ VideoTimeLine::video_file_info (std::string filename, bool local)
_session->config.set_timecode_format(timecode_60); _session->config.set_timecode_format(timecode_60);
break; break;
default: default:
warning << _("Failed to set session-framerate: ") << video_file_fps << _(" does not have a corresponding option setting in Ardour.") << endmsg; /* TODO: gettext arg */ warning << string_compose (
_("Failed to set session-framerate: '%1' does not have a corresponding option setting in %2."),
video_file_fps, PROGRAM_NAME ) << endmsg;
break; break;
} }
_session->config.set_video_pullup(0); /* TODO only set if set_timecode_format() was successful ?!*/ _session->config.set_video_pullup(0); /* TODO only set if set_timecode_format() was successful ?!*/
} }
if (floor(video_file_fps*100) != floor(_session->timecode_frames_per_second()*100)) { if (floor(video_file_fps*100) != floor(_session->timecode_frames_per_second()*100)) {
warning << _("Video file's framerate is not equal to Ardour session timecode's framerate: ") warning << string_compose(
<< video_file_fps << _(" vs ") << _session->timecode_frames_per_second() << endmsg; _("Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs '%3'"),
PROGRAM_NAME, video_file_fps, _session->timecode_frames_per_second())
<< endmsg;
} }
flush_local_cache (); flush_local_cache ();
@ -548,7 +553,7 @@ VideoTimeLine::check_server ()
, video_server_url.c_str() , video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
); );
char *res=curl_http_get(url, NULL); char *res=a3_curl_http_get(url, NULL);
if (res) { if (res) {
if (strstr(res, "status: ok, online.")) { ok = true; } if (strstr(res, "status: ok, online.")) { ok = true; }
free(res); free(res);
@ -570,7 +575,7 @@ VideoTimeLine::check_server_docroot ()
, video_server_url.c_str() , video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
); );
char *res=curl_http_get(url, NULL); char *res=a3_curl_http_get(url, NULL);
if (!res) { if (!res) {
return false; return false;
} }
@ -580,8 +585,8 @@ VideoTimeLine::check_server_docroot ()
|| lines.at(0).empty() || lines.at(0).empty()
|| lines.at(0).at(0) != video_get_docroot(Config)) { || lines.at(0).at(0) != video_get_docroot(Config)) {
warning << string_compose( warning << string_compose(
_("Video-server docroot mismatch. Ardour: '%1', video-server: '%2'. This usually means that the video server was not started by ardour and uses a different document-root."), _("Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means that the video server was not started by ardour and uses a different document-root."),
video_get_docroot(Config), lines.at(0).at(0)) PROGRAM_NAME, video_get_docroot(Config), lines.at(0).at(0))
<< endmsg; << endmsg;
ok = false; // TODO allow to override ok = false; // TODO allow to override
} }
@ -666,7 +671,7 @@ VideoTimeLine::flush_cache () {
, video_server_url.c_str() , video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
); );
char *res=curl_http_get(url, NULL); char *res=a3_curl_http_get(url, NULL);
if (res) { if (res) {
free (res); free (res);
} }
@ -814,8 +819,8 @@ VideoTimeLine::terminated_video_monitor () {
vmonitor->save_session(); vmonitor->save_session();
delete vmonitor; delete vmonitor;
} }
GuiUpdate("set-xjadeo-active-off");
vmonitor=0; vmonitor=0;
GuiUpdate("set-xjadeo-active-off");
if (reopen_vmonitor) { if (reopen_vmonitor) {
reopen_vmonitor=false; reopen_vmonitor=false;
open_video_monitor(); open_video_monitor();

View file

@ -96,7 +96,7 @@ class VideoTimeLine : public sigc::trackable, public ARDOUR::SessionHandlePtr, p
float get_apv(); /* audio frames per video frame; */ float get_apv(); /* audio frames per video frame; */
ARDOUR::framecnt_t get_duration () { return video_duration;} ARDOUR::framecnt_t get_duration () { return video_duration;}
ARDOUR::frameoffset_t get_offset () { return video_offset;} ARDOUR::frameoffset_t get_offset () { return video_offset;}
ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return floor(offset/get_apv())*get_apv(); } ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return rint(offset/get_apv())*get_apv(); }
void set_offset (ARDOUR::frameoffset_t offset) { video_offset = quantify_frames_to_apv(offset); } // this function does not update video_offset_p, call save_undo() to finalize changes to this! - this fn is currently only used from editor_drag.cc void set_offset (ARDOUR::frameoffset_t offset) { video_offset = quantify_frames_to_apv(offset); } // this function does not update video_offset_p, call save_undo() to finalize changes to this! - this fn is currently only used from editor_drag.cc
protected: protected:

View file

@ -61,7 +61,7 @@ Amp::display_name() const
} }
bool bool
Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out) const Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;

View file

@ -40,7 +40,7 @@ public:
bool visible () const; bool visible () const;
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);

View file

@ -152,6 +152,7 @@ class AudioDiskstream : public Diskstream
friend class AudioTrack; friend class AudioTrack;
int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal); int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal);
frameoffset_t calculate_playback_distance (pframes_t nframes);
bool commit (framecnt_t); bool commit (framecnt_t);
private: private:

View file

@ -104,7 +104,7 @@ class AUPlugin : public ARDOUR::Plugin
bool has_editor () const; bool has_editor () const;
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
ChanCount output_streams() const; ChanCount output_streams() const;
ChanCount input_streams() const; ChanCount input_streams() const;
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);

View file

@ -38,7 +38,7 @@ class CapturingProcessor : public Processor
int set_block_size (pframes_t nframes); int set_block_size (pframes_t nframes);
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
virtual XMLNode& state (bool); virtual XMLNode& state (bool);
private: private:

View file

@ -67,7 +67,7 @@ public:
std::string display_name() const; std::string display_name() const;
Role role() const { return _role; } Role role() const { return _role; }
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);

View file

@ -193,6 +193,7 @@ class Diskstream : public SessionObject, public PublicDiskstream
friend class Track; friend class Track;
virtual int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal) = 0; virtual int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal) = 0;
virtual frameoffset_t calculate_playback_distance (pframes_t nframes) = 0;
virtual bool commit (framecnt_t) = 0; virtual bool commit (framecnt_t) = 0;
//private: //private:

View file

@ -39,7 +39,7 @@ class InternalReturn : public Return
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
bool configure_io (ChanCount, ChanCount); bool configure_io (ChanCount, ChanCount);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
void add_send (InternalSend *); void add_send (InternalSend *);
void remove_send (InternalSend *); void remove_send (InternalSend *);

View file

@ -42,7 +42,7 @@ class InternalSend : public Send
void cycle_start (pframes_t); void cycle_start (pframes_t);
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
bool feeds (boost::shared_ptr<Route> other) const; bool feeds (boost::shared_ptr<Route> other) const;
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
int set_block_size (pframes_t); int set_block_size (pframes_t);

View file

@ -56,7 +56,7 @@ public:
void reset (); void reset ();
void reset_max (); void reset_max ();
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
/* special method for meter, to ensure that it can always handle the maximum /* special method for meter, to ensure that it can always handle the maximum
@ -75,6 +75,9 @@ public:
/** Compute peaks */ /** Compute peaks */
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
void activate () { }
void deactivate () { }
ChanCount input_streams () const { return current_meters; } ChanCount input_streams () const { return current_meters; }
ChanCount output_streams () const { return current_meters; } ChanCount output_streams () const { return current_meters; }

View file

@ -125,6 +125,7 @@ class MidiDiskstream : public Diskstream
friend class MidiTrack; friend class MidiTrack;
int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_diskstream); int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_diskstream);
frameoffset_t calculate_playback_distance (pframes_t nframes);
bool commit (framecnt_t nframes); bool commit (framecnt_t nframes);
static framecnt_t midi_readahead; static framecnt_t midi_readahead;

View file

@ -118,7 +118,7 @@ public:
int set_state (const XMLNode&, int /* version */); int set_state (const XMLNode&, int /* version */);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
void set_cut_all (bool); void set_cut_all (bool);
void set_dim_all (bool); void set_dim_all (bool);

View file

@ -53,7 +53,7 @@ public:
std::string describe_parameter (Evoral::Parameter param); std::string describe_parameter (Evoral::Parameter param);
bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return true; }; bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return true; };
void configure_io (ChanCount in, ChanCount out); void configure_io (ChanCount in, ChanCount out);
/// The fundamental Panner function /// The fundamental Panner function

View file

@ -242,7 +242,7 @@ class Plugin : public PBD::StatefulDestructible, public Latent
/* specific types of plugins can overload this. As of September 2008, only /* specific types of plugins can overload this. As of September 2008, only
AUPlugin does this. AUPlugin does this.
*/ */
virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return false; } virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return false; }
virtual ChanCount output_streams() const; virtual ChanCount output_streams() const;
virtual ChanCount input_streams() const; virtual ChanCount input_streams() const;

View file

@ -69,7 +69,7 @@ class PluginInsert : public Processor
bool set_count (uint32_t num); bool set_count (uint32_t num);
uint32_t get_count () const { return _plugins.size(); } uint32_t get_count () const { return _plugins.size(); }
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
bool has_no_inputs() const; bool has_no_inputs() const;
@ -160,6 +160,8 @@ class PluginInsert : public Processor
BufferSet _signal_analysis_inputs; BufferSet _signal_analysis_inputs;
BufferSet _signal_analysis_outputs; BufferSet _signal_analysis_outputs;
ChanCount midi_bypass;
/** Description of how we can match our plugin's IO to our own insert IO */ /** Description of how we can match our plugin's IO to our own insert IO */
struct Match { struct Match {
Match () : method (Impossible), plugins (0) {} Match () : method (Impossible), plugins (0) {}
@ -170,7 +172,7 @@ class PluginInsert : public Processor
ChanCount hide; ///< number of channels to hide ChanCount hide; ///< number of channels to hide
}; };
Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const; Match private_can_support_io_configuration (ChanCount const &, ChanCount &);
/** details of the match currently being used */ /** details of the match currently being used */
Match _match; Match _match;

View file

@ -57,7 +57,7 @@ class PortInsert : public IOProcessor
bool set_name (const std::string& name); bool set_name (const std::string& name);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
void activate (); void activate ();

View file

@ -45,7 +45,8 @@ public:
*/ */
static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO); static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO); static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
static BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
static BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO); static BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
static gain_t* gain_automation_buffer (); static gain_t* gain_automation_buffer ();
static gain_t* send_gain_automation_buffer (); static gain_t* send_gain_automation_buffer ();

View file

@ -82,7 +82,7 @@ class Processor : public SessionObject, public Automatable, public Latent
/* Derived classes should override these, or processor appears as an in-place pass-through */ /* Derived classes should override these, or processor appears as an in-place pass-through */
virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const = 0; virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) = 0;
virtual ChanCount input_streams () const { return _configured_input; } virtual ChanCount input_streams () const { return _configured_input; }
virtual ChanCount output_streams() const { return _configured_output; } virtual ChanCount output_streams() const { return _configured_output; }

View file

@ -148,10 +148,13 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal
/* metering */ /* metering */
CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f)
CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f) CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 13.3f)
CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUfrench) CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUstandard)
CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18) CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18)
CONFIG_VARIABLE (MeterLineUp, meter_line_up_din, "meter-line-up-din", MeteringLineUp15)
CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f)
CONFIG_VARIABLE (bool, meter_style_led, "meter-style-led", true)
CONFIG_VARIABLE (bool, show_editor_meter, "show-editor-meter", true)
/* miscellany */ /* miscellany */

View file

@ -56,7 +56,7 @@ public:
uint32_t pans_required() const { return _configured_input.n_audio(); } uint32_t pans_required() const { return _configured_input.n_audio(); }
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
static uint32_t how_many_returns(); static uint32_t how_many_returns();

View file

@ -530,6 +530,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
void silence_unlocked (framecnt_t); void silence_unlocked (framecnt_t);
ChanCount processor_max_streams; ChanCount processor_max_streams;
ChanCount processor_out_streams;
uint32_t pans_required() const; uint32_t pans_required() const;
ChanCount n_process_buffers (); ChanCount n_process_buffers ();
@ -553,8 +554,10 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
void output_change_handler (IOChange, void *src); void output_change_handler (IOChange, void *src);
bool input_port_count_changing (ChanCount); bool input_port_count_changing (ChanCount);
bool output_port_count_changing (ChanCount);
bool _in_configure_processors; bool _in_configure_processors;
bool _initial_io_setup;
int configure_processors_unlocked (ProcessorStreams*); int configure_processors_unlocked (ProcessorStreams*);
std::list<std::pair<ChanCount, ChanCount> > try_configure_processors (ChanCount, ProcessorStreams *); std::list<std::pair<ChanCount, ChanCount> > try_configure_processors (ChanCount, ProcessorStreams *);

View file

@ -56,7 +56,7 @@ class Send : public Delivery
void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out); bool configure_io (ChanCount in, ChanCount out);
void activate (); void activate ();

View file

@ -200,7 +200,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void process (pframes_t nframes); void process (pframes_t nframes);
BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO); BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO); BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true );
BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO); BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
bool have_rec_enabled_track () const; bool have_rec_enabled_track () const;
@ -813,6 +814,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void send_mmc_locate (framepos_t); void send_mmc_locate (framepos_t);
int send_full_time_code (framepos_t); int send_full_time_code (framepos_t);
void send_song_position_pointer (framepos_t);
bool step_editing() const { return (_step_editors > 0); } bool step_editing() const { return (_step_editors > 0); }
@ -1209,6 +1211,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
double ltc_enc_cnt; double ltc_enc_cnt;
framepos_t ltc_enc_off; framepos_t ltc_enc_off;
bool restarting; bool restarting;
framepos_t ltc_prev_cycle;
framepos_t ltc_timecode_offset; framepos_t ltc_timecode_offset;
bool ltc_timecode_negative_offset; bool ltc_timecode_negative_offset;

View file

@ -64,3 +64,4 @@ CONFIG_VARIABLE (bool, show_rec_on_meterbridge, "show-rec-on-meterbridge", true)
CONFIG_VARIABLE (bool, show_mute_on_meterbridge, "show-mute-on-meterbridge", false) CONFIG_VARIABLE (bool, show_mute_on_meterbridge, "show-mute-on-meterbridge", false)
CONFIG_VARIABLE (bool, show_solo_on_meterbridge, "show-solo-on-meterbridge", false) CONFIG_VARIABLE (bool, show_solo_on_meterbridge, "show-solo-on-meterbridge", false)
CONFIG_VARIABLE (bool, show_name_on_meterbridge, "show-name-on-meterbridge", true) CONFIG_VARIABLE (bool, show_name_on_meterbridge, "show-name-on-meterbridge", true)
CONFIG_VARIABLE (uint32_t, meterbridge_label_height, "meterbridge-label-height", 0)

View file

@ -38,6 +38,7 @@ public:
BufferSet* silent_buffers; BufferSet* silent_buffers;
BufferSet* scratch_buffers; BufferSet* scratch_buffers;
BufferSet* route_buffers;
BufferSet* mix_buffers; BufferSet* mix_buffers;
gain_t* gain_automation_buffer; gain_t* gain_automation_buffer;
gain_t* send_gain_automation_buffer; gain_t* send_gain_automation_buffer;

View file

@ -19,6 +19,7 @@
*/ */
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <boost/scoped_ptr.hpp>
#include "pbd/signals.h" #include "pbd/signals.h"
@ -42,7 +43,7 @@ class MidiClockTicker : public SessionHandlePtr, boost::noncopyable
{ {
public: public:
MidiClockTicker (); MidiClockTicker ();
virtual ~MidiClockTicker() {}; virtual ~MidiClockTicker();
void tick (const framepos_t& transport_frames); void tick (const framepos_t& transport_frames);
@ -63,6 +64,9 @@ public:
/// slot for the signal session::TransportLooped /// slot for the signal session::TransportLooped
void transport_looped(); void transport_looped();
/// slot for the signal session::Located
void session_located();
/// pulses per quarter note (default 24) /// pulses per quarter note (default 24)
void set_ppqn(int ppqn) { _ppqn = ppqn; } void set_ppqn(int ppqn) { _ppqn = ppqn; }
@ -71,12 +75,16 @@ private:
int _ppqn; int _ppqn;
double _last_tick; double _last_tick;
class Position;
boost::scoped_ptr<Position> _pos;
double one_ppqn_in_frames (framepos_t transport_position); double one_ppqn_in_frames (framepos_t transport_position);
void send_midi_clock_event (pframes_t offset); void send_midi_clock_event (pframes_t offset);
void send_start_event (pframes_t offset); void send_start_event (pframes_t offset);
void send_continue_event (pframes_t offset); void send_continue_event (pframes_t offset);
void send_stop_event (pframes_t offset); void send_stop_event (pframes_t offset);
void send_position_event (uint32_t midi_clocks, pframes_t offset);
}; };
} }

View file

@ -384,9 +384,10 @@ namespace ARDOUR {
}; };
enum VUMeterStandard { enum VUMeterStandard {
MeteringVUfrench, // + 2 MeteringVUfrench, // 0VU = -2dBu
MeteringVUamerican, // +-0 MeteringVUamerican, // 0VU = 0dBu
MeteringVUstandard // -4 MeteringVUstandard, // 0VU = +4dBu
MeteringVUeight // 0VU = +8dBu
}; };
enum MeterLineUp { enum MeterLineUp {

View file

@ -49,7 +49,7 @@ public:
return false; return false;
} }
bool can_support_io_configuration (const ChanCount &, ChanCount &) const { bool can_support_io_configuration (const ChanCount &, ChanCount &) {
return false; return false;
} }

View file

@ -700,6 +700,31 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
return 0; return 0;
} }
frameoffset_t
AudioDiskstream::calculate_playback_distance (pframes_t nframes)
{
frameoffset_t playback_distance = nframes;
if (record_enabled()) {
playback_distance = nframes;
} else if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
interpolation.set_speed (_target_speed);
boost::shared_ptr<ChannelList> c = channels.reader();
int channel = 0;
for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
}
} else {
playback_distance = nframes;
}
if (_actual_speed < 0.0) {
return -playback_distance;
} else {
return playback_distance;
}
}
/** Update various things including playback_sample, read pointer on each channel's playback_buf /** Update various things including playback_sample, read pointer on each channel's playback_buf
* and write pointer on each channel's capture_buf. Also wout whether the butler is needed. * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
* @return true if the butler is required. * @return true if the butler is required.
@ -900,7 +925,7 @@ AudioDiskstream::internal_playback_seek (framecnt_t distance)
boost::shared_ptr<ChannelList> c = channels.reader(); boost::shared_ptr<ChannelList> c = channels.reader();
for (chan = c->begin(); chan != c->end(); ++chan) { for (chan = c->begin(); chan != c->end(); ++chan) {
(*chan)->playback_buf->increment_read_ptr (distance); (*chan)->playback_buf->increment_read_ptr (llabs(distance));
} }
if (first_recordable_frame < max_framepos) { if (first_recordable_frame < max_framepos) {

View file

@ -313,6 +313,12 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
if (!lm.locked()) { if (!lm.locked()) {
boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
if (can_internal_playback_seek(llabs(playback_distance))) {
/* TODO should declick */
internal_playback_seek(playback_distance);
}
return 0; return 0;
} }
@ -353,7 +359,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
_silent = false; _silent = false;
_amp->apply_gain_automation(false); _amp->apply_gain_automation(false);
BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers ()); BufferSet& bufs = _session.get_route_buffers (n_process_buffers ());
fill_buffers_with_input (bufs, _input, nframes); fill_buffers_with_input (bufs, _input, nframes);

View file

@ -998,7 +998,7 @@ AUPlugin::output_streams() const
} }
bool bool
AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) const AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
// Note: We never attempt to multiply-instantiate plugins to meet io configurations. // Note: We never attempt to multiply-instantiate plugins to meet io configurations.
@ -1824,7 +1824,6 @@ AUPlugin::do_save_preset (string preset_name)
CFPropertyListRef propertyList; CFPropertyListRef propertyList;
vector<Glib::ustring> v; vector<Glib::ustring> v;
Glib::ustring user_preset_path; Glib::ustring user_preset_path;
bool ret = true;
std::string m = maker(); std::string m = maker();
std::string n = name(); std::string n = name();
@ -1843,12 +1842,12 @@ AUPlugin::do_save_preset (string preset_name)
if (g_mkdir_with_parents (user_preset_path.c_str(), 0775) < 0) { if (g_mkdir_with_parents (user_preset_path.c_str(), 0775) < 0) {
error << string_compose (_("Cannot create user plugin presets folder (%1)"), user_preset_path) << endmsg; error << string_compose (_("Cannot create user plugin presets folder (%1)"), user_preset_path) << endmsg;
return false; return string();
} }
DEBUG_TRACE (DEBUG::AudioUnits, "get current preset\n"); DEBUG_TRACE (DEBUG::AudioUnits, "get current preset\n");
if (unit->GetAUPreset (propertyList) != noErr) { if (unit->GetAUPreset (propertyList) != noErr) {
return false; return string();
} }
// add the actual preset name */ // add the actual preset name */
@ -1863,7 +1862,7 @@ AUPlugin::do_save_preset (string preset_name)
if (save_property_list (propertyList, user_preset_path)) { if (save_property_list (propertyList, user_preset_path)) {
error << string_compose (_("Saving plugin state to %1 failed"), user_preset_path) << endmsg; error << string_compose (_("Saving plugin state to %1 failed"), user_preset_path) << endmsg;
ret = false; return string();
} }
CFRelease(propertyList); CFRelease(propertyList);

View file

@ -182,7 +182,7 @@ AudioSource::touch_peakfile ()
struct utimbuf tbuf; struct utimbuf tbuf;
tbuf.actime = statbuf.st_atime; tbuf.actime = statbuf.st_atime;
tbuf.modtime = time ((time_t) 0); tbuf.modtime = time ((time_t*) 0);
utime (peakpath.c_str(), &tbuf); utime (peakpath.c_str(), &tbuf);
} }

View file

@ -62,7 +62,7 @@ CapturingProcessor::configure_io (ChanCount in, ChanCount out)
} }
bool bool
CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;

View file

@ -124,7 +124,7 @@ Delivery::display_name () const
} }
bool bool
Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) const Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
if (_role == Main) { if (_role == Main) {

View file

@ -226,6 +226,7 @@ setup_enum_writer ()
REGISTER_ENUM (MeteringVUfrench); REGISTER_ENUM (MeteringVUfrench);
REGISTER_ENUM (MeteringVUamerican); REGISTER_ENUM (MeteringVUamerican);
REGISTER_ENUM (MeteringVUstandard); REGISTER_ENUM (MeteringVUstandard);
REGISTER_ENUM (MeteringVUeight);
REGISTER (_VUMeterStandard); REGISTER (_VUMeterStandard);
REGISTER_ENUM (MeteringLineUp24); REGISTER_ENUM (MeteringLineUp24);

View file

@ -80,7 +80,7 @@ InternalReturn::get_state()
} }
bool bool
InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) const InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;

View file

@ -284,7 +284,7 @@ InternalSend::connect_when_legal ()
} }
bool bool
InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) const InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;

View file

@ -49,45 +49,37 @@ void Kmeterdsp::process (float *p, int n)
// p : pointer to sample buffer // p : pointer to sample buffer
// n : number of samples to process // n : number of samples to process
float s, t, z1, z2; float s, z1, z2;
// Get filter state. // Get filter state.
z1 = _z1; z1 = _z1;
z2 = _z2; z2 = _z2;
// Process n samples. Find digital peak value for this // Perform filtering. The second filter is evaluated
// period and perform filtering. The second filter is // only every 4th sample - this is just an optimisation.
// evaluated only every 4th sample - this is just an
// optimisation.
t = 0;
n /= 4; // Loop is unrolled by 4. n /= 4; // Loop is unrolled by 4.
while (n--) while (n--)
{ {
s = *p++; s = *p++;
s *= s; s *= s;
if (t < s) t = s; // Update digital peak.
z1 += _omega * (s - z1); // Update first filter. z1 += _omega * (s - z1); // Update first filter.
s = *p++; s = *p++;
s *= s; s *= s;
if (t < s) t = s; // Update digital peak.
z1 += _omega * (s - z1); // Update first filter. z1 += _omega * (s - z1); // Update first filter.
s = *p++; s = *p++;
s *= s; s *= s;
if (t < s) t = s; // Update digital peak.
z1 += _omega * (s - z1); // Update first filter. z1 += _omega * (s - z1); // Update first filter.
s = *p++; s = *p++;
s *= s; s *= s;
if (t < s) t = s; // Update digital peak.
z1 += _omega * (s - z1); // Update first filter. z1 += _omega * (s - z1); // Update first filter.
z2 += 4 * _omega * (z1 - z2); // Update second filter. z2 += 4 * _omega * (z1 - z2); // Update second filter.
} }
t = sqrtf (t);
// Save filter state. The added constants avoid denormals. // Save filter state. The added constants avoid denormals.
_z1 = z1 + 1e-20f; _z1 = z1 + 1e-20f;
_z2 = z2 + 1e-20f; _z2 = z2 + 1e-20f;
s = sqrtf (2 * z2); s = sqrtf (2.0f * z2);
if (_flag) // Display thread has read the rms value. if (_flag) // Display thread has read the rms value.
{ {

View file

@ -562,7 +562,7 @@ LadspaPlugin::connect_and_run (BufferSet& bufs,
cycles_t then = get_cycles (); cycles_t then = get_cycles ();
BufferSet& silent_bufs = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1)); BufferSet& silent_bufs = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1));
BufferSet& scratch_bufs = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1)); BufferSet& scratch_bufs = _session.get_scratch_buffers(ChanCount(DataType::AUDIO, 1));
uint32_t audio_in_index = 0; uint32_t audio_in_index = 0;
uint32_t audio_out_index = 0; uint32_t audio_out_index = 0;

View file

@ -970,7 +970,7 @@ LV2Plugin::find_presets()
lilv_node_as_string(name)))); lilv_node_as_string(name))));
} else { } else {
warning << string_compose( warning << string_compose(
_("Plugin \"%1\% preset \"%2%\" is missing a label\n"), _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)), lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
lilv_node_as_string(preset)) << endmsg; lilv_node_as_string(preset)) << endmsg;
} }
@ -1651,7 +1651,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
} }
} else if (!valid) { } else if (!valid) {
// Nothing we understand or care about, connect to scratch // Nothing we understand or care about, connect to scratch
_ev_buffers[port_index] = silent_bufs.get_lv2_midi( _ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
(flags & PORT_INPUT), 0, (flags & PORT_EVENT)); (flags & PORT_INPUT), 0, (flags & PORT_EVENT));
} }
buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]); buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);

View file

@ -43,6 +43,8 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
Iec1ppmdsp::init(s.nominal_frame_rate()); Iec1ppmdsp::init(s.nominal_frame_rate());
Iec2ppmdsp::init(s.nominal_frame_rate()); Iec2ppmdsp::init(s.nominal_frame_rate());
Vumeterdsp::init(s.nominal_frame_rate()); Vumeterdsp::init(s.nominal_frame_rate());
_pending_active = true;
_meter_type = MeterPeak;
} }
PeakMeter::~PeakMeter () PeakMeter::~PeakMeter ()
@ -163,7 +165,7 @@ PeakMeter::reset_max ()
} }
bool bool
PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) const PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;
@ -186,20 +188,20 @@ PeakMeter::configure_io (ChanCount in, ChanCount out)
void void
PeakMeter::reflect_inputs (const ChanCount& in) PeakMeter::reflect_inputs (const ChanCount& in)
{ {
current_meters = in; for (uint32_t i = in.n_total(); i < current_meters.n_total(); ++i) {
if (i < _peak_signal.size()) {
const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); _peak_signal[i] = 0.0f;
const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi());
for (size_t n = 0; n < limit; ++n) {
if (n < n_midi) {
_visible_peak_power[n] = 0;
} else {
_visible_peak_power[n] = -INFINITY;
} }
} }
for (uint32_t i = in.n_audio(); i < current_meters.n_audio(); ++i) {
if (i >= _kmeter.size()) continue;
_kmeter[i]->reset();
_iec1meter[i]->reset();
_iec2meter[i]->reset();
_vumeter[i]->reset();
}
reset(); current_meters = in;
reset_max(); reset_max();
ConfigurationChanged (in, in); /* EMIT SIGNAL */ ConfigurationChanged (in, in); /* EMIT SIGNAL */
@ -268,7 +270,17 @@ PeakMeter::meter ()
return; return;
} }
assert(_visible_peak_power.size() == _peak_signal.size()); // TODO block this thread while PeakMeter::reset_max_channels() is
// reallocating channels.
// (may happen with Session > New: old session not yet closed,
// meter-thread still active while new one is initializing and
// maybe on other occasions, too)
if ( (_visible_peak_power.size() != _peak_signal.size())
|| (_max_peak_power.size() != _peak_signal.size())
|| (_max_peak_signal.size() != _peak_signal.size())
) {
return;
}
const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ());
const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi());
@ -325,6 +337,8 @@ PeakMeter::meter ()
} }
} }
#define CHECKSIZE(MTR) (n < MTR.size() + n_midi && n >= n_midi)
float float
PeakMeter::meter_level(uint32_t n, MeterType type) { PeakMeter::meter_level(uint32_t n, MeterType type) {
switch (type) { switch (type) {
@ -333,7 +347,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
case MeterK14: case MeterK14:
{ {
const uint32_t n_midi = current_meters.n_midi(); const uint32_t n_midi = current_meters.n_midi();
if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { if (CHECKSIZE(_kmeter)) {
return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read()); return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read());
} }
} }
@ -342,7 +356,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
case MeterIEC1NOR: case MeterIEC1NOR:
{ {
const uint32_t n_midi = current_meters.n_midi(); const uint32_t n_midi = current_meters.n_midi();
if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { if (CHECKSIZE(_iec1meter)) {
return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read()); return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read());
} }
} }
@ -351,7 +365,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
case MeterIEC2EBU: case MeterIEC2EBU:
{ {
const uint32_t n_midi = current_meters.n_midi(); const uint32_t n_midi = current_meters.n_midi();
if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { if (CHECKSIZE(_iec2meter)) {
return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read()); return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read());
} }
} }
@ -359,7 +373,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
case MeterVU: case MeterVU:
{ {
const uint32_t n_midi = current_meters.n_midi(); const uint32_t n_midi = current_meters.n_midi();
if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) { if (CHECKSIZE(_vumeter)) {
return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read()); return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read());
} }
} }

View file

@ -517,6 +517,20 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
return 0; return 0;
} }
frameoffset_t
MidiDiskstream::calculate_playback_distance (pframes_t nframes)
{
frameoffset_t playback_distance = nframes;
/* XXX: should be doing varispeed stuff once it's implemented in ::process() above */
if (_actual_speed < 0.0) {
return -playback_distance;
} else {
return playback_distance;
}
}
bool bool
MidiDiskstream::commit (framecnt_t playback_distance) MidiDiskstream::commit (framecnt_t playback_distance)
{ {

View file

@ -319,6 +319,12 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
{ {
Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
if (!lm.locked()) { if (!lm.locked()) {
boost::shared_ptr<MidiDiskstream> diskstream = midi_diskstream();
framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
if (can_internal_playback_seek(llabs(playback_distance))) {
/* TODO should declick, and/or note-off */
internal_playback_seek(playback_distance);
}
return 0; return 0;
} }
@ -353,7 +359,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
return dret; return dret;
} }
BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
fill_buffers_with_input (bufs, _input, nframes); fill_buffers_with_input (bufs, _input, nframes);

View file

@ -355,7 +355,7 @@ MonitorProcessor::configure_io (ChanCount in, ChanCount out)
} }
bool bool
MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;

View file

@ -250,7 +250,7 @@ Playlist::Playlist (boost::shared_ptr<const Playlist> other, framepos_t start, f
plist.add (Properties::layer, region->layer()); plist.add (Properties::layer, region->layer());
plist.add (Properties::layering_index, region->layering_index()); plist.add (Properties::layering_index, region->layering_index());
new_region = RegionFactory::RegionFactory::create (region, plist); new_region = RegionFactory::create (region, plist);
add_region_internal (new_region, position); add_region_internal (new_region, position);
} }
@ -284,7 +284,7 @@ Playlist::copy_regions (RegionList& newlist) const
RegionReadLock rlock (const_cast<Playlist *> (this)); RegionReadLock rlock (const_cast<Playlist *> (this));
for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) { for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
newlist.push_back (RegionFactory::RegionFactory::create (*i, true)); newlist.push_back (RegionFactory::create (*i, true));
} }
} }

View file

@ -145,7 +145,7 @@ PluginInsert::output_streams() const
ChanCount out = info->n_outputs; ChanCount out = info->n_outputs;
// DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size())); // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
out.set_audio (out.n_audio() * _plugins.size()); out.set_audio (out.n_audio() * _plugins.size());
out.set_midi (out.n_midi() * _plugins.size()); out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
return out; return out;
} }
} }
@ -448,7 +448,7 @@ PluginInsert::silence (framecnt_t nframes)
} }
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
(*i)->connect_and_run (_session.get_silent_buffers ((*i)->get_info()->n_inputs), in_map, out_map, nframes, 0); (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
} }
} }
@ -465,7 +465,6 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end
} }
} else { } else {
if (has_no_audio_inputs()) { if (has_no_audio_inputs()) {
/* silence all (audio) outputs. Should really declick /* silence all (audio) outputs. Should really declick
@ -704,7 +703,7 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
* @return true if the given IO configuration can be supported. * @return true if the given IO configuration can be supported.
*/ */
bool bool
PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
return private_can_support_io_configuration (in, out).method != Impossible; return private_can_support_io_configuration (in, out).method != Impossible;
} }
@ -714,9 +713,11 @@ PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
* it can be. * it can be.
*/ */
PluginInsert::Match PluginInsert::Match
PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
{ {
PluginInfoPtr info = _plugins.front()->get_info(); PluginInfoPtr info = _plugins.front()->get_info();
ChanCount in; in += inx;
midi_bypass.reset();
if (info->reconfigurable_io()) { if (info->reconfigurable_io()) {
/* Plugin has flexible I/O, so delegate to it */ /* Plugin has flexible I/O, so delegate to it */
@ -731,6 +732,15 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
ChanCount inputs = info->n_inputs; ChanCount inputs = info->n_inputs;
ChanCount outputs = info->n_outputs; ChanCount outputs = info->n_outputs;
if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
midi_bypass.set(DataType::MIDI, 1);
}
if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
in.set(DataType::MIDI, 0);
}
bool no_inputs = true; bool no_inputs = true;
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
if (inputs.get (*t) != 0) { if (inputs.get (*t) != 0) {
@ -741,13 +751,13 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
if (no_inputs) { if (no_inputs) {
/* no inputs so we can take any input configuration since we throw it away */ /* no inputs so we can take any input configuration since we throw it away */
out = outputs; out = outputs + midi_bypass;
return Match (NoInputs, 1); return Match (NoInputs, 1);
} }
/* Plugin inputs match requested inputs exactly */ /* Plugin inputs match requested inputs exactly */
if (inputs == in) { if (inputs == in) {
out = outputs; out = outputs + midi_bypass;
return Match (ExactMatch, 1); return Match (ExactMatch, 1);
} }
@ -789,6 +799,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
out.set (*t, outputs.get(*t) * f); out.set (*t, outputs.get(*t) * f);
} }
out += midi_bypass;
return Match (Replicate, f); return Match (Replicate, f);
} }
@ -812,7 +823,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
} }
if (can_split) { if (can_split) {
out = outputs; out = outputs + midi_bypass;
return Match (Split, 1); return Match (Split, 1);
} }
@ -836,10 +847,11 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
} }
if (could_hide && !cannot_hide) { if (could_hide && !cannot_hide) {
out = outputs; out = outputs + midi_bypass;
return Match (Hide, 1, hide_channels); return Match (Hide, 1, hide_channels);
} }
midi_bypass.reset();
return Match (Impossible, 0); return Match (Impossible, 0);
} }

View file

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-11 08:49-0400\n" "POT-Creation-Date: 2013-07-17 11:09+0200\n"
"PO-Revision-Date: 2013-02-05 19:52+0100\n" "PO-Revision-Date: 2013-07-23 15:04+0200\n"
"Last-Translator: Edgar Aichinger <edogawa@aon.at>\n" "Last-Translator: Edgar Aichinger <edogawa@aon.at>\n"
"Language-Team: German <ardour-dev@lists.ardour.org>\n" "Language-Team: German <ardour-dev@lists.ardour.org>\n"
"Language: de\n" "Language: de\n"
@ -218,7 +218,7 @@ msgstr ""
msgid "Connect session to engine" msgid "Connect session to engine"
msgstr "Verbinde Projekt mit Engine" msgstr "Verbinde Projekt mit Engine"
#: audioengine.cc:844 #: audioengine.cc:843
msgid "" msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus " "a port with the name \"%1\" already exists: check for duplicated track/bus "
"names" "names"
@ -226,7 +226,7 @@ msgstr ""
"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/" "Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
"Busnamen" "Busnamen"
#: audioengine.cc:846 session.cc:1698 #: audioengine.cc:845 session.cc:1698
msgid "" msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK " "No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks." "with more ports if you need this many tracks."
@ -234,35 +234,35 @@ msgstr ""
"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen " "Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
"Sie %1 stoppen und JACK mit mehr Ports neu starten." "Sie %1 stoppen und JACK mit mehr Ports neu starten."
#: audioengine.cc:849 #: audioengine.cc:848
msgid "AudioEngine: cannot register port \"%1\": %2" msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren" msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
#: audioengine.cc:879 #: audioengine.cc:878
msgid "unable to create port: %1" msgid "unable to create port: %1"
msgstr "kann Port: %1 nicht erzeugen" msgstr "kann Port: %1 nicht erzeugen"
#: audioengine.cc:933 #: audioengine.cc:932
msgid "connect called before engine was started" msgid "connect called before engine was started"
msgstr "Aufruf von connect vor dem Start der Engine" msgstr "Aufruf von connect vor dem Start der Engine"
#: audioengine.cc:959 #: audioengine.cc:958
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden" msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
#: audioengine.cc:974 audioengine.cc:1005 #: audioengine.cc:973 audioengine.cc:1004
msgid "disconnect called before engine was started" msgid "disconnect called before engine was started"
msgstr "Aufruf von disconnect vor dem Start der Engine" msgstr "Aufruf von disconnect vor dem Start der Engine"
#: audioengine.cc:1053 #: audioengine.cc:1052
msgid "get_port_by_name() called before engine was started" msgid "get_port_by_name() called before engine was started"
msgstr "Aufruf von get_port_by_name() vor dem Start der Engine" msgstr "Aufruf von get_port_by_name() vor dem Start der Engine"
#: audioengine.cc:1105 #: audioengine.cc:1104
msgid "get_ports called before engine was started" msgid "get_ports called before engine was started"
msgstr "Aufruf von get_ports vor dem Start der Engine" msgstr "Aufruf von get_ports vor dem Start der Engine"
#: audioengine.cc:1428 #: audioengine.cc:1427
msgid "failed to connect to JACK" msgid "failed to connect to JACK"
msgstr "Verbindung zu JACK fehlgeschlagen" msgstr "Verbindung zu JACK fehlgeschlagen"
@ -316,8 +316,8 @@ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)"
msgid "" msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr "" msgstr ""
"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen" "AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht "
"(%5)" "lesen(%5)"
#: audiosource.cc:667 #: audiosource.cc:667
msgid "%1: could not write read raw data for peak computation (%2)" msgid "%1: could not write read raw data for peak computation (%2)"
@ -971,21 +971,21 @@ msgstr "R"
msgid "%d" msgid "%d"
msgstr "%d" msgstr "%d"
#: ladspa_plugin.cc:87 #: ladspa_plugin.cc:88
msgid "LADSPA: module has no descriptor function." msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: Modul hat keine Beschreibungsfunktion" msgstr "LADSPA: Modul hat keine Beschreibungsfunktion"
#: ladspa_plugin.cc:92 #: ladspa_plugin.cc:93
msgid "LADSPA: plugin has gone away since discovery!" msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: Plugin ist nicht mehr auffindbar!" msgstr "LADSPA: Plugin ist nicht mehr auffindbar!"
#: ladspa_plugin.cc:99 #: ladspa_plugin.cc:100
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr "" msgstr ""
"LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing" "LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing"
"\" beherrscht" "\" beherrscht"
#: ladspa_plugin.cc:296 #: ladspa_plugin.cc:297
msgid "" msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change " "illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid" "in the plugin design, and presets may be invalid"
@ -993,35 +993,35 @@ msgstr ""
"Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-" "Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-"
"Design hindeuten, und Presets sind eventuell ungültig" "Design hindeuten, und Presets sind eventuell ungültig"
#: ladspa_plugin.cc:373 ladspa_plugin.cc:418 #: ladspa_plugin.cc:376 ladspa_plugin.cc:426
msgid "Bad node sent to LadspaPlugin::set_state" msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet" msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet"
#: ladspa_plugin.cc:386 ladspa_plugin.cc:431 #: ladspa_plugin.cc:391 ladspa_plugin.cc:440
msgid "LADSPA: no ladspa port number" msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: keine LADSPA-Portnummer" msgstr "LADSPA: keine LADSPA-Portnummer"
#: ladspa_plugin.cc:392 ladspa_plugin.cc:437 #: ladspa_plugin.cc:397 ladspa_plugin.cc:446
msgid "LADSPA: no ladspa port data" msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: keine LADSPA-Portdaten" msgstr "LADSPA: keine LADSPA-Portdaten"
#: ladspa_plugin.cc:707 #: ladspa_plugin.cc:717
msgid "LADSPA: cannot load module from \"%1\"" msgid "LADSPA: cannot load module from \"%1\""
msgstr "LADSPA: kann Modul nicht aus \"%1\" laden" msgstr "LADSPA: kann Modul nicht aus \"%1\" laden"
#: ladspa_plugin.cc:817 #: ladspa_plugin.cc:827
msgid "Could not locate HOME. Preset not removed." msgid "Could not locate HOME. Preset not removed."
msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt." msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt."
#: ladspa_plugin.cc:854 ladspa_plugin.cc:860 #: ladspa_plugin.cc:864 ladspa_plugin.cc:870
msgid "Could not create %1. Preset not saved. (%2)" msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)" msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)"
#: ladspa_plugin.cc:867 #: ladspa_plugin.cc:877
msgid "Error saving presets file %1." msgid "Error saving presets file %1."
msgstr "Fehler beim Sichern der Preset-Datei %1." msgstr "Fehler beim Sichern der Preset-Datei %1."
#: ladspa_plugin.cc:905 #: ladspa_plugin.cc:915
msgid "Could not locate HOME. Preset not saved." msgid "Could not locate HOME. Preset not saved."
msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert." msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert."
@ -1368,23 +1368,39 @@ msgstr ""
"Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts " "Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts "
"konstruieren!" "konstruieren!"
#: plugin.cc:324
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
"Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, "
"für die Vollversion zu bezahlen"
#: plugin.cc:398
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
"Das Speichern von Pluginpresets werden in diesem %1-Binärpaket nicht "
"unterstützt. Erwägen Sie, für die Vollversion zu bezahlen"
#: plugin_insert.cc:599 #: plugin_insert.cc:599
msgid "programming error: " msgid "programming error: "
msgstr "Programmierfehler:" msgstr "Programmierfehler:"
#: plugin_insert.cc:908 #: plugin_insert.cc:914
msgid "XML node describing plugin is missing the `type' field" msgid "XML node describing plugin is missing the `type' field"
msgstr "Dem XML-Knoten zur Beschreibung des Plugins fehlt das \"type\"-Feld" msgstr "Dem XML-Knoten zur Beschreibung des Plugins fehlt das \"type\"-Feld"
#: plugin_insert.cc:923 #: plugin_insert.cc:929
msgid "unknown plugin type %1 in plugin insert state" msgid "unknown plugin type %1 in plugin insert state"
msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins" msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins"
#: plugin_insert.cc:951 #: plugin_insert.cc:957
msgid "Plugin has no unique ID field" msgid "Plugin has no unique ID field"
msgstr "Das Plugin hat kein Feld für die eindeutige ID" msgstr "Das Plugin hat kein Feld für die eindeutige ID"
#: plugin_insert.cc:960 #: plugin_insert.cc:966
msgid "" msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n" "Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used." "Perhaps it was removed or moved since it was last used."
@ -1392,15 +1408,15 @@ msgstr ""
"Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n" "Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n"
"Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben." "Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben."
#: plugin_insert.cc:1076 #: plugin_insert.cc:1082
msgid "PluginInsert: Auto: no ladspa port number" msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert: Auto: keine LADSPA Portnummer" msgstr "PluginInsert: Auto: keine LADSPA Portnummer"
#: plugin_insert.cc:1083 #: plugin_insert.cc:1089
msgid "PluginInsert: Auto: port id out of range" msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung" msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung"
#: plugin_insert.cc:1119 #: plugin_insert.cc:1125
msgid "PluginInsert: automatable control %1 not found - ignored" msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr "" msgstr ""
"PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert" "PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert"
@ -1550,23 +1566,23 @@ msgstr "Import: Fehler in src_new() : %1"
msgid "return %1" msgid "return %1"
msgstr "Rückgabewert: %1" msgstr "Rückgabewert: %1"
#: route.cc:1100 route.cc:2550 #: route.cc:1101 route.cc:2557
msgid "unknown Processor type \"%1\"; ignored" msgid "unknown Processor type \"%1\"; ignored"
msgstr "unbekannter Prozessortyp \"%1\"; ignoriert" msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
#: route.cc:1112 #: route.cc:1113
msgid "processor could not be created. Ignored." msgid "processor could not be created. Ignored."
msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert." msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
#: route.cc:1983 route.cc:2203 #: route.cc:1986 route.cc:2210
msgid "Bad node sent to Route::set_state() [%1]" msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]" msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
#: route.cc:2042 #: route.cc:2045
msgid "Pannable state found for route (%1) without a panner!" msgid "Pannable state found for route (%1) without a panner!"
msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!" msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
#: route.cc:2106 route.cc:2110 route.cc:2317 route.cc:2321 #: route.cc:2113 route.cc:2117 route.cc:2324 route.cc:2328
msgid "badly formed order key string in state file! [%1] ... ignored." msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr "" msgstr ""
"schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in " "schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
@ -1857,18 +1873,17 @@ msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
msgid "Session: cannot create Playlist from XML description." msgid "Session: cannot create Playlist from XML description."
msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen" msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
#: session_process.cc:135 #: session_process.cc:133
msgid "Session: error in no roll for %1" msgid "Session: error in no roll for %1"
msgstr "Session: Fehler in no_roll für %1" msgstr "Session: Fehler in no_roll für %1"
#: session_process.cc:1160 #: session_process.cc:1158
msgid "Programming error: illegal event type in process_event (%1)" msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)" msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
#: session_state.cc:139 #: session_state.cc:139
#, fuzzy
msgid "Could not use path %1 (%2)" msgid "Could not use path %1 (%2)"
msgstr "Konnte Pfad %1 nicht benutzen (%s)" msgstr "Konnte Pfad %1 nicht benutzen (%2)"
#: session_state.cc:267 #: session_state.cc:267
msgid "solo cut control (dB)" msgid "solo cut control (dB)"
@ -2406,7 +2421,7 @@ msgstr ""
msgid "attempt to write a non-writable audio file source (%1)" msgid "attempt to write a non-writable audio file source (%1)"
msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)" msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)"
#: sndfilesource.cc:396 utils.cc:497 utils.cc:521 utils.cc:535 utils.cc:554 #: sndfilesource.cc:396 utils.cc:507 utils.cc:531 utils.cc:545 utils.cc:564
msgid "programming error: %1 %2" msgid "programming error: %1 %2"
msgstr "Programmierfehler: %1 %2" msgstr "Programmierfehler: %1 %2"
@ -2672,11 +2687,11 @@ msgstr "M-Clock"
msgid "LTC" msgid "LTC"
msgstr "LTC" msgstr "LTC"
#: utils.cc:589 #: utils.cc:599
msgid "programming error: unknown native header format: %1" msgid "programming error: unknown native header format: %1"
msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1" msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
#: utils.cc:604 #: utils.cc:614
msgid "cannot open directory %1 (%2)" msgid "cannot open directory %1 (%2)"
msgstr "kann Verzeichnis %1 nicht öffnen (%2)" msgstr "kann Verzeichnis %1 nicht öffnen (%2)"

View file

@ -266,7 +266,7 @@ PortInsert::configure_io (ChanCount in, ChanCount out)
} }
bool bool
PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in; out = in;
return true; return true;

View file

@ -90,7 +90,7 @@ ProcessThread::get_silent_buffers (ChanCount count)
} }
BufferSet& BufferSet&
ProcessThread::get_scratch_buffers (ChanCount count) ProcessThread::get_scratch_buffers (ChanCount count, bool silence)
{ {
ThreadBuffers* tb = _private_thread_buffers.get(); ThreadBuffers* tb = _private_thread_buffers.get();
assert (tb); assert (tb);
@ -105,6 +105,41 @@ ProcessThread::get_scratch_buffers (ChanCount count)
sb->set_count (sb->available()); sb->set_count (sb->available());
} }
if (silence) {
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
for (uint32_t i = 0; i < sb->count().get(*t); ++i) {
sb->get(*t, i).clear();
}
}
}
return *sb;
}
BufferSet&
ProcessThread::get_route_buffers (ChanCount count, bool silence)
{
ThreadBuffers* tb = _private_thread_buffers.get();
assert (tb);
BufferSet* sb = tb->route_buffers;
assert (sb);
if (count != ChanCount::ZERO) {
assert(sb->available() >= count);
sb->set_count (count);
} else {
sb->set_count (sb->available());
}
if (silence) {
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
for (uint32_t i = 0; i < sb->count().get(*t); ++i) {
sb->get(*t, i).clear();
}
}
}
return *sb; return *sb;
} }

View file

@ -136,7 +136,7 @@ Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pfra
} }
bool bool
Return::can_support_io_configuration (const ChanCount& in, ChanCount& out) const Return::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
out = in + _input->n_ports(); out = in + _input->n_ports();
return true; return true;

View file

@ -98,9 +98,13 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _default_type (default_type) , _default_type (default_type)
, _remote_control_id (0) , _remote_control_id (0)
, _in_configure_processors (false) , _in_configure_processors (false)
, _initial_io_setup (false)
, _custom_meter_position_noted (false) , _custom_meter_position_noted (false)
, _last_custom_meter_was_at_end (false) , _last_custom_meter_was_at_end (false)
{ {
if (is_master()) {
_meter_type = MeterK20;
}
processor_max_streams.reset(); processor_max_streams.reset();
} }
@ -133,6 +137,7 @@ Route::init ()
_input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1)); _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
_output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
_output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
/* add amp processor */ /* add amp processor */
@ -540,11 +545,10 @@ Route::process_output_buffers (BufferSet& bufs,
if (bufs.count() != (*i)->input_streams()) { if (bufs.count() != (*i)->input_streams()) {
DEBUG_TRACE ( DEBUG_TRACE (
DEBUG::Processors, string_compose ( DEBUG::Processors, string_compose (
"%1 bufs = %2 input for %3 = %4\n", "input port mismatch %1 bufs = %2 input for %3 = %4\n",
_name, bufs.count(), (*i)->name(), (*i)->input_streams() _name, bufs.count(), (*i)->name(), (*i)->input_streams()
) )
); );
continue;
} }
} }
#endif #endif
@ -568,7 +572,7 @@ void
Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick) Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
{ {
assert (is_monitor()); assert (is_monitor());
BufferSet& bufs (_session.get_scratch_buffers (n_process_buffers())); BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
passthru (bufs, start_frame, end_frame, nframes, declick); passthru (bufs, start_frame, end_frame, nframes, declick);
} }
@ -594,7 +598,7 @@ Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
void void
Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick) Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
{ {
BufferSet& bufs (_session.get_silent_buffers (n_process_buffers())); BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
bufs.set_count (_input->n_ports()); bufs.set_count (_input->n_ports());
write_out_of_band_data (bufs, start_frame, end_frame, nframes); write_out_of_band_data (bufs, start_frame, end_frame, nframes);
@ -1651,7 +1655,8 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) { if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n"); DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
break; DEBUG_TRACE (DEBUG::Processors, "}\n");
return list<pair<ChanCount, ChanCount> > ();
} }
if ((*p)->can_support_io_configuration(in, out)) { if ((*p)->can_support_io_configuration(in, out)) {
@ -1701,6 +1706,9 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
} }
ChanCount out; ChanCount out;
bool seen_mains_out = false;
processor_out_streams = _input->n_ports();
processor_max_streams.reset();
list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin(); list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) { for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
@ -1713,8 +1721,21 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
processor_max_streams = ChanCount::max(processor_max_streams, c->first); processor_max_streams = ChanCount::max(processor_max_streams, c->first);
processor_max_streams = ChanCount::max(processor_max_streams, c->second); processor_max_streams = ChanCount::max(processor_max_streams, c->second);
out = c->second; out = c->second;
if (boost::dynamic_pointer_cast<Delivery> (*p)
&& boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
/* main delivery will increase port count to match input.
* the Delivery::Main is usually the last processor - followed only by
* 'MeterOutput'.
*/
seen_mains_out = true;
}
if (!seen_mains_out) {
processor_out_streams = out;
}
} }
if (_meter) { if (_meter) {
_meter->reset_max_channels (processor_max_streams); _meter->reset_max_channels (processor_max_streams);
} }
@ -1992,6 +2013,7 @@ Route::set_state (const XMLNode& node, int version)
} }
set_id (node); set_id (node);
_initial_io_setup = true;
if ((prop = node.property (X_("flags"))) != 0) { if ((prop = node.property (X_("flags"))) != 0) {
_flags = Flag (string_2_enum (prop->value(), _flags)); _flags = Flag (string_2_enum (prop->value(), _flags));
@ -2059,6 +2081,8 @@ Route::set_state (const XMLNode& node, int version)
_meter_type = MeterType (string_2_enum (prop->value (), _meter_type)); _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
} }
_initial_io_setup = false;
set_processor_state (processor_state); set_processor_state (processor_state);
// this looks up the internal instrument in processors // this looks up the internal instrument in processors
@ -2939,6 +2963,9 @@ void
Route::output_change_handler (IOChange change, void * /*src*/) Route::output_change_handler (IOChange change, void * /*src*/)
{ {
bool need_to_queue_solo_change = true; bool need_to_queue_solo_change = true;
if (_initial_io_setup) {
return;
}
if ((change.type & IOChange::ConfigurationChanged)) { if ((change.type & IOChange::ConfigurationChanged)) {
/* This is called with the process lock held if change /* This is called with the process lock held if change
@ -3013,7 +3040,7 @@ Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
*/ */
} }
BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
fill_buffers_with_input (bufs, _input, nframes); fill_buffers_with_input (bufs, _input, nframes);
@ -3052,7 +3079,7 @@ Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, in
_silent = false; _silent = false;
BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
fill_buffers_with_input (bufs, _input, nframes); fill_buffers_with_input (bufs, _input, nframes);
@ -3152,9 +3179,6 @@ Route::set_meter_point (MeterPoint p, bool force)
*/ */
} }
_meter->reset();
_meter->reset_max();
meter_change (); /* EMIT SIGNAL */ meter_change (); /* EMIT SIGNAL */
bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user); bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
@ -3754,6 +3778,19 @@ Route::input_port_count_changing (ChanCount to)
return false; return false;
} }
/** Called when there is a proposed change to the output port count */
bool
Route::output_port_count_changing (ChanCount to)
{
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
if (processor_out_streams.get(*t) > to.get(*t)) {
return true;
}
}
/* The change is ok */
return false;
}
list<string> list<string>
Route::unknown_processors () const Route::unknown_processors () const
{ {

View file

@ -270,7 +270,7 @@ Send::set_state_2X (const XMLNode& node, int /* version */)
} }
bool bool
Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) const Send::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{ {
/* sends have no impact at all on the channel configuration of the /* sends have no impact at all on the channel configuration of the
streams passing through the route. so, out == in. streams passing through the route. so, out == in.

View file

@ -4170,11 +4170,18 @@ Session::get_silent_buffers (ChanCount count)
} }
BufferSet& BufferSet&
Session::get_scratch_buffers (ChanCount count) Session::get_scratch_buffers (ChanCount count, bool silence)
{ {
return ProcessThread::get_scratch_buffers (count); return ProcessThread::get_scratch_buffers (count, silence);
} }
BufferSet&
Session::get_route_buffers (ChanCount count, bool silence)
{
return ProcessThread::get_route_buffers (count, silence);
}
BufferSet& BufferSet&
Session::get_mix_buffers (ChanCount count) Session::get_mix_buffers (ChanCount count)
{ {

Some files were not shown because too many files have changed in this diff Show more