From 8a5b5145cc8c7a1fcffdd8387f3f4cdc79af0911 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 5 Apr 2015 14:02:30 -0400 Subject: add libardour code for going completely silent after a compile-time defined number of seconds --- libs/ardour/ardour/audioengine.h | 16 ++++++++++++ libs/ardour/ardour/session.h | 1 - libs/ardour/audioengine.cc | 53 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 83df9a8760..445d299f39 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -232,6 +232,16 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager LatencyMeasurement measuring_latency () const { return _measuring_latency; } + /* These two are used only in builds where SILENCE_AFTER_SECONDS was + * set. BecameSilent will be emitted when the audioengine goes silent. + * reset_silence_countdown() can be used to reset the silence + * countdown, whose duration will be reduced to half of its previous + * value. + */ + + PBD::Signal0 BecameSilent; + void reset_silence_countdown (); + private: AudioEngine (); @@ -293,6 +303,12 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager BackendMap _backends; AudioBackendInfo* backend_discover (const std::string&); void drop_backend (); + +#ifdef SILENCE_AFTER + framecnt_t _silence_countdown; + uint32_t _silence_hit_cnt; +#endif + }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 6329b29ad2..942b75fbef 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -559,7 +559,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop bool transport_stopped() const { return _transport_speed == 0.0f; } bool transport_rolling() const { return _transport_speed != 0.0f; } - void set_silent (bool yn); bool silent () { return _silent; } TempoMap& tempo_map() { return *_tempo_map; } diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 452403e485..1f878474f6 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -63,6 +64,10 @@ using namespace PBD; gint AudioEngine::m_meter_exit; AudioEngine* AudioEngine::_instance = 0; +#ifdef SILENCE_AFTER +#define SILENCE_AFTER_SECONDS 10 +#endif + AudioEngine::AudioEngine () : session_remove_pending (false) , session_removal_countdown (-1) @@ -89,9 +94,14 @@ AudioEngine::AudioEngine () , _hw_devicelist_update_thread(0) , _hw_devicelist_update_count(0) , _stop_hw_devicelist_processing(0) +#ifdef SILENCE_AFTER_SECONDS + , _silence_countdown (0) + , _silence_hit_cnt (0) +#endif { g_atomic_int_set (&m_meter_exit, 0); - start_hw_event_processing(); + reset_silence_countdown (); + start_hw_event_processing(); discover_backends (); } @@ -148,6 +158,10 @@ AudioEngine::sample_rate_change (pframes_t nframes) SampleRateChanged (nframes); /* EMIT SIGNAL */ +#ifdef SILENCE_AFTER_SECONDS + _silence_countdown = nframes * SILENCE_AFTER_SECONDS; +#endif + return 0; } @@ -349,10 +363,31 @@ AudioEngine::process_callback (pframes_t nframes) last_monitor_check = next_processed_frames; } +#ifdef SILENCE_AFTER_SECONDS + + bool was_silent = (_silence_countdown == 0); + + if (_silence_countdown >= nframes) { + _silence_countdown -= nframes; + } else { + _silence_countdown = 0; + } + + if (!was_silent && _silence_countdown == 0) { + _silence_hit_cnt++; + BecameSilent (); /* EMIT SIGNAL */ + } + + if (_silence_countdown == 0 || _session->silent()) { + PortManager::silence (nframes); + } + +#else if (_session->silent()) { PortManager::silence (nframes); } - +#endif + if (session_remove_pending && session_removal_countdown) { PortManager::fade_out (session_removal_gain, session_removal_gain_step, nframes); @@ -375,6 +410,19 @@ AudioEngine::process_callback (pframes_t nframes) return 0; } +void +AudioEngine::reset_silence_countdown () +{ +#ifdef SILENCE_AFTER_SECONDS + double sr = 48000; /* default in case there is no backend */ + + sr = sample_rate(); + + _silence_countdown = max (60 * sr, /* 60 seconds */ + sr * (SILENCE_AFTER_SECONDS / pow (2, _silence_hit_cnt))); + +#endif +} void AudioEngine::launch_device_control_app() @@ -1081,6 +1129,7 @@ AudioEngine::set_sample_rate (float sr) if (!_backend) { return -1; } + return _backend->set_sample_rate (sr); } -- cgit v1.2.3