make Mackie::Surface keep a reference to the input source+channel and clean up in destructor

This commit is contained in:
Paul Davis 2015-10-08 21:23:48 -04:00
parent ce03b02a79
commit 7e10c21468
3 changed files with 47 additions and 6 deletions

View file

@ -688,11 +688,17 @@ MackieControlProtocol::set_device_info (const string& device_name)
int int
MackieControlProtocol::set_device (const string& device_name) MackieControlProtocol::set_device (const string& device_name)
{ {
if (device_name == device_info().name()) {
/* already using that device, nothing to do */
return 0;
}
if (set_device_info (device_name)) { if (set_device_info (device_name)) {
return -1; return -1;
} }
clear_surfaces (); clear_surfaces ();
hui_connection.disconnect (); hui_connection.disconnect ();
if (_device_info.device_type() == DeviceInfo::HUI) { if (_device_info.device_type() == DeviceInfo::HUI) {
@ -707,6 +713,8 @@ MackieControlProtocol::set_device (const string& device_name)
switch_banks (0, true); switch_banks (0, true);
// DeviceChanged ();
return 0; return 0;
} }
@ -811,8 +819,8 @@ MackieControlProtocol::create_surfaces ()
if ((fd = input_port.selectable ()) >= 0) { if ((fd = input_port.selectable ()) >= 0) {
GIOChannel* ioc = g_io_channel_unix_new (fd); surface->input_channel = g_io_channel_unix_new (fd);
GSource* gsrc = g_io_create_watch (ioc, GIOCondition (G_IO_IN|G_IO_HUP|G_IO_ERR)); surface->input_source = g_io_create_watch (surface->input_channel, GIOCondition (G_IO_IN|G_IO_HUP|G_IO_ERR));
/* hack up an object so that in the callback from the event loop /* hack up an object so that in the callback from the event loop
we have both the MackieControlProtocol and the input port. we have both the MackieControlProtocol and the input port.
@ -827,8 +835,8 @@ MackieControlProtocol::create_surfaces ()
ipm->mcp = this; ipm->mcp = this;
ipm->port = &input_port; ipm->port = &input_port;
g_source_set_callback (gsrc, (GSourceFunc) ipmidi_input_handler, ipm, NULL); g_source_set_callback (surface->input_source, (GSourceFunc) ipmidi_input_handler, ipm, NULL);
g_source_attach (gsrc, main_loop()->get_context()->gobj()); g_source_attach (surface->input_source, main_loop()->get_context()->gobj());
} }
} }
} }
@ -1367,14 +1375,15 @@ MackieControlProtocol::handle_button_event (Surface& surface, Button& button, Bu
bool bool
MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port) MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port)
{ {
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("something happend on %1\n", port->name()));
if (ioc & ~IO_IN) { if (ioc & ~IO_IN) {
DEBUG_TRACE (DEBUG::MackieControl, "MIDI port closed\n");
return false; return false;
} }
if (ioc & IO_IN) { if (ioc & IO_IN) {
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("something happend on %1\n", port->name()));
/* Devices using regular JACK MIDI ports will need to have /* Devices using regular JACK MIDI ports will need to have
the x-thread FIFO drained to avoid burning endless CPU. the x-thread FIFO drained to avoid burning endless CPU.
@ -1790,3 +1799,17 @@ MackieControlProtocol::toggle_backlight ()
(*s)->toggle_backlight (); (*s)->toggle_backlight ();
} }
} }
boost::shared_ptr<Surface>
MackieControlProtocol::nth_surface (uint32_t n) const
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s, --n) {
if (n == 0) {
return *s;
}
}
return boost::shared_ptr<Surface> ();
}

View file

@ -92,6 +92,8 @@ Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, ui
, _master_fader (0) , _master_fader (0)
, _last_master_gain_written (-0.0f) , _last_master_gain_written (-0.0f)
, connection_state (0) , connection_state (0)
, input_channel (0)
, input_source (0)
{ {
DEBUG_TRACE (DEBUG::MackieControl, "Surface::Surface init\n"); DEBUG_TRACE (DEBUG::MackieControl, "Surface::Surface init\n");
@ -162,6 +164,16 @@ Surface::~Surface ()
port_connection.disconnect (); port_connection.disconnect ();
if (input_source) {
g_source_destroy (input_source);
input_source = 0;
}
if (input_channel) {
g_io_channel_unref (input_channel);
input_channel = 0;
}
delete _jog_wheel; delete _jog_wheel;
delete _port; delete _port;

View file

@ -202,6 +202,12 @@ public:
int connection_state; int connection_state;
MidiByteArray display_line (std::string const& msg, int line_num); MidiByteArray display_line (std::string const& msg, int line_num);
public:
/* IP MIDI devices need to keep a handle on these */
GIOChannel* input_channel;
GSource* input_source;
}; };
} }