X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Faudioengine.h;h=cb5b82d0588148bc9d785560b74fb56b0434fa45;hb=eaa1dacf5fc9537cfff36e2339bd07aab348aa2e;hp=b1e059e76af8ccaf02a7326730348dadf0c1abd7;hpb=a2f82f8c5d46beead18d22a60c67c67e848d9561;p=ardour.git diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index b1e059e76a..cb5b82d058 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -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 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 Freewheel; - + + PBD::Signal1 Freewheel; + PBD::Signal0 Xrun; /** this signal is emitted if the sample rate changes */ @@ -173,24 +175,30 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager PBD::Signal0 DeviceError; /* this signal is emitted if the device list changed */ - + PBD::Signal0 DeviceListChanged; - + /* this signal is sent if the backend ever disconnects us */ - + PBD::Signal1 Halted; - + /* these two are emitted when the engine itself is started and stopped */ - + PBD::Signal0 Running; PBD::Signal0 Stopped; + /* these two are emitted when a device reset is initiated/finished + */ + + PBD::Signal0 DeviceResetStarted; + PBD::Signal0 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 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 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__ */