bool AnalyzerWaveform::isDisabledOrLoadStoredSuccess(TrackPointer tio) const { ConstWaveformPointer pTrackWaveform = tio->getWaveform(); ConstWaveformPointer pTrackWaveformSummary = tio->getWaveformSummary(); ConstWaveformPointer pLoadedTrackWaveform; ConstWaveformPointer pLoadedTrackWaveformSummary; TrackId trackId = tio->getId(); bool missingWaveform = pTrackWaveform.isNull(); bool missingWavesummary = pTrackWaveformSummary.isNull(); if (trackId.isValid() && (missingWaveform || missingWavesummary)) { QList<AnalysisDao::AnalysisInfo> analyses = m_pAnalysisDao->getAnalysesForTrack(trackId); QListIterator<AnalysisDao::AnalysisInfo> it(analyses); while (it.hasNext()) { const AnalysisDao::AnalysisInfo& analysis = it.next(); WaveformFactory::VersionClass vc; if (analysis.type == AnalysisDao::TYPE_WAVEFORM) { vc = WaveformFactory::waveformVersionToVersionClass(analysis.version); if (missingWaveform && vc == WaveformFactory::VC_USE) { pLoadedTrackWaveform = ConstWaveformPointer( WaveformFactory::loadWaveformFromAnalysis(analysis)); missingWaveform = false; } else if (vc != WaveformFactory::VC_KEEP) { // remove all other Analysis except that one we should keep m_pAnalysisDao->deleteAnalysis(analysis.analysisId); } } if (analysis.type == AnalysisDao::TYPE_WAVESUMMARY) { vc = WaveformFactory::waveformSummaryVersionToVersionClass(analysis.version); if (missingWavesummary && vc == WaveformFactory::VC_USE) { pLoadedTrackWaveformSummary = ConstWaveformPointer( WaveformFactory::loadWaveformFromAnalysis(analysis)); missingWavesummary = false; } else if (vc != WaveformFactory::VC_KEEP) { // remove all other Analysis except that one we should keep m_pAnalysisDao->deleteAnalysis(analysis.analysisId); } } } } // If we don't need to calculate the waveform/wavesummary, skip. if (!missingWaveform && !missingWavesummary) { kLogger.debug() << "loadStored - Stored waveform loaded"; if (pLoadedTrackWaveform) { tio->setWaveform(pLoadedTrackWaveform); } if (pLoadedTrackWaveformSummary) { tio->setWaveformSummary(pLoadedTrackWaveformSummary); } return true; } return false; }
bool AnalyzerWaveform::initialize(TrackPointer tio, int sampleRate, int totalSamples) { m_skipProcessing = false; m_timer.start(); if (totalSamples == 0) { qWarning() << "AnalyzerWaveform::initialize - no waveform/waveform summary"; return false; } // If we don't need to calculate the waveform/wavesummary, skip. if (isDisabledOrLoadStoredSuccess(tio)) { m_skipProcessing = true; } else { // Now actually initialize the AnalyzerWaveform: destroyFilters(); createFilters(sampleRate); //TODO (vrince) Do we want to expose this as settings or whatever ? const int mainWaveformSampleRate = 441; // two visual sample per pixel in full width overview in full hd const int summaryWaveformSamples = 2 * 1920; m_waveform = WaveformPointer(new Waveform( sampleRate, totalSamples, mainWaveformSampleRate, -1)); m_waveformSummary = WaveformPointer(new Waveform( sampleRate, totalSamples, mainWaveformSampleRate, summaryWaveformSamples)); // Now, that the Waveform memory is initialized, we can set set them to // the TIO. Be aware that other threads of Mixxx can touch them from // now. tio->setWaveform(m_waveform); tio->setWaveformSummary(m_waveformSummary); m_waveformData = m_waveform->data(); m_waveformSummaryData = m_waveformSummary->data(); m_stride = WaveformStride(m_waveform->getAudioVisualRatio(), m_waveformSummary->getAudioVisualRatio()); m_currentStride = 0; m_currentSummaryStride = 0; //debug //m_waveform->dump(); //m_waveformSummary->dump(); #ifdef TEST_HEAT_MAP test_heatMap = new QImage(256,256,QImage::Format_RGB32); test_heatMap->fill(0xFFFFFFFF); #endif } return !m_skipProcessing; }
void AnalyzerWaveform::cleanup(TrackPointer tio) { Q_UNUSED(tio); if (m_skipProcessing) { return; } tio->setWaveform(ConstWaveformPointer()); // Since clear() could delete the waveform, clear our pointer to the // waveform's vector data first. m_waveformData = nullptr; m_waveform.clear(); tio->setWaveformSummary(ConstWaveformPointer()); // Since clear() could delete the waveform, clear our pointer to the // waveform's vector data first. m_waveformSummaryData = nullptr; m_waveformSummary.clear(); }