ardour/gtk2_ardour/strip_silence_dialog.h
Robin Gareus 39c2b544f0 Keep Dialogs which report process around.
Since 5.8-245-g3e43585fa, a response hides the dialog Window
in ArdourDialog::on_response (to prevent dialogs windows staying
around unresponsively while Ardour does background work).
This logic does not apply to Dialog Windows which implement
ProgressReporter or support dialog responses other than OK, Close.
2017-04-20 19:03:52 +02:00

102 lines
2.9 KiB
C++

/*
Copyright (C) 2009 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gtkmm/spinbutton.h>
#include <glibmm/threads.h>
#include "ardour/types.h"
#include "ardour_dialog.h"
#include "progress_reporter.h"
namespace ARDOUR {
class Session;
}
class AudioClock;
class RegionView;
/// Dialog box to set options for the `strip silence' filter
class StripSilenceDialog : public ArdourDialog, public ProgressReporter
{
public:
StripSilenceDialog (ARDOUR::Session*, std::list<RegionView*> const &);
~StripSilenceDialog ();
double threshold () const {
return _threshold.get_value ();
}
void drop_rects ();
void silences (ARDOUR::AudioIntervalMap&);
ARDOUR::framecnt_t minimum_length () const;
ARDOUR::framecnt_t fade_length () const;
void on_response (int response_id) {
Gtk::Dialog::on_response (response_id);
}
private:
void create_waves ();
void canvas_allocation (Gtk::Allocation &);
void update_silence_rects ();
void resize_silence_rects ();
void update ();
void update_threshold_line ();
void update_stats (ARDOUR::AudioIntervalResult const &);
void threshold_changed ();
void update_progress_gui (float);
void restart_thread ();
Gtk::SpinButton _threshold;
AudioClock* _minimum_length;
AudioClock* _fade_length;
Gtk::ProgressBar _progress_bar;
Gtk::Button* cancel_button;
Gtk::Button* apply_button;
struct ViewInterval {
RegionView* view;
ARDOUR::AudioIntervalResult intervals;
ViewInterval (RegionView* rv) : view (rv) {}
};
std::list<ViewInterval> views;
bool _destroying;
pthread_t _thread; ///< thread to compute silence in the background
static void * _detection_thread_work (void *);
void * detection_thread_work ();
Glib::Threads::Mutex _lock; ///< lock held while the thread is doing work
Glib::Threads::Cond _run_cond; ///< condition to wake the thread
bool _thread_should_finish; ///< true if the thread should terminate
PBD::Signal0<void> Completed; ///< emitted when a silence detection has completed
PBD::ScopedConnection _completed_connection;
ARDOUR::InterThreadInfo _interthread_info;
sigc::connection progress_idle_connection;
bool idle_update_progress(); ///< GUI-thread progress updates of background silence computation
int analysis_progress_cur;
int analysis_progress_max;
};