void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); #ifdef __APPLE__ // force half-rate? glFinish(); #endif const wxSize ClientSize = GetClientSize(); glContext->SetCurrent(*this); initGLExtensions(); glViewport(0, 0, ClientSize.x, ClientSize.y); glContext->BeginDraw(ThemeMgr::mgr.currentTheme->fftBackground.r, ThemeMgr::mgr.currentTheme->fftBackground.g, ThemeMgr::mgr.currentTheme->fftBackground.b); glContext->Draw(spectrum_points, getCenterFrequency(), getBandwidth()); std::vector<DemodulatorInstance *> &demods = wxGetApp().getDemodMgr().getDemodulators(); for (int i = 0, iMax = demods.size(); i < iMax; i++) { glContext->DrawDemodInfo(demods[i], ThemeMgr::mgr.currentTheme->fftHighlight, getCenterFrequency(), getBandwidth()); } glContext->EndDraw(); SwapBuffers(); }
void ThreeBandBiquadEQEffectGroupState::setFilters( int sampleRate, double lowFreqCorner, double highFreqCorner) { double lowCenter = getCenterFrequency(kMinimumFrequency, lowFreqCorner); double midCenter = getCenterFrequency(lowFreqCorner, highFreqCorner); double highCenter = getCenterFrequency(highFreqCorner, kMaximumFrequency); m_lowBoost->setFrequencyCorners( sampleRate, lowCenter, kQBoost, m_oldLowBoost); m_midBoost->setFrequencyCorners( sampleRate, midCenter, kQBoost, m_oldMidBoost); m_highBoost->setFrequencyCorners( sampleRate, highCenter, kQBoost, m_oldHighBoost); m_lowCut->setFrequencyCorners( sampleRate, lowCenter, kQKill, m_oldLowCut); m_midCut->setFrequencyCorners( sampleRate, midCenter, kQKill, m_oldMidCut); m_highCut->setFrequencyCorners( sampleRate, highCenter / 2, kQKillShelve, m_oldHighCut); }
void BiquadFullKillEQEffectGroupState::setFilters( int sampleRate, double lowFreqCorner, double highFreqCorner) { double lowCenter = getCenterFrequency(kMinimumFrequency, lowFreqCorner); double midCenter = getCenterFrequency(lowFreqCorner, highFreqCorner); double highCenter = getCenterFrequency(highFreqCorner, kMaximumFrequency); m_lowBoost->setFrequencyCorners( sampleRate, lowCenter, kQBoost, m_oldLowBoost); m_midBoost->setFrequencyCorners( sampleRate, midCenter, kQBoost, m_oldMidBoost); m_highBoost->setFrequencyCorners( sampleRate, highCenter, kQBoost, m_oldHighBoost); m_lowKill->setFrequencyCorners( sampleRate, lowCenter * 2, kQLowKillShelve, m_oldLowKill); m_midKill->setFrequencyCorners( sampleRate, midCenter, kQKill, m_oldMidKill); m_highKill->setFrequencyCorners( sampleRate, highCenter / 2, kQHighKillShelve, m_oldHighKill); m_lvMixIso->setFilters(sampleRate, lowFreqCorner, highFreqCorner); }
void ThreeBandBiquadEQEffect::processChannel( const ChannelHandle& handle, ThreeBandBiquadEQEffectGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, const unsigned int numSamples, const unsigned int sampleRate, const EffectProcessor::EnableState enableState, const GroupFeatureState& groupFeatures) { Q_UNUSED(handle); Q_UNUSED(groupFeatures); if (pState->m_oldSampleRate != sampleRate || (pState->m_loFreqCorner != m_pLoFreqCorner->get()) || (pState->m_highFreqCorner != m_pHiFreqCorner->get())) { pState->m_loFreqCorner = m_pLoFreqCorner->get(); pState->m_highFreqCorner = m_pHiFreqCorner->get(); pState->m_oldSampleRate = sampleRate; pState->setFilters(sampleRate, pState->m_loFreqCorner, pState->m_highFreqCorner); } // Ramp to dry, when disabling, this will ramp from dry when enabling as well double bqGainLow = 0; double bqGainMid = 0; double bqGainHigh = 0; if (enableState != EffectProcessor::DISABLING) { bqGainLow = knobValueToBiquadGainDb( m_pPotLow->value(), m_pKillLow->toBool()); bqGainMid = knobValueToBiquadGainDb( m_pPotMid->value(), m_pKillMid->toBool()); bqGainHigh = knobValueToBiquadGainDb( m_pPotHigh->value(), m_pKillHigh->toBool()); } int activeFilters = 0; if (bqGainLow > 0.0 || pState->m_oldLowBoost > 0.0) { ++activeFilters; } if (bqGainLow < 0.0 || pState->m_oldLowCut < 0.0) { ++activeFilters; } if (bqGainMid > 0.0 || pState->m_oldMidBoost > 0.0) { ++activeFilters; } if (bqGainMid < 0.0 || pState->m_oldMidCut < 0.0) { ++activeFilters; } if (bqGainHigh > 0.0 || pState->m_oldHighBoost > 0.0) { ++activeFilters; } if (bqGainHigh < 0.0 || pState->m_oldHighCut < 0.0) { ++activeFilters; } QVarLengthArray<const CSAMPLE*, 6> inBuffer; QVarLengthArray<CSAMPLE*, 6> outBuffer; if (activeFilters % 2 == 0) { inBuffer.append(pInput); outBuffer.append(pState->m_tempBuf.data()); inBuffer.append(pState->m_tempBuf.data()); outBuffer.append(pOutput); inBuffer.append(pOutput); outBuffer.append(pState->m_tempBuf.data()); inBuffer.append(pState->m_tempBuf.data()); outBuffer.append(pOutput); inBuffer.append(pOutput); outBuffer.append(pState->m_tempBuf.data()); inBuffer.append(pState->m_tempBuf.data()); outBuffer.append(pOutput); } else { inBuffer.append(pInput); outBuffer.append(pOutput); inBuffer.append(pOutput); outBuffer.append(pState->m_tempBuf.data()); inBuffer.append(pState->m_tempBuf.data()); outBuffer.append(pOutput); inBuffer.append(pOutput); outBuffer.append(pState->m_tempBuf.data()); inBuffer.append(pState->m_tempBuf.data()); outBuffer.append(pOutput); inBuffer.append(pOutput); outBuffer.append(pState->m_tempBuf.data()); } int bufIndex = 0; if (bqGainLow > 0.0 || pState->m_oldLowBoost > 0.0) { if (bqGainLow != pState->m_oldLowBoost) { double lowCenter = getCenterFrequency( kMinimumFrequency, pState->m_loFreqCorner); pState->m_lowBoost->setFrequencyCorners( sampleRate, lowCenter, kQBoost, bqGainLow); pState->m_oldLowBoost = bqGainLow; } if (bqGainLow > 0.0) { pState->m_lowBoost->process( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } else { pState->m_lowBoost->processAndPauseFilter( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } ++bufIndex; } else { pState->m_lowBoost->pauseFilter(); } if (bqGainLow < 0.0 || pState->m_oldLowCut < 0.0) { if (bqGainLow != pState->m_oldLowCut) { double lowCenter = getCenterFrequency( kMinimumFrequency, pState->m_loFreqCorner); pState->m_lowCut->setFrequencyCorners( sampleRate, lowCenter, kQKill, bqGainLow); pState->m_oldLowCut = bqGainLow; } if (bqGainLow < 0.0) { pState->m_lowCut->process( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } else { pState->m_lowCut->processAndPauseFilter( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } ++bufIndex; } else { pState->m_lowCut->pauseFilter(); } if (bqGainMid > 0.0 || pState->m_oldMidBoost > 0.0) { if (bqGainMid != pState->m_oldMidBoost) { double midCenter = getCenterFrequency( pState->m_loFreqCorner, pState->m_highFreqCorner); pState->m_midBoost->setFrequencyCorners( sampleRate, midCenter, kQBoost, bqGainMid); pState->m_oldMidBoost = bqGainMid; } if (bqGainMid > 0.0) { pState->m_midBoost->process( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } else { pState->m_midBoost->processAndPauseFilter( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } ++bufIndex; } else { pState->m_midBoost->pauseFilter(); } if (bqGainMid < 0.0 || pState->m_oldMidCut < 0.0) { if (bqGainMid != pState->m_oldMidCut) { double midCenter = getCenterFrequency( pState->m_loFreqCorner, pState->m_highFreqCorner); pState->m_midCut->setFrequencyCorners( sampleRate, midCenter, kQKill, bqGainMid); pState->m_oldMidCut = bqGainMid; } if (bqGainMid < 0.0) { pState->m_midCut->process( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } else { pState->m_midCut->processAndPauseFilter( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } ++bufIndex; } else { pState->m_midCut->pauseFilter(); } if (bqGainHigh > 0.0 || pState->m_oldHighBoost > 0.0) { if (bqGainHigh != pState->m_oldHighBoost) { double highCenter = getCenterFrequency( pState->m_highFreqCorner, kMaximumFrequency); pState->m_highBoost->setFrequencyCorners( sampleRate, highCenter, kQBoost, bqGainHigh); pState->m_oldHighBoost = bqGainHigh; } if (bqGainHigh > 0.0) { pState->m_highBoost->process( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } else { pState->m_highBoost->processAndPauseFilter( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } ++bufIndex; } else { pState->m_highBoost->pauseFilter(); } if (bqGainHigh < 0.0 || pState->m_oldHighCut < 0.0) { if (bqGainHigh != pState->m_oldHighCut) { double highCenter = getCenterFrequency( pState->m_highFreqCorner, kMaximumFrequency); pState->m_highCut->setFrequencyCorners( sampleRate, highCenter / 2, kQKillShelve, bqGainHigh); pState->m_oldHighCut = bqGainHigh; } if (bqGainHigh < 0.0) { pState->m_highCut->process( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } else { pState->m_highCut->processAndPauseFilter( inBuffer[bufIndex], outBuffer[bufIndex], numSamples); } ++bufIndex; } else { pState->m_highCut->pauseFilter(); } if (activeFilters == 0) { SampleUtil::copy(pOutput, pInput, numSamples); } if (enableState == EffectProcessor::DISABLING) { pState->m_lowBoost->pauseFilter(); pState->m_midBoost->pauseFilter(); pState->m_highBoost->pauseFilter(); pState->m_lowCut->pauseFilter(); pState->m_midCut->pauseFilter(); pState->m_highCut->pauseFilter(); } }
void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { InteractiveCanvas::OnMouseReleased(event); wxGetApp().getDemodMgr().updateLastState(); bool isNew = shiftDown || (wxGetApp().getDemodMgr().getLastActiveDemodulator() == NULL) || (wxGetApp().getDemodMgr().getLastActiveDemodulator() && !wxGetApp().getDemodMgr().getLastActiveDemodulator()->isActive()); mouseTracker.setVertDragLock(false); mouseTracker.setHorizDragLock(false); DemodulatorInstance *demod = isNew?NULL:wxGetApp().getDemodMgr().getLastActiveDemodulator(); DemodulatorInstance *activeDemod = isNew?NULL:wxGetApp().getDemodMgr().getActiveDemodulator(); DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); if (mouseTracker.getOriginDeltaMouseX() == 0 && mouseTracker.getOriginDeltaMouseY() == 0) { float pos = mouseTracker.getMouseX(); long long input_center_freq = getCenterFrequency(); long long freqTarget = input_center_freq - (long long) (0.5 * (float) getBandwidth()) + (long long) ((float) pos * (float) getBandwidth()); long long demodFreq = demod?demod->getFrequency():freqTarget; long long bwDiff = freqTarget - demodFreq; long long freq = demodFreq; int snap = wxGetApp().getFrequencySnap(); if (snap > 1) { if (demod) { bwDiff = roundf((double)bwDiff/(double)snap)*snap; freq += bwDiff; } else { freq = roundl((long double)freq/(double)snap)*snap; } } else { freq += bwDiff; } if (dragState == WF_DRAG_NONE) { if (!isNew && wxGetApp().getDemodMgr().getDemodulators().size()) { mgr->updateLastState(); demod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); } else { isNew = true; demod = wxGetApp().getDemodMgr().newThread(); demod->setFrequency(freq); demod->setDemodulatorType(mgr->getLastDemodulatorType()); demod->setBandwidth(mgr->getLastBandwidth()); demod->setSquelchLevel(mgr->getLastSquelchLevel()); demod->setSquelchEnabled(mgr->isLastSquelchEnabled()); demod->setGain(mgr->getLastGain()); demod->setMuted(mgr->isLastMuted()); if (mgr->getLastDeltaLock()) { demod->setDeltaLock(true); demod->setDeltaLockOfs(wxGetApp().getFrequency()-freq); } else { demod->setDeltaLock(false); } demod->writeModemSettings(mgr->getLastModemSettings(mgr->getLastDemodulatorType())); demod->run(); wxGetApp().bindDemodulator(demod); } if (!demod) { dragState = WF_DRAG_NONE; return; } demod->updateLabel(freq); demod->setFrequency(freq); if (demod->isDeltaLock()) { demod->setDeltaLockOfs(demod->getFrequency() - wxGetApp().getFrequency()); } if (isNew) { setStatusText("New demodulator at frequency: %s", freq); } else { setStatusText("Moved demodulator to frequency: %s", freq); } wxGetApp().getDemodMgr().setActiveDemodulator(demod, false); SetCursor(wxCURSOR_SIZING); nextDragState = WF_DRAG_FREQUENCY; mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); } else { if (activeDemod) { wxGetApp().getDemodMgr().setActiveDemodulator(activeDemod, false); mgr->updateLastState(); activeDemod->setTracking(true); nextDragState = WF_DRAG_FREQUENCY; } else { nextDragState = WF_DRAG_NONE; } } } else if (dragState == WF_DRAG_RANGE) { float width = mouseTracker.getOriginDeltaMouseX(); float pos; std::string last_type = mgr->getLastDemodulatorType(); if (last_type == "LSB" || last_type == "USB") { float pos1 = mouseTracker.getOriginMouseX(); float pos2 = mouseTracker.getMouseX(); if (pos2 < pos1) { float tmp = pos1; pos1 = pos2; pos2 = tmp; } pos = (last_type == "LSB")?pos2:pos1; width *= 2; } else { pos = mouseTracker.getOriginMouseX() + width / 2.0; } long long input_center_freq = getCenterFrequency(); long long freq = input_center_freq - (long long) (0.5 * (float) getBandwidth()) + (long long) ((float) pos * (float) getBandwidth()); unsigned int bw = (unsigned int) (fabs(width) * (float) getBandwidth()); if (bw < MIN_BANDWIDTH) { bw = MIN_BANDWIDTH; } if (!bw) { dragState = WF_DRAG_NONE; return; } int snap = wxGetApp().getFrequencySnap(); if (snap > 1) { freq = roundl((long double)freq/(double)snap)*snap; } if (!isNew && wxGetApp().getDemodMgr().getDemodulators().size()) { mgr->updateLastState(); demod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); } else { demod = wxGetApp().getDemodMgr().newThread(); demod->setFrequency(freq); demod->setDemodulatorType(mgr->getLastDemodulatorType()); demod->setBandwidth(bw); demod->setSquelchLevel(mgr->getLastSquelchLevel()); demod->setSquelchEnabled(mgr->isLastSquelchEnabled()); demod->setGain(mgr->getLastGain()); demod->setMuted(mgr->isLastMuted()); if (mgr->getLastDeltaLock()) { demod->setDeltaLock(true); demod->setDeltaLockOfs(wxGetApp().getFrequency()-freq); } else { demod->setDeltaLock(false); } demod->writeModemSettings(mgr->getLastModemSettings(mgr->getLastDemodulatorType())); demod->run(); wxGetApp().bindDemodulator(demod); } if (demod == NULL) { dragState = WF_DRAG_NONE; return; } setStatusText("New demodulator at frequency: %s", freq); demod->updateLabel(freq); demod->setFrequency(freq); demod->setBandwidth(bw); mgr->setActiveDemodulator(demod, false); mgr->updateLastState(); } dragState = WF_DRAG_NONE; }
void WaterfallCanvas::OnMouseDown(wxMouseEvent& event) { InteractiveCanvas::OnMouseDown(event); updateHoverState(); dragState = nextDragState; wxGetApp().getDemodMgr().updateLastState(); if (dragState && dragState != WF_DRAG_RANGE) { DemodulatorInstance *demod = wxGetApp().getDemodMgr().getActiveDemodulator(); if (demod) { dragOfs = (long long) (mouseTracker.getMouseX() * (float) getBandwidth()) + getCenterFrequency() - (getBandwidth() / 2) - demod->getFrequency(); dragBW = demod->getBandwidth(); } wxGetApp().getDemodMgr().setActiveDemodulator(wxGetApp().getDemodMgr().getActiveDemodulator(), false); } }
void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { InteractiveCanvas::OnKeyDown(event); DemodulatorInstance *activeDemod = wxGetApp().getDemodMgr().getActiveDemodulator(); long long originalFreq = getCenterFrequency(); long long freq = originalFreq; switch (event.GetKeyCode()) { case WXK_UP: case WXK_NUMPAD_UP: if (!shiftDown) { mouseZoom = 1.0; zoom = 0.95; } else { scaleMove = 1.0; } break; case WXK_DOWN: case WXK_NUMPAD_DOWN: if (!shiftDown) { mouseZoom = 1.0; zoom = 1.05; } else { scaleMove = -1.0; } break; case WXK_RIGHT: case WXK_NUMPAD_RIGHT: if (isView) { freqMove = shiftDown?5.0:1.0; freqMoving = true; } else { freq += shiftDown?(getBandwidth() * 10):(getBandwidth() / 2); } break; case WXK_LEFT: case WXK_NUMPAD_LEFT: if (isView) { freqMove = shiftDown?-5.0:-1.0; freqMoving = true; } else { freq -= shiftDown?(getBandwidth() * 10):(getBandwidth() / 2); } break; case 'D': case WXK_DELETE: if (!activeDemod) { break; } wxGetApp().removeDemodulator(activeDemod); wxGetApp().getDemodMgr().deleteThread(activeDemod); break; case 'M': if (!activeDemod) { break; } activeDemod->setMuted(!activeDemod->isMuted()); break; case 'B': if (spectrumCanvas) { spectrumCanvas->setShowDb(!spectrumCanvas->getShowDb()); } break; case WXK_SPACE: wxGetApp().showFrequencyInput(); break; case 'C': if (wxGetApp().getDemodMgr().getActiveDemodulator()) { wxGetApp().setFrequency(wxGetApp().getDemodMgr().getActiveDemodulator()->getFrequency()); } else if (mouseTracker.mouseInView()) { long long freq = getFrequencyAt(mouseTracker.getMouseX()); int snap = wxGetApp().getFrequencySnap(); if (snap > 1) { freq = roundf((float)freq/(float)snap)*snap; } wxGetApp().setFrequency(freq); } #ifdef USE_HAMLIB if (wxGetApp().rigIsActive() && !wxGetApp().getRigThread()->getControlMode()) { wxGetApp().getRigThread()->setFrequency(wxGetApp().getFrequency(),true); } #endif break; default: event.Skip(); return; } long long minFreq = bandwidth/2; if (freq < minFreq) { freq = minFreq; } if (freq != originalFreq) { updateCenterFrequency(freq); } }
void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { tex_update.lock(); wxPaintDC dc(this); const wxSize ClientSize = GetClientSize(); long double currentZoom = zoom; if (mouseZoom != 1) { currentZoom = mouseZoom; mouseZoom = mouseZoom + (1.0 - mouseZoom) * 0.2; if (fabs(mouseZoom-1.0)<0.01) { mouseZoom = 1; } } if (scaleMove != 0) { SpectrumVisualProcessor *sp = wxGetApp().getSpectrumProcessor(); FFTVisualDataThread *wdt = wxGetApp().getAppFrame()->getWaterfallDataThread(); SpectrumVisualProcessor *wp = wdt->getProcessor(); float factor = sp->getScaleFactor(); factor += scaleMove * 0.02; if (factor < 0.25) { factor = 0.25; } if (factor > 10.0) { factor = 10.0; } sp->setScaleFactor(factor); wp->setScaleFactor(factor); } if (freqMove != 0.0) { long long newFreq = getCenterFrequency() + (long long)((long double)getBandwidth()*freqMove) * 0.01; long long minFreq = bandwidth/2; if (newFreq < minFreq) { newFreq = minFreq; } updateCenterFrequency(newFreq); if (!freqMoving) { freqMove -= (freqMove * 0.2); if (fabs(freqMove) < 0.01) { freqMove = 0.0; } } } long long bw; if (currentZoom != 1) { long long freq = wxGetApp().getFrequency(); bw = getBandwidth(); double mpos = 0; float mouseInView = false; if (mouseTracker.mouseInView()) { mpos = mouseTracker.getMouseX(); mouseInView = true; } else if (spectrumCanvas && spectrumCanvas->getMouseTracker()->mouseInView()) { mpos = spectrumCanvas->getMouseTracker()->getMouseX(); mouseInView = true; } if (currentZoom < 1) { bw = (long long) ceil((long double) bw * currentZoom); if (bw < minBandwidth) { bw = minBandwidth; } if (mouseInView) { long long mfreqA = getFrequencyAt(mpos, centerFreq, getBandwidth()); long long mfreqB = getFrequencyAt(mpos, centerFreq, bw); centerFreq += mfreqA - mfreqB; } setView(centerFreq, bw); } else { if (isView) { bw = (long long) ceil((long double) bw * currentZoom); if (bw >= wxGetApp().getSampleRate()) { disableView(); if (spectrumCanvas) { spectrumCanvas->disableView(); } bw = wxGetApp().getSampleRate(); centerFreq = wxGetApp().getFrequency(); } else { if (mouseInView) { long long mfreqA = getFrequencyAt(mpos, centerFreq, getBandwidth()); long long mfreqB = getFrequencyAt(mpos, centerFreq, bw); centerFreq += mfreqA - mfreqB; setBandwidth(bw); } else { setBandwidth(bw); } } } } if (centerFreq < freq && (centerFreq - bandwidth / 2) < (freq - wxGetApp().getSampleRate() / 2)) { centerFreq = (freq - wxGetApp().getSampleRate() / 2) + bandwidth / 2; } if (centerFreq > freq && (centerFreq + bandwidth / 2) > (freq + wxGetApp().getSampleRate() / 2)) { centerFreq = (freq + wxGetApp().getSampleRate() / 2) - bandwidth / 2; } if (spectrumCanvas) { if ((spectrumCanvas->getCenterFrequency() != centerFreq) || (spectrumCanvas->getBandwidth() != bw)) { if (getViewState()) { spectrumCanvas->setView(centerFreq,bw); } else { spectrumCanvas->disableView(); spectrumCanvas->setCenterFrequency(centerFreq); spectrumCanvas->setBandwidth(bw); } } } } glContext->SetCurrent(*this); initGLExtensions(); glViewport(0, 0, ClientSize.x, ClientSize.y); if (fft_size_changed.load()) { fft_size = new_fft_size; waterfallPanel.setup(fft_size, waterfall_lines); fft_size_changed.store(false); } glContext->BeginDraw(0,0,0); waterfallPanel.calcTransform(CubicVR::mat4::identity()); waterfallPanel.draw(); std::vector<DemodulatorInstance *> &demods = wxGetApp().getDemodMgr().getDemodulators(); DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); bool isNew = shiftDown || (wxGetApp().getDemodMgr().getLastActiveDemodulator() && !wxGetApp().getDemodMgr().getLastActiveDemodulator()->isActive()); int currentBandwidth = getBandwidth(); long long currentCenterFreq = getCenterFrequency(); ColorTheme *currentTheme = ThemeMgr::mgr.currentTheme; std::string last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); if (mouseTracker.mouseInView() || wxGetApp().getDemodMgr().getActiveDemodulator()) { hoverAlpha += (1.0f-hoverAlpha)*0.1f; if (hoverAlpha > 1.5f) { hoverAlpha = 1.5f; } glContext->setHoverAlpha(hoverAlpha); if (nextDragState == WF_DRAG_RANGE) { float width = (1.0 / (float) ClientSize.x); float rangeWidth = mouseTracker.getOriginDeltaMouseX(); float centerPos; if (mouseTracker.mouseDown()) { if (rangeWidth) { width = rangeWidth; } centerPos = mouseTracker.getOriginMouseX() + width / 2.0; } else { centerPos = mouseTracker.getMouseX(); } glContext->DrawDemod(lastActiveDemodulator, isNew?currentTheme->waterfallHighlight:currentTheme->waterfallDestroy, currentCenterFreq, currentBandwidth); if ((last_type == "LSB" || last_type == "USB") && mouseTracker.mouseDown()) { centerPos = mouseTracker.getMouseX(); glContext->DrawRangeSelector(centerPos, centerPos-width, isNew?currentTheme->waterfallNew:currentTheme->waterfallHover); } else { glContext->DrawFreqSelector(centerPos, isNew?currentTheme->waterfallNew:currentTheme->waterfallHover, width, currentCenterFreq, currentBandwidth); } } else { if (lastActiveDemodulator) { glContext->DrawDemod(lastActiveDemodulator, ((isNew && activeDemodulator == NULL) || (activeDemodulator != NULL))?currentTheme->waterfallHighlight:currentTheme->waterfallDestroy, currentCenterFreq, currentBandwidth); } if (activeDemodulator == NULL) { glContext->DrawFreqSelector(mouseTracker.getMouseX(), ((isNew && lastActiveDemodulator) || (!lastActiveDemodulator) )?currentTheme->waterfallNew:currentTheme->waterfallHover, 0, currentCenterFreq, currentBandwidth); } else { glContext->DrawDemod(activeDemodulator, currentTheme->waterfallHover, currentCenterFreq, currentBandwidth); } } } else { hoverAlpha += (0.0f-hoverAlpha)*0.05f; if (hoverAlpha < 1.0e-5f) { hoverAlpha = 0; } glContext->setHoverAlpha(hoverAlpha); if (activeDemodulator) { glContext->DrawDemod(activeDemodulator, currentTheme->waterfallHighlight, currentCenterFreq, currentBandwidth); } if (lastActiveDemodulator) { glContext->DrawDemod(lastActiveDemodulator, currentTheme->waterfallHighlight, currentCenterFreq, currentBandwidth); } } glContext->setHoverAlpha(0); for (int i = 0, iMax = demods.size(); i < iMax; i++) { if (activeDemodulator == demods[i] || lastActiveDemodulator == demods[i]) { continue; } glContext->DrawDemod(demods[i], currentTheme->waterfallHighlight, currentCenterFreq, currentBandwidth); } glContext->EndDraw(); SwapBuffers(); tex_update.unlock(); }
void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); const wxSize ClientSize = GetClientSize(); if (!visualDataQueue.empty()) { SpectrumVisualData *vData; visualDataQueue.pop(vData); if (vData) { spectrumPanel.setPoints(vData->spectrum_points); spectrumPanel.setPeakPoints(vData->spectrum_hold_points); spectrumPanel.setFloorValue(vData->fft_floor); spectrumPanel.setCeilValue(vData->fft_ceiling); vData->decRefCount(); } } if (resetScaleFactor) { scaleFactor += (1.0-scaleFactor)*0.05; if (fabs(scaleFactor-1.0) < 0.01) { scaleFactor = 1.0; resetScaleFactor = false; } updateScaleFactor(scaleFactor); } glContext->SetCurrent(*this); initGLExtensions(); glViewport(0, 0, ClientSize.x, ClientSize.y); glContext->BeginDraw(0,0,0); spectrumPanel.setFreq(getCenterFrequency()); spectrumPanel.setBandwidth(getBandwidth()); spectrumPanel.calcTransform(CubicVR::mat4::identity()); spectrumPanel.draw(); glLoadIdentity(); std::vector<DemodulatorInstance *> &demods = wxGetApp().getDemodMgr().getDemodulators(); DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); for (int i = 0, iMax = demods.size(); i < iMax; i++) { if (!demods[i]->isActive()) { continue; } glContext->DrawDemodInfo(demods[i], ThemeMgr::mgr.currentTheme->fftHighlight, getCenterFrequency(), getBandwidth(), activeDemodulator==demods[i]); } if (waterfallCanvas && !activeDemodulator) { MouseTracker *wfmt = waterfallCanvas->getMouseTracker(); if (wfmt->mouseInView()) { int snap = wxGetApp().getFrequencySnap(); long long freq = getFrequencyAt(wfmt->getMouseX()); if (snap > 1) { freq = roundf((float)freq/(float)snap)*snap; } DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); bool isNew = (((waterfallCanvas->isShiftDown() || (lastActiveDemodulator && !lastActiveDemodulator->isActive())) && lastActiveDemodulator) || (!lastActiveDemodulator)); glContext->DrawFreqBwInfo(freq, wxGetApp().getDemodMgr().getLastBandwidth(), isNew?ThemeMgr::mgr.currentTheme->waterfallNew:ThemeMgr::mgr.currentTheme->waterfallHover, getCenterFrequency(), getBandwidth(), true, true); } } glContext->EndDraw(); spectrumPanel.drawChildren(); SwapBuffers(); }