summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/audio_track.h11
-rw-r--r--libs/ardour/ardour/auditioner.h6
-rw-r--r--libs/ardour/ardour/disk_io.h14
-rw-r--r--libs/ardour/ardour/disk_reader.h9
-rw-r--r--libs/ardour/ardour/disk_writer.h40
-rw-r--r--libs/ardour/ardour/midi_track.h6
-rw-r--r--libs/ardour/ardour/public_diskstream.h2
-rw-r--r--libs/ardour/ardour/route.h7
-rw-r--r--libs/ardour/ardour/track.h32
9 files changed, 63 insertions, 64 deletions
diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h
index 7103825daf..2779e6a4f8 100644
--- a/libs/ardour/ardour/audio_track.h
+++ b/libs/ardour/ardour/audio_track.h
@@ -40,13 +40,6 @@ class LIBARDOUR_API AudioTrack : public Track
int roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
int declick, bool& need_butler);
- boost::shared_ptr<Diskstream> create_diskstream ();
- void set_diskstream (boost::shared_ptr<Diskstream>);
-
- DataType data_type () const {
- return DataType::AUDIO;
- }
-
void freeze_me (InterThreadInfo&);
void unfreeze ();
@@ -62,13 +55,9 @@ class LIBARDOUR_API AudioTrack : public Track
boost::shared_ptr<AudioFileSource> write_source (uint32_t n = 0);
protected:
- boost::shared_ptr<AudioDiskstream> audio_diskstream () const;
XMLNode& state (bool full);
private:
-
- boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &);
-
int deprecated_use_diskstream_connections ();
void set_state_part_two ();
void set_state_part_three ();
diff --git a/libs/ardour/ardour/auditioner.h b/libs/ardour/ardour/auditioner.h
index 48d889344a..1dbe0cd81e 100644
--- a/libs/ardour/ardour/auditioner.h
+++ b/libs/ardour/ardour/auditioner.h
@@ -80,9 +80,6 @@ class LIBARDOUR_API Auditioner : public Track
int roll_audio (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler);
int roll_midi (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler);
- boost::shared_ptr<Diskstream> create_diskstream ();
- void set_diskstream (boost::shared_ptr<Diskstream> ds);
-
/* fake track */
void set_state_part_two () {}
int set_state (const XMLNode&, int) { return 0; }
@@ -102,9 +99,6 @@ class LIBARDOUR_API Auditioner : public Track
boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &)
{ return boost::shared_ptr<Diskstream> (); }
- boost::shared_ptr<AudioDiskstream> audio_diskstream() const;
- boost::shared_ptr<MidiDiskstream> midi_diskstream() const;
-
private:
boost::shared_ptr<AudioRegion> the_region;
boost::shared_ptr<MidiRegion> midi_region;
diff --git a/libs/ardour/ardour/disk_io.h b/libs/ardour/ardour/disk_io.h
index dd775cbe84..c10dad54a1 100644
--- a/libs/ardour/ardour/disk_io.h
+++ b/libs/ardour/ardour/disk_io.h
@@ -65,12 +65,11 @@ class LIBARDOUR_API DiskIOProcessor : public Processor
bool configure_io (ChanCount in, ChanCount out);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
- /** @return A number between 0 and 1, where 0 indicates that the playback buffer
+ /** @return A number between 0 and 1, where 0 indicates that the playback/capture buffer
* is dry (ie the disk subsystem could not keep up) and 1 indicates that the
* buffer is full.
*/
- virtual float playback_buffer_load() const = 0;
- virtual float capture_buffer_load() const = 0;
+ virtual float buffer_load() const = 0;
void set_flag (Flag f) { _flags = Flag (_flags | f); }
void unset_flag (Flag f) { _flags = Flag (_flags & ~f); }
@@ -89,8 +88,6 @@ class LIBARDOUR_API DiskIOProcessor : public Processor
virtual void punch_in() {}
virtual void punch_out() {}
- virtual float buffer_load() const = 0;
-
bool slaved() const { return _slaved; }
void set_slaved(bool yn) { _slaved = yn; }
@@ -113,8 +110,6 @@ class LIBARDOUR_API DiskIOProcessor : public Processor
virtual void playlist_modified () {}
virtual int use_playlist (DataType, boost::shared_ptr<Playlist>);
- virtual int use_new_playlist (DataType);
- virtual int use_copy_playlist (DataType);
PBD::Signal1<void,DataType> PlaylistChanged;
@@ -135,6 +130,8 @@ class LIBARDOUR_API DiskIOProcessor : public Processor
bool _slaved;
Location* loop_location;
bool in_set_state;
+ framepos_t file_frame;
+ framepos_t playback_sample;
framecnt_t wrap_buffer_size;
framecnt_t speed_buffer_size;
bool _need_butler;
@@ -202,7 +199,6 @@ class LIBARDOUR_API DiskIOProcessor : public Processor
virtual void playlist_changed (const PBD::PropertyChange&) {}
virtual void playlist_deleted (boost::weak_ptr<Playlist>);
virtual void playlist_ranges_moved (std::list< Evoral::RangeMove<framepos_t> > const &, bool) {}
- int find_and_use_playlist (DataType, std::string const &);
/* The MIDI stuff */
@@ -210,6 +206,8 @@ class LIBARDOUR_API DiskIOProcessor : public Processor
gint _frames_written_to_ringbuffer;
gint _frames_read_from_ringbuffer;
CubicMidiInterpolation midi_interpolation;
+
+ static void get_location_times (const Location* location, framepos_t* start, framepos_t* end, framepos_t* length);
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/disk_reader.h b/libs/ardour/ardour/disk_reader.h
index 7b076ab23f..e09904ad34 100644
--- a/libs/ardour/ardour/disk_reader.h
+++ b/libs/ardour/ardour/disk_reader.h
@@ -86,14 +86,18 @@ class LIBARDOUR_API DiskReader : public DiskIOProcessor
void adjust_buffering ();
int can_internal_playback_seek (framecnt_t distance);
+ int internal_playback_seek (framecnt_t distance);
int seek (framepos_t frame, bool complete_refill = false);
static PBD::Signal0<void> Underrun;
void playlist_modified ();
+ void reset_tracker ();
protected:
- void reset_tracker ();
+ friend class Track;
+ friend class MidiTrack;
+
void resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time);
boost::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
@@ -113,8 +117,6 @@ class LIBARDOUR_API DiskReader : public DiskIOProcessor
IOChange input_change_pending;
framecnt_t wrap_buffer_size;
framecnt_t speed_buffer_size;
- framepos_t file_frame;
- framepos_t playback_sample;
MonitorChoice _monitoring_choice;
int _do_refill_with_alloc (bool partial_fill);
@@ -142,7 +144,6 @@ class LIBARDOUR_API DiskReader : public DiskIOProcessor
int refill_audio (Sample *mixdown_buffer, float *gain_buffer, framecnt_t fill_level);
int refill_midi ();
- int internal_playback_seek (framecnt_t distance);
frameoffset_t calculate_playback_distance (pframes_t);
void get_playback (MidiBuffer& dst, framecnt_t nframes);
diff --git a/libs/ardour/ardour/disk_writer.h b/libs/ardour/ardour/disk_writer.h
index 3eed3c6d99..d0f3672cbd 100644
--- a/libs/ardour/ardour/disk_writer.h
+++ b/libs/ardour/ardour/disk_writer.h
@@ -24,12 +24,14 @@
#include <vector>
#include "ardour/disk_io.h"
+#include "ardour/midi_buffer.h"
namespace ARDOUR
{
class AudioFileSource;
class SMFSource;
+class MidiSource;
class LIBARDOUR_API DiskWriter : public DiskIOProcessor
{
@@ -50,8 +52,6 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
virtual XMLNode& state (bool full);
int set_state (const XMLNode&, int version);
- virtual int use_new_write_source (uint32_t n=0) = 0;
-
std::string write_source_name () const {
if (_write_source_name.empty()) {
return name();
@@ -72,6 +72,8 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
boost::shared_ptr<SMFSource> midi_write_source () { return _midi_write_source; }
virtual std::string steal_write_source_name () { return std::string(); }
+ int use_new_write_source (DataType, uint32_t n = 0);
+ void reset_write_sources (bool, bool force = false);
AlignStyle alignment_style() const { return _alignment_style; }
AlignChoice alignment_choice() const { return _alignment_choice; }
@@ -87,8 +89,8 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
bool record_enabled() const { return g_atomic_int_get (const_cast<gint*>(&_record_enabled)); }
bool record_safe () const { return g_atomic_int_get (const_cast<gint*>(&_record_safe)); }
- virtual void set_record_enabled (bool yn) = 0;
- virtual void set_record_safe (bool yn) = 0;
+ virtual void set_record_enabled (bool yn);
+ virtual void set_record_safe (bool yn);
bool destructive() const { return _flags & Destructive; }
int set_destructive (bool yn);
@@ -109,16 +111,31 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
framecnt_t capture_offset() const { return _capture_offset; }
virtual void set_capture_offset ();
+ int seek (framepos_t frame, bool complete_refill);
+
static PBD::Signal0<void> Overrun;
+ void set_note_mode (NoteMode m);
+
+ /** Emitted when some MIDI data has been received for recording.
+ * Parameter is the source that it is destined for.
+ * A caller can get a copy of the data with get_gui_feed_buffer ()
+ */
+ PBD::Signal1<void, boost::weak_ptr<MidiSource> > DataRecorded;
+
PBD::Signal0<void> RecordEnableChanged;
PBD::Signal0<void> RecordSafeChanged;
+ void check_record_status (framepos_t transport_frame, bool can_record);
+
+ void transport_looped (framepos_t transport_frame);
+ void transport_stopped_wallclock (struct tm&, time_t, bool abort);
+
protected:
- virtual int do_flush (RunContext context, bool force = false) = 0;
+ friend class Track;
+ int do_flush (RunContext context, bool force = false);
void get_input_sources ();
- void check_record_status (framepos_t transport_frame, bool can_record);
void prepare_record_status (framepos_t /*capture_start_frame*/);
void set_align_style_from_io();
void setup_destructive_playlist ();
@@ -138,9 +155,6 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
framecnt_t& rec_nframes, framecnt_t& rec_offset
);
- static framecnt_t disk_read_chunk_frames;
- static framecnt_t disk_write_chunk_frames;
-
struct CaptureInfo {
framepos_t start;
framecnt_t frames;
@@ -168,7 +182,7 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
std::list<boost::shared_ptr<Source> > _last_capture_sources;
std::vector<boost::shared_ptr<AudioFileSource> > capturing_sources;
-
+
static framecnt_t _chunk_frames;
NoteMode _note_mode;
@@ -176,6 +190,12 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
volatile gint _num_captured_loops;
framepos_t _accumulated_capture_offset;
+ /** A buffer that we use to put newly-arrived MIDI data in for
+ the GUI to read (so that it can update itself).
+ */
+ MidiBuffer _gui_feed_buffer;
+ mutable Glib::Threads::Mutex _gui_feed_buffer_mutex;
+
void finish_capture (boost::shared_ptr<ChannelList> c);
};
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index dc2d4ec2cf..ea6e4e3636 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -54,10 +54,6 @@ public:
bool can_be_record_enabled ();
bool can_be_record_safe ();
- DataType data_type () const {
- return DataType::MIDI;
- }
-
void freeze_me (InterThreadInfo&);
void unfreeze ();
@@ -156,8 +152,6 @@ private:
virtual boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &);
- boost::shared_ptr<MidiDiskstream> midi_diskstream () const;
-
void write_out_of_band_data (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, framecnt_t nframes);
void set_state_part_two ();
diff --git a/libs/ardour/ardour/public_diskstream.h b/libs/ardour/ardour/public_diskstream.h
index 1fc93a6674..a80219ff80 100644
--- a/libs/ardour/ardour/public_diskstream.h
+++ b/libs/ardour/ardour/public_diskstream.h
@@ -68,7 +68,7 @@ public:
virtual framepos_t current_capture_start () const = 0;
virtual framepos_t current_capture_end () const = 0;
virtual void playlist_modified () = 0;
- virtual int use_playlist (boost::shared_ptr<Playlist>) = 0;
+ // XXX DISK removed virtual int use_playlist (boost::shared_ptr<Playlist>) = 0;
virtual void set_align_style (AlignStyle, bool force=false) = 0;
virtual void set_align_choice (AlignChoice, bool force=false) = 0;
virtual int use_copy_playlist () = 0;
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 2c668f6ed7..619e79fafc 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -100,6 +100,13 @@ public:
virtual int init ();
+ DataType data_type () const {
+ /* XXX ultimately nice to do away with this concept, but it is
+ quite useful for coders and for users too.
+ */
+ return _default_type;
+ }
+
boost::shared_ptr<IO> input() const { return _input; }
boost::shared_ptr<IO> output() const { return _output; }
IOVector all_inputs () const;
diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h
index b67e9d970a..33c967f088 100644
--- a/libs/ardour/ardour/track.h
+++ b/libs/ardour/ardour/track.h
@@ -36,15 +36,19 @@ class RouteGroup;
class Source;
class Region;
class Diskstream;
+class DiskReader;
+class DiskWriter;
class IO;
class MonitorControl;
class RecordEnableControl;
class RecordSafeControl;
/** A track is an route (bus) with a recordable diskstream and
- * related objects relevant to tracking, playback and editing.
+ * related objects relevant to recording, playback and editing.
*
- * Specifically a track has regions and playlist objects.
+ * Specifically a track has a playlist object that describes material
+ * to be played from disk, and modifies that object during recording and
+ * editing.
*/
class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskstream
{
@@ -75,14 +79,8 @@ class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskst
bool needs_butler() const { return _needs_butler; }
- virtual DataType data_type () const = 0;
-
bool can_record();
- void use_new_diskstream ();
- virtual boost::shared_ptr<Diskstream> create_diskstream() = 0;
- virtual void set_diskstream (boost::shared_ptr<Diskstream>);
-
void set_latency_compensation (framecnt_t);
enum FreezeState {
@@ -179,18 +177,17 @@ class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskst
AlignChoice alignment_choice () const;
framepos_t current_capture_start () const;
framepos_t current_capture_end () const;
- void playlist_modified ();
- int use_playlist (boost::shared_ptr<Playlist>);
void set_align_style (AlignStyle, bool force=false);
void set_align_choice (AlignChoice, bool force=false);
+ void playlist_modified ();
+ int use_playlist (DataType, boost::shared_ptr<Playlist>);
+ int find_and_use_playlist (DataType, std::string const & name);
int use_copy_playlist ();
int use_new_playlist ();
void adjust_playback_buffering ();
void adjust_capture_buffering ();
- PBD::Signal0<void> DiskstreamChanged;
PBD::Signal0<void> FreezeChange;
- /* Emitted when our diskstream is set to use a different playlist */
PBD::Signal0<void> PlaylistChanged;
PBD::Signal0<void> SpeedChanged;
PBD::Signal0<void> AlignmentStyleChanged;
@@ -199,6 +196,11 @@ class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskst
XMLNode& state (bool full);
boost::shared_ptr<Diskstream> _diskstream;
+
+ boost::shared_ptr<DiskReader> _disk_reader;
+ boost::shared_ptr<DiskWriter> _disk_writer;
+ boost::shared_ptr<Playlist> _playlists[DataType::num_types];
+
MeterPoint _saved_meter_point;
TrackMode _mode;
bool _needs_butler;
@@ -245,12 +247,6 @@ class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskst
virtual void monitoring_changed (bool, PBD::Controllable::GroupControlDisposition);
private:
-
- virtual boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &) = 0;
-
- void diskstream_playlist_changed ();
- void diskstream_speed_changed ();
- void diskstream_alignment_style_changed ();
void parameter_changed (std::string const & p);
std::string _diskstream_name;