summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_diskstream.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-05-21 07:45:45 +0000
committerDavid Robillard <d@drobilla.net>2008-05-21 07:45:45 +0000
commit873d884fb2e88ac32930fb7c8ad907f4a681ccf4 (patch)
tree432102ac48907f2bfa6aa4cdaf5d26d2a2a1dac0 /libs/ardour/midi_diskstream.cc
parente9d9f8d8ccb843308087430285836474763941a8 (diff)
Separate audio and MIDI disk buffer size (and track read ahead) parameters.
Clean up and remove more unused stuff from MidiDiskstream. Remove false assumptions that MIDI ring buffer space (bytes) corresponds to disk I/O chunk length (frames). git-svn-id: svn://localhost/ardour2/branches/3.0@3375 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_diskstream.cc')
-rw-r--r--libs/ardour/midi_diskstream.cc78
1 files changed, 12 insertions, 66 deletions
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index b36e8da293..84fe21ce35 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -61,12 +61,7 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F
: Diskstream(sess, name, flag)
, _playback_buf(0)
, _capture_buf(0)
- //, _current_playback_buffer(0)
- //, _current_capture_buffer(0)
- //, _playback_wrap_buffer(0)
- //, _capture_wrap_buffer(0)
, _source_port(0)
- , _capture_transition_buf(0)
, _last_flush_frame(0)
, _note_mode(Sustained)
{
@@ -86,12 +81,7 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
: Diskstream(sess, node)
, _playback_buf(0)
, _capture_buf(0)
- //, _current_playback_buffer(0)
- //, _current_capture_buffer(0)
- //, _playback_wrap_buffer(0)
- //, _capture_wrap_buffer(0)
, _source_port(0)
- , _capture_transition_buf(0)
, _last_flush_frame(0)
, _note_mode(Sustained)
{
@@ -123,9 +113,8 @@ MidiDiskstream::init (Diskstream::Flag f)
set_block_size (_session.get_block_size());
allocate_temporary_buffers ();
- _playback_buf = new MidiRingBuffer (_session.diskstream_buffer_size());
- _capture_buf = new MidiRingBuffer (_session.diskstream_buffer_size());
- _capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
+ _playback_buf = new MidiRingBuffer (_session.midi_diskstream_buffer_size());
+ _capture_buf = new MidiRingBuffer (_session.midi_diskstream_buffer_size());
_n_channels = ChanCount(DataType::MIDI, 1);
@@ -141,10 +130,9 @@ MidiDiskstream::~MidiDiskstream ()
void
MidiDiskstream::non_realtime_locate (nframes_t position)
{
- //cerr << "MDS: non_realtime_locate: " << position << endl;
assert(_write_source);
_write_source->set_timeline_position (position);
- seek(position, true); // correct?
+ seek(position, false);
}
@@ -304,7 +292,6 @@ MidiDiskstream::set_destructive (bool yn)
void
MidiDiskstream::set_note_mode (NoteMode m)
{
- cout << "MDS: SET NOTE MODE: " << m << endl;
_note_mode = m;
midi_playlist()->set_note_mode(m);
if (_write_source && _write_source->model())
@@ -403,21 +390,6 @@ MidiDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframe
}
- if (_flags & Recordable) {
- RingBufferNPT<CaptureTransition>::rw_vector transvec;
- _capture_transition_buf->get_write_vector(&transvec);
-
- if (transvec.len[0] > 0) {
- transvec.buf[0]->type = CaptureStart;
- transvec.buf[0]->capture_val = capture_start_frame;
- _capture_transition_buf->increment_write_ptr(1);
- } else {
- // bad!
- fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
- << endmsg;
- }
- }
-
} else if (!record_enabled() || !can_record) {
/* stop recording */
@@ -468,7 +440,7 @@ MidiDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t
return 0;
}
- /* This lock is held until the end of AudioDiskstream::commit, so these two functions
+ /* This lock is held until the end of ::commit, so these two functions
must always be called as a pair. The only exception is if this function
returns a non-zero value, in which case, ::commit should not be called.
*/
@@ -642,12 +614,18 @@ MidiDiskstream::commit (nframes_t nframes)
adjust_capture_position = 0;
}
+ /* what audio does:
+ * can't do this with midi: write space is in bytes, chunk_frames is in frames
if (_slaved) {
need_butler = _playback_buf->write_space() >= _playback_buf->capacity() / 2;
} else {
need_butler = _playback_buf->write_space() >= disk_io_chunk_frames
|| _capture_buf->read_space() >= disk_io_chunk_frames;
- }
+ }*/
+
+ /* we'll just keep the playback buffer full for now.
+ * this should be decreased to reduce edit latency */
+ need_butler = _playback_buf->write_space() >= _playback_buf->capacity() / 2;
if (commit_should_unlock) {
state_lock.unlock();
@@ -664,9 +642,8 @@ MidiDiskstream::set_pending_overwrite (bool yn)
/* called from audio thread, so we can use the read ptr and playback sample as we wish */
pending_overwrite = yn;
-
+
overwrite_frame = playback_sample;
- //overwrite_offset = channels.front().playback_buf->get_read_ptr();
}
int
@@ -682,8 +659,6 @@ MidiDiskstream::seek (nframes_t frame, bool complete_refill)
Glib::Mutex::Lock lm (state_lock);
int ret = -1;
- //cerr << "MDS: seek: " << frame << endl;
-
_playback_buf->reset();
_capture_buf->reset();
@@ -826,35 +801,6 @@ MidiDiskstream::do_refill ()
return 0;
}
- /* if there are 2+ chunks of disk i/o possible for
- this track, let the caller know so that it can arrange
- for us to be called again, ASAP.
- */
-
- if (write_space >= (_slaved?3:2) * disk_io_chunk_frames) {
- ret = 1;
- }
-
- /* if we're running close to normal speed and there isn't enough
- space to do disk_io_chunk_frames of I/O, then don't bother.
-
- at higher speeds, just do it because the sync between butler
- and audio thread may not be good enough.
- */
-
- if ((write_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
- return 0;
- }
-
- /* when slaved, don't try to get too close to the read pointer. this
- leaves space for the buffer reversal to have something useful to
- work with.
- */
-
- if (_slaved && write_space < (_playback_buf->capacity() / 2)) {
- return 0;
- }
-
if (reversed) {
return 0;
}