* implement handle_port_inactive properly
* two bcf doesn't work
* remappable buttons (OSC or Surfax?)
* 7/1 configurable to 8
* need an object that can encapsulate different port types, ie BCF vs MCU. Not at the surface level.
* finish button implementations.
* concurrency for bank switching? And make sure "old" events aren't sent to "new" faders
* TODOs in code
* removal of a route results in a strip that isn't dead, but doesn't have any effect on the session
* use i18n. see string_compose

MCU
---
* if mackie wheel moves too fast, it's ignored.
* gain/panner display in second line
* metering on second line
* per-strip signal led
* midi bandwidth?
* Zoom buttons, from Jean-Martin Barbut. In fact I'm a bit desappointed with those functions, because I was used
	to use the 4 "N-E-S-W" buttons to zoom in and out with horizontal
	buttons and zoom in/out on track height with vertical buttons. That is
	with the zoom button in. with the zoom button off, it selects tracks
	with vertical buttons and selects regions with horizontal buttons. This
	was quite useful. The fact that the zoom button switches the wheel to
	zoom is fine, but it would be great to also have the track/region
	selection and the track height available from those buttons. I.e : you
	select a track with the vertical arrows and you increase/decrease the
	eight of the track with the zoom btn on. This combined with the region
	selection allows to zoom in a region (vertical and horizontal zoom) very
	easily.


Later
-----
* how long can UI signal callbacks take to execute? What happens if they block?
  where ENSURE_CORRECT_THREAD is a macro that is modelled on ENSURE_GUI_THREAD
  if the handler is not called in the "correct thread", it will use a pseudo-RT-safe-enough technique to get the correct thread to recall "handler" later on, and return.
* alsa/sequencer ports unstable. possibly problems with use of ::poll
* use glib::Timer instead of mine. Actually don't because it's not very useable.
* crash when mmc port set to mcu?
* remove commented couts
* Perhaps MackieControlProtocol shouldn't implement MackieButtonHandler
* Need a HostAdapter class to encapsulate ardour calls
* talk to route plugins
* check for excessiveness (ie too many events making other subsystems work too hard)
* Queueing of writes?
* Generic surface code to common location
* bulk remote id changes cause too many surface updates. use Config->remote_model.
* which bank switching - overlap or dead faders? Option?
* signals for buttons?
* MackieControlProtocol in namespace Mackie?
* power-cycling of surface. fd_midiport doesn't close.
* mix busses and/or a "bus-only" bank/mode
* what about surfaces like Mackie C4 and BCR2000?

UI integration
--------------

* maybe use current snap state for jog wheel and ffwd/rew
* Some indication on the UI of currently bank-switched-in routes?
  Useful for surfaces that don't have a scribble strip.

Bugs
----
* when using alsa/sequencer, some midi events intended for mcu port end up being
  read by the seq port.
* MIDI::Port::type() returns _type, which is undefined. It might be in the descriptor
* auditioner doesn't connect to master 1 and master 2 - it loses the spaces.
