void MidiApple::updateDeviceList() { closeDevices(); openDevices(); emit readablePortsChanged(); emit writablePortsChanged(); }
void MidiPort::loadSettings( const QDomElement& thisElement ) { m_inputChannelModel.loadSettings( thisElement, "inputchannel" ); m_outputChannelModel.loadSettings( thisElement, "outputchannel" ); m_inputControllerModel.loadSettings( thisElement, "inputcontroller" ); m_outputControllerModel.loadSettings( thisElement, "outputcontroller" ); m_fixedInputVelocityModel.loadSettings( thisElement, "fixedinputvelocity" ); m_fixedOutputVelocityModel.loadSettings( thisElement, "fixedoutputvelocity" ); m_outputProgramModel.loadSettings( thisElement, "outputprogram" ); m_baseVelocityModel.loadSettings( thisElement, "basevelocity" ); m_readableModel.loadSettings( thisElement, "readable" ); m_writableModel.loadSettings( thisElement, "writable" ); // restore connections if( isInputEnabled() ) { QStringList rp = thisElement.attribute( "inports" ).split( ',' ); for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { if( it.value() != ( rp.indexOf( it.key() ) != -1 ) ) { subscribeReadablePort( it.key() ); } } emit readablePortsChanged(); } if( isOutputEnabled() ) { QStringList wp = thisElement.attribute( "outports" ).split( ',' ); for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { if( it.value() != ( wp.indexOf( it.key() ) != -1 ) ) { subscribeWritablePort( it.key() ); } } emit writablePortsChanged(); } if( thisElement.hasAttribute( "basevelocity" ) == false ) { // for projects created by LMMS < 0.9.92 there's no value for the base // velocity and for compat reasons we have to stick with maximum velocity // which did not allow note volumes > 100% m_baseVelocityModel.setValue( MidiMaxVelocity ); } }
void MidiPortMenu::modelChanged() { MidiPort * mp = castModel<MidiPort>(); if( m_mode == MidiPort::Input ) { connect( mp, SIGNAL( readablePortsChanged() ), this, SLOT( updateMenu() ) ); } else if( m_mode == MidiPort::Output ) { connect( mp, SIGNAL( writablePortsChanged() ), this, SLOT( updateMenu() ) ); } updateMenu(); }
void MidiPort::updateMidiPortMode() { // this small lookup-table makes everything easier static const Modes modeTable[2][2] = { { Disabled, Output }, { Input, Duplex } } ; setMode( modeTable[m_readableModel.value()][m_writableModel.value()] ); // check whether we have to dis-check items in connection-menu if( !isInputEnabled() ) { for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { // subscribed? if( it.value() ) { subscribeReadablePort( it.key(), false ); } } } if( !isOutputEnabled() ) { for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { // subscribed? if( it.value() ) { subscribeWritablePort( it.key(), false ); } } } emit readablePortsChanged(); emit writablePortsChanged(); emit modeChanged(); if( Engine::getSong() ) { Engine::getSong()->setModified(); } }
void MidiPort::updateReadablePorts() { // first save all selected ports QStringList selectedPorts; for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { if( it.value() ) { selectedPorts.push_back( it.key() ); } } m_readablePorts.clear(); const QStringList& wp = m_midiClient->readablePorts(); // now insert new ports and restore selections for( QStringList::ConstIterator it = wp.begin(); it != wp.end(); ++it ) { m_readablePorts[*it] = ( selectedPorts.indexOf( *it ) != -1 ); } emit readablePortsChanged(); }
void MidiAlsaSeq::updatePortList() { QStringList readablePorts; QStringList writablePorts; // get input- and output-ports snd_seq_client_info_t * cinfo; snd_seq_port_info_t * pinfo; snd_seq_client_info_malloc( &cinfo ); snd_seq_port_info_malloc( &pinfo ); snd_seq_client_info_set_client( cinfo, -1 ); m_seqMutex.lock(); while( snd_seq_query_next_client( m_seqHandle, cinfo ) >= 0 ) { int client = snd_seq_client_info_get_client( cinfo ); snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); while( snd_seq_query_next_port( m_seqHandle, pinfo ) >= 0 ) { // we need both READ and SUBS_READ if( ( snd_seq_port_info_get_capability( pinfo ) & ( SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ ) ) == ( SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ ) ) { readablePorts.push_back( __portName( cinfo, pinfo ) ); } if( ( snd_seq_port_info_get_capability( pinfo ) & ( SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ) ) == ( SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ) ) { writablePorts.push_back( __portName( cinfo, pinfo ) ); } } } m_seqMutex.unlock(); snd_seq_client_info_free( cinfo ); snd_seq_port_info_free( pinfo ); if( m_readablePorts != readablePorts ) { m_readablePorts = readablePorts; emit readablePortsChanged(); } if( m_writablePorts != writablePorts ) { m_writablePorts = writablePorts; emit writablePortsChanged(); } }