summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-07-05 19:47:25 +0000
committerDavid Robillard <d@drobilla.net>2006-07-05 19:47:25 +0000
commit22c20ab6f215c0ab24702a479aa6821c25a7d058 (patch)
tree3f606773d2082fd3f28857e1c1ef876d2e007559 /libs/ardour
parent5dc4abef7951c1a1b85fb6b9dbb194d73b8c4c2b (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')
-rw-r--r--libs/ardour/SConscript4
-rw-r--r--libs/ardour/ardour/audiofilesource.h8
-rw-r--r--libs/ardour/ardour/coreaudiosource.h (renamed from libs/ardour/ardour/coreaudio_source.h)11
-rw-r--r--libs/ardour/ardour/destructive_filesource.h3
-rw-r--r--libs/ardour/ardour/diskstream.h9
-rw-r--r--libs/ardour/ardour/session.h30
-rw-r--r--libs/ardour/ardour/session_diskstream.h4
-rw-r--r--libs/ardour/ardour/sndfilesource.h5
-rw-r--r--libs/ardour/audio_diskstream.cc10
-rw-r--r--libs/ardour/audio_playlist.cc2
-rw-r--r--libs/ardour/audio_track.cc8
-rw-r--r--libs/ardour/audiofilesource.cc54
-rw-r--r--libs/ardour/coreaudiosource.cc (renamed from libs/ardour/coreaudio_source.cc)22
-rw-r--r--libs/ardour/midi_diskstream.cc11
-rw-r--r--libs/ardour/midi_track.cc10
-rw-r--r--libs/ardour/plugin.cc14
-rw-r--r--libs/ardour/session.cc68
-rw-r--r--libs/ardour/session_butler.cc24
-rw-r--r--libs/ardour/session_export.cc2
-rw-r--r--libs/ardour/session_process.cc12
-rw-r--r--libs/ardour/session_state.cc17
-rw-r--r--libs/ardour/session_time.cc1
-rw-r--r--libs/ardour/session_transport.cc36
-rw-r--r--libs/ardour/sndfilesource.cc94
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