diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc index 1823ab1303..2fb5ac5697 100644 --- a/gtk2_ardour/audio_region_editor.cc +++ b/gtk2_ardour/audio_region_editor.cc @@ -17,8 +17,11 @@ */ +#include + #include "pbd/memento_command.h" #include "pbd/stateful_diff_command.h" +#include "pbd/pthread_utils.h" #include "ardour/session.h" #include "ardour/audioregion.h" @@ -41,28 +44,63 @@ using namespace PBD; using namespace std; using namespace Gtkmm2ext; +static void * +_peak_amplitude_thread (void* arg) +{ + SessionEvent::create_per_thread_pool ("peak amplitude events", 64); + static_cast(arg)->peak_amplitude_thread (); + return 0; +} + AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr r) : RegionEditor (s, r) , _audio_region (r) , gain_adjustment(accurate_coefficient_to_dB(_audio_region->scale_amplitude()), -40.0, +40.0, 0.1, 1.0, 0) - + , _peak_amplitude_found (false) { - gain_label.set_alignment (1, 0.5); - Gtk::HBox* gb = Gtk::manage (new Gtk::HBox); - gb->set_spacing (6); - gb->pack_start (gain_entry); - gb->pack_start (*Gtk::manage (new Gtk::Label (_("dB"))), false, false); + Gtk::HBox* b = Gtk::manage (new Gtk::HBox); + b->set_spacing (6); + b->pack_start (gain_entry); + b->pack_start (*Gtk::manage (new Gtk::Label (_("dB"))), false, false); gain_label.set_name ("AudioRegionEditorLabel"); gain_label.set_text (_("Region gain:")); + gain_label.set_alignment (1, 0.5); gain_entry.configure (gain_adjustment, 0.0, 1); _table.attach (gain_label, 0, 1, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); - _table.attach (*gb, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); + _table.attach (*b, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); + ++_table_row; + b = Gtk::manage (new Gtk::HBox); + b->set_spacing (6); + b->pack_start (_peak_amplitude); + b->pack_start (*Gtk::manage (new Gtk::Label (_("dBFS"))), false, false); + + _peak_amplitude_label.set_name ("AudioRegionEditorLabel"); + _peak_amplitude_label.set_text (_("Peak amplitude:")); + _peak_amplitude_label.set_alignment (1, 0.5); + _table.attach (_peak_amplitude_label, 0, 1, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); + _table.attach (*b, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); + ++_table_row; + gain_changed (); gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &AudioRegionEditor::gain_adjustment_changed)); + + _peak_amplitude.property_editable() = false; + _peak_amplitude.set_text (_("Calculating...")); + + PeakAmplitudeFound.connect (_peak_amplitude_connection, invalidator (*this), boost::bind (&AudioRegionEditor::peak_amplitude_found, this, _1), gui_context ()); + pthread_create_and_store (X_("peak-amplitude"), &_peak_amplitude_thread_handle, _peak_amplitude_thread, this); +} + +AudioRegionEditor::~AudioRegionEditor () +{ + pthread_cancel_one (_peak_amplitude_thread_handle); + void* v; + int const r = pthread_join (_peak_amplitude_thread_handle, &v); + assert (r == 0); } void @@ -91,3 +129,16 @@ AudioRegionEditor::gain_adjustment_changed () _audio_region->set_scale_amplitude (gain); } } + +void +AudioRegionEditor::peak_amplitude_thread () +{ + PeakAmplitudeFound (accurate_coefficient_to_dB (_audio_region->maximum_amplitude ())); /* EMIT SIGNAL */ +} + +void +AudioRegionEditor::peak_amplitude_found (double p) +{ + _peak_amplitude.set_text (boost::lexical_cast (p)); +} + diff --git a/gtk2_ardour/audio_region_editor.h b/gtk2_ardour/audio_region_editor.h index ee7d6bd54a..f3accaf115 100644 --- a/gtk2_ardour/audio_region_editor.h +++ b/gtk2_ardour/audio_region_editor.h @@ -53,7 +53,10 @@ class AudioRegionEditor : public RegionEditor { public: AudioRegionEditor (ARDOUR::Session*, boost::shared_ptr); + ~AudioRegionEditor (); + void peak_amplitude_thread (); + private: void region_changed (PBD::PropertyChange const &); @@ -66,6 +69,15 @@ class AudioRegionEditor : public RegionEditor Gtk::Label gain_label; Gtk::Adjustment gain_adjustment; Gtk::SpinButton gain_entry; + + Gtk::Label _peak_amplitude_label; + Gtk::Entry _peak_amplitude; + + bool _peak_amplitude_found; + pthread_t _peak_amplitude_thread_handle; + void peak_amplitude_found (double); + PBD::Signal1 PeakAmplitudeFound; + PBD::ScopedConnection _peak_amplitude_connection; }; #endif /* __gtk_ardour_audio_region_edit_h__ */ diff --git a/gtk2_ardour/region_editor.cc b/gtk2_ardour/region_editor.cc index 0d3f89dfad..708c789dd0 100755 --- a/gtk2_ardour/region_editor.cc +++ b/gtk2_ardour/region_editor.cc @@ -44,7 +44,7 @@ using namespace Gtkmm2ext; RegionEditor::RegionEditor (Session* s, boost::shared_ptr r) : ArdourDialog (_("Region")), - _table (8, 2), + _table (9, 2), _table_row (0), _region (r), name_label (_("Name:")), @@ -88,7 +88,12 @@ RegionEditor::RegionEditor (Session* s, boost::shared_ptr r) start_label.set_name ("RegionEditorLabel"); start_label.set_text (_("File start:")); _sources_label.set_name ("RegionEditorLabel"); - _sources_label.set_text (_("Sources:")); + + if (region->n_channels() > 1) { + _sources_label.set_text (_("Sources:")); + } else { + _sources_label.set_text (_("Source:")); + } _table.set_col_spacings (12); _table.set_row_spacings (6); @@ -139,7 +144,7 @@ RegionEditor::RegionEditor (Session* s, boost::shared_ptr r) _table.attach (_sources_label, 0, 1, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); _table.attach (_sources, 1, 2, _table_row, _table_row + 1, Gtk::FILL, Gtk::FILL); ++_table_row; - + get_vbox()->pack_start (_table, true, true); add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_ACCEPT); diff --git a/gtk2_ardour/region_editor.h b/gtk2_ardour/region_editor.h index df9df33fc8..66f0f6226d 100644 --- a/gtk2_ardour/region_editor.h +++ b/gtk2_ardour/region_editor.h @@ -52,6 +52,7 @@ class RegionEditor : public ArdourDialog { public: RegionEditor (ARDOUR::Session*, boost::shared_ptr); + virtual ~RegionEditor () {} protected: virtual void region_changed (const PBD::PropertyChange&); diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index 302d1d1698..902e7eb934 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -83,7 +83,7 @@ class AudioRegion : public Region gain_t scale_amplitude() const { return _scale_amplitude; } void normalize (float, float target_in_dB = 0.0f); - double maximum_amplitude (Progress *) const; + double maximum_amplitude (Progress* p = 0) const; bool envelope_active () const { return _envelope_active; } bool fade_in_active () const { return _fade_in_active; } diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index be3b80de87..9d94651eb0 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -1174,9 +1174,11 @@ AudioRegion::maximum_amplitude (Progress* p) const } fpos += to_read; - p->set_progress (float (fpos - _start) / _length); - if (p->cancelled ()) { - return -1; + if (p) { + p->set_progress (float (fpos - _start) / _length); + if (p->cancelled ()) { + return -1; + } } }