Support thread-safe LV2 state restoration
[ardour.git] / libs / ardour / ardour / sndfilesource.h
index bed431c4902d5f5845b0b5c24b5f4f7b240587b4..4579a32b6df9c6bfe19ec2591c708a1807702687 100644 (file)
 
 #include "ardour/audiofilesource.h"
 #include "ardour/broadcast_info.h"
-#include "pbd/sndfile_manager.h"
 
 namespace ARDOUR {
 
-class SndFileSource : public AudioFileSource {
+class LIBARDOUR_API SndFileSource : public AudioFileSource {
   public:
        /** Constructor to be called for existing external-to-session files */
        SndFileSource (Session&, const std::string& path, int chn, Flag flags);
@@ -38,7 +37,16 @@ class SndFileSource : public AudioFileSource {
                       SampleFormat samp_format, HeaderFormat hdr_format, framecnt_t rate,
                       Flag flags = SndFileSource::default_writable_flags);
 
-       /** Constructor to be called for existing in-session files */
+       /* Constructor to be called for recovering files being used for
+        * capture. They are in-session, they already exist, they should not
+        * be writable. They are an odd hybrid (from a constructor point of
+        * view) of the previous two constructors.
+        */
+       SndFileSource (Session&, const std::string& path, int chn);
+
+       /** Constructor to be called for existing in-session files during
+        * session loading
+        */
        SndFileSource (Session&, const XMLNode&);
 
        ~SndFileSource ();
@@ -58,6 +66,7 @@ class SndFileSource : public AudioFileSource {
        bool set_destructive (bool yn);
 
        bool one_of_several_channels () const;
+    uint32_t channel_count () const { return _info.channels; }
 
        bool clamped_at_unity () const;
 
@@ -67,6 +76,8 @@ class SndFileSource : public AudioFileSource {
        static int get_soundfile_info (const std::string& path, SoundFileInfo& _info, std::string& error_msg);
 
   protected:
+       void close ();
+
        void set_path (const std::string& p);
        void set_header_timeline_position ();
 
@@ -75,7 +86,7 @@ class SndFileSource : public AudioFileSource {
        framecnt_t write_float (Sample* data, framepos_t pos, framecnt_t cnt);
 
   private:
-       PBD::SndFileDescriptor* _descriptor;
+       SNDFILE* _sndfile;
        SF_INFO _info;
        BroadcastInfo *_broadcast_info;
 
@@ -94,8 +105,6 @@ class SndFileSource : public AudioFileSource {
        bool          _capture_end;
        framepos_t     capture_start_frame;
        framepos_t     file_pos; // unit is frames
-       framecnt_t     xfade_out_count;
-       framecnt_t     xfade_in_count;
        Sample*        xfade_buf;
 
        framecnt_t crossfade (Sample* data, framecnt_t cnt, int dir);
@@ -104,7 +113,6 @@ class SndFileSource : public AudioFileSource {
        framecnt_t nondestructive_write_unlocked (Sample *dst, framecnt_t cnt);
        void handle_header_position_change ();
        PBD::ScopedConnection header_position_connection;
-       PBD::ScopedConnection file_manager_connection;
 };
 
 } // namespace ARDOUR