2 Copyright (C) 2001 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "pbd/memento_command.h"
21 #include "pbd/stateful_diff_command.h"
22 #include "pbd/pthread_utils.h"
24 #include "ardour/session.h"
25 #include "ardour/audioregion.h"
26 #include "ardour/playlist.h"
27 #include "ardour/utils.h"
28 #include "ardour/dB.h"
29 #include <gtkmm2ext/utils.h>
32 #include "audio_region_editor.h"
33 #include "audio_region_view.h"
34 #include "ardour_ui.h"
36 #include "gui_thread.h"
40 using namespace ARDOUR
;
43 using namespace Gtkmm2ext
;
46 _peak_amplitude_thread (void* arg
)
48 SessionEvent::create_per_thread_pool ("peak amplitude events", 64);
49 static_cast<AudioRegionEditor
*>(arg
)->peak_amplitude_thread ();
53 AudioRegionEditor::AudioRegionEditor (Session
* s
, boost::shared_ptr
<AudioRegion
> r
)
56 , gain_adjustment(accurate_coefficient_to_dB(_audio_region
->scale_amplitude()), -40.0, +40.0, 0.1, 1.0, 0)
57 , _peak_channel (false)
60 Gtk::HBox
* b
= Gtk::manage (new Gtk::HBox
);
62 b
->pack_start (gain_entry
);
63 b
->pack_start (*Gtk::manage (new Gtk::Label (_("dB"))), false, false);
65 gain_label
.set_name ("AudioRegionEditorLabel");
66 gain_label
.set_text (_("Region gain:"));
67 gain_label
.set_alignment (1, 0.5);
68 gain_entry
.configure (gain_adjustment
, 0.0, 1);
69 _table
.attach (gain_label
, 0, 1, _table_row
, _table_row
+ 1, Gtk::FILL
, Gtk::FILL
);
70 _table
.attach (*b
, 1, 2, _table_row
, _table_row
+ 1, Gtk::FILL
, Gtk::FILL
);
73 b
= Gtk::manage (new Gtk::HBox
);
75 b
->pack_start (_peak_amplitude
);
76 b
->pack_start (*Gtk::manage (new Gtk::Label (_("dBFS"))), false, false);
78 _peak_amplitude_label
.set_name ("AudioRegionEditorLabel");
79 _peak_amplitude_label
.set_text (_("Peak amplitude:"));
80 _peak_amplitude_label
.set_alignment (1, 0.5);
81 _table
.attach (_peak_amplitude_label
, 0, 1, _table_row
, _table_row
+ 1, Gtk::FILL
, Gtk::FILL
);
82 _table
.attach (*b
, 1, 2, _table_row
, _table_row
+ 1, Gtk::FILL
, Gtk::FILL
);
87 gain_adjustment
.signal_value_changed().connect (sigc::mem_fun (*this, &AudioRegionEditor::gain_adjustment_changed
));
89 _peak_amplitude
.property_editable() = false;
90 _peak_amplitude
.set_text (_("Calculating..."));
92 PeakAmplitudeFound
.connect (_peak_amplitude_connection
, invalidator (*this), boost::bind (&AudioRegionEditor::peak_amplitude_found
, this, _1
), gui_context ());
93 pthread_create_and_store (X_("peak-amplitude"), &_peak_amplitude_thread_handle
, _peak_amplitude_thread
, this);
94 _peak_channel
.deliver ('c');
97 AudioRegionEditor::~AudioRegionEditor ()
99 pthread_cancel_one (_peak_amplitude_thread_handle
);
101 int const r
= pthread_join (_peak_amplitude_thread_handle
, &v
);
106 AudioRegionEditor::region_changed (const PBD::PropertyChange
& what_changed
)
108 RegionEditor::region_changed (what_changed
);
110 if (what_changed
.contains (ARDOUR::Properties::scale_amplitude
)) {
114 if (what_changed
.contains (ARDOUR::Properties::start
) || what_changed
.contains (ARDOUR::Properties::length
)) {
115 /* ask the peak thread to run again */
116 _peak_channel
.deliver ('c');
120 AudioRegionEditor::gain_changed ()
122 float const region_gain_dB
= accurate_coefficient_to_dB (_audio_region
->scale_amplitude());
123 if (region_gain_dB
!= gain_adjustment
.get_value()) {
124 gain_adjustment
.set_value(region_gain_dB
);
129 AudioRegionEditor::gain_adjustment_changed ()
131 float const gain
= dB_to_coefficient (gain_adjustment
.get_value());
132 if (_audio_region
->scale_amplitude() != gain
) {
133 _audio_region
->set_scale_amplitude (gain
);
138 AudioRegionEditor::peak_amplitude_thread ()
141 /* await instructions to run */
143 _peak_channel
.receive (msg
);
145 /* compute peak amplitude and signal the fact */
146 PeakAmplitudeFound (accurate_coefficient_to_dB (_audio_region
->maximum_amplitude ())); /* EMIT SIGNAL */
151 AudioRegionEditor::peak_amplitude_found (double p
)
155 s
.setf (ios::fixed
, ios::floatfield
);
157 _peak_amplitude
.set_text (s
.str ());