Respond to MMC even when synced to JACK. Fixes #3700.
[ardour.git] / libs / ardour / ardour / audiosource.h
index 7ea72606883d40fcda931db860d4e05ce147728d..22d5d1a7249c7881b22919a7a3ea8a15540257f9 100644 (file)
@@ -60,7 +60,7 @@ class AudioSource : virtual public Source,
 
        virtual float sample_rate () const = 0;
 
-       virtual void mark_streaming_write_completed () {}
+       virtual void mark_streaming_write_completed ();
 
        virtual bool can_truncate_peaks() const { return true; }
 
@@ -69,7 +69,7 @@ class AudioSource : virtual public Source,
 
        uint32_t read_data_count() const { return _read_data_count; }
        uint32_t write_data_count() const { return _write_data_count; }
-       void dec_read_data_count(nframes_t);
+       void dec_read_data_count (framecnt_t);
 
        int read_peaks (PeakData *peaks, framecnt_t npeaks,
                        framepos_t start, framecnt_t cnt, double samples_per_visual_peak) const;
@@ -111,8 +111,6 @@ class AudioSource : virtual public Source,
        static bool _build_peakfiles;
 
        framecnt_t           _length;
-       bool                 _peaks_built;
-       mutable Glib::Mutex  _peaks_ready_lock;
        std::string         peakpath;
        std::string        _captured_for;
 
@@ -121,7 +119,7 @@ class AudioSource : virtual public Source,
 
        int initialize_peakfile (bool newfile, std::string path);
        int build_peaks_from_scratch ();
-       int compute_and_write_peaks (Sample* buf, framepos_t first_frame, framecnt_t cnt,
+       int compute_and_write_peaks (Sample* buf, framecnt_t first_frame, framecnt_t cnt,
        bool force, bool intermediate_peaks_ready_signal);
        void truncate_peakfile();
 
@@ -137,11 +135,20 @@ class AudioSource : virtual public Source,
                                         framecnt_t npeaks, framepos_t start, framecnt_t cnt,
                                         double samples_per_visual_peak, framecnt_t fpp) const;
        
-       int compute_and_write_peaks (Sample* buf, framepos_t first_frame, framecnt_t cnt,
+       int compute_and_write_peaks (Sample* buf, framecnt_t first_frame, framecnt_t cnt,
                                     bool force, bool intermediate_peaks_ready_signal, 
                                     framecnt_t frames_per_peak);
 
   private:
+       bool _peaks_built;
+       /** This mutex is used to protect both the _peaks_built
+        *  variable and also the emission (and handling) of the
+        *  PeaksReady signal.  Holding the lock when emitting
+        *  PeaksReady means that _peaks_built cannot be changed
+        *  during the handling of the signal.
+        */
+       mutable Glib::Mutex _peaks_ready_lock;
+       
        PBD::FdFileDescriptor* _peakfile_descriptor;
        int        _peakfile_fd;
        framecnt_t peak_leftover_cnt;