mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 19:56:31 +01:00
Fix up my previous buggy MMC cleanup.
git-svn-id: svn://localhost/ardour2/branches/3.0@7363 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
2062ce8186
commit
bde4d3f341
7 changed files with 71 additions and 65 deletions
|
|
@ -961,9 +961,7 @@ Session::enable_record ()
|
||||||
if (g_atomic_int_get (&_record_status) != Recording) {
|
if (g_atomic_int_get (&_record_status) != Recording) {
|
||||||
g_atomic_int_set (&_record_status, Recording);
|
g_atomic_int_set (&_record_status, Recording);
|
||||||
_last_record_location = _transport_frame;
|
_last_record_location = _transport_frame;
|
||||||
if (_mmc) {
|
|
||||||
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
|
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
|
||||||
}
|
|
||||||
|
|
||||||
if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
|
if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
|
||||||
|
|
||||||
|
|
@ -989,9 +987,7 @@ Session::disable_record (bool rt_context, bool force)
|
||||||
|
|
||||||
if ((!Config->get_latched_record_enable () && !play_loop) || force) {
|
if ((!Config->get_latched_record_enable () && !play_loop) || force) {
|
||||||
g_atomic_int_set (&_record_status, Disabled);
|
g_atomic_int_set (&_record_status, Disabled);
|
||||||
if (_mmc) {
|
|
||||||
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
|
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (rs == Recording) {
|
if (rs == Recording) {
|
||||||
g_atomic_int_set (&_record_status, Enabled);
|
g_atomic_int_set (&_record_status, Enabled);
|
||||||
|
|
@ -1051,9 +1047,7 @@ Session::maybe_enable_record ()
|
||||||
enable_record ();
|
enable_record ();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_mmc) {
|
|
||||||
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
|
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
|
||||||
}
|
|
||||||
RecordStateChanged (); /* EMIT SIGNAL */
|
RecordStateChanged (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,10 @@ Session::use_config_midi_ports ()
|
||||||
{
|
{
|
||||||
string port_name;
|
string port_name;
|
||||||
|
|
||||||
|
if (default_mmc_port) {
|
||||||
|
_mmc->set_port (default_mmc_port);
|
||||||
|
}
|
||||||
|
|
||||||
if (default_mtc_port) {
|
if (default_mtc_port) {
|
||||||
set_mtc_port (default_mtc_port->name());
|
set_mtc_port (default_mtc_port->name());
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -230,26 +234,26 @@ Session::set_trace_midi_input (bool yn, MIDI::Port* port)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (_mmc && _mmc->port()) {
|
if (_mmc->port()) {
|
||||||
if ((input_parser = _mmc->port()->input()) != 0) {
|
if ((input_parser = _mmc->port()->input()) != 0) {
|
||||||
input_parser->trace (yn, &cout, "input: ");
|
input_parser->trace (yn, &cout, "input: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_mtc_port && (!_mmc || (_mtc_port != _mmc->port()))) {
|
if (_mtc_port && _mtc_port != _mmc->port()) {
|
||||||
if ((input_parser = _mtc_port->input()) != 0) {
|
if ((input_parser = _mtc_port->input()) != 0) {
|
||||||
input_parser->trace (yn, &cout, "input: ");
|
input_parser->trace (yn, &cout, "input: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_midi_port && (!_mmc || (_midi_port != _mmc->port())) && _midi_port != _mtc_port ) {
|
if (_midi_port && _midi_port != _mmc->port() && _midi_port != _mtc_port) {
|
||||||
if ((input_parser = _midi_port->input()) != 0) {
|
if ((input_parser = _midi_port->input()) != 0) {
|
||||||
input_parser->trace (yn, &cout, "input: ");
|
input_parser->trace (yn, &cout, "input: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_midi_clock_port
|
if (_midi_clock_port
|
||||||
&& (!_mmc || (_midi_clock_port != _mmc->port()))
|
&& _midi_clock_port != _mmc->port()
|
||||||
&& _midi_clock_port != _mtc_port
|
&& _midi_clock_port != _mtc_port
|
||||||
&& _midi_clock_port != _midi_port) {
|
&& _midi_clock_port != _midi_port) {
|
||||||
if ((input_parser = _midi_clock_port->input()) != 0) {
|
if ((input_parser = _midi_clock_port->input()) != 0) {
|
||||||
|
|
@ -271,7 +275,7 @@ Session::set_trace_midi_output (bool yn, MIDI::Port* port)
|
||||||
output_parser->trace (yn, &cout, "output: ");
|
output_parser->trace (yn, &cout, "output: ");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_mmc && _mmc->port()) {
|
if (_mmc->port()) {
|
||||||
if ((output_parser = _mmc->port()->output()) != 0) {
|
if ((output_parser = _mmc->port()->output()) != 0) {
|
||||||
output_parser->trace (yn, &cout, "output: ");
|
output_parser->trace (yn, &cout, "output: ");
|
||||||
}
|
}
|
||||||
|
|
@ -283,7 +287,7 @@ Session::set_trace_midi_output (bool yn, MIDI::Port* port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_midi_port && (!_mmc || (_midi_port != _mmc->port())) && _midi_port != _mtc_port ) {
|
if (_midi_port && _midi_port != _mmc->port() && _midi_port != _mtc_port) {
|
||||||
if ((output_parser = _midi_port->output()) != 0) {
|
if ((output_parser = _midi_port->output()) != 0) {
|
||||||
output_parser->trace (yn, &cout, "output: ");
|
output_parser->trace (yn, &cout, "output: ");
|
||||||
}
|
}
|
||||||
|
|
@ -304,7 +308,7 @@ Session::get_trace_midi_input(MIDI::Port *port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (_mmc && _mmc->port()) {
|
if (_mmc->port()) {
|
||||||
if ((input_parser = _mmc->port()->input()) != 0) {
|
if ((input_parser = _mmc->port()->input()) != 0) {
|
||||||
return input_parser->tracing();
|
return input_parser->tracing();
|
||||||
}
|
}
|
||||||
|
|
@ -336,7 +340,7 @@ Session::get_trace_midi_output(MIDI::Port *port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (_mmc && _mmc->port()) {
|
if (_mmc->port()) {
|
||||||
if ((output_parser = _mmc->port()->output()) != 0) {
|
if ((output_parser = _mmc->port()->output()) != 0) {
|
||||||
return output_parser->tracing();
|
return output_parser->tracing();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,9 +69,7 @@ Session::process (nframes_t nframes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_mmc) {
|
|
||||||
_mmc->flush_pending ();
|
_mmc->flush_pending ();
|
||||||
}
|
|
||||||
|
|
||||||
_engine.main_thread()->get_buffers ();
|
_engine.main_thread()->get_buffers ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -353,10 +353,8 @@ Session::second_stage_init ()
|
||||||
send_full_time_code (0);
|
send_full_time_code (0);
|
||||||
_engine.transport_locate (0);
|
_engine.transport_locate (0);
|
||||||
|
|
||||||
if (_mmc) {
|
|
||||||
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdMmcReset));
|
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdMmcReset));
|
||||||
_mmc->send (MIDI::MachineControlCommand (Timecode::Time ()));
|
_mmc->send (MIDI::MachineControlCommand (Timecode::Time ()));
|
||||||
}
|
|
||||||
|
|
||||||
MidiClockTicker::instance().set_session (this);
|
MidiClockTicker::instance().set_session (this);
|
||||||
MIDI::Name::MidiPatchManager::instance().set_session (this);
|
MIDI::Name::MidiPatchManager::instance().set_session (this);
|
||||||
|
|
@ -1245,10 +1243,7 @@ Session::set_state (const XMLNode& node, int version)
|
||||||
error << _("Session: XML state has no options section") << endmsg;
|
error << _("Session: XML state has no options section") << endmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_midi_machine_control ();
|
use_config_midi_ports ();
|
||||||
|
|
||||||
if (use_config_midi_ports ()) {
|
|
||||||
}
|
|
||||||
|
|
||||||
if (version >= 3000) {
|
if (version >= 3000) {
|
||||||
if ((child = find_named_node (node, "Metadata")) == 0) {
|
if ((child = find_named_node (node, "Metadata")) == 0) {
|
||||||
|
|
@ -3194,15 +3189,11 @@ Session::config_changed (std::string p, bool ours)
|
||||||
|
|
||||||
} else if (p == "mmc-device-id" || p == "mmc-receive-id") {
|
} else if (p == "mmc-device-id" || p == "mmc-receive-id") {
|
||||||
|
|
||||||
if (_mmc) {
|
|
||||||
_mmc->set_receive_device_id (Config->get_mmc_receive_device_id());
|
_mmc->set_receive_device_id (Config->get_mmc_receive_device_id());
|
||||||
}
|
|
||||||
|
|
||||||
} else if (p == "mmc-send-id") {
|
} else if (p == "mmc-send-id") {
|
||||||
|
|
||||||
if (_mmc) {
|
|
||||||
_mmc->set_send_device_id (Config->get_mmc_send_device_id());
|
_mmc->set_send_device_id (Config->get_mmc_send_device_id());
|
||||||
}
|
|
||||||
|
|
||||||
} else if (p == "midi-control") {
|
} else if (p == "midi-control") {
|
||||||
|
|
||||||
|
|
@ -3268,9 +3259,7 @@ Session::config_changed (std::string p, bool ours)
|
||||||
|
|
||||||
} else if (p == "send-mmc") {
|
} else if (p == "send-mmc") {
|
||||||
|
|
||||||
if (_mmc) {
|
|
||||||
_mmc->enable_send (Config->get_send_mmc ());
|
_mmc->enable_send (Config->get_send_mmc ());
|
||||||
}
|
|
||||||
|
|
||||||
} else if (p == "midi-feedback") {
|
} else if (p == "midi-feedback") {
|
||||||
|
|
||||||
|
|
@ -3318,7 +3307,7 @@ Session::config_changed (std::string p, bool ours)
|
||||||
sync_order_keys ("session");
|
sync_order_keys ("session");
|
||||||
} else if (p == "initial-program-change") {
|
} else if (p == "initial-program-change") {
|
||||||
|
|
||||||
if (_mmc && _mmc->port() && Config->get_initial_program_change() >= 0) {
|
if (_mmc->port() && Config->get_initial_program_change() >= 0) {
|
||||||
MIDI::byte buf[2];
|
MIDI::byte buf[2];
|
||||||
|
|
||||||
buf[0] = MIDI::program; // channel zero by default
|
buf[0] = MIDI::program; // channel zero by default
|
||||||
|
|
@ -3328,7 +3317,7 @@ Session::config_changed (std::string p, bool ours)
|
||||||
}
|
}
|
||||||
} else if (p == "initial-program-change") {
|
} else if (p == "initial-program-change") {
|
||||||
|
|
||||||
if (_mmc && _mmc->port() && Config->get_initial_program_change() >= 0) {
|
if (_mmc->port() && Config->get_initial_program_change() >= 0) {
|
||||||
MIDI::byte* buf = new MIDI::byte[2];
|
MIDI::byte* buf = new MIDI::byte[2];
|
||||||
|
|
||||||
buf[0] = MIDI::program; // channel zero by default
|
buf[0] = MIDI::program; // channel zero by default
|
||||||
|
|
@ -3386,12 +3375,7 @@ Session::load_diskstreams_2X (XMLNode const & node, int)
|
||||||
void
|
void
|
||||||
Session::setup_midi_machine_control ()
|
Session::setup_midi_machine_control ()
|
||||||
{
|
{
|
||||||
if (!default_mmc_port) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_mmc = new MIDI::MachineControl;
|
_mmc = new MIDI::MachineControl;
|
||||||
_mmc->set_port (default_mmc_port);
|
|
||||||
|
|
||||||
_mmc->Play.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1));
|
_mmc->Play.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1));
|
||||||
_mmc->DeferredPlay.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1));
|
_mmc->DeferredPlay.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1));
|
||||||
|
|
@ -3409,7 +3393,7 @@ Session::setup_midi_machine_control ()
|
||||||
|
|
||||||
/* also handle MIDI SPP because its so common */
|
/* also handle MIDI SPP because its so common */
|
||||||
|
|
||||||
_mmc->port()->input()->start.connect_same_thread (*this, boost::bind (&Session::spp_start, this, _1, _2));
|
_mmc->SPPStart.connect_same_thread (*this, boost::bind (&Session::spp_start, this, _1, _2));
|
||||||
_mmc->port()->input()->contineu.connect_same_thread (*this, boost::bind (&Session::spp_continue, this, _1, _2));
|
_mmc->SPPContinue.connect_same_thread (*this, boost::bind (&Session::spp_continue, this, _1, _2));
|
||||||
_mmc->port()->input()->stop.connect_same_thread (*this, boost::bind (&Session::spp_stop, this, _1, _2));
|
_mmc->SPPStop.connect_same_thread (*this, boost::bind (&Session::spp_stop, this, _1, _2));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -183,13 +183,11 @@ Session::realtime_stop (bool abort, bool clear_state)
|
||||||
|
|
||||||
// FIXME: where should this really be? [DR]
|
// FIXME: where should this really be? [DR]
|
||||||
//send_full_time_code();
|
//send_full_time_code();
|
||||||
if (_mmc) {
|
|
||||||
Timecode::Time time;
|
Timecode::Time time;
|
||||||
timecode_time_subframes (_transport_frame, time);
|
timecode_time_subframes (_transport_frame, time);
|
||||||
|
|
||||||
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdStop));
|
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdStop));
|
||||||
_mmc->send (MIDI::MachineControlCommand (time));
|
_mmc->send (MIDI::MachineControlCommand (time));
|
||||||
}
|
|
||||||
|
|
||||||
if (_transport_speed < 0.0f) {
|
if (_transport_speed < 0.0f) {
|
||||||
todo = (PostTransportWork (todo | PostTransportStop | PostTransportReverse));
|
todo = (PostTransportWork (todo | PostTransportStop | PostTransportReverse));
|
||||||
|
|
@ -896,7 +894,7 @@ Session::locate (nframes64_t target_frame, bool with_roll, bool with_flush, bool
|
||||||
|
|
||||||
_send_timecode_update = true;
|
_send_timecode_update = true;
|
||||||
|
|
||||||
if (with_mmc && _mmc) {
|
if (with_mmc) {
|
||||||
Timecode::Time time;
|
Timecode::Time time;
|
||||||
timecode_time_subframes (_transport_frame, time);
|
timecode_time_subframes (_transport_frame, time);
|
||||||
_mmc->send (MIDI::MachineControlCommand (time));
|
_mmc->send (MIDI::MachineControlCommand (time));
|
||||||
|
|
@ -1136,11 +1134,9 @@ Session::start_transport ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_mmc) {
|
|
||||||
Timecode::Time time;
|
Timecode::Time time;
|
||||||
timecode_time_subframes (_transport_frame, time);
|
timecode_time_subframes (_transport_frame, time);
|
||||||
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdDeferredPlay));
|
_mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdDeferredPlay));
|
||||||
}
|
|
||||||
|
|
||||||
TransportStateChange (); /* EMIT SIGNAL */
|
TransportStateChange (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
#include "pbd/ringbuffer.h"
|
#include "pbd/ringbuffer.h"
|
||||||
#include "midi++/types.h"
|
#include "midi++/types.h"
|
||||||
|
#include "midi++/parser.h"
|
||||||
|
|
||||||
namespace MIDI {
|
namespace MIDI {
|
||||||
|
|
||||||
|
|
@ -143,6 +144,10 @@ class MachineControl
|
||||||
MMCSignal Wait;
|
MMCSignal Wait;
|
||||||
MMCSignal Resume;
|
MMCSignal Resume;
|
||||||
|
|
||||||
|
TimestampedSignal SPPStart;
|
||||||
|
TimestampedSignal SPPContinue;
|
||||||
|
TimestampedSignal SPPStop;
|
||||||
|
|
||||||
/* The second argument is the shuttle speed, the third is
|
/* The second argument is the shuttle speed, the third is
|
||||||
true if the direction is "forwards", false for "reverse"
|
true if the direction is "forwards", false for "reverse"
|
||||||
*/
|
*/
|
||||||
|
|
@ -264,7 +269,7 @@ class MachineControl
|
||||||
static pthread_t _sending_thread;
|
static pthread_t _sending_thread;
|
||||||
|
|
||||||
void process_mmc_message (Parser &p, byte *, size_t len);
|
void process_mmc_message (Parser &p, byte *, size_t len);
|
||||||
PBD::ScopedConnection mmc_connection; ///< connection to our parser for incoming data
|
PBD::ScopedConnectionList port_connections; ///< connections to our parser for incoming data
|
||||||
|
|
||||||
int do_masked_write (byte *, size_t len);
|
int do_masked_write (byte *, size_t len);
|
||||||
int do_locate (byte *, size_t len);
|
int do_locate (byte *, size_t len);
|
||||||
|
|
@ -273,6 +278,9 @@ class MachineControl
|
||||||
void send_immediately (MachineControlCommand const &);
|
void send_immediately (MachineControlCommand const &);
|
||||||
|
|
||||||
void write_track_status (byte *, size_t len, byte reg);
|
void write_track_status (byte *, size_t len, byte reg);
|
||||||
|
void spp_start (Parser&, nframes_t);
|
||||||
|
void spp_continue (Parser&, nframes_t);
|
||||||
|
void spp_stop (Parser&, nframes_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Class to describe a MIDI machine control command to be sent.
|
/** Class to describe a MIDI machine control command to be sent.
|
||||||
|
|
|
||||||
|
|
@ -210,10 +210,13 @@ MachineControl::set_port (Port* p)
|
||||||
{
|
{
|
||||||
_port = p;
|
_port = p;
|
||||||
|
|
||||||
mmc_connection.disconnect ();
|
port_connections.drop_connections ();
|
||||||
|
|
||||||
if (_port->input()) {
|
if (_port->input()) {
|
||||||
_port->input()->mmc.connect_same_thread (mmc_connection, boost::bind (&MachineControl::process_mmc_message, this, _1, _2, _3));
|
_port->input()->mmc.connect_same_thread (port_connections, boost::bind (&MachineControl::process_mmc_message, this, _1, _2, _3));
|
||||||
|
_port->input()->start.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_start, this, _1, _2));
|
||||||
|
_port->input()->contineu.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_continue, this, _1, _2));
|
||||||
|
_port->input()->stop.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_stop, this, _1, _2));
|
||||||
} else {
|
} else {
|
||||||
warning << "MMC connected to a non-input port: useless!" << endmsg;
|
warning << "MMC connected to a non-input port: useless!" << endmsg;
|
||||||
}
|
}
|
||||||
|
|
@ -688,6 +691,24 @@ MachineControl::set_sending_thread (pthread_t t)
|
||||||
_sending_thread = t;
|
_sending_thread = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MachineControl::spp_start (Parser& parser, nframes_t timestamp)
|
||||||
|
{
|
||||||
|
SPPStart (parser, timestamp); /* EMIT SIGNAL */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MachineControl::spp_continue (Parser& parser, nframes_t timestamp)
|
||||||
|
{
|
||||||
|
SPPContinue (parser, timestamp); /* EMIT SIGNAL */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MachineControl::spp_stop (Parser& parser, nframes_t timestamp)
|
||||||
|
{
|
||||||
|
SPPStop (parser, timestamp); /* EMIT SIGNAL */
|
||||||
|
}
|
||||||
|
|
||||||
MachineControlCommand::MachineControlCommand (MachineControl::Command c)
|
MachineControlCommand::MachineControlCommand (MachineControl::Command c)
|
||||||
: _command (c)
|
: _command (c)
|
||||||
{
|
{
|
||||||
|
|
@ -725,3 +746,4 @@ MachineControlCommand::fill_buffer (MachineControl* mmc, MIDI::byte* b) const
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue