From 6c4fbd5149ebade84e3d94a3b667899065d0bb31 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 15 Jun 2008 21:49:15 +0000 Subject: [PATCH] refactored midiPortMenu-creation and -management - fixes crash when removing track which had MIDI-in enabled and enabled MIDI-in for another track afterwards git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1149 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 19 +++++++++ include/instrument_midi_io_view.h | 7 ++-- include/instrument_track.h | 2 - include/midi_port.h | 4 ++ src/core/midi/midi_port.cpp | 21 ++++++---- src/gui/widgets/instrument_midi_io_view.cpp | 46 +++++++++++---------- src/tracks/instrument_track.cpp | 32 +++++--------- 7 files changed, 77 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 00c013880..b00596a73 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,24 @@ 2008-06-15 Tobias Doerffel + * include/knob.h: + * src/gui/widgets/knob.cpp: + - cache pixmap + - only redraw if angle has changed by more than 3 degrees + - cleanups + + * src/core/midi/midi_alsa_seq.cpp: + cleanups and small optimizations + + * include/instrument_midi_io_view.h: + * include/instrument_track.h: + * include/midi_port.h: + * src/core/midi/midi_port.cpp: + * src/tracks/instrument_track.cpp: + * src/gui/widgets/instrument_midi_io_view.cpp: + refactored midiPortMenu-creation and -management - fixes crash when + removing track which had MIDI-in enabled and enabled MIDI-in for + another track afterwards + * src/gui/file_browser.cpp: do not load MIDI-settings when loading preset as this might break existing instrument tracks diff --git a/include/instrument_midi_io_view.h b/include/instrument_midi_io_view.h index 4134c0cdb..6dc52e883 100644 --- a/include/instrument_midi_io_view.h +++ b/include/instrument_midi_io_view.h @@ -36,14 +36,13 @@ class tabWidget; class ledCheckBox; class lcdSpinBox; class midiPortMenu; +class QToolButton; class instrumentMidiIOView : public QWidget, public modelView { public: - instrumentMidiIOView( midiPortMenu * _readable_ports_menu, - midiPortMenu * _writable_ports_menu, - QWidget * _parent ); + instrumentMidiIOView( QWidget * _parent ); virtual ~instrumentMidiIOView(); @@ -57,6 +56,8 @@ private: ledCheckBox * m_sendCheckBox; ledCheckBox * m_defaultVelocityInCheckBox; ledCheckBox * m_defaultVelocityOutCheckBox; + QToolButton * m_rpBtn; + QToolButton * m_wpBtn; } ; diff --git a/include/instrument_track.h b/include/instrument_track.h index fdfc3cbb7..88d006ea9 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -249,8 +249,6 @@ private: instrumentTrackButton * m_tswInstrumentTrackButton; QMenu * m_tswMidiMenu; - midiPortMenu * m_readablePortsMenu; - midiPortMenu * m_writablePortsMenu; QAction * m_midiInputAction; QAction * m_midiOutputAction; diff --git a/include/midi_port.h b/include/midi_port.h index b54d2e36e..e3a0ca10d 100644 --- a/include/midi_port.h +++ b/include/midi_port.h @@ -37,6 +37,7 @@ class midiClient; class midiEventProcessor; +class midiPortMenu; class midiTime; @@ -125,6 +126,9 @@ public: return( m_writablePorts ); } + midiPortMenu * m_readablePortsMenu; + midiPortMenu * m_writablePortsMenu; + signals: void readablePortsChanged( void ); diff --git a/src/core/midi/midi_port.cpp b/src/core/midi/midi_port.cpp index f181b8bbd..07d121dc1 100644 --- a/src/core/midi/midi_port.cpp +++ b/src/core/midi/midi_port.cpp @@ -38,24 +38,26 @@ midiPort::midiPort( const QString & _name, midiClient * _mc, midiEventProcessor * _mep, model * _parent, track * _track, Modes _mode ) : model( _parent ), + m_readablePortsMenu( NULL ), + m_writablePortsMenu( NULL ), m_midiClient( _mc ), m_midiEventProcessor( _mep ), m_name( _name ), m_mode( _mode ), m_inputChannelModel( 0, 0, MidiChannelCount, this, - tr( "Input channel" ) ), - m_outputChannelModel( 1, 1, MidiChannelCount, this, - tr( "Output channel" ) ), + tr( "Input channel" ) ), + m_outputChannelModel( 1, 1, MidiChannelCount, this, + tr( "Output channel" ) ), m_inputControllerModel( 0, 0, MidiControllerCount, this, - tr( "Input controller" ) ), + tr( "Input controller" ) ), m_outputControllerModel( 0, 0, MidiControllerCount, this, - tr( "Output controller" ) ), + tr( "Output controller" ) ), m_readableModel( FALSE, this, tr( "Receive MIDI-events" ) ), m_writableModel( FALSE, this, tr( "Send MIDI-events" ) ), m_defaultVelocityInEnabledModel( FALSE, this, - tr( "Default input velocity" ) ), + tr( "Default input velocity" ) ), m_defaultVelocityOutEnabledModel( FALSE, this, - tr( "Default output velocity" ) ) + tr( "Default output velocity" ) ) { m_midiClient->addPort( this ); @@ -95,6 +97,11 @@ midiPort::midiPort( const QString & _name, midiClient * _mc, midiPort::~midiPort() { + // unsubscribe ports + m_readableModel.setValue( FALSE ); + m_writableModel.setValue( FALSE ); + + // and finally unregister ourself m_midiClient->removePort( this ); } diff --git a/src/gui/widgets/instrument_midi_io_view.cpp b/src/gui/widgets/instrument_midi_io_view.cpp index 40cd24366..4a149208f 100644 --- a/src/gui/widgets/instrument_midi_io_view.cpp +++ b/src/gui/widgets/instrument_midi_io_view.cpp @@ -35,17 +35,17 @@ #include "gui_templates.h" #include "led_checkbox.h" #include "lcd_spinbox.h" +#include "midi_client.h" #include "tab_widget.h" #include "tooltip.h" -instrumentMidiIOView::instrumentMidiIOView( - midiPortMenu * _readable_ports_menu, - midiPortMenu * _writable_ports_menu, - QWidget * _parent ) : +instrumentMidiIOView::instrumentMidiIOView( QWidget * _parent ) : QWidget( _parent ), - modelView( NULL ) + modelView( NULL ), + m_rpBtn( NULL ), + m_wpBtn( NULL ) { m_setupTabWidget = new tabWidget( tr( "MIDI-SETUP FOR THIS CHANNEL" ), this ); @@ -92,25 +92,21 @@ instrumentMidiIOView::instrumentMidiIOView( m_defaultVelocityOutCheckBox->move( 28, 164 ); - if( _readable_ports_menu != NULL ) + if( !engine::getMixer()->getMIDIClient()->isRaw() ) { - QToolButton * rp_btn = new QToolButton( m_setupTabWidget ); - rp_btn->setText( tr( "MIDI-devices to receive " + m_rpBtn = new QToolButton( m_setupTabWidget ); + m_rpBtn->setText( tr( "MIDI-devices to receive " "MIDI-events from" ) ); - rp_btn->setIcon( embed::getIconPixmap( "midi_in" ) ); - rp_btn->setGeometry( 186, 34, 40, 40 ); - rp_btn->setMenu( _readable_ports_menu ); - rp_btn->setPopupMode( QToolButton::InstantPopup ); - } - if( _writable_ports_menu != NULL ) - { - QToolButton * wp_btn = new QToolButton( m_setupTabWidget ); - wp_btn->setText( tr( "MIDI-devices to send MIDI-events " + m_rpBtn->setIcon( embed::getIconPixmap( "midi_in" ) ); + m_rpBtn->setGeometry( 186, 34, 40, 40 ); + m_rpBtn->setPopupMode( QToolButton::InstantPopup ); + + m_wpBtn = new QToolButton( m_setupTabWidget ); + m_wpBtn->setText( tr( "MIDI-devices to send MIDI-events " "to" ) ); - wp_btn->setIcon( embed::getIconPixmap( "midi_out" ) ); - wp_btn->setGeometry( 186, 114, 40, 40 ); - wp_btn->setMenu( _writable_ports_menu ); - wp_btn->setPopupMode( QToolButton::InstantPopup ); + m_wpBtn->setIcon( embed::getIconPixmap( "midi_out" ) ); + m_wpBtn->setGeometry( 186, 114, 40, 40 ); + m_wpBtn->setPopupMode( QToolButton::InstantPopup ); } } @@ -135,6 +131,14 @@ void instrumentMidiIOView::modelChanged( void ) m_sendCheckBox->setModel( &mp->m_writableModel ); m_defaultVelocityOutCheckBox->setModel( &mp->m_defaultVelocityOutEnabledModel ); + if( m_rpBtn ) + { + m_rpBtn->setMenu( mp->m_readablePortsMenu ); + } + if( m_wpBtn ) + { + m_wpBtn->setMenu( mp->m_writablePortsMenu ); + } } diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 69e732dca..e0975619d 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -841,9 +841,7 @@ QQueue instrumentTrackView::s_windows; instrumentTrackView::instrumentTrackView( instrumentTrack * _it, trackContainerView * _tcv ) : trackView( _it, _tcv ), - m_window( NULL ), - m_readablePortsMenu( NULL ), - m_writablePortsMenu( NULL ) + m_window( NULL ) { setAcceptDrops( TRUE ); setFixedHeight( 32 ); @@ -870,14 +868,14 @@ instrumentTrackView::instrumentTrackView( instrumentTrack * _it, // sequenced MIDI? if( !engine::getMixer()->getMIDIClient()->isRaw() ) { - m_readablePortsMenu = new midiPortMenu( midiPort::Input ); - m_writablePortsMenu = new midiPortMenu( midiPort::Output ); - m_readablePortsMenu->setModel( &_it->m_midiPort ); - m_writablePortsMenu->setModel( &_it->m_midiPort ); + _it->m_midiPort.m_readablePortsMenu = new midiPortMenu( midiPort::Input ); + _it->m_midiPort.m_writablePortsMenu = new midiPortMenu( midiPort::Output ); + _it->m_midiPort.m_readablePortsMenu->setModel( &_it->m_midiPort ); + _it->m_midiPort.m_writablePortsMenu->setModel( &_it->m_midiPort ); m_midiInputAction = m_tswMidiMenu->addMenu( - m_readablePortsMenu ); + _it->m_midiPort.m_readablePortsMenu ); m_midiOutputAction = m_tswMidiMenu->addMenu( - m_writablePortsMenu ); + _it->m_midiPort.m_writablePortsMenu ); } else { @@ -929,6 +927,9 @@ instrumentTrackView::instrumentTrackView( instrumentTrack * _it, instrumentTrackView::~instrumentTrackView() { freeInstrumentTrackWindow(); + + delete model()->m_midiPort.m_readablePortsMenu; + delete model()->m_midiPort.m_writablePortsMenu; } @@ -1172,9 +1173,7 @@ instrumentTrackWindow::instrumentTrackWindow( instrumentTrackView * _itv ) : instrument_functions ); m_arpView= new arpeggiatorView( &m_track->m_arpeggiator, instrument_functions ); - m_midiView = new instrumentMidiIOView( m_itv->m_readablePortsMenu, - m_itv->m_writablePortsMenu, - m_tabWidget ); + m_midiView = new instrumentMidiIOView( m_tabWidget ); m_effectView = new effectRackView( m_track->m_audioPort.getEffects(), m_tabWidget ); m_tabWidget->addTab( m_ssView, tr( "ENV/LFO" ), 1 ); @@ -1255,15 +1254,6 @@ void instrumentTrackWindow::modelChanged( void ) m_midiView->setModel( &m_track->m_midiPort ); m_effectView->setModel( m_track->m_audioPort.getEffects() ); updateName(); - - if( m_itv->m_readablePortsMenu != NULL ) - { - m_itv->m_readablePortsMenu->setModel( &m_track->m_midiPort ); - } - if( m_itv->m_writablePortsMenu != NULL ) - { - m_itv->m_writablePortsMenu->setModel( &m_track->m_midiPort ); - } }