void SoundManager::loadSamples() { //some path, may be absolute or relative to bin/data int numSeasons = 4; int numCategories = 5; std::string seasons[4] = {"SUM","FAL","WIN","SPR"}; std::string category[5] = {"DWN","DAY","DSK","EXP","NIG"}; for (int i=0; i<numSeasons; i++) { for (int j=0; j<numCategories; j++) { std::string folderName = seasons[i] + "_" + category[j]; std::string samplesPath = "sounds/" + folderName; std::cout<< m_dateManager->getTime()<<"- SoundManager-> loading samples from \""<<samplesPath<<"/\""<<std::endl; ofLogNotice()<< m_dateManager->getTime()<<"- SoundManager->loading samples from \""<<samplesPath<<"/\""; ofDirectory dir(samplesPath); //only show wav and aiff files dir.allowExt("wav"); dir.allowExt("aiff"); dir.allowExt("aif"); //populate the directory object if(dir.listDir()==0) { std::cout <<m_dateManager->getTime()<<"- SoundManager-> No samples found in \""<< samplesPath <<"/\"" << std::endl; ofLogNotice() <<m_dateManager->getTime()<<"- SoundManager-> No samples found in \""<< samplesPath <<"/\""; //break; } SamplesList sampleList; //go through and print out all the paths for(int n = 0; n < dir.numFiles(); n++) { std::string sampleName = this->getSampleName(dir.getPath(n)); SoundObject* sample = new SoundObject(sampleName); sample->loadSound(dir.getPath(n)); sampleList.push_back(sample); std::cout <<m_dateManager->getTime()<<"- SoundManager-> loaded sample \""<< sampleName <<"/\"" << std::endl; ofLogNotice() <<m_dateManager->getTime()<<"- SoundManager-> loaded sample \""<< sampleName <<"/\""; } m_samples[folderName] = sampleList; } } m_currentSampleList = m_samples.begin()->second; // m_currentSampleList points to the first element map }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); SamplesList v; v.push_back(GeogPixSample(1991,51,106.805015,-20.675571)); v.push_back(GeogPixSample(776,2730,100.120199,-6.423076)); v.push_back(GeogPixSample(861,1414,100.578835,-13.555069)); v.push_back(GeogPixSample(1743,951,105.426127,-15.991936)); mapPanel = new MapPanel(GPSMapManager("GPSMap.png",v),this); QStringList strList = ui->line_lng->text().split(QChar(',')); mapPanel->mapMagager.setLng(strList[1].toDouble()); mapPanel->mapMagager.setLat((strList[0].toDouble()*(-1))); mapPanel->resize(800,800); mapPanel->show(); }
SoundManager::~SoundManager() { for (SamplesMap::iterator it=m_samples.begin() ; it != m_samples.end(); it++ ) { SamplesList sampleList = it->second; for (SamplesList::iterator it2=sampleList.begin() ; it2 != sampleList.end(); it2++ ) { AppManager::getInstance().getSoundEffectsManager().removeAllSoundEffects(*(*it2)); delete *it2; *it2 = NULL; } } m_samples.clear(); if(m_soundVisual) { AppManager::getInstance().getViewManager().removeVisual(*m_soundVisual); delete m_soundVisual; m_soundVisual = NULL; } m_dateManager = NULL; if (m_sampleName) { AppManager::getInstance().getVisualEffectsManager().removeAllVisualEffects(*m_sampleName); AppManager::getInstance().getViewManager().removeVisual(*m_sampleName); delete m_sampleName; m_sampleName = NULL; } if(m_tube) { delete m_tube; m_tube = NULL; } }
void OscilloscopeEngine::displayOscilloscopeChannelData(int dislayFrom, int displayedLength, int removeFrom) { if (m_capturedChannels != CHANNEL_BOTH) { SamplesList *buffer = NULL; if (m_capturedChannels == CHANNEL_LEFT) { buffer = &m_samplesInputBufferLeft; } else if (m_capturedChannels == CHANNEL_RIGHT) { buffer = &m_samplesInputBufferRight; } QVector<double> values; values = QVector<double>::fromList(buffer->mid(dislayFrom, displayedLength)); draw(m_capturedChannels, values); *buffer = buffer->mid(removeFrom); } else { QVector<double> values; values = QVector<double>::fromList(m_samplesInputBufferLeft.mid(dislayFrom, displayedLength)); draw(CHANNEL_LEFT, values); values = QVector<double>::fromList(m_samplesInputBufferRight.mid(dislayFrom, displayedLength)); draw(CHANNEL_RIGHT, values); m_samplesInputBufferLeft = m_samplesInputBufferLeft.mid(removeFrom); m_samplesInputBufferRight = m_samplesInputBufferRight.mid(removeFrom); } }
void OscilloscopeEngine::processOscilloscopeData(SamplesList leftChannelData, SamplesList rightChannelData) { if (!m_isRunning) { return; } // qDebug() << "Got" << samples.length() << "samples"; if (m_capturedChannels == CHANNEL_NONE) { return; } SamplesList *buffer = NULL; SamplesList *samples = NULL; // I. Select primary channel if (m_capturedChannels != CHANNEL_BOTH) { // For single channel capture, process only one buffer. if (m_capturedChannels == CHANNEL_LEFT) { buffer = &m_samplesInputBufferLeft; samples = &leftChannelData; } else if (m_capturedChannels == CHANNEL_RIGHT) { buffer = &m_samplesInputBufferRight; samples = &rightChannelData; } } else { // For both channel capture, only one channel is selected for Normal or Single triggering if (m_triggerChannel == CHANNEL_LEFT) { buffer = &m_samplesInputBufferLeft; } else if (m_triggerChannel == CHANNEL_RIGHT) { buffer = &m_samplesInputBufferRight; } else if (m_triggerMode != TRIG_AUTO) { qWarning() << "For non-auto trigger mode an one channel have to be choosen for triggering"; Q_ASSERT(false); return; } } // II. For both channel capture we have to check buffers state - samples must be captured simultaneously if (m_capturedChannels == CHANNEL_BOTH) { // This is not a bug when if (m_samplesInputBufferLeft.size() != m_samplesInputBufferRight.size()) { qWarning() << "Audio input buffers are not synced. Reset them." << "Left:" << m_samplesInputBufferLeft.size() << "Right:" << m_samplesInputBufferRight.size(); m_samplesInputBufferLeft.clear(); m_samplesInputBufferRight.clear(); // Q_ASSERT(false); } if (leftChannelData.size() != rightChannelData.size()) { qWarning() << "Fresh audio samples are not synced. Reset them." << "Left:" << leftChannelData.size() << "Right:" << rightChannelData.size(); leftChannelData.clear(); rightChannelData.clear(); // Q_ASSERT(false); } } // III. Trigger mode: Automatic - display data immediatelly if there are enough data in buffer if (m_triggerMode == TRIG_AUTO) { if (m_capturedChannels != CHANNEL_BOTH) { buffer->append(*samples); if (buffer->size() < m_frameLength) { return; } } else { m_samplesInputBufferLeft.append(leftChannelData); m_samplesInputBufferRight.append(rightChannelData); if (m_samplesInputBufferLeft.size() < m_frameLength) { return; } } displayOscilloscopeChannelData(0, m_frameLength, m_frameLength); return; } // IV. Trigger mode: Single - if data acqured, the graph have to hold data if ((m_triggerMode == TRIG_SINGLE) && m_dataForSingleCaptureAcqured) { return; } // V. Trigger mode: Normal or Single (when trigger hasn't fired yet) if ((m_triggerMode == TRIG_NORMAL) or (m_triggerMode == TRIG_SINGLE)) { // Fill buffers with samples if (m_capturedChannels != CHANNEL_BOTH) { buffer->append(*samples); if (buffer->size() < m_frameLength * 2) { return; } } else { m_samplesInputBufferLeft.append(leftChannelData); m_samplesInputBufferRight.append(rightChannelData); if (m_samplesInputBufferLeft.size() < m_frameLength * 2) { return; } } // Find moments when signal intersects trigger line by required slope // Start searching with offset in half of frame length, because this half has been already plotted QList<int> eventsOffsets; for (int offset = m_frameLength / 2 - 1; offset < buffer->size(); ++offset) { qreal cur = buffer->at(offset); qreal prev = buffer->at(offset - 1); if (m_triggerSlope == TRIG_RISING) { if ((prev <= m_triggerLevel) && (cur >= m_triggerLevel)) { eventsOffsets.append(offset); } } else { if ((prev >= m_triggerLevel) && (cur <= m_triggerLevel)) { eventsOffsets.append(offset); } } } if (eventsOffsets.size() > 0) { // take first event in next frame for (int i = 0; i < eventsOffsets.size(); ++i) { int offset = eventsOffsets[i]; if (offset >= m_frameLength * 3 / 2) { // there is not enough data for display full frame eventsOffsets.clear(); break; } if (offset >= m_frameLength / 2) { displayOscilloscopeChannelData(offset - m_frameLength / 2, m_frameLength, m_frameLength / 2); m_dataForSingleCaptureAcqured = true; return; } } // or select last event if (eventsOffsets.size() > 0) { int offset = eventsOffsets.last(); displayOscilloscopeChannelData(offset - m_frameLength / 2, m_frameLength, m_frameLength / 2); m_dataForSingleCaptureAcqured = true; return; } } // buffer is overflowed if (buffer->size() > m_frameLength * 2) { if (m_capturedChannels != CHANNEL_BOTH) { *buffer = buffer->mid(m_frameLength); } else { m_samplesInputBufferLeft = m_samplesInputBufferLeft.mid(m_frameLength); m_samplesInputBufferRight = m_samplesInputBufferRight.mid(m_frameLength); } } } }