diff options
author | David Robillard <d@drobilla.net> | 2006-07-05 19:47:25 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2006-07-05 19:47:25 +0000 |
commit | 22c20ab6f215c0ab24702a479aa6821c25a7d058 (patch) | |
tree | 3f606773d2082fd3f28857e1c1ef876d2e007559 /libs/ardour | |
parent | 5dc4abef7951c1a1b85fb6b9dbb194d73b8c4c2b (diff) |
Merged with trunk, and a few trivial GUI updates etc.
git-svn-id: svn://localhost/ardour2/branches/midi@664 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
24 files changed, 240 insertions, 219 deletions
diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index c42728f85b..c93a7c4593 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -106,7 +106,7 @@ arch_specific_objects = [ ] osc_files = [ 'osc.cc' ] vst_files = [ 'vst_plugin.cc', 'session_vst.cc' ] -coreaudio_files = [ 'coreaudio_source.cc' ] +coreaudio_files = [ 'coreaudiosource.cc' ] extra_sources = [ ] if ardour['VST']: @@ -206,7 +206,7 @@ ardour.Merge ([ libraries['lrdf'], libraries['samplerate'], libraries['sigc2'], - libraries['pbd3'], + libraries['pbd'], libraries['soundtouch'], libraries['midi++2'], libraries['glib2'], diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h index ecbac569d5..36251c07ff 100644 --- a/libs/ardour/ardour/audiofilesource.h +++ b/libs/ardour/ardour/audiofilesource.h @@ -42,7 +42,7 @@ class AudioFileSource : public AudioSource { Removable = 0x8, RemovableIfEmpty = 0x10, RemoveAtDestroy = 0x20, - BuildPeaks = 0x40 + NoPeakFile = 0x40 }; virtual ~AudioFileSource (); @@ -62,7 +62,7 @@ class AudioFileSource : public AudioSource { cannot. */ - static AudioFileSource* create (string path_plus_channel); + static AudioFileSource* create (const string& path_plus_channel, Flag flags = Flag (0)); static AudioFileSource* create (const XMLNode&); static bool get_soundfile_info (string path, SoundFileInfo& _info, string& error); @@ -97,7 +97,7 @@ class AudioFileSource : public AudioSource { static void set_search_path (string); static void set_header_position_offset (jack_nframes_t offset, bool negative); - static sigc::signal<void,struct tm*, time_t> HeaderPositionOffsetChanged; + static sigc::signal<void> HeaderPositionOffsetChanged; XMLNode& get_state (); int set_state (const XMLNode&); @@ -107,7 +107,7 @@ class AudioFileSource : public AudioSource { to cause issues. */ - void handle_header_position_change (struct tm*, time_t tnow); + void handle_header_position_change (); protected: diff --git a/libs/ardour/ardour/coreaudio_source.h b/libs/ardour/ardour/coreaudiosource.h index 81f1a14050..ba9f122fc9 100644 --- a/libs/ardour/ardour/coreaudio_source.h +++ b/libs/ardour/ardour/coreaudiosource.h @@ -27,15 +27,22 @@ namespace ARDOUR { class CoreAudioSource : public AudioFileSource { public: - CoreAudioSource (const string& path_plus_channel, bool build_peak = true); CoreAudioSource (const XMLNode&); + CoreAudioSource (const string& path_plus_channel, Flag); ~CoreAudioSource (); float sample_rate() const; int update_header (jack_nframes_t when, struct tm&, time_t); + int flush_header () {return 0;}; + void set_header_timeline_position () {}; + protected: jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const; + + jack_nframes_t write_unlocked (Sample *dst, jack_nframes_t cnt, char * workbuf) + { return 0; } + private: ExtAudioFileRef af; @@ -45,7 +52,7 @@ class CoreAudioSource : public AudioFileSource { mutable jack_nframes_t tmpbufsize; mutable Glib::Mutex _tmpbuf_lock; - void init (const string &str, bool build_peak); + void init (const string &str); }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/destructive_filesource.h b/libs/ardour/ardour/destructive_filesource.h index c92a0762ee..2d10528ac8 100644 --- a/libs/ardour/ardour/destructive_filesource.h +++ b/libs/ardour/ardour/destructive_filesource.h @@ -32,8 +32,7 @@ namespace ARDOUR { class DestructiveFileSource : public SndFileSource { public: DestructiveFileSource (std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate, - Flag flags = AudioFileSource::Flag (AudioFileSource::Writable| - AudioFileSource::BuildPeaks)); + Flag flags = AudioFileSource::Flag (AudioFileSource::Writable)); DestructiveFileSource (const XMLNode&); ~DestructiveFileSource (); diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index f43e8273a7..a72289acd1 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -80,6 +80,9 @@ class Diskstream : public Stateful, public sigc::trackable void unref() { if (_refcnt) _refcnt--; if (_refcnt == 0) delete this; } uint32_t refcnt() const { return _refcnt; } + virtual float playback_buffer_load() const = 0; + virtual float capture_buffer_load() const = 0; + void set_flag (Flag f) { _flags |= f; } void unset_flag (Flag f) { _flags &= ~f; } @@ -106,6 +109,7 @@ class Diskstream : public Stateful, public sigc::trackable virtual void punch_out() {} virtual void set_speed (double); + virtual void non_realtime_set_speed () = 0; virtual Playlist *playlist () = 0; virtual int use_new_playlist () = 0; @@ -128,6 +132,9 @@ class Diskstream : public Stateful, public sigc::trackable /* Stateful */ virtual XMLNode& get_state(void) = 0; virtual int set_state(const XMLNode& node) = 0; + + // FIXME: makes sense for all diskstream types? + virtual void monitor_input (bool) {} jack_nframes_t capture_offset() const { return _capture_offset; } virtual void set_capture_offset (); @@ -166,7 +173,7 @@ class Diskstream : public Stateful, public sigc::trackable virtual void set_pending_overwrite (bool) = 0; virtual int overwrite_existing_buffers () = 0; virtual void reverse_scrub_buffer (bool to_forward) = 0; - //void set_block_size (jack_nframes_t); + virtual void set_block_size (jack_nframes_t) = 0; virtual int internal_playback_seek (jack_nframes_t distance) = 0; virtual int can_internal_playback_seek (jack_nframes_t distance) = 0; virtual int rename_write_sources () = 0; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 6284e94900..0e1b7627be 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -68,6 +68,7 @@ class AuxInput; class Source; class AudioSource; +class Diskstream; class AudioDiskstream; class AudioFileSource; class Auditioner; @@ -281,30 +282,25 @@ class Session : public sigc::trackable, public Stateful void refill_all_diskstream_buffers (); uint32_t diskstream_buffer_size() const { return dstream_buffer_size; } - /* XXX fix required here when we get new diskstream types *, but - not sure of the direction to take this in until then. - */ - - uint32_t get_next_diskstream_id() const { return n_audio_diskstreams(); } - uint32_t n_audio_diskstreams() const; + uint32_t get_next_diskstream_id() const { return n_diskstreams(); } + uint32_t n_diskstreams() const; - typedef list<AudioDiskstream *> AudioDiskstreamList; + template<class T> void foreach_diskstream (T *obj, void (T::*func)(Diskstream&)); - Session::AudioDiskstreamList audio_disk_streams() const { + typedef list<Diskstream *> DiskstreamList; + + Session::DiskstreamList disk_streams() const { Glib::RWLock::ReaderLock lm (diskstream_lock); - return audio_diskstreams; /* XXX yes, force a copy */ + return diskstreams; /* XXX yes, force a copy */ } - void foreach_audio_diskstream (void (AudioDiskstream::*func)(void)); - template<class T> void foreach_audio_diskstream (T *obj, void (T::*func)(AudioDiskstream&)); - typedef list<Route *> RouteList; - + RouteList get_routes() const { Glib::RWLock::ReaderLock rlock (route_lock); return routes; /* XXX yes, force a copy */ } - + uint32_t nroutes() const { return routes.size(); } uint32_t ntracks () const; uint32_t nbusses () const; @@ -719,8 +715,6 @@ class Session : public sigc::trackable, public Stateful sigc::signal<void,Playlist*> PlaylistAdded; sigc::signal<void,Playlist*> PlaylistRemoved; - Playlist *get_playlist (string name); - uint32_t n_playlists() const; template<class T> void foreach_playlist (T *obj, void (T::*func)(Playlist *)); @@ -980,7 +974,7 @@ class Session : public sigc::trackable, public Stateful void set_frame_rate (jack_nframes_t nframes); protected: - friend class AudioDiskstream; + friend class Diskstream; void stop_butler (); void wait_till_butler_finished(); @@ -1475,7 +1469,7 @@ class Session : public sigc::trackable, public Stateful /* disk-streams */ - AudioDiskstreamList audio_diskstreams; + DiskstreamList diskstreams; mutable Glib::RWLock diskstream_lock; uint32_t dstream_buffer_size; void add_diskstream (Diskstream*); diff --git a/libs/ardour/ardour/session_diskstream.h b/libs/ardour/ardour/session_diskstream.h index 33fc5419ba..52db157f44 100644 --- a/libs/ardour/ardour/session_diskstream.h +++ b/libs/ardour/ardour/session_diskstream.h @@ -27,10 +27,10 @@ namespace ARDOUR { template<class T> void -Session::foreach_audio_diskstream (T *obj, void (T::*func)(AudioDiskstream&)) +Session::foreach_diskstream (T *obj, void (T::*func)(Diskstream&)) { Glib::RWLock::ReaderLock lm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); i++) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); i++) { if (!(*i)->hidden()) { (obj->*func) (**i); } diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index d146bb5793..5e3c1f621d 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -39,8 +39,7 @@ class SndFileSource : public AudioFileSource { Flag flags = AudioFileSource::Flag (AudioFileSource::Writable| AudioFileSource::Removable| AudioFileSource::RemovableIfEmpty| - AudioFileSource::CanRename| - AudioFileSource::BuildPeaks)); + AudioFileSource::CanRename)); /* constructor to be called for existing in-session files */ @@ -52,7 +51,7 @@ class SndFileSource : public AudioFileSource { int update_header (jack_nframes_t when, struct tm&, time_t); int flush_header (); - static Flag default_in_session_flags(); + void handle_smpte_offset_change (jack_nframes_t offset, bool negative); protected: void set_header_timeline_position (); diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 277fad0ae8..f24993b87b 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -55,10 +55,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -//sigc::signal<void,AudioDiskstream*> AudioDiskstream::AudioDiskstreamCreated; sigc::signal<void,list<AudioFileSource*>*> AudioDiskstream::DeleteSources; -//sigc::signal<void> AudioDiskstream::DiskOverrun; -//sigc::signal<void> AudioDiskstream::DiskUnderrun; AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag) : Diskstream(sess, name, flag) @@ -295,9 +292,9 @@ AudioDiskstream::find_and_use_playlist (const string& name) Playlist* pl; AudioPlaylist* playlist; - if ((pl = _session.get_playlist (name)) == 0) { - error << string_compose(_("AudioDiskstream: Session doesn't know about a Playlist called \"%1\""), name) << endmsg; - return -1; + if ((pl = _session.playlist_by_name (name)) == 0) { + playlist = new AudioPlaylist(_session, name); + pl = playlist; } if ((playlist = dynamic_cast<AudioPlaylist*> (pl)) == 0) { @@ -1630,6 +1627,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca srcs.push_back (s); if ((fsrc = dynamic_cast<AudioFileSource *>(s)) != 0) { + cerr << "updating source after capture\n"; fsrc->update_header (capture_info.front()->start, when, twhen); } diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index be5c9ab5d9..aa8940dce4 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -20,7 +20,7 @@ #include <algorithm> -#include <stdlib.h> +#include <cstdlib> #include <sigc++/bind.h> diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 0f22ebbe44..82a2a38c2c 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -94,14 +94,6 @@ AudioTrack::~AudioTrack () } } -#if 0 -void -AudioTrack::handle_smpte_offset_change () -{ - diskstream -} -#endif - int AudioTrack::deprecated_use_diskstream_connections () { diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index 1e13a29acc..0663f5f9b1 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -42,7 +42,7 @@ // if these headers come before sigc++ is included // the parser throws ObjC++ errors. (nil is a keyword) #ifdef HAVE_COREAUDIO -#include <ardour/coreaudio_source.h> +#include <ardour/coreaudiosource.h> #include <AudioToolbox/ExtendedAudioFile.h> #include <AudioToolbox/AudioFormat.h> #endif // HAVE_COREAUDIO @@ -55,9 +55,9 @@ using namespace PBD; string AudioFileSource::peak_dir = ""; string AudioFileSource::search_path; -sigc::signal<void,struct tm*, time_t> AudioFileSource::HeaderPositionOffsetChanged; -bool AudioFileSource::header_position_negative; -uint64_t AudioFileSource::header_position_offset; +sigc::signal<void> AudioFileSource::HeaderPositionOffsetChanged; +bool AudioFileSource::header_position_negative; +uint64_t AudioFileSource::header_position_offset; char AudioFileSource::bwf_country_code[3] = "US"; char AudioFileSource::bwf_organization_code[4] = "LAS"; @@ -122,7 +122,6 @@ AudioFileSource::init (string pathstr, bool must_exist) next_peak_clear_should_notify = false; if (!find (pathstr, must_exist, is_new)) { - cerr << "cannot find " << pathstr << " with me = " << must_exist << endl; return -1; } @@ -211,16 +210,16 @@ AudioFileSource::create (const XMLNode& node) #ifdef HAVE_COREAUDIO AudioFileSource* -AudioFileSource::create (const string& idstr) +AudioFileSource::create (const string& idstr, Flag flags) { AudioFileSource* es = 0; try { - es = new CoreAudioSource (idstr); + es = new CoreAudioSource (idstr, flags); } catch (failed_constructor& err) { - es = new SndFileSource (idstr); + es = new SndFileSource (idstr, flags); } return es; @@ -229,9 +228,9 @@ AudioFileSource::create (const string& idstr) #else AudioFileSource* -AudioFileSource::create (string idstr) +AudioFileSource::create (const string& idstr, Flag flags) { - return new SndFileSource (idstr); + return new SndFileSource (idstr, flags); } #endif // HAVE_COREAUDIO @@ -595,33 +594,28 @@ AudioFileSource::set_search_path (string p) void AudioFileSource::set_header_position_offset (jack_nframes_t offset, bool negative) { - time_t tnow; - - time (&tnow); - header_position_offset = offset; header_position_negative = negative; - HeaderPositionOffsetChanged (localtime (&tnow), tnow); /* EMIT SIGNAL */ -} -void -AudioFileSource::set_timeline_position (jack_nframes_t pos) -{ - timeline_position = pos; + HeaderPositionOffsetChanged (); } -void -AudioFileSource::handle_header_position_change (struct tm* now, time_t tnow) +void +AudioFileSource::handle_header_position_change () { - /* don't do this if the file has never had its header flushed to disk yet */ - - if (writable() && _timestamp) { + if (writable()) { set_header_timeline_position (); flush_header (); } } void +AudioFileSource::set_timeline_position (jack_nframes_t pos) +{ + timeline_position = pos; +} + +void AudioFileSource::set_allow_remove_if_empty (bool yn) { if (writable()) { @@ -655,8 +649,14 @@ AudioFileSource::set_name (string newname, bool destructive) bool AudioFileSource::is_empty (string path) { - /* XXX fix me */ + bool ret = false; + AudioFileSource* afs = create (path, NoPeakFile); - return false; + if (afs) { + ret = (afs->length() == 0); + delete afs; + } + + return ret; } diff --git a/libs/ardour/coreaudio_source.cc b/libs/ardour/coreaudiosource.cc index 1b0ee565e7..55409a8524 100644 --- a/libs/ardour/coreaudio_source.cc +++ b/libs/ardour/coreaudiosource.cc @@ -18,8 +18,7 @@ */ #include <pbd/error.h> - -#include <ardour/coreaudio_source.h> +#include <ardour/coreaudiosource.h> #include "i18n.h" @@ -31,22 +30,21 @@ using namespace PBD; CoreAudioSource::CoreAudioSource (const XMLNode& node) : AudioFileSource (node) { - init (_name, true); + init (_name); + AudioSourceCreated (this); /* EMIT SIGNAL */ } -CoreAudioSource::CoreAudioSource (const string& idstr, bool build_peak) - : AudioFileSource(idstr, build_peak) +CoreAudioSource::CoreAudioSource (const string& idstr, Flag flags) + : AudioFileSource(idstr, flags) { - init (idstr, build_peak); + init (idstr); - if (build_peak) { - AudioSourceCreated (this); /* EMIT SIGNAL */ - } + AudioSourceCreated (this); /* EMIT SIGNAL */ } void -CoreAudioSource::init (const string& idstr, bool build_peak) +CoreAudioSource::init (const string& idstr) { string::size_type pos; string file; @@ -132,7 +130,7 @@ CoreAudioSource::init (const string& idstr, bool build_peak) throw failed_constructor (); } - if (build_peak) { + if (_build_peakfiles) { if (initialize_peakfile (false, file)) { error << "initialize peakfile failed" << endmsg; ExtAudioFileDispose (af); @@ -155,7 +153,7 @@ CoreAudioSource::~CoreAudioSource () } jack_nframes_t -CoreAudioSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const +CoreAudioSource::read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const { OSStatus err = noErr; diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 0af4af4f7c..fdf9092308 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -55,10 +55,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -//sigc::signal<void,MidiDiskstream*> MidiDiskstream::MidiDiskstreamCreated; sigc::signal<void,list<SMFSource*>*> MidiDiskstream::DeleteSources; -//sigc::signal<void> MidiDiskstream::DiskOverrun; -//sigc::signal<void> MidiDiskstream::DiskUnderrun; MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::Flag flag) : Diskstream(sess, name, flag) @@ -154,13 +151,13 @@ MidiDiskstream::find_and_use_playlist (const string& name) Playlist* pl; MidiPlaylist* playlist; - if ((pl = _session.get_playlist (name)) == 0) { - error << string_compose(_("MidiDiskstream: Session doesn't know about a Playlist called \"%1\""), name) << endmsg; - return -1; + if ((pl = _session.playlist_by_name (name)) == 0) { + playlist = new MidiPlaylist(_session, name); + pl = playlist; } if ((playlist = dynamic_cast<MidiPlaylist*> (pl)) == 0) { - error << string_compose(_("MidiDiskstream: Playlist \"%1\" isn't an midi playlist"), name) << endmsg; + error << string_compose(_("MidiDiskstream: Playlist \"%1\" isn't a midi playlist"), name) << endmsg; return -1; } diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index d4f7be1e6f..4a9febcdca 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -186,32 +186,30 @@ MidiTrack::set_diskstream (MidiDiskstream& ds, void *src) int MidiTrack::use_diskstream (string name) { - /* MidiDiskstream *dstream; - if ((dstream = _session.diskstream_by_name (name)) == 0) { + if ((dstream = dynamic_cast<MidiDiskstream*>(_session.diskstream_by_name (name))) == 0) { PBD::error << string_compose(_("MidiTrack: diskstream \"%1\" not known by session"), name) << endmsg; return -1; } return set_diskstream (*dstream, this); - */ + return 0; } int MidiTrack::use_diskstream (id_t id) { - /* MidiDiskstream *dstream; - if ((dstream = _session.diskstream_by_id (id)) == 0) { + if ((dstream = dynamic_cast<MidiDiskstream*>(_session.diskstream_by_id (id))) == 0) { PBD::error << string_compose(_("MidiTrack: diskstream \"%1\" not known by session"), id) << endmsg; return -1; } return set_diskstream (*dstream, this); - */ + return 0; } diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index 2d1f8ffcbd..9fc6c57909 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -127,10 +127,16 @@ Plugin::MIDIPortControl::set_value (float value) value = 0.0; } } else { - value = lower + (range * value); - - if (logarithmic) { - value = exp(value); + + if (!logarithmic) { + value = lower + (range * value); + } else { + float _lower = 0.0f; + if (lower > 0.0f) { + _lower = log(lower); + } + + value = exp(_lower + log(range) * value); } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index c6c6f0444c..2fcd09a31c 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -462,10 +462,10 @@ Session::~Session () } #ifdef TRACK_DESTRUCTION - cerr << "delete audio_diskstreams\n"; + cerr << "delete diskstreams\n"; #endif /* TRACK_DESTRUCTION */ - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ) { - AudioDiskstreamList::iterator tmp; + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ) { + DiskstreamList::iterator tmp; tmp = i; ++tmp; @@ -973,7 +973,7 @@ Session::set_auto_input (bool yn) The rarity and short potential lock duration makes this "OK" */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (!auto_input); @@ -991,7 +991,7 @@ Session::reset_input_monitor_state () { if (transport_rolling()) { Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (Config->get_use_hardware_monitoring() && !auto_input); @@ -999,7 +999,7 @@ Session::reset_input_monitor_state () } } else { Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (Config->get_use_hardware_monitoring()); @@ -1080,7 +1080,7 @@ Session::auto_loop_changed (Location* location) } else if (seamless_loop && !loop_changing) { - // schedule a locate-roll to refill the audio_diskstreams at the + // schedule a locate-roll to refill the diskstreams at the // previous loop end loop_changing = true; @@ -1277,7 +1277,7 @@ Session::enable_record () */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { (*i)->monitor_input (true); } @@ -1316,7 +1316,7 @@ Session::disable_record (bool rt_context, bool force) */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { (*i)->monitor_input (false); } @@ -1343,7 +1343,7 @@ Session::step_back_from_record () */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (auto_input && (*i)->record_enabled ()) { //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (false); @@ -1512,7 +1512,7 @@ Session::set_block_size (jack_nframes_t nframes) (*i)->set_block_size (nframes); } - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->set_block_size (nframes); } @@ -2115,21 +2115,14 @@ Session::add_route (Route* route) } void -Session::add_diskstream (Diskstream* s) +Session::add_diskstream (Diskstream* dstream) { - // FIXME: temporary. duh. - AudioDiskstream* dstream = dynamic_cast<AudioDiskstream*>(s); - if (!dstream) { - cerr << "FIXME: Non Audio Diskstream" << endl; - return; - } - /* need to do this in case we're rolling at the time, to prevent false underruns */ dstream->non_realtime_do_refill(); { Glib::RWLock::WriterLock lm (diskstream_lock); - audio_diskstreams.push_back (dstream); + diskstreams.push_back (dstream); } /* take a reference to the diskstream, preventing it from @@ -2194,7 +2187,7 @@ Session::remove_route (Route& route) { Glib::RWLock::WriterLock lm (diskstream_lock); - audio_diskstreams.remove (ds); + diskstreams.remove (ds); } ds->unref (); @@ -2483,7 +2476,7 @@ Session::get_maximum_extent () const ensure atomicity. */ - for (AudioDiskstreamList::const_iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { Playlist* pl = (*i)->playlist(); if ((me = pl->get_maximum_extent()) > max) { max = me; @@ -2499,7 +2492,7 @@ Session::diskstream_by_name (string name) Glib::RWLock::ReaderLock lm (diskstream_lock); // FIXME: duh - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->name() == name) { return* i; } @@ -2514,7 +2507,7 @@ Session::diskstream_by_id (id_t id) Glib::RWLock::ReaderLock lm (diskstream_lock); // FIXME: duh - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->id() == id) { return *i; } @@ -2840,7 +2833,7 @@ Session::remove_last_capture () Glib::RWLock::ReaderLock lm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { list<Region*>& l = (*i)->last_capture_regions(); if (!l.empty()) { @@ -3152,18 +3145,6 @@ Session::create_audio_source_for_session (AudioDiskstream& ds, uint32_t chan, bo /* Playlist management */ Playlist * -Session::get_playlist (string name) -{ - Playlist* ret = 0; - - if ((ret = playlist_by_name (name)) == 0) { - ret = new AudioPlaylist (*this, name); - } - - return ret; -} - -Playlist * Session::playlist_by_name (string name) { Glib::Mutex::Lock lm (playlist_lock); @@ -3385,29 +3366,30 @@ Session::set_all_mute (bool yn) } uint32_t -Session::n_audio_diskstreams () const +Session::n_diskstreams () const { Glib::RWLock::ReaderLock lm (diskstream_lock); uint32_t n = 0; - for (AudioDiskstreamList::const_iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { n++; } } return n; } - +/* void Session::foreach_audio_diskstream (void (AudioDiskstream::*func)(void)) { Glib::RWLock::ReaderLock lm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { ((*i)->*func)(); } } } +*/ void Session::graph_reordered () @@ -3429,7 +3411,7 @@ Session::graph_reordered () reflect any changes in latencies within the graph. */ - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->set_capture_offset (); } } @@ -3712,7 +3694,7 @@ Session::reset_native_file_format () //RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__); Glib::RWLock::ReaderLock lm2 (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->reset_write_sources (false); } } diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc index b1451912d0..f0a2af0a83 100644 --- a/libs/ardour/session_butler.cc +++ b/libs/ardour/session_butler.cc @@ -168,7 +168,7 @@ Session::butler_thread_work () struct timeval begin, end; struct pollfd pfd[1]; bool disk_work_outstanding = false; - AudioDiskstreamList::iterator i; + DiskstreamList::iterator i; butler_mixdown_buffer = new Sample[AudioDiskstream::disk_io_frames()]; butler_gain_buffer = new gain_t[AudioDiskstream::disk_io_frames()]; @@ -239,7 +239,7 @@ Session::butler_thread_work () } } - //for (i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + //for (i = diskstreams.begin(); i != diskstreams.end(); ++i) { // cerr << "BEFORE " << (*i)->name() << ": pb = " << (*i)->playback_buffer_load() << " cp = " << (*i)->capture_buffer_load() << endl; //} @@ -255,15 +255,17 @@ Session::butler_thread_work () Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (i = audio_diskstreams.begin(); !transport_work_requested() && butler_should_run && i != audio_diskstreams.end(); ++i) { + for (i = diskstreams.begin(); !transport_work_requested() && butler_should_run && i != diskstreams.end(); ++i) { // cerr << "rah fondr " << (*i)->io()->name () << endl; + AudioDiskstream* ads = dynamic_cast<AudioDiskstream*>(*i); + if (!ads) continue; // FIXME - switch ((*i)->do_refill (butler_mixdown_buffer, butler_gain_buffer, conv_buffer)) { + switch (ads->do_refill (butler_mixdown_buffer, butler_gain_buffer, conv_buffer)) { case 0: - bytes += (*i)->read_data_count(); + bytes += ads->read_data_count(); break; case 1: - bytes += (*i)->read_data_count(); + bytes += ads->read_data_count(); disk_work_outstanding = true; break; @@ -275,7 +277,7 @@ Session::butler_thread_work () } - if (i != audio_diskstreams.end()) { + if (i != diskstreams.end()) { /* we didn't get to all the streams */ disk_work_outstanding = true; } @@ -297,7 +299,7 @@ Session::butler_thread_work () compute_io = true; gettimeofday (&begin, 0); - for (i = audio_diskstreams.begin(); !transport_work_requested() && butler_should_run && i != audio_diskstreams.end(); ++i) { + for (i = diskstreams.begin(); !transport_work_requested() && butler_should_run && i != diskstreams.end(); ++i) { // cerr << "write behind for " << (*i)->name () << endl; switch ((*i)->do_flush (conv_buffer)) { @@ -326,7 +328,7 @@ Session::butler_thread_work () request_stop (); } - if (i != audio_diskstreams.end()) { + if (i != diskstreams.end()) { /* we didn't get to all the streams */ disk_work_outstanding = true; } @@ -353,7 +355,7 @@ Session::butler_thread_work () Glib::Mutex::Lock lm (butler_request_lock); if (butler_should_run && (disk_work_outstanding || transport_work_requested())) { -// for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { +// for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { // cerr << "AFTER " << (*i)->name() << ": pb = " << (*i)->playback_buffer_load() << " cp = " << (*i)->capture_buffer_load() << endl; // } @@ -393,7 +395,7 @@ Session::overwrite_some_buffers (Diskstream* ds) } else { Glib::RWLock::ReaderLock dm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->set_pending_overwrite (true); } } diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index ddced9cc5f..37365c8403 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -495,7 +495,7 @@ Session::prepare_to_export (AudioExportSpecification& spec) { Glib::RWLock::ReaderLock lm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)-> seek (spec.start_frame, true)) { error << string_compose (_("%1: cannot seek to %2 for export"), (*i)->name(), spec.start_frame) diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 23e7757c9d..9e3809f6b8 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -74,7 +74,7 @@ Session::process (jack_nframes_t nframes) void Session::prepare_diskstreams () { - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->prepare (); } } @@ -151,7 +151,7 @@ Session::process_routes (jack_nframes_t nframes, jack_nframes_t offset) call path, so make sure we release any outstanding locks here before we return failure. */ - for (AudioDiskstreamList::iterator ids = audio_diskstreams.begin(); ids != audio_diskstreams.end(); ++ids) { + for (DiskstreamList::iterator ids = diskstreams.begin(); ids != diskstreams.end(); ++ids) { (*ids)->recover (); } @@ -190,7 +190,7 @@ Session::silent_process_routes (jack_nframes_t nframes, jack_nframes_t offset) call path, so make sure we release any outstanding locks here before we return failure. */ - for (AudioDiskstreamList::iterator ids = audio_diskstreams.begin(); ids != audio_diskstreams.end(); ++ids) { + for (DiskstreamList::iterator ids = diskstreams.begin(); ids != diskstreams.end(); ++ids) { (*ids)->recover (); } @@ -209,7 +209,7 @@ Session::commit_diskstreams (jack_nframes_t nframes, bool &needs_butler) float pworst = 1.0f; float cworst = 1.0f; - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->hidden()) { continue; @@ -579,7 +579,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset) bool ok = true; jack_nframes_t frame_delta = slave_transport_frame - _transport_frame; - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->can_internal_playback_seek (frame_delta)) { ok = false; break; @@ -587,7 +587,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset) } if (ok) { - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->internal_playback_seek (frame_delta); } _transport_frame += frame_delta; diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 12092b1bad..9f21eb5c4e 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -59,6 +59,7 @@ #include <ardour/configuration.h> #include <ardour/session.h> #include <ardour/audio_diskstream.h> +#include <ardour/midi_diskstream.h> #include <ardour/utils.h> #include <ardour/audioplaylist.h> #include <ardour/audiofilesource.h> @@ -270,7 +271,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) AudioSource::AudioSourceCreated.connect (mem_fun (*this, &Session::add_audio_source)); Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist)); Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect)); - AudioDiskstream::DiskstreamCreated.connect (mem_fun (*this, &Session::add_diskstream)); + Diskstream::DiskstreamCreated.connect (mem_fun (*this, &Session::add_diskstream)); NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection)); IO::MoreOutputs.connect (mem_fun (*this, &Session::ensure_passthru_buffers)); @@ -624,12 +625,16 @@ Session::load_diskstreams (const XMLNode& node) clist = node.children(); for (citer = clist.begin(); citer != clist.end(); ++citer) { - - AudioDiskstream* dstream; + Diskstream* dstream = NULL; try { - dstream = new AudioDiskstream (*this, **citer); - /* added automatically by AudioDiskstreamCreated handler */ + if ((*citer)->name() == "AudioDiskstream") { + dstream = new AudioDiskstream (*this, **citer); + /* added automatically by DiskstreamCreated handler */ + } else { + assert((*citer)->name() == "MidiDiskstream"); + dstream = new MidiDiskstream (*this, **citer); + } } catch (failed_constructor& err) { @@ -1380,7 +1385,7 @@ Session::state(bool full_state) { Glib::RWLock::ReaderLock dl (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { child->add_child_nocopy ((*i)->get_state()); } diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc index 0db3afcee6..494a78ae88 100644 --- a/libs/ardour/session_time.cc +++ b/libs/ardour/session_time.cc @@ -113,7 +113,6 @@ Session::set_smpte_offset_negative (bool neg) SMPTEOffsetChanged (); /* EMIT SIGNAL */ } - void Session::smpte_to_sample( SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const { diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index d7ab60f3fb..6a92d71d1c 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -206,7 +206,7 @@ Session::butler_transport_work () } if (post_transport_work & PostTransportInputChange) { - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->non_realtime_input_change (); } } @@ -222,7 +222,7 @@ Session::butler_transport_work () cumulative_rf_motion = 0; reset_rf_scale (0); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) { (*i)->seek ((jack_nframes_t) (_transport_frame * (double) (*i)->speed())); @@ -254,7 +254,7 @@ Session::non_realtime_set_speed () { Glib::RWLock::ReaderLock lm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->non_realtime_set_speed (); } } @@ -264,7 +264,7 @@ Session::non_realtime_overwrite () { Glib::RWLock::ReaderLock lm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->pending_overwrite) { (*i)->overwrite_existing_buffers (); } @@ -280,7 +280,7 @@ Session::non_realtime_stop (bool abort) did_record = false; - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->get_captured_frames () != 0) { did_record = true; break; @@ -333,7 +333,7 @@ Session::non_realtime_stop (bool abort) _have_captured = true; } - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->transport_stopped (*now, xnow, abort); } @@ -370,7 +370,7 @@ Session::non_realtime_stop (bool abort) } #endif - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) { (*i)->seek ((jack_nframes_t) (_transport_frame * (double) (*i)->speed())); @@ -494,7 +494,7 @@ Session::set_auto_loop (bool yn) if (seamless_loop) { // set all diskstreams to use internal looping - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { (*i)->set_loop (loc); } @@ -502,7 +502,7 @@ Session::set_auto_loop (bool yn) } else { // set all diskstreams to NOT use internal looping - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { (*i)->set_loop (0); } @@ -532,7 +532,7 @@ Session::set_auto_loop (bool yn) clear_events (Event::AutoLoop); // set all diskstreams to NOT use internal looping - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { (*i)->set_loop (0); } @@ -653,7 +653,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b The rarity and short potential lock duration makes this "OK" */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (!auto_input); @@ -668,7 +668,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b The rarity and short potential lock duration makes this "OK" */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (true); @@ -714,7 +714,7 @@ Session::set_transport_speed (float speed, bool abort) The rarity and short potential lock duration makes this "OK" */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (true); @@ -740,7 +740,7 @@ Session::set_transport_speed (float speed, bool abort) The rarity and short potential lock duration makes this "OK" */ Glib::RWLock::ReaderLock dsm (diskstream_lock); - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (auto_input && (*i)->record_enabled ()) { //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl; (*i)->monitor_input (false); @@ -791,7 +791,7 @@ Session::set_transport_speed (float speed, bool abort) _last_transport_speed = _transport_speed; _transport_speed = speed; - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->realtime_set_speed ((*i)->speed(), true)) { post_transport_work = PostTransportWork (post_transport_work | PostTransportSpeed); } @@ -881,7 +881,7 @@ Session::actually_start_transport () transport_sub_state |= PendingDeclickIn; _transport_speed = 1.0; - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->realtime_set_speed ((*i)->speed(), true); } @@ -1014,7 +1014,7 @@ Session::set_slave_source (SlaveSource src, jack_nframes_t frame) _slave_type = src; - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { if ((*i)->realtime_set_speed ((*i)->speed(), true)) { non_rt_required = true; @@ -1242,7 +1242,7 @@ Session::update_latency_compensation (bool with_stop, bool abort) /* reflect any changes in latencies into capture offsets */ - for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) { + for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->set_capture_offset (); } } diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index 24a70f636b..443a24e3c2 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -55,6 +55,7 @@ SndFileSource::SndFileSource (const XMLNode& node) } SndFileSource::SndFileSource (string idstr, Flag flags) + /* files created this way are never writable or removable */ : AudioFileSource (idstr, Flag (flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy))) { init (idstr); @@ -63,7 +64,7 @@ SndFileSource::SndFileSource (string idstr, Flag flags) throw failed_constructor (); } - if (_build_peakfiles) { + if (!(_flags & NoPeakFile) && _build_peakfiles) { if (initialize_peakfile (false, _path)) { sf_close (sf); sf = 0; @@ -170,9 +171,10 @@ SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf, delete _broadcast_info; _broadcast_info = 0; } + } - if (_build_peakfiles) { + if (!(_flags & NoPeakFile) && _build_peakfiles) { if (initialize_peakfile (true, _path)) { sf_close (sf); sf = 0; @@ -180,12 +182,6 @@ SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf, } } - /* since SndFileSource's constructed with this constructor can be writable, make sure we update if the header info changes */ - - if (writable()) { - HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioFileSource::handle_header_position_change)); - } - AudioSourceCreated (this); /* EMIT SIGNAL */ } @@ -235,34 +231,56 @@ SndFileSource::open () _length = _info.frames; + + _broadcast_info = (SF_BROADCAST_INFO*) calloc (1, sizeof (SF_BROADCAST_INFO)); + + /* lookup broadcast info */ + + if (sf_command (sf, SFC_GET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) { + + /* if the file has data but no broadcast info, then clearly, there is no broadcast info */ + + if (_length) { + free (_broadcast_info); + _broadcast_info = 0; + _flags = Flag (_flags & ~Broadcast); + } + + } else { + + /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits + of the time reference. + */ + + set_timeline_position (_broadcast_info->time_reference_low); + } + if (writable()) { sf_command (sf, SFC_SET_UPDATE_HEADER_AUTO, 0, SF_FALSE); + + /* update header if header offset info changes */ + + AudioFileSource::HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioFileSource::handle_header_position_change)); } return 0; } -void -SndFileSource::close () +SndFileSource::~SndFileSource () { + GoingAway (this); /* EMIT SIGNAL */ + if (sf) { sf_close (sf); sf = 0; } -} - -SndFileSource::~SndFileSource () -{ - GoingAway (this); /* EMIT SIGNAL */ - - close (); if (interleave_buf) { delete [] interleave_buf; } if (_broadcast_info) { - delete [] _broadcast_info; + free (_broadcast_info); } } @@ -404,27 +422,38 @@ SndFileSource::write_unlocked (Sample *data, jack_nframes_t cnt, char * workbuf) int SndFileSource::update_header (jack_nframes_t when, struct tm& now, time_t tnow) { - /* allow derived classes to override how this is done */ - set_timeline_position (when); if (_flags & Broadcast) { - /* this will flush the header implicitly */ - return setup_broadcast_info (when, now, tnow); - } else { - return flush_header (); - } + if (setup_broadcast_info (when, now, tnow)) { + return -1; + } + } + + return flush_header (); } int SndFileSource::flush_header () { + if (!writable() || (sf == 0)) { + return -1; + } + return (sf_command (sf, SFC_UPDATE_HEADER_NOW, 0, 0) != SF_TRUE); } int SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t tnow) { + if (!writable()) { + return -1; + } + + if (!(_flags & Broadcast)) { + return 0; + } + /* random code is 9 digits */ int random_code = random() % 999999999; @@ -452,12 +481,10 @@ SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t set_header_timeline_position (); - /* note that libsndfile flushes the header to disk when resetting the broadcast info */ - if (sf_command (sf, SFC_SET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) { error << string_compose (_("cannot set broadcast info for audio file %1; Dropping broadcast info for this file"), _path) << endmsg; _flags = Flag (_flags & ~Broadcast); - delete _broadcast_info; + free (_broadcast_info); _broadcast_info = 0; return -1; } @@ -470,6 +497,10 @@ SndFileSource::set_header_timeline_position () { uint64_t pos; + if (!(_flags & Broadcast)) { + return; + } + _broadcast_info->time_reference_high = 0; if (header_position_negative) { @@ -491,6 +522,13 @@ SndFileSource::set_header_timeline_position () _broadcast_info->time_reference_high = (pos >> 32); _broadcast_info->time_reference_low = (pos & 0xffffffff); + + if (sf_command (sf, SFC_SET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) { + error << string_compose (_("cannot set broadcast info for audio file %1; Dropping broadcast info for this file"), _path) << endmsg; + _flags = Flag (_flags & ~Broadcast); + free (_broadcast_info); + _broadcast_info = 0; + } } jack_nframes_t |