add an plugin API to query generic-gui grid-layout
[ardour.git] / libs / ardour / ardour / audioengine.h
index b1e059e76af8ccaf02a7326730348dadf0c1abd7..7bb7aa3a4d3ce42655bc8f3398a7c333c27acc37 100644 (file)
@@ -57,7 +57,7 @@ class ProcessThread;
 class AudioBackend;
 struct AudioBackendInfo;
 
-class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
+class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr
 {
   public:
 
@@ -75,7 +75,7 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
 
        ProcessThread* main_thread() const { return _main_thread; }
 
-       /* START BACKEND PROXY API 
+       /* START BACKEND PROXY API
         *
         * See audio_backend.h for full documentation and semantics. These wrappers
         * just forward to a backend implementation.
@@ -99,6 +99,8 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
        pframes_t      samples_since_cycle_start ();
        bool           get_sync_offset (pframes_t& offset) const;
 
+       std::string    get_last_backend_error () const { return _last_backend_error_string; }
+
        int            create_process_thread (boost::function<void()> func);
        int            join_process_threads ();
        bool           in_process_thread ();
@@ -137,7 +139,7 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
        }
 
        framecnt_t processed_frames() const { return _processed_frames; }
-    
+
        void set_session (Session *);
        void remove_session (); // not a replacement for SessionHandle::session_going_away()
        Session* session() const { return _session; }
@@ -148,19 +150,19 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
            public:
                virtual const char *what() const throw() { return "could not connect to engine backend"; }
        };
-    
+
        void split_cycle (pframes_t offset);
-    
+
        int  reset_timebase ();
-    
+
        void update_latencies ();
-    
+
        /* this signal is sent for every process() cycle while freewheeling.
           (the regular process() call to session->process() is not made)
        */
-    
+
        PBD::Signal1<int, pframes_t> Freewheel;
-    
+
        PBD::Signal0<void> Xrun;
 
        /** this signal is emitted if the sample rate changes */
@@ -173,24 +175,30 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
        PBD::Signal0<void> DeviceError;
 
        /* this signal is emitted if the device list changed */
-    
+
        PBD::Signal0<void> DeviceListChanged;
-    
+
        /* this signal is sent if the backend ever disconnects us */
-    
+
        PBD::Signal1<void,const char*> Halted;
-    
+
        /* these two are emitted when the engine itself is
           started and stopped
        */
-    
+
        PBD::Signal0<void> Running;
        PBD::Signal0<void> Stopped;
 
+       /* these two are emitted when a device reset is initiated/finished
+        */
+
+       PBD::Signal0<void> DeviceResetStarted;
+       PBD::Signal0<void> DeviceResetFinished;
+
        static AudioEngine* instance() { return _instance; }
        static void destroy();
        void died ();
-    
+
        /* The backend will cause these at the appropriate time(s)
         */
        int  process_callback (pframes_t nframes);
@@ -203,6 +211,9 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
        void latency_callback (bool for_playback);
        void halted_callback (const char* reason);
 
+       /* checks if current thread is properly set up for audio processing */
+       static bool thread_initialised_for_audio_processing ();
+
        /* sets up the process callback thread */
        static void thread_init_callback (void *);
 
@@ -226,6 +237,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<void> BecameSilent;
+       void reset_silence_countdown ();
+
   private:
        AudioEngine ();
 
@@ -261,6 +282,8 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
        bool                      _started_for_latency;
        bool                      _in_destructor;
 
+       std::string               _last_backend_error_string;
+
        Glib::Threads::Thread*     _hw_reset_event_thread;
        gint                       _hw_reset_request_count;
        Glib::Threads::Cond        _hw_reset_condition;
@@ -277,18 +300,18 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
        void do_reset_backend();
        void do_devicelist_update();
 
-       void meter_thread ();
-       void start_metering_thread ();
-       void stop_metering_thread ();
-
-       static gint      m_meter_exit;
-
        typedef std::map<std::string,AudioBackendInfo*> BackendMap;
        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
 
 #endif /* __ardour_audioengine_h__ */