void DSPEngine::handleMessages() { Message* message; while((message = m_messageQueue.accept()) != NULL) { qDebug("Message: %s", message->getIdentifier()); if(DSPPing::match(message)) { message->completed(m_state); } else if(DSPExit::match(message)) { gotoIdle(); m_state = StNotStarted; exit(); message->completed(m_state); } else if(DSPAcquisitionStart::match(message)) { m_state = gotoIdle(); if(m_state == StIdle) m_state = gotoRunning(); message->completed(m_state); } else if(DSPAcquisitionStop::match(message)) { m_state = gotoIdle(); message->completed(m_state); } else if(DSPGetDeviceDescription::match(message)) { ((DSPGetDeviceDescription*)message)->setDeviceDescription(m_deviceDescription); message->completed(); } else if(DSPGetErrorMessage::match(message)) { ((DSPGetErrorMessage*)message)->setErrorMessage(m_errorMessage); message->completed(); } else if(DSPSetSource::match(message)) { handleSetSource(((DSPSetSource*)message)->getSampleSource()); message->completed(); } else if(DSPAddSink::match(message)) { SampleSink* sink = ((DSPAddSink*)message)->getSampleSink(); if(m_state == StRunning) { DSPSignalNotification* signal = DSPSignalNotification::create(m_sampleRate, 0, m_tunerFrequency); signal->submit(&m_messageQueue, sink); sink->start(); } m_sampleSinks.push_back(sink); message->completed(); } else if(DSPRemoveSink::match(message)) { SampleSink* sink = ((DSPAddSink*)message)->getSampleSink(); if(m_state == StRunning) sink->stop(); m_sampleSinks.remove(sink); message->completed(); } else if(DSPAddAudioSource::match(message)) { m_audioOutput.addFifo(((DSPAddAudioSource*)message)->getAudioFifo()); message->completed(); } else if(DSPRemoveAudioSource::match(message)) { m_audioOutput.removeFifo(((DSPAddAudioSource*)message)->getAudioFifo()); message->completed(); } else if(DSPConfigureCorrection::match(message)) { DSPConfigureCorrection* conf = (DSPConfigureCorrection*)message; m_iqImbalanceCorrection = conf->getIQImbalanceCorrection(); if(m_dcOffsetCorrection != conf->getDCOffsetCorrection()) { m_dcOffsetCorrection = conf->getDCOffsetCorrection(); m_iOffset = 0; m_qOffset = 0; } if(m_iqImbalanceCorrection != conf->getIQImbalanceCorrection()) { m_iqImbalanceCorrection = conf->getIQImbalanceCorrection(); m_iRange = 1 << 16; m_qRange = 1 << 16; m_imbalance = 65536; } message->completed(); } else { if(!distributeMessage(message)) message->completed(); } } }
void DSPDeviceSinkEngine::handleSynchronousMessages() { Message *message = m_syncMessenger.getMessage(); qDebug() << "DSPDeviceSinkEngine::handleSynchronousMessages: " << message->getIdentifier(); if (DSPGenerationInit::match(*message)) { m_state = gotoIdle(); if(m_state == StIdle) { m_state = gotoInit(); // State goes ready if init is performed } } else if (DSPGenerationStart::match(*message)) { if(m_state == StReady) { m_state = gotoRunning(); } } else if (DSPGenerationStop::match(*message)) { m_state = gotoIdle(); } else if (DSPGetSinkDeviceDescription::match(*message)) { ((DSPGetSinkDeviceDescription*) message)->setDeviceDescription(m_deviceDescription); } else if (DSPGetErrorMessage::match(*message)) { ((DSPGetErrorMessage*) message)->setErrorMessage(m_errorMessage); } else if (DSPSetSink::match(*message)) { handleSetSink(((DSPSetSink*) message)->getSampleSink()); } else if (DSPAddSpectrumSink::match(*message)) { m_spectrumSink = ((DSPAddSpectrumSink*) message)->getSampleSink(); } else if (DSPRemoveSpectrumSink::match(*message)) { BasebandSampleSink* spectrumSink = ((DSPRemoveSpectrumSink*) message)->getSampleSink(); if(m_state == StRunning) { spectrumSink->stop(); } m_spectrumSink = 0; } else if (DSPAddBasebandSampleSource::match(*message)) { BasebandSampleSource* source = ((DSPAddBasebandSampleSource*) message)->getSampleSource(); m_basebandSampleSources.push_back(source); DSPSignalNotification notif(m_sampleRate, m_centerFrequency); source->handleMessage(notif); checkNumberOfBasebandSources(); if (m_state == StRunning) { source->start(); } } else if (DSPRemoveBasebandSampleSource::match(*message)) { BasebandSampleSource* source = ((DSPRemoveBasebandSampleSource*) message)->getSampleSource(); if(m_state == StRunning) { source->stop(); } m_basebandSampleSources.remove(source); checkNumberOfBasebandSources(); } else if (DSPAddThreadedBasebandSampleSource::match(*message)) { ThreadedBasebandSampleSource *threadedSource = ((DSPAddThreadedBasebandSampleSource*) message)->getThreadedSampleSource(); m_threadedBasebandSampleSources.push_back(threadedSource); DSPSignalNotification notif(m_sampleRate, m_centerFrequency); threadedSource->handleSourceMessage(notif); checkNumberOfBasebandSources(); if (m_state == StRunning) { threadedSource->start(); } } else if (DSPRemoveThreadedBasebandSampleSource::match(*message)) { ThreadedBasebandSampleSource* threadedSource = ((DSPRemoveThreadedBasebandSampleSource*) message)->getThreadedSampleSource(); if (m_state == StRunning) { threadedSource->stop(); } m_threadedBasebandSampleSources.remove(threadedSource); checkNumberOfBasebandSources(); } m_syncMessenger.done(m_state); }