move display of silence for strip-silence into regionviews, along with text to describe impact on the region. this doesn't actually make strip-silence work any better, but the display is improving

git-svn-id: svn://localhost/ardour2/branches/3.0@8224 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-12-08 21:02:37 +00:00
parent 32ac2049fe
commit f176612086
10 changed files with 215 additions and 195 deletions

View File

@ -93,6 +93,8 @@
<Option name="recorded waveform fill" value="ffffffff"/>
<Option name="recorded waveform outline" value="0f0f1fff"/>
<Option name="rubber band rect" value="c6c6c659"/>
<Option name="silence" value="9efffd7a"/>
<Option name="silence text" value="0e066cff"/>
<Option name="selected crossfade editor line" value="00dbdbff"/>
<Option name="selected crossfade editor wave" value="f9ea14a0"/>
<Option name="selected region base" value="51518aa0"/>

View File

@ -94,6 +94,8 @@ CANVAS_VARIABLE(canvasvar_SelectedWaveFormFill, "selected waveform fill")
CANVAS_VARIABLE(canvasvar_SelectedWaveForm, "selected waveform outline")
CANVAS_VARIABLE(canvasvar_SelectionRect, "selection rect")
CANVAS_VARIABLE(canvasvar_Selection, "selection")
CANVAS_VARIABLE(canvasvar_Silence, "silence")
CANVAS_VARIABLE(canvasvar_SilenceText, "silence text")
CANVAS_VARIABLE(canvasvar_StereoPannerOutline, "stereo panner outline")
CANVAS_VARIABLE(canvasvar_StereoPannerFill, "stereo panner fill")
CANVAS_VARIABLE(canvasvar_StereoPannerText, "stereo panner text")

View File

@ -4544,16 +4544,16 @@ Editor::strip_region_silence ()
return;
}
std::list<boost::shared_ptr<AudioRegion> > ar;
std::list<RegionView*> audio_only;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (*i);
if (arv) {
ar.push_back (arv->audio_region ());
audio_only.push_back (arv);
}
}
StripSilenceDialog d (_session, ar);
StripSilenceDialog d (_session, audio_only);
int const r = d.run ();
if (r == Gtk::RESPONSE_OK) {

View File

@ -34,6 +34,7 @@
#include "ardour_ui.h"
#include "global_signals.h"
#include "canvas-noevent-text.h"
#include "streamview.h"
#include "region_view.h"
#include "automation_region_view.h"
@ -45,6 +46,7 @@
#include "region_editor.h"
#include "ghostregion.h"
#include "route_time_axis.h"
#include "ui_config.h"
#include "utils.h"
#include "rgb_macros.h"
#include "gui_thread.h"
@ -55,6 +57,7 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
using namespace Editing;
using namespace Gtk;
using namespace ArdourCanvas;
static const int32_t sync_mark_width = 9;
@ -80,6 +83,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent,
, _pixel_width(1.0)
, in_destructor(false)
, wait_for_data(false)
, _silence_text (0)
, _time_converter(r->session().tempo_map(), r->position())
{
GhostRegion::CatchDeletion.connect (*this, invalidator (*this), ui_bind (&RegionView::remove_ghost, this, _1), gui_context());
@ -88,6 +92,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent,
RegionView::RegionView (const RegionView& other)
: sigc::trackable(other)
, TimeAxisViewItem (other)
, _silence_text (0)
, _time_converter(other._time_converter)
{
/* derived concrete type will call init () */
@ -103,6 +108,7 @@ RegionView::RegionView (const RegionView& other)
RegionView::RegionView (const RegionView& other, boost::shared_ptr<Region> other_region)
: sigc::trackable(other)
, TimeAxisViewItem (other)
, _silence_text (0)
, _time_converter(other._time_converter)
{
/* this is a pseudo-copy constructor used when dragging regions
@ -137,6 +143,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent,
, _pixel_width(1.0)
, in_destructor(false)
, wait_for_data(false)
, _silence_text (0)
, _time_converter(r->session().tempo_map(), r->position())
{
}
@ -208,9 +215,102 @@ RegionView::~RegionView ()
delete *i;
}
drop_silent_frames ();
delete editor;
}
void
RegionView::set_silent_frames (const AudioIntervalResult& silences)
{
framecnt_t shortest = max_framecnt;
/* remove old silent frames */
drop_silent_frames ();
if (!silences.empty()) {
uint32_t const color = ARDOUR_UI::config()->canvasvar_Silence.get();
for (AudioIntervalResult::const_iterator i = silences.begin(); i != silences.end(); ++i) {
ArdourCanvas::SimpleRect* cr = new ArdourCanvas::SimpleRect (*group);
_silent_frames.push_back (cr);
cr->property_x1() = trackview.editor().frame_to_pixel ((*i).first);
cr->property_y1() = 1;
cr->property_y2() = _height - 2;
cr->property_outline_pixels() = 0;
cr->property_fill_color_rgba () = color;
cr->property_x2() = trackview.editor().frame_to_pixel ((*i).first + (*i).second);
if ((*i).second < shortest) {
shortest= (*i).second;
}
}
_silence_text = new ArdourCanvas::NoEventText (*group);
_silence_text->property_font_desc() = *(get_font_for_style (N_("VerboseCanvasCusor")));
_silence_text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SilenceText.get();
_silence_text->property_anchor() = ANCHOR_NW;
/* both positions are relative to the RV start */
_silence_text->property_x() = trackview.editor().frame_to_pixel (silences.front().first) + 10.0;
_silence_text->property_y() = 20.0;
double ms;
char const * sunits;
ms = (float) shortest/_region->session().frame_rate();
/* ms are now in seconds */
if (ms >= 60.0) {
sunits = _("minutes");
ms /= 60.0;
} else if (ms < 1.0) {
sunits = _("msecs");
ms *= 1000.0;
} else {
sunits = _("secs");
}
_silence_text->property_text() = string_compose (_("%1 silent segments, shortest = %2 %3"),
silences.size(), ms, sunits).c_str();
}
}
void
RegionView::hide_silent_frames ()
{
for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin (); i != _silent_frames.end (); ++i) {
(*i)->hide ();
}
_silence_text->hide();
}
void
RegionView::drop_silent_frames ()
{
for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin (); i != _silent_frames.end (); ++i) {
delete *i;
}
_silent_frames.clear ();
delete _silence_text;
_silence_text = 0;
}
void
RegionView::show_silent_frames ()
{
for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin (); i != _silent_frames.end (); ++i) {
(*i)->show ();
}
_silence_text->show ();
}
gint
RegionView::_lock_toggle (ArdourCanvas::Item*, GdkEvent* ev, void* arg)
{
@ -607,6 +707,11 @@ RegionView::set_height (double h)
for (list<ArdourCanvas::SimpleRect*>::iterator i = _coverage_frames.begin(); i != _coverage_frames.end(); ++i) {
(*i)->property_y2() = h + 1;
}
for (list<ArdourCanvas::SimpleRect*>::iterator i = _silent_frames.begin(); i != _silent_frames.end(); ++i) {
(*i)->property_y2() = h + 1;
}
}
/** Remove old coverage frames and make new ones, if we're in a LayerDisplay mode

View File

@ -38,6 +38,10 @@ class GhostRegion;
class AutomationTimeAxisView;
class AutomationRegionView;
namespace Gnome { namespace Canvas {
class NoEventText;
} }
class RegionView : public TimeAxisViewItem
{
public:
@ -108,6 +112,11 @@ class RegionView : public TimeAxisViewItem
void trim_contents (framepos_t, bool, bool);
virtual void thaw_after_trim ();
void set_silent_frames (const ARDOUR::AudioIntervalResult&);
void drop_silent_frames ();
void hide_silent_frames ();
void show_silent_frames ();
protected:
/** Allows derived types to specify their visibility requirements
@ -164,6 +173,15 @@ class RegionView : public TimeAxisViewItem
*/
std::list<ArdourCanvas::SimpleRect*> _coverage_frames;
/** a list of rectangles which are used in stacked display mode to colour
different bits of regions according to whether or not they are the one
that will be played at any given time.
*/
std::list<ArdourCanvas::SimpleRect*> _silent_frames;
/** a text item to display strip silence statistics
*/
ArdourCanvas::NoEventText* _silence_text;
ARDOUR::BeatsFramesConverter _time_converter;
};

View File

@ -32,6 +32,7 @@
#include "gui_thread.h"
#include "strip_silence_dialog.h"
#include "canvas_impl.h"
#include "region_view.h"
#include "simpleline.h"
#include "waveview.h"
#include "simplerect.h"
@ -44,18 +45,20 @@ using namespace std;
using namespace ArdourCanvas;
/** Construct Strip silence dialog box */
StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOUR::AudioRegion> > const & regions)
StripSilenceDialog::StripSilenceDialog (Session* s, list<RegionView*> const & v)
: ArdourDialog (_("Strip Silence"))
, ProgressReporter ()
, _minimum_length (X_("silence duration"), true, "SilenceDurationClock", true, false, true, false)
, _fade_length (X_("silence duration"), true, "SilenceDurationClock", true, false, true, false)
, _wave_width (640)
, _wave_height (64)
, _peaks_ready_connection (0)
, _destroying (false)
{
set_session (s);
for (list<RegionView*>::const_iterator r = v.begin(); r != v.end(); ++r) {
views.push_back (ViewInterval (*r));
}
Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox);
Gtk::Table* table = Gtk::manage (new Gtk::Table (3, 3));
@ -121,17 +124,6 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOU
add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_OK);
_canvas = new CanvasAA ();
_canvas->signal_size_allocate().connect (sigc::mem_fun (*this, &StripSilenceDialog::canvas_allocation));
_canvas->set_size_request (_wave_width, _wave_height * regions.size());
for (list<boost::shared_ptr<ARDOUR::AudioRegion> >::const_iterator i = regions.begin(); i != regions.end(); ++i) {
Wave* w = new Wave (_canvas->root(), *i);
_waves.push_back (w);
}
get_vbox()->pack_start (*_canvas, true, true);
get_vbox()->pack_start (_progress_bar, true, true);
show_all ();
@ -139,7 +131,6 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<boost::shared_ptr<ARDOU
_threshold.get_adjustment()->signal_value_changed().connect (sigc::mem_fun (*this, &StripSilenceDialog::threshold_changed));
_minimum_length.ValueChanged.connect (sigc::mem_fun (*this, &StripSilenceDialog::restart_thread));
create_waves ();
update_silence_rects ();
update_threshold_line ();
@ -164,110 +155,17 @@ StripSilenceDialog::~StripSilenceDialog ()
_run_cond.signal ();
pthread_join (_thread, 0);
for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) {
delete *i;
}
_waves.clear ();
delete _peaks_ready_connection;
delete _canvas;
}
void
StripSilenceDialog::create_waves ()
{
int n = 0;
delete _peaks_ready_connection;
_peaks_ready_connection = 0;
for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) {
if ((*i)->region->audio_source(0)->peaks_ready (boost::bind (&StripSilenceDialog::peaks_ready, this), &_peaks_ready_connection, gui_context())) {
(*i)->view = new WaveView (*(_canvas->root()));
(*i)->view->property_data_src() = static_cast<gpointer>((*i)->region.get());
(*i)->view->property_cache() = WaveView::create_cache ();
(*i)->view->property_cache_updater() = true;
(*i)->view->property_channel() = 0;
(*i)->view->property_length_function() = (void *) region_length_from_c;
(*i)->view->property_sourcefile_length_function() = (void *) sourcefile_length_from_c;
(*i)->view->property_peak_function() = (void *) region_read_peaks_from_c;
(*i)->view->property_x() = 0;
(*i)->view->property_y() = n * _wave_height;
(*i)->view->property_height() = _wave_height;
(*i)->view->property_samples_per_unit() = (*i)->samples_per_unit;
(*i)->view->property_region_start() = (*i)->region->start();
(*i)->view->property_wave_color() = ARDOUR_UI::config()->canvasvar_WaveForm.get();
(*i)->view->property_fill_color() = ARDOUR_UI::config()->canvasvar_WaveFormFill.get();
(*i)->view->property_logscaled() = true;
(*i)->view->property_rectified() = true;
}
++n;
}
}
void
StripSilenceDialog::peaks_ready ()
{
delete _peaks_ready_connection;
_peaks_ready_connection = 0;
create_waves ();
}
void
StripSilenceDialog::canvas_allocation (Gtk::Allocation& alloc)
{
int n = 0;
_canvas->set_scroll_region (0.0, 0.0, alloc.get_width(), alloc.get_height());
_wave_width = alloc.get_width ();
_wave_height = alloc.get_height ();
for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i, ++n) {
(*i)->samples_per_unit = ((double) (*i)->region->length() / _wave_width);
if ((*i)->view) {
(*i)->view->property_y() = n * _wave_height;
(*i)->view->property_samples_per_unit() = (*i)->samples_per_unit;
(*i)->view->property_height() = _wave_height;
}
}
resize_silence_rects ();
update_threshold_line ();
}
void
StripSilenceDialog::resize_silence_rects ()
{
int n = 0;
/* Lock so that we don't contend with the detection thread for access to the silence regions */
Glib::Mutex::Lock lm (_lock);
for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) {
list<pair<frameoffset_t, framecnt_t> >::const_iterator j;
list<SimpleRect*>::iterator r;
for (j = (*i)->silence.begin(), r = (*i)->silence_rects.begin();
j != (*i)->silence.end() && r != (*i)->silence_rects.end(); ++j, ++r) {
(*r)->property_x1() = j->first / (*i)->samples_per_unit;
(*r)->property_x2() = j->second / (*i)->samples_per_unit;
(*r)->property_y1() = n * _wave_height;
(*r)->property_y2() = (n + 1) * _wave_height;
(*r)->property_outline_pixels() = 0;
(*r)->property_fill_color_rgba() = RGBA_TO_UINT (128, 128, 128, 128);
}
++n;
for (list<ViewInterval>::iterator v = views.begin(); v != views.end(); ++v) {
(*v).view->drop_silent_frames ();
}
delete _peaks_ready_connection;
}
void
StripSilenceDialog::update_threshold_line ()
{
#if 0
int n = 0;
/* Don't need to lock here as we're not reading the _waves silence details */
@ -283,52 +181,37 @@ StripSilenceDialog::update_threshold_line ()
}
++n;
#endif
}
void
StripSilenceDialog::update ()
{
update_silence_rects ();
cerr << "UPDATE!\n";
update_threshold_line ();
/* XXX: first one only?! */
update_stats (_waves.front()->silence);
// update_stats (_waves.front()->silence);
update_silence_rects ();
cerr << "UPDATE done\n";
}
void
StripSilenceDialog::update_silence_rects ()
{
int n = 0;
uint32_t max_segments = 0;
uint32_t sc;
/* Lock so that we don't contend with the detection thread for access to the silence regions */
Glib::Mutex::Lock lm (_lock);
for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) {
for (list<SimpleRect*>::iterator j = (*i)->silence_rects.begin(); j != (*i)->silence_rects.end(); ++j) {
delete *j;
}
(*i)->silence_rects.clear ();
sc = 0;
for (list<pair<frameoffset_t, framecnt_t> >::const_iterator j = (*i)->silence.begin(); j != (*i)->silence.end(); ++j) {
SimpleRect* r = new SimpleRect (*(_canvas->root()));
r->property_x1() = j->first / (*i)->samples_per_unit;
r->property_x2() = j->second / (*i)->samples_per_unit;
r->property_y1() = n * _wave_height;
r->property_y2() = (n + 1) * _wave_height;
r->property_outline_pixels() = 0;
r->property_fill_color_rgba() = RGBA_TO_UINT (128, 128, 128, 128);
(*i)->silence_rects.push_back (r);
sc++;
}
max_segments = max (max_segments, sc);
++n;
for (list<ViewInterval>::iterator v = views.begin(); v != views.end(); ++v) {
(*v).view->set_silent_frames ((*v).intervals);
max_segments = max (max_segments, (uint32_t) (*v).intervals.size());
}
#if 0
cerr << "minaudible in update " << min_audible << " minsilence = " << min_silence << endl;
if (min_audible > 0) {
float ms, ma;
char const * aunits;
@ -337,14 +220,22 @@ StripSilenceDialog::update_silence_rects ()
ma = (float) min_audible/_session->frame_rate();
ms = (float) min_silence/_session->frame_rate();
if (min_audible < _session->frame_rate()) {
aunits = _("ms");
/* ma and ms are now in seconds */
if (ma >= 60.0) {
aunits = _("minutes");
//ma /= 60.0;
} else if (min_audible < _session->frame_rate()) {
aunits = _("msecs");
ma *= 1000.0;
} else {
aunits = _("s");
aunits = _("seconds");
}
if (min_silence < _session->frame_rate()) {
if (ms >= 60.0) {
sunits = _("minutes");
//ms /= 60.0;
} else if (min_silence < _session->frame_rate()) {
sunits = _("ms");
ms *= 1000.0;
} else {
@ -364,6 +255,7 @@ StripSilenceDialog::update_silence_rects ()
_shortest_silence_label.set_text ("");
_shortest_audible_label.set_text ("");
}
#endif
}
void *
@ -383,8 +275,13 @@ StripSilenceDialog::detection_thread_work ()
_lock.lock ();
while (1) {
for (list<Wave*>::iterator i = _waves.begin(); i != _waves.end(); ++i) {
(*i)->silence = (*i)->region->find_silence (dB_to_coefficient (threshold ()), minimum_length (), _interthread_info);
for (list<ViewInterval>::iterator i = views.begin(); i != views.end(); ++i) {
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> ((*i).view->region());
if (ar) {
(*i).intervals = ar->find_silence (dB_to_coefficient (threshold ()), minimum_length (), _interthread_info);
}
if (_interthread_info.cancel) {
break;
}
@ -441,7 +338,7 @@ StripSilenceDialog::threshold_changed ()
}
void
StripSilenceDialog::update_stats (const SilenceResult& res)
StripSilenceDialog::update_stats (const AudioIntervalResult& res)
{
if (res.empty()) {
return;
@ -452,7 +349,9 @@ StripSilenceDialog::update_stats (const SilenceResult& res)
max_audible = 0;
min_audible = max_framepos;
SilenceResult::const_iterator cur;
AudioIntervalResult::const_iterator cur;
bool saw_silence = false;
bool saw_audible = false;
cur = res.begin();
@ -477,10 +376,14 @@ StripSilenceDialog::update_stats (const SilenceResult& res)
interval_duration = end - start;
if (in_silence) {
saw_silence = true;
cerr << "Silent duration: " << interval_duration << endl;
max_silence = max (max_silence, interval_duration);
min_silence = min (min_silence, interval_duration);
} else {
saw_audible = true;
cerr << "Audible duration: " << interval_duration << endl;
max_audible = max (max_audible, interval_duration);
min_audible = min (min_audible, interval_duration);
@ -491,36 +394,32 @@ StripSilenceDialog::update_stats (const SilenceResult& res)
end = cur->first;
in_silence = !in_silence;
}
if (!saw_silence) {
min_silence = 0;
max_silence = 0;
}
if (!saw_audible) {
min_audible = 0;
max_audible = 0;
}
cerr << "max aud: " << max_audible << " min aud: " << min_audible << " max sil: " << max_silence << " min sil: " << min_silence << endl;
}
framecnt_t
StripSilenceDialog::minimum_length () const
{
return _minimum_length.current_duration (_waves.front()->region->position());
return _minimum_length.current_duration (views.front().view->region()->position());
}
framecnt_t
StripSilenceDialog::fade_length () const
{
return _minimum_length.current_duration (_waves.front()->region->position());
return _minimum_length.current_duration (views.front().view->region()->position());
}
StripSilenceDialog::Wave::Wave (Group* g, boost::shared_ptr<AudioRegion> r)
: region (r), view (0), samples_per_unit (1)
{
threshold_line = new ArdourCanvas::SimpleLine (*g);
threshold_line->property_color_rgba() = RGBA_TO_UINT (0, 0, 0, 128);
}
StripSilenceDialog::Wave::~Wave ()
{
delete view;
delete threshold_line;
for (list<SimpleRect*>::iterator i = silence_rects.begin(); i != silence_rects.end(); ++i) {
delete *i;
}
}
void
StripSilenceDialog::update_progress_gui (float p)
{

View File

@ -26,15 +26,16 @@
#include "progress_reporter.h"
namespace ARDOUR {
class AudioRegion;
class Session;
}
class RegionView;
/// Dialog box to set options for the `strip silence' filter
class StripSilenceDialog : public ArdourDialog, public ProgressReporter
{
public:
StripSilenceDialog (ARDOUR::Session*, std::list<boost::shared_ptr<ARDOUR::AudioRegion> > const &);
StripSilenceDialog (ARDOUR::Session*, std::list<RegionView*> const &);
~StripSilenceDialog ();
double threshold () const {
@ -45,8 +46,6 @@ public:
ARDOUR::framecnt_t fade_length () const;
private:
typedef std::list<std::pair<ARDOUR::frameoffset_t,ARDOUR::framecnt_t> > SilenceResult;
void create_waves ();
void peaks_ready ();
void canvas_allocation (Gtk::Allocation &);
@ -54,7 +53,7 @@ private:
void resize_silence_rects ();
void update ();
void update_threshold_line ();
void update_stats (SilenceResult const &);
void update_stats (ARDOUR::AudioIntervalResult const &);
void threshold_changed ();
void update_progress_gui (float);
void restart_thread ();
@ -67,22 +66,14 @@ private:
Gtk::Label _shortest_audible_label;
Gtk::ProgressBar _progress_bar;
struct Wave {
boost::shared_ptr<ARDOUR::AudioRegion> region;
ArdourCanvas::WaveView* view;
std::list<ArdourCanvas::SimpleRect*> silence_rects;
ArdourCanvas::SimpleLine* threshold_line;
double samples_per_unit;
SilenceResult silence;
Wave (ArdourCanvas::Group *, boost::shared_ptr<ARDOUR::AudioRegion>);
~Wave ();
};
struct ViewInterval {
RegionView* view;
ARDOUR::AudioIntervalResult intervals;
ArdourCanvas::Canvas* _canvas;
std::list<Wave*> _waves;
int _wave_width;
int _wave_height;
ViewInterval (RegionView* rv) : view (rv) {}
};
std::list<ViewInterval> views;
ARDOUR::framecnt_t max_audible;
ARDOUR::framecnt_t min_audible;

View File

@ -176,7 +176,7 @@ class AudioRegion : public Region
int update_transient (framepos_t old_position, framepos_t new_position);
int adjust_transients (framepos_t delta);
std::list<std::pair<frameoffset_t, framecnt_t> > find_silence (Sample, framecnt_t, InterThreadInfo&) const;
AudioIntervalResult find_silence (Sample, framecnt_t, InterThreadInfo&) const;
private:
friend class RegionFactory;

View File

@ -72,6 +72,9 @@ namespace ARDOUR {
static const framepos_t max_framepos = INT64_MAX;
static const framecnt_t max_framecnt = INT64_MAX;
// a set of (time) intervals: first of pair is the offset within the region, second is the length of the interval
typedef std::list<std::pair<frameoffset_t,framecnt_t> > AudioIntervalResult;
struct IOChange {
enum Type {

View File

@ -1498,10 +1498,10 @@ in this and future transient-detection operations.\n\
*
* @param threshold Threshold below which signal is considered silence (as a sample value)
* @param min_length Minimum length of silent period to be reported.
* @return Silent periods; first of pair is the offset within the region, second is the length of the period
* @return Silent intervals
*/
std::list<std::pair<frameoffset_t, framecnt_t> >
AudioIntervalResult
AudioRegion::find_silence (Sample threshold, framecnt_t min_length, InterThreadInfo& itt) const
{
framecnt_t const block_size = 64 * 1024;
@ -1510,8 +1510,8 @@ AudioRegion::find_silence (Sample threshold, framecnt_t min_length, InterThreadI
framepos_t pos = _start;
framepos_t const end = _start + _length - 1;
std::list<std::pair<frameoffset_t, framecnt_t> > silent_periods;
AudioIntervalResult silent_periods;
bool in_silence = false;
frameoffset_t silence_start = 0;