From 79fed95c1bd678f73f5b5ee8bbc44a517493c686 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 6 Sep 2013 10:39:14 -0400 Subject: [PATCH] tighten up error handling a little bit during various setup functions for Mackie Control --- .../mackie/mackie_control_protocol.cc | 32 ++++++++++++++----- .../surfaces/mackie/mackie_control_protocol.h | 10 +++--- libs/surfaces/mackie/surface.cc | 6 +++- libs/surfaces/mackie/surface_port.cc | 7 ++++ 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 635ce2b34a..32be851247 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -393,7 +393,9 @@ MackieControlProtocol::set_active (bool yn) BaseUI::run (); - create_surfaces (); + if (create_surfaces ()) { + return -1; + } connect_session_signals (); _active = true; update_surfaces (); @@ -606,7 +608,7 @@ MackieControlProtocol::set_profile (const string& profile_name) _device_profile = d->second; } -void +int MackieControlProtocol::set_device (const string& device_name, bool allow_activation) { map::iterator d = DeviceInfo::device_info.find (device_name); @@ -615,7 +617,7 @@ MackieControlProtocol::set_device (const string& device_name, bool allow_activat device_name, allow_activation)); if (d == DeviceInfo::device_info.end()) { - return; + return -1; } if (_active) { @@ -629,13 +631,16 @@ MackieControlProtocol::set_device (const string& device_name, bool allow_activat set_active (true); } else { if (_active) { - create_surfaces (); + if (create_surfaces ()) { + return -1; + } switch_banks (0, true); } } + return 0; } -void +int MackieControlProtocol::create_surfaces () { string device_name; @@ -652,7 +657,13 @@ MackieControlProtocol::create_surfaces () for (uint32_t n = 0; n < 1 + _device_info.extenders(); ++n) { - boost::shared_ptr surface (new Surface (*this, device_name, n, stype)); + boost::shared_ptr surface; + + try { + surface.reset (new Surface (*this, device_name, n, stype)); + } catch (...) { + return -1; + } { Glib::Threads::Mutex::Lock lm (surfaces_lock); @@ -698,6 +709,8 @@ MackieControlProtocol::create_surfaces () g_source_ref (psrc->gobj()); } } + + return 0; } void @@ -1573,14 +1586,17 @@ MackieControlProtocol::set_ipmidi_base (int16_t portnum) } } -void +int MackieControlProtocol::ipmidi_restart () { clear_ports (); clear_surfaces (); - create_surfaces (); + if (create_surfaces ()) { + return -1; + } switch_banks (_current_initial_bank, true); needs_ipmidi_restart = false; + return 0; } void diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index ffc06a32eb..4669247726 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -120,8 +120,8 @@ class MackieControlProtocol Mackie::DeviceProfile& device_profile() { return _device_profile; } int set_active (bool yn); - void set_device (const std::string&, bool allow_activation = true); - void set_profile (const std::string&); + int set_device (const std::string&, bool allow_activation = true); + void set_profile (const std::string&); FlipMode flip_mode () const { return _flip_mode; } ViewMode view_mode () const { return _view_mode; } @@ -291,7 +291,7 @@ class MackieControlProtocol ARDOUR::RouteNotificationList _last_selected_routes; - void create_surfaces (); + int create_surfaces (); bool periodic(); void build_gui (); bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port); @@ -301,8 +301,8 @@ class MackieControlProtocol void build_button_map (); void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr, bool save_list); void _gui_track_selection_changed (ARDOUR::RouteNotificationList*, bool save_list); - void ipmidi_restart (); - void initialize (); + int ipmidi_restart (); + void initialize (); /* BUTTON HANDLING */ diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc index 23cef9d13c..507491d84c 100644 --- a/libs/surfaces/mackie/surface.cc +++ b/libs/surfaces/mackie/surface.cc @@ -86,7 +86,11 @@ Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, ui { DEBUG_TRACE (DEBUG::MackieControl, "Surface::Surface init\n"); - _port = new SurfacePort (*this); + try { + _port = new SurfacePort (*this); + } catch (...) { + throw failed_constructor (); + } /* only the first Surface object has global controls */ diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc index 6583f3307f..508f501f59 100644 --- a/libs/surfaces/mackie/surface_port.cc +++ b/libs/surfaces/mackie/surface_port.cc @@ -23,6 +23,8 @@ #include #include +#include "pbd/failed_constructor.h" + #include "midi++/types.h" #include "midi++/ipmidi_port.h" @@ -49,6 +51,7 @@ using namespace ARDOUR; SurfacePort::SurfacePort (Surface& s) : _surface (&s) { + if (_surface->mcp().device_info().uses_ipmidi()) { _input_port = new MIDI::IPMIDIPort (_surface->mcp().ipmidi_base() +_surface->number()); _output_port = _input_port; @@ -56,6 +59,10 @@ SurfacePort::SurfacePort (Surface& s) _async_in = AudioEngine::instance()->register_input_port (DataType::MIDI, string_compose (_("%1 in"), _surface->name()), true); _async_out = AudioEngine::instance()->register_output_port (DataType::MIDI, string_compose (_("%1 out"), _surface->name()), true); + if (_async_in == 0 || _async_out == 0) { + throw failed_constructor(); + } + _input_port = boost::dynamic_pointer_cast(_async_in).get(); _output_port = boost::dynamic_pointer_cast(_async_out).get(); }