X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsndfilesource.h;h=916e9da49ec15f6b5d4ed7c8cecd705180b4dc90;hb=6698f5f686bef82b0c9568558c83a3b9b3344700;hp=37167e6a9af5bc6067eca07fda398d94b33a7ad0;hpb=1e05b4389dab5912fb4178d489aa9eef639d823c;p=ardour.git diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index 37167e6a9a..916e9da49e 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __sndfile_source_h__ @@ -23,32 +22,92 @@ #include -#include +#include namespace ARDOUR { -class SndFileSource : public ExternalSource { +class SndFileSource : public AudioFileSource { public: - SndFileSource (const string& path_plus_channel, bool build_peak = true); - SndFileSource (const XMLNode&); + /* constructor to be called for existing external-to-session files */ + + SndFileSource (Session&, Glib::ustring path, int chn, Flag flags); + + /* constructor to be called for new in-session files */ + + SndFileSource (Session&, Glib::ustring path, SampleFormat samp_format, HeaderFormat hdr_format, nframes_t rate, + Flag flags = SndFileSource::default_writable_flags); + + /* constructor to be called for existing in-session files */ + + SndFileSource (Session&, const XMLNode&); + ~SndFileSource (); - jack_nframes_t length() const { return _info.frames; } + float sample_rate () const; + int update_header (nframes_t when, struct tm&, time_t); + int flush_header (); + + nframes_t natural_position () const; + + nframes_t last_capture_start_frame() const; + void mark_capture_start (nframes_t); + void mark_capture_end (); + void clear_capture_marks(); + + bool set_destructive (bool yn); + + bool one_of_several_channels () const; + + static void setup_standard_crossfades (nframes_t sample_rate); + static const AudioFileSource::Flag default_writable_flags; - jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const; + static int get_soundfile_info (const Glib::ustring& path, SoundFileInfo& _info, string& error_msg); + + protected: + void set_header_timeline_position (); + + nframes_t read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const; + nframes_t write_unlocked (Sample *dst, nframes_t cnt); + + nframes_t write_float (Sample* data, nframes_t pos, nframes_t cnt); private: SNDFILE *sf; SF_INFO _info; + SF_BROADCAST_INFO *_broadcast_info; + + mutable float *interleave_buf; + mutable nframes_t interleave_bufsize; + + void init (); + int open(); + void close(); + int setup_broadcast_info (nframes_t when, struct tm&, time_t); + + /* destructive */ + + static nframes_t xfade_frames; + static gain_t* out_coefficient; + static gain_t* in_coefficient; + + bool _capture_start; + bool _capture_end; + nframes_t capture_start_frame; + nframes_t file_pos; // unit is frames + nframes_t xfade_out_count; + nframes_t xfade_in_count; + Sample* xfade_buf; - mutable float *tmpbuf; - mutable jack_nframes_t tmpbufsize; - mutable PBD::Lock _tmpbuf_lock; + nframes_t crossfade (Sample* data, nframes_t cnt, int dir); + void set_timeline_position (int64_t); + nframes_t destructive_write_unlocked (Sample *dst, nframes_t cnt); + nframes_t nondestructive_write_unlocked (Sample *dst, nframes_t cnt); + void handle_header_position_change (); - void init (const string &str, bool build_peak); + static int64_t get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists); }; -}; /* namespace ARDOUR */ +} // namespace ARDOUR #endif /* __sndfile_source_h__ */