--- qsampler/trunk/src/qsamplerChannelStrip.ui.h 2005/01/18 11:29:01 341 +++ qsampler/trunk/src/qsamplerChannelStrip.ui.h 2005/08/19 17:10:16 751 @@ -22,10 +22,12 @@ #include #include +#include #include #include #include #include +#include #include @@ -34,6 +36,9 @@ #include "config.h" +// Channel status/usage usage limit control. +#define QSAMPLER_ERROR_LIMIT 3 + // Kind of constructor. void qsamplerChannelStrip::init (void) @@ -41,6 +46,7 @@ // Initialize locals. m_pChannel = NULL; m_iDirtyChange = 0; + m_iErrorCount = 0; // Try to restore normal window positioning. adjustSize(); @@ -57,6 +63,50 @@ } +// Drag'n'drop file handler. +bool qsamplerChannelStrip::decodeDragFile ( const QMimeSource *pEvent, QString& sInstrumentFile ) +{ + if (m_pChannel == NULL) + return false; + if (QTextDrag::canDecode(pEvent)) { + QString sText; + if (QTextDrag::decode(pEvent, sText)) { + QStringList files = QStringList::split('\n', sText); + for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) { + *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path(); + if (qsamplerChannel::isInstrumentFile(*iter)) { + sInstrumentFile = *iter; + return true; + } + } + } + } + // Fail. + return false; +} + + +// Window drag-n-drop event handlers. +void qsamplerChannelStrip::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent ) +{ + QString sInstrumentFile; + pDragEnterEvent->accept(decodeDragFile(pDragEnterEvent, sInstrumentFile)); +} + + +void qsamplerChannelStrip::dropEvent ( QDropEvent* pDropEvent ) +{ + QString sInstrumentFile; + + if (decodeDragFile(pDropEvent, sInstrumentFile)) { + // Go and set the dropped instrument filename... + m_pChannel->setInstrument(sInstrumentFile, 0); + // Open up the channel dialog. + channelSetup(); + } +} + + // Channel strip setup formal initializer. void qsamplerChannelStrip::setup ( qsamplerChannel *pChannel ) { @@ -70,6 +120,10 @@ // Stabilize this around. updateChannelInfo(); + + // We'll accept drops from now on... + if (m_pChannel) + setAcceptDrops(true); } // Channel secriptor accessor. @@ -117,75 +171,106 @@ pLabel->setPaletteBackgroundPixmap(pm); delete pList; } - + // And this standalone too. StreamVoiceCountTextLabel->setPaletteBackgroundPixmap(pm); } +// Maximum volume slider accessors. +void qsamplerChannelStrip::setMaxVolume ( int iMaxVolume ) +{ + m_iDirtyChange++; + VolumeSlider->setRange(0, iMaxVolume); + VolumeSpinBox->setRange(0, iMaxVolume); + m_iDirtyChange--; +} + + // Channel setup dialog slot. bool qsamplerChannelStrip::channelSetup (void) { - bool bResult = m_pChannel->channelSetup(this); + if (m_pChannel == NULL) + return false; + + // Invoke the channel setup dialog. + bool bResult = m_pChannel->channelSetup(this); + // Notify that this channel has changed. + if (bResult) + emit channelChanged(this); - if (bResult) - emit channelChanged(this); + return bResult; +} - return bResult; + +// Channel mute slot. +bool qsamplerChannelStrip::channelMute ( bool bMute ) +{ + if (m_pChannel == NULL) + return false; + + // Invoke the channel mute method. + bool bResult = m_pChannel->setChannelMute(bMute); + // Notify that this channel has changed. + if (bResult) + emit channelChanged(this); + + return bResult; } -// Update whole channel info state. -bool qsamplerChannelStrip::updateChannelInfo (void) +// Channel solo slot. +bool qsamplerChannelStrip::channelSolo ( bool bSolo ) { - if (m_pChannel == NULL) - return false; - - // Update strip caption. - QString sText = m_pChannel->channelName(); - setCaption(sText); - ChannelSetupPushButton->setText(sText); + if (m_pChannel == NULL) + return false; - // Check if we're up and connected. - if (m_pChannel->client() == NULL) - return false; + // Invoke the channel solo method. + bool bResult = m_pChannel->setChannelSolo(bSolo); + // Notify that this channel has changed. + if (bResult) + emit channelChanged(this); - // Read actual channel information. - m_pChannel->updateChannelInfo(); + return bResult; +} - // Set some proper display values. - const QString sIndent = " "; - // Engine name... - if (m_pChannel->engineName().isEmpty()) - EngineNameTextLabel->setText(sIndent + tr("(No engine)")); - else - EngineNameTextLabel->setText(sIndent + m_pChannel->engineName()); +// Channel reset slot. +bool qsamplerChannelStrip::channelReset (void) +{ + if (m_pChannel == NULL) + return false; - // Instrument name... - if (m_pChannel->instrumentFile().isEmpty()) - InstrumentNameTextLabel->setText(sIndent + tr("(No instrument)")); - else - InstrumentNameTextLabel->setText(sIndent + qsamplerChannel::getInstrumentName(m_pChannel->instrumentFile(), m_pChannel->instrumentNr())); + // Invoke the channel reset method. + bool bResult = m_pChannel->channelReset(); + // Notify that this channel has changed. + if (bResult) + emit channelChanged(this); - // Instrument status... - int iInstrumentStatus = m_pChannel->instrumentStatus(); - if (iInstrumentStatus < 0) { - InstrumentStatusTextLabel->setPaletteForegroundColor(Qt::red); - InstrumentStatusTextLabel->setText(tr("ERR%1").arg(iInstrumentStatus)); - } else { - InstrumentStatusTextLabel->setPaletteForegroundColor(iInstrumentStatus < 100 ? Qt::yellow : Qt::green); - InstrumentStatusTextLabel->setText(QString::number(iInstrumentStatus) + "%"); - } + return bResult; +} - // MIDI Port/Channel... - if (m_pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL) - MidiPortChannelTextLabel->setText(QString("%1 / *").arg(m_pChannel->midiPort())); - else - MidiPortChannelTextLabel->setText(QString("%1 / %2").arg(m_pChannel->midiPort()).arg(m_pChannel->midiChannel() + 1)); - // And update the both GUI volume elements. - return updateChannelVolume(); +// Update the channel instrument name. +bool qsamplerChannelStrip::updateInstrumentName ( bool bForce ) +{ + if (m_pChannel == NULL) + return false; + + // Do we refresh the actual name? + if (bForce) + m_pChannel->updateInstrumentName(); + + // Instrument name... + if (m_pChannel->instrumentName().isEmpty()) { + if (m_pChannel->instrumentStatus() >= 0) + InstrumentNameTextLabel->setText(' ' + qsamplerChannel::loadingInstrument()); + else + InstrumentNameTextLabel->setText(' ' + qsamplerChannel::noInstrumentName()); + } else + InstrumentNameTextLabel->setText(' ' + m_pChannel->instrumentName()); + + return true; } @@ -218,34 +303,92 @@ VolumeSlider->setValue(iVolume); VolumeSpinBox->setValue(iVolume); m_iDirtyChange--; - + return true; } -// Update whole channel usage state. -bool qsamplerChannelStrip::updateChannelUsage (void) +// Update whole channel info state. +bool qsamplerChannelStrip::updateChannelInfo (void) { if (m_pChannel == NULL) return false; + + // Check for error limit/recycle... + if (m_iErrorCount > QSAMPLER_ERROR_LIMIT) + return true; + + // Update strip caption. + QString sText = m_pChannel->channelName(); + setCaption(sText); + ChannelSetupPushButton->setText(sText); + + // Check if we're up and connected. if (m_pChannel->client() == NULL) return false; - // Update whole channel status info, - // if instrument load is still pending... - if (m_pChannel->instrumentStatus() < 100) { - updateChannelInfo(); - // Check (updated) status again... - if (m_pChannel->instrumentStatus() < 100) - return false; - // Once we get a complete instrument load, - // we'll try an implied channel reset... - m_pChannel->resetChannel(); + // Read actual channel information. + m_pChannel->updateChannelInfo(); + + // Engine name... + if (m_pChannel->engineName().isEmpty()) + EngineNameTextLabel->setText(' ' + qsamplerChannel::noEngineName()); + else + EngineNameTextLabel->setText(' ' + m_pChannel->engineName()); + + // Instrument name... + updateInstrumentName(false); + + // MIDI Port/Channel... + if (m_pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL) + MidiPortChannelTextLabel->setText(QString("%1 / *").arg(m_pChannel->midiPort())); + else + MidiPortChannelTextLabel->setText(QString("%1 / %2").arg(m_pChannel->midiPort()).arg(m_pChannel->midiChannel() + 1)); + + // Instrument status... + int iInstrumentStatus = m_pChannel->instrumentStatus(); + if (iInstrumentStatus < 0) { + InstrumentStatusTextLabel->setPaletteForegroundColor(Qt::red); + InstrumentStatusTextLabel->setText(tr("ERR%1").arg(iInstrumentStatus)); + m_iErrorCount++; + return false; } - - // Check again that we're clean. - if (m_pChannel->instrumentStatus() < 100) + // All seems normal... + InstrumentStatusTextLabel->setPaletteForegroundColor(iInstrumentStatus < 100 ? Qt::yellow : Qt::green); + InstrumentStatusTextLabel->setText(QString::number(iInstrumentStatus) + '%'); + m_iErrorCount = 0; + +#ifdef CONFIG_MUTE_SOLO + // Mute/Solo button state coloring... + const QColor& rgbNormal = ChannelSetupPushButton->paletteBackgroundColor(); + bool bMute = m_pChannel->channelMute(); + ChannelMutePushButton->setPaletteBackgroundColor(bMute ? Qt::red : rgbNormal); + ChannelMutePushButton->setDown(bMute); + bool bSolo = m_pChannel->channelSolo(); + ChannelSoloPushButton->setPaletteBackgroundColor(bSolo ? Qt::yellow : rgbNormal); + ChannelSoloPushButton->setDown(bSolo); +#else + ChannelMutePushButton->setEnabled(false); + ChannelSoloPushButton->setEnabled(false); +#endif + + // And update the both GUI volume elements; + // return success if, and only if, intrument is fully loaded... + return updateChannelVolume() && (iInstrumentStatus == 100); +} + + +// Update whole channel usage state. +bool qsamplerChannelStrip::updateChannelUsage (void) +{ + if (m_pChannel == NULL) return false; + if (m_pChannel->client() == NULL) + return false; + + // This only makes sense on fully loaded channels... + if (m_pChannel->instrumentStatus() < 100) + return false; // Get current channel voice count. int iVoiceCount = ::lscp_get_channel_voice_count(m_pChannel->client(), m_pChannel->channelID()); @@ -259,7 +402,7 @@ // Update the GUI elements... StreamUsageProgressBar->setProgress(iStreamUsage); StreamVoiceCountTextLabel->setText(QString("%1 / %2").arg(iStreamCount).arg(iVoiceCount)); - + // We're clean. return true; } @@ -293,19 +436,16 @@ { if (m_pChannel == NULL) return; - + // We'll just show up the main form's edit menu (thru qsamplerChannel). m_pChannel->contextMenuEvent(pEvent); } -// Maximum volume slider accessors. -void qsamplerChannelStrip::setMaxVolume ( int iMaxVolume ) +// Error count hackish accessors. +void qsamplerChannelStrip::resetErrorCount (void) { - m_iDirtyChange++; - VolumeSlider->setRange(0, iMaxVolume); - VolumeSpinBox->setRange(0, iMaxVolume); - m_iDirtyChange--; + m_iErrorCount = 0; }