From 27f5d20e05ac531e2a5a0a705bf58dbf76da925a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 14 Aug 2009 14:49:33 +0200 Subject: [PATCH] ControllerConnectionDialog: improved auto detect feature for controllers When opening up the ControllerConnectionDialog by default auto detect is enabled and all MIDI input devices are selected. Upon the first event all devices but the one the event came from get unchecked. This eases the process of assigning MIDI controls to software controls. --- include/MidiPortMenu.h | 5 +- src/gui/ControllerConnectionDialog.cpp | 64 ++++++++++++++++---------- src/gui/widgets/MidiPortMenu.cpp | 8 ++-- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/include/MidiPortMenu.h b/include/MidiPortMenu.h index 2f395064d..80fa1d581 100644 --- a/include/MidiPortMenu.h +++ b/include/MidiPortMenu.h @@ -43,9 +43,12 @@ public: virtual ~MidiPortMenu(); +public slots: + void updateMenu(); + + protected slots: void activatedPort( QAction * _item ); - void updatePorts(); private: diff --git a/src/gui/ControllerConnectionDialog.cpp b/src/gui/ControllerConnectionDialog.cpp index d80dc7837..93c08a93c 100644 --- a/src/gui/ControllerConnectionDialog.cpp +++ b/src/gui/ControllerConnectionDialog.cpp @@ -72,15 +72,14 @@ public: { m_detectedMidiChannel = _me.m_channel + 1; m_detectedMidiController = ( _me.m_data.m_bytes[0] & 0x7F ) + 1; + m_detectedMidiPort = + engine::getMixer()->midiClient()->sourcePortName( _me ); emit valueChanged(); } } - int m_detectedMidiChannel; - int m_detectedMidiController; - // Would be a nice copy ctor, but too hard to add copy ctor because // model has none. MidiController * copyToMidiController( model * _parent ) @@ -95,21 +94,34 @@ public: } - void useDetected( void ) + void useDetected() { m_midiPort.setInputChannel( m_detectedMidiChannel ); m_midiPort.setInputController( m_detectedMidiController ); + MidiPort::Map map = m_midiPort.readablePorts(); + for( MidiPort::Map::Iterator it = map.begin(); it != map.end(); ++it ) + { + m_midiPort.subscribeReadablePort( it.key(), + m_detectedMidiPort.isEmpty() || + ( it.key() == m_detectedMidiPort ) ); + } } public slots: - void reset( void ) + void reset() { m_midiPort.setInputChannel( 0 ); m_midiPort.setInputController( 0 ); } -}; + +private: + int m_detectedMidiChannel; + int m_detectedMidiController; + QString m_detectedMidiPort; + +} ; @@ -119,14 +131,14 @@ ControllerConnectionDialog::ControllerConnectionDialog( QWidget * _parent, ) : QDialog( _parent ), m_readablePorts( NULL ), - m_midiAutoDetect( FALSE ), + m_midiAutoDetect( false ), m_controller( NULL ), m_targetModel( _target_model ), m_midiController( NULL ) { setWindowIcon( embed::getIconPixmap( "setup_audio" ) ); setWindowTitle( tr( "Connection Settings" ) ); - setModal( TRUE ); + setModal( true ); // Midi stuff m_midiGroupBox = new groupBox( tr( "MIDI CONTROLLER" ), this ); @@ -194,7 +206,7 @@ ControllerConnectionDialog::ControllerConnectionDialog( QWidget * _parent, m_mappingFunction = new QLineEdit( m_mappingBox ); m_mappingFunction->setGeometry( 10, 20, 170, 16 ); m_mappingFunction->setText( "input" ); - m_mappingFunction->setReadOnly( TRUE ); + m_mappingFunction->setReadOnly( true ); // Buttons @@ -240,7 +252,7 @@ ControllerConnectionDialog::ControllerConnectionDialog( QWidget * _parent, if ( cc->getController()->type() == Controller::MidiController ) { - m_midiGroupBox->model()->setValue( TRUE ); + m_midiGroupBox->model()->setValue( true ); // ensure controller is created midiToggled(); @@ -260,7 +272,7 @@ ControllerConnectionDialog::ControllerConnectionDialog( QWidget * _parent, if( idx >= 0 ) { - m_userGroupBox->model()->setValue( TRUE ); + m_userGroupBox->model()->setValue( true ); m_userController->model()->setValue( idx ); } } @@ -269,7 +281,7 @@ ControllerConnectionDialog::ControllerConnectionDialog( QWidget * _parent, if( !cc ) { - m_midiGroupBox->model()->setValue( TRUE ); + m_midiGroupBox->model()->setValue( true ); } show(); @@ -289,7 +301,7 @@ ControllerConnectionDialog::~ControllerConnectionDialog() -void ControllerConnectionDialog::selectController( void ) +void ControllerConnectionDialog::selectController() { // Midi if( m_midiGroupBox->model()->value() > 0 ) @@ -341,7 +353,7 @@ void ControllerConnectionDialog::selectController( void ) -void ControllerConnectionDialog::midiToggled( void ) +void ControllerConnectionDialog::midiToggled() { int enabled = m_midiGroupBox->model()->value(); if( enabled != 0 ) @@ -354,6 +366,15 @@ void ControllerConnectionDialog::midiToggled( void ) if( !m_midiController ) { m_midiController = new AutoDetectMidiController( engine::getSong() ); + + MidiPort::Map map = m_midiController->m_midiPort.readablePorts(); + for( MidiPort::Map::Iterator it = map.begin(); + it != map.end(); ++it ) + { + it.value() = true; + } + m_midiController->subscribeReadablePorts( map ); + m_midiChannelSpinBox->setModel( &m_midiController->m_midiPort.m_inputChannelModel ); m_midiControllerSpinBox->setModel( @@ -363,15 +384,11 @@ void ControllerConnectionDialog::midiToggled( void ) m_readablePorts->setModel( &m_midiController->m_midiPort ); } - connect( m_midiController, SIGNAL( valueChanged() ), this, SLOT( midiValueChanged() ) ); } } - else - { - m_midiAutoDetect.setValue( FALSE ); - } + m_midiAutoDetect.setValue( enabled ); m_midiChannelSpinBox->setEnabled( enabled ); m_midiControllerSpinBox->setEnabled( enabled ); @@ -381,7 +398,7 @@ void ControllerConnectionDialog::midiToggled( void ) -void ControllerConnectionDialog::userToggled( void ) +void ControllerConnectionDialog::userToggled() { int enabled = m_userGroupBox->model()->value(); if( enabled != 0 && m_midiGroupBox->model()->value() != 0 ) @@ -395,7 +412,7 @@ void ControllerConnectionDialog::userToggled( void ) -void ControllerConnectionDialog::autoDetectToggled( void ) +void ControllerConnectionDialog::autoDetectToggled() { if( m_midiAutoDetect.value() ) { @@ -406,13 +423,12 @@ void ControllerConnectionDialog::autoDetectToggled( void ) -void ControllerConnectionDialog::midiValueChanged( void ) +void ControllerConnectionDialog::midiValueChanged() { if( m_midiAutoDetect.value() ) { m_midiController->useDetected(); - - m_midiAutoDetect.setValue( FALSE ); + m_readablePorts->updateMenu(); } } diff --git a/src/gui/widgets/MidiPortMenu.cpp b/src/gui/widgets/MidiPortMenu.cpp index f588ed1f1..e61f7a167 100644 --- a/src/gui/widgets/MidiPortMenu.cpp +++ b/src/gui/widgets/MidiPortMenu.cpp @@ -53,14 +53,14 @@ void MidiPortMenu::modelChanged() if( m_mode == MidiPort::Input ) { connect( mp, SIGNAL( readablePortsChanged() ), - this, SLOT( updatePorts() ) ); + this, SLOT( updateMenu() ) ); } else if( m_mode == MidiPort::Output ) { connect( mp, SIGNAL( writablePortsChanged() ), - this, SLOT( updatePorts() ) ); + this, SLOT( updateMenu() ) ); } - updatePorts(); + updateMenu(); } @@ -83,7 +83,7 @@ void MidiPortMenu::activatedPort( QAction * _item ) -void MidiPortMenu::updatePorts() +void MidiPortMenu::updateMenu() { MidiPort * mp = castModel(); const MidiPort::Map & map = ( m_mode == MidiPort::Input ) ?