--- qsampler/trunk/src/qsamplerChannelStrip.ui.h 2004/06/05 11:37:06 109 +++ qsampler/trunk/src/qsamplerChannelStrip.ui.h 2004/11/17 17:17:18 302 @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include @@ -37,20 +39,8 @@ void qsamplerChannelStrip::init (void) { // Initialize locals. - m_pMainForm = NULL; - m_iChannelID = 0; - -// m_sEngineName = "(No engine)"; -// m_sInstrumentFile = "(No instrument)"; - m_iInstrumentNr = 0; - m_sMidiDriver = "ALSA"; // DEPRECATED. - m_iMidiDevice = 0; - m_iMidiPort = 0; - m_iMidiChannel = 0; - m_sAudioDriver = "ALSA"; // DEPRECATED. - m_iAudioDevice = 0; - m_fVolume = 0.0; - + m_pMainForm = NULL; + m_pChannel = NULL; m_iDirtyChange = 0; // Try to restore normal window positioning. @@ -61,343 +51,171 @@ // Kind of destructor. void qsamplerChannelStrip::destroy (void) { + // Destroy existing channel descriptor. + if (m_pChannel) + delete m_pChannel; + m_pChannel = NULL; } // Channel strip setup formal initializer. void qsamplerChannelStrip::setup ( qsamplerMainForm *pMainForm, int iChannelID ) { - m_iDirtyChange = 0; + // Set main form reference. m_pMainForm = pMainForm; - - setChannelID(iChannelID); -} - - -// The global options settings delegated property. -qsamplerOptions *qsamplerChannelStrip::options (void) -{ - if (m_pMainForm == NULL) - return NULL; - - return m_pMainForm->options(); -} - - -// The client descriptor delegated property. -lscp_client_t *qsamplerChannelStrip::client (void) -{ - if (m_pMainForm == NULL) - return NULL; - - return m_pMainForm->client(); -} - - -// Channel-ID (aka Sammpler-Channel) accessors. -int qsamplerChannelStrip::channelID (void) -{ - return m_iChannelID; -} - -void qsamplerChannelStrip::setChannelID ( int iChannelID ) -{ - m_iChannelID = iChannelID; - - updateChannelInfo(); -} - - -// Engine name accessors. -QString& qsamplerChannelStrip::engineName (void) -{ - return m_sEngineName; -} - -bool qsamplerChannelStrip::loadEngine ( const QString& sEngineName ) -{ - if (client() == NULL) - return false; - - if (::lscp_load_engine(client(), sEngineName.latin1(), m_iChannelID) != LSCP_OK) { - appendMessagesClient("lscp_load_engine"); - return false; - } - - m_sEngineName = sEngineName; - return true; -} - - -// Instrument filename accessors. -QString& qsamplerChannelStrip::instrumentFile (void) -{ - return m_sInstrumentFile; -} - -// Instrument index accessors. -int qsamplerChannelStrip::instrumentNr (void) -{ - return m_iInstrumentNr; -} - -bool qsamplerChannelStrip::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr ) -{ - if (client() == NULL) - return false; - - if (::lscp_load_instrument(client(), sInstrumentFile.latin1(), iInstrumentNr, m_iChannelID) != LSCP_OK) { - appendMessagesClient("lscp_load_instrument"); - return false; - } - - m_sInstrumentFile = sInstrumentFile; - m_iInstrumentNr = iInstrumentNr; - return true; -} - - -// MIDI driver type accessors (DEPRECATED). -QString& qsamplerChannelStrip::midiDriver (void) -{ - return m_sMidiDriver; -} - -bool qsamplerChannelStrip::setMidiDriver ( const QString& sMidiDriver ) -{ - if (client() == NULL) - return false; - - if (::lscp_set_channel_midi_type(client(), m_iChannelID, sMidiDriver.latin1()) != LSCP_OK) { - appendMessagesClient("lscp_set_channel_midi_type"); - return false; + + // Destroy any previous channel descriptor. + if (m_pChannel) + delete m_pChannel; + + // Create a new one... + m_pChannel = new qsamplerChannel(pMainForm); + // And set appropriate settings. + if (m_pChannel && iChannelID >= 0) { + m_pChannel->setChannelID(iChannelID); + m_iDirtyChange = 0; } - m_sMidiDriver = sMidiDriver; - return true; -} - - -// MIDI device accessors. -int qsamplerChannelStrip::midiDevice (void) -{ - return m_iMidiDevice; -} - -bool qsamplerChannelStrip::setMidiDevice ( int iMidiDevice ) -{ - if (client() == NULL) - return false; - -// FIXME: call this when LSCP becomes stable. -// if (::lscp_set_channel_midi_device(client(), m_iChannelID, iMidiDevice) != LSCP_OK) { -// appendMessagesClient("lscp_set_channel_midi_device"); -// return false; -// } - - m_iMidiDevice = iMidiDevice; - return true; -} - - -// MIDI port number accessor. -int qsamplerChannelStrip::midiPort (void) -{ - return m_iMidiPort; -} - -bool qsamplerChannelStrip::setMidiPort ( int iMidiPort ) -{ - if (client() == NULL) - return false; - -// FIXME: call this when LSCP becomes stable. -// if (::lscp_set_channel_midi_port(client(), m_iChannelID, iMidiPort) != LSCP_OK) { -// appendMessagesClient("lscp_set_channel_midi_port"); -// return false; -// } - - m_iMidiPort = iMidiPort; - return true; -} - - -// MIDI channel accessor. -int qsamplerChannelStrip::midiChannel (void) -{ - return m_iMidiChannel; + // Stabilize this around. + updateChannelInfo(); } -bool qsamplerChannelStrip::setMidiChannel ( int iMidiChannel ) +// Channel secriptor accessor. +qsamplerChannel *qsamplerChannelStrip::channel (void) { - if (client() == NULL) - return false; - -// FIXME: call this when LSCP becomes stable. -// if (::lscp_set_channel_midi_channel(client(), m_iChannelID, iMidiChannel) != LSCP_OK) { -// appendMessagesClient("lscp_set_channel_midi_channel"); -// return false; -// } - - m_iMidiChannel = iMidiChannel; - return true; + return m_pChannel; } -// Audio device accessor. -int qsamplerChannelStrip::audioDevice (void) +// Messages view font accessors. +QFont qsamplerChannelStrip::displayFont (void) { - return m_iAudioDevice; + return EngineNameTextLabel->font(); } -bool qsamplerChannelStrip::setAudioDevice ( int iAudioDevice ) +void qsamplerChannelStrip::setDisplayFont ( const QFont & font ) { - if (client() == NULL) - return false; - -// FIXME: call this when LSCP becomes stable. -// if (::lscp_set_channel_audio_device(client(), m_iChannelID, iAudioDevice) != LSCP_OK) { -// appendMessagesClient("lscp_set_channel_audio_device"); -// return false; -// } - - m_iAudioDevice = iAudioDevice; - return true; + EngineNameTextLabel->setFont(font); + MidiPortChannelTextLabel->setFont(font); + InstrumentNameTextLabel->setFont(font); + InstrumentStatusTextLabel->setFont(font); } -// Audio driver type accessors (DEPRECATED). -QString& qsamplerChannelStrip::audioDriver (void) +// Channel display background effect. +void qsamplerChannelStrip::setDisplayEffect ( bool bDisplayEffect ) { - return m_sAudioDriver; -} - -bool qsamplerChannelStrip::setAudioDriver ( const QString& sAudioDriver ) -{ - if (client() == NULL) - return false; - - if (::lscp_set_channel_audio_type(client(), m_iChannelID, sAudioDriver.latin1()) != LSCP_OK) { - appendMessagesClient("lscp_set_channel_audio_type"); - return false; - } - - m_sAudioDriver = sAudioDriver; - return true; + QPixmap pm; + if (bDisplayEffect) + pm = QPixmap::fromMimeSource("displaybg1.png"); + setDisplayBackground(pm); } -// Channel volume accessors. -float qsamplerChannelStrip::volume (void) -{ - return m_fVolume; -} - -bool qsamplerChannelStrip::setVolume ( float fVolume ) +// Update main display background pixmap. +void qsamplerChannelStrip::setDisplayBackground ( const QPixmap& pm ) { - if (client() == NULL) - return false; + // Set the main origin... + ChannelInfoFrame->setPaletteBackgroundPixmap(pm); - if (::lscp_set_channel_volume(client(), m_iChannelID, fVolume) != LSCP_OK) { - appendMessagesClient("lscp_set_channel_volume"); - return false; + // Iterate for every child text label... + QObjectList *pList = ChannelInfoFrame->queryList("QLabel"); + if (pList) { + for (QLabel *pLabel = (QLabel *) pList->first(); pLabel; pLabel = (QLabel *) pList->next()) + pLabel->setPaletteBackgroundPixmap(pm); + delete pList; } - - m_fVolume = fVolume; - return true; + + // And this standalone too. + StreamVoiceCountTextLabel->setPaletteBackgroundPixmap(pm); } -// Messages view font accessors. -QFont qsamplerChannelStrip::displayFont (void) +// Channel setup dialog slot. +bool qsamplerChannelStrip::channelSetup (void) { - return EngineNameTextLabel->font(); -} + bool bResult = false; -void qsamplerChannelStrip::setDisplayFont ( const QFont & font ) -{ - EngineNameTextLabel->setFont(font); - InstrumentNameTextLabel->setFont(font); - MidiPortChannelTextLabel->setFont(font); -} - -// Channel setup dialog. -void qsamplerChannelStrip::channelSetup (void) -{ qsamplerChannelForm *pChannelForm = new qsamplerChannelForm(this); if (pChannelForm) { - pChannelForm->setup(this); - if (pChannelForm->exec()) { - updateChannelInfo(); - emit channelChanged(this); - } + pChannelForm->setup(m_pChannel); + bResult = pChannelForm->exec(); delete pChannelForm; } + + if (bResult) + emit channelChanged(this); + + return bResult; } // Update whole channel info state. -void qsamplerChannelStrip::updateChannelInfo (void) +bool qsamplerChannelStrip::updateChannelInfo (void) { + if (m_pChannel == NULL) + return false; + // Update strip caption. - QString sText = tr("Channel %1").arg(m_iChannelID); + QString sText = m_pChannel->channelName(); setCaption(sText); ChannelSetupPushButton->setText(sText); // Check if we're up and connected. - if (client() == NULL) - return; + if (m_pChannel->client() == NULL) + return false; - // Read channel information. - lscp_channel_info_t *pChannelInfo = ::lscp_get_channel_info(client(), m_iChannelID); - if (pChannelInfo == NULL) { - appendMessagesClient("lscp_get_channel_info"); - // appendMessagesError(tr("Could not get channel information.\n\nSorry.")); - } else { - // Cache in channel information. - m_sEngineName = pChannelInfo->engine_name; - m_sInstrumentFile = pChannelInfo->instrument_file; - m_iInstrumentNr = pChannelInfo->instrument_nr; - m_iMidiDevice = pChannelInfo->midi_device; - m_iMidiPort = pChannelInfo->midi_port; - m_iMidiChannel = pChannelInfo->midi_channel; - m_iAudioDevice = pChannelInfo->audio_device; - m_fVolume = pChannelInfo->volume; - } + // Read actual channel information. + m_pChannel->updateChannelInfo(); // Set some proper display values. + const QString sIndent = " "; // Engine name... - if (m_sEngineName.isEmpty()) - EngineNameTextLabel->setText(tr("(No engine)")); + if (m_pChannel->engineName().isEmpty()) + EngineNameTextLabel->setText(sIndent + tr("(No engine)")); else - EngineNameTextLabel->setText(m_sEngineName); + EngineNameTextLabel->setText(sIndent + m_pChannel->engineName()); // Instrument name... - if (m_sInstrumentFile.isEmpty()) - InstrumentNameTextLabel->setText(tr("(No instrument)")); + if (m_pChannel->instrumentFile().isEmpty()) + InstrumentNameTextLabel->setText(sIndent + tr("(No instrument)")); else - InstrumentNameTextLabel->setText(QString("%1 [%2]") - .arg(QFileInfo(m_sInstrumentFile).fileName()).arg(m_iInstrumentNr)); + InstrumentNameTextLabel->setText(sIndent + qsamplerChannel::getInstrumentName(m_pChannel->instrumentFile(), m_pChannel->instrumentNr())); + + // 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) + "%"); + } // MIDI Port/Channel... - MidiPortChannelTextLabel->setText(QString("%1 / %2") - .arg(m_iMidiPort).arg(m_iMidiChannel)); - + 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. - updateChannelVolume(); + return updateChannelVolume(); } // Do the dirty volume change. -void qsamplerChannelStrip::updateChannelVolume (void) +bool qsamplerChannelStrip::updateChannelVolume (void) { + if (m_pChannel == NULL) + return false; + // Convert... #ifdef CONFIG_ROUND - int iVolume = (int) ::round(100.0 * m_fVolume); + int iVolume = (int) ::round(100.0 * m_pChannel->volume()); #else double fIPart = 0.0; - double fFPart = ::modf(100.0 * m_fVolume, &fIPart); + double fFPart = ::modf(100.0 * m_pChannel->volume(), &fIPart); int iVolume = (int) fIPart; if (fFPart >= +0.5) iVolume++; @@ -407,9 +225,7 @@ #endif // And clip... - if (iVolume > 100) - iVolume = 100; - else if (iVolume < 0) + if (iVolume < 0) iVolume = 0; // Flag it here, to avoid infinite recursion. @@ -417,86 +233,95 @@ VolumeSlider->setValue(iVolume); VolumeSpinBox->setValue(iVolume); m_iDirtyChange--; + + return true; } // Update whole channel usage state. -void qsamplerChannelStrip::updateChannelUsage (void) +bool qsamplerChannelStrip::updateChannelUsage (void) { - if (client() == NULL) - return; + if (m_pChannel == NULL) + return false; + 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(); + } + + // Check again that we're clean. + if (m_pChannel->instrumentStatus() < 100) + return false; // Get current channel voice count. - int iVoiceCount = ::lscp_get_channel_voice_count(client(), m_iChannelID); + int iVoiceCount = ::lscp_get_channel_voice_count(m_pChannel->client(), m_pChannel->channelID()); // Get current stream count. - int iStreamCount = ::lscp_get_channel_stream_count(client(), m_iChannelID); + int iStreamCount = ::lscp_get_channel_stream_count(m_pChannel->client(), m_pChannel->channelID()); // Get current channel buffer fill usage. // As benno has suggested this is the percentage usage // of the least filled buffer stream... - int iStreamUsage = 0; - if (iStreamCount > 0) { - lscp_buffer_fill_t *pBufferFill = ::lscp_get_channel_buffer_fill(client(), LSCP_USAGE_PERCENTAGE, m_iChannelID); - if (pBufferFill) { - for (int iStream = 0; iStream < iStreamCount; iStream++) { - if (iStreamUsage > (int) pBufferFill[iStream].stream_usage || iStream == 0) - iStreamUsage = pBufferFill[iStream].stream_usage; - } - } - } + int iStreamUsage = ::lscp_get_channel_stream_usage(m_pChannel->client(), m_pChannel->channelID());; + // Update the GUI elements... StreamUsageProgressBar->setProgress(iStreamUsage); StreamVoiceCountTextLabel->setText(QString("%1 / %2").arg(iStreamCount).arg(iVoiceCount)); + + // We're clean. + return true; } // Volume change slot. void qsamplerChannelStrip::volumeChanged ( int iVolume ) { + if (m_pChannel == NULL) + return; + // Avoid recursion. if (m_iDirtyChange > 0) return; // Convert and clip. float fVolume = (float) iVolume / 100.0; - if (fVolume > 1.0) - fVolume = 1.0; - else if (fVolume < 0.0) + if (fVolume < 0.001) fVolume = 0.0; // Update the GUI elements. - if (setVolume(fVolume)) { + if (m_pChannel->setVolume(fVolume)) { updateChannelVolume(); emit channelChanged(this); } } -// Redirected messages output methods. -void qsamplerChannelStrip::appendMessages( const QString& s ) -{ - m_pMainForm->appendMessages(s); -} - -void qsamplerChannelStrip::appendMessagesColor( const QString& s, const QString& c ) -{ - m_pMainForm->appendMessagesColor(s, c); -} - -void qsamplerChannelStrip::appendMessagesText( const QString& s ) +// Context menu event handler. +void qsamplerChannelStrip::contextMenuEvent( QContextMenuEvent *pEvent ) { - m_pMainForm->appendMessagesText(s); + if (m_pMainForm == NULL) + return; + + // We'll just show up the main form's edit menu. + m_pMainForm->contextMenuEvent(pEvent); } -void qsamplerChannelStrip::appendMessagesError( const QString& s ) -{ - m_pMainForm->appendMessagesError(s); -} -void qsamplerChannelStrip::appendMessagesClient( const QString& s ) +// Maximum volume slider accessors. +void qsamplerChannelStrip::setMaxVolume ( int iMaxVolume ) { - m_pMainForm->appendMessagesClient(s); + m_iDirtyChange++; + VolumeSlider->setRange(0, iMaxVolume); + VolumeSpinBox->setRange(0, iMaxVolume); + m_iDirtyChange--; } // end of qsamplerChannelStrip.ui.h -