#include <fcntl.h>
#include <cstdlib>
#include <ctime>
-#include <strings.h> // for ffs(3)
#include <sys/stat.h>
-#include <sys/mman.h>
#include "pbd/error.h"
+#include "pbd/ffs.h"
#include "pbd/basename.h"
#include <glibmm/threads.h>
#include "pbd/xml++.h"
seek (_session.transport_frame());
}
- g_atomic_int_set(const_cast<gint*>(&_frames_pending_write), 0);
- g_atomic_int_set(const_cast<gint*>(&_num_captured_loops), 0);
+ g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
+ g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
}
int
}
_write_source->mark_write_starting_now(
capture_start_frame, capture_captured, loop_length);
- g_atomic_int_set(const_cast<gint*>(&_frames_pending_write), 0);
- g_atomic_int_set(const_cast<gint*>(&_num_captured_loops), 0);
+ g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
+ g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
was_recording = true;
}
}
break;
case ForceChannel:
if (ev.is_channel_event()) {
- ev.set_channel (ffs(mask) - 1);
+ ev.set_channel (PBD::ffs(mask) - 1);
}
_capture_buf->write(transport_frame + loop_offset + ev.time(),
ev.type(), ev.size(), ev.buffer());
return 0;
}
+frameoffset_t
+MidiDiskstream::calculate_playback_distance (pframes_t nframes)
+{
+ frameoffset_t playback_distance = nframes;
+
+ /* XXX: should be doing varispeed stuff once it's implemented in ::process() above */
+
+ if (_actual_speed < 0.0) {
+ return -playback_distance;
+ } else {
+ return playback_distance;
+ }
+}
+
bool
MidiDiskstream::commit (framecnt_t playback_distance)
{
return 0;
}
- const framecnt_t total = g_atomic_int_get(const_cast<gint*>(&_frames_pending_write));
+ const framecnt_t total = g_atomic_int_get(const_cast<gint*> (&_frames_pending_write));
if (total == 0 ||
_capture_buf->read_space() == 0 ||
error << string_compose(_("MidiDiskstream %1: cannot write to disk"), id()) << endmsg;
return -1;
}
- g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), -to_write);
+ g_atomic_int_add(const_cast<gint*> (&_frames_pending_write), -to_write);
}
out:
the Source and/or entirely after the capture is finished.
*/
if (was_recording) {
- g_atomic_int_add(const_cast<gint*>(&_num_captured_loops), 1);
+ g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
}
}
boost::shared_ptr<MidiPort> sp = _source_port.lock ();
if (sp && Config->get_monitoring_model() == HardwareMonitoring) {
- sp->request_jack_monitors_input (!(_session.config.get_auto_input() && rolling));
+ sp->request_input_monitoring (!(_session.config.get_auto_input() && rolling));
}
return true;
try {
_write_source = boost::dynamic_pointer_cast<SMFSource>(
- _session.create_midi_source_for_session (0, name ()));
+ _session.create_midi_source_for_session (name ()));
if (!_write_source) {
throw failed_constructor();
return 0;
}
-
-list<boost::shared_ptr<Source> >
-MidiDiskstream::steal_write_sources()
+/**
+ * We want to use the name of the existing write source (the one that will be
+ * used by the next capture) for another purpose. So change the name of the
+ * current source, and return its current name.
+ *
+ * Return an empty string if the change cannot be accomplished.
+ */
+std::string
+MidiDiskstream::steal_write_source_name ()
{
- list<boost::shared_ptr<Source> > ret;
-
- /* put some data on the disk, even if its just a header for an empty file */
- boost::dynamic_pointer_cast<SMFSource> (_write_source)->ensure_disk_file ();
+ string our_old_name = _write_source->name();
- /* never let it go away */
- _write_source->mark_nonremovable ();
-
- ret.push_back (_write_source);
-
- /* get a new one */
-
- use_new_write_source (0);
+ /* this will bump the name of the current write source to the next one
+ * (e.g. "MIDI 1-1" gets renamed to "MIDI 1-2"), thus leaving the
+ * current write source name (e.g. "MIDI 1-1" available). See the
+ * comments in Session::create_midi_source_by_stealing_name() about why
+ * we do this.
+ */
- return ret;
+ try {
+ string new_name = _session.new_midi_source_name (name());
+
+ if (_write_source->rename (new_name)) {
+ return string();
+ }
+ } catch (...) {
+ return string ();
+ }
+
+ return our_old_name;
}
void
}
void
-MidiDiskstream::ensure_jack_monitors_input (bool yn)
+MidiDiskstream::ensure_input_monitoring (bool yn)
{
boost::shared_ptr<MidiPort> sp = _source_port.lock ();
if (sp) {
- sp->ensure_jack_monitors_input (yn);
+ sp->ensure_input_monitoring (yn);
}
}