int Syncler::syncDir(const string& path){ verbose("syncing directory %s\n",path.c_str()); map<string,Sync::Item>& fdir=from->getItems(path); map<string,Sync::Item>& tdir=to->getItems(path); int res=0; for (auto it=tdir.begin(); it!=tdir.end(); ++it){ if (fdir.count(it->first)==0 || it->second.directory!=fdir[it->first].directory){ it->second.removed=true; cout << "D " << it->second.path << it->second.name << endl; CHECKRES(to->removeItem(it->second)); } } vector<string> morepaths; for (auto it=fdir.begin(); it!=fdir.end(); ++it){ Sync::Item& src=it->second; if (it->second.directory){ morepaths.push_back(src.path+src.name); } if (tdir.count(it->first)==0 || tdir[it->first].removed){ cout << "A " << src.path << src.name << endl; CHECKRES(to->addItem(from->getTransfer(src))); continue; } if (it->second.directory) continue; CHECKRES(syncFile(src,tdir[it->first])); } for (string& x: morepaths){ CHECKRES(syncDir(x)); } return 0; }
// Create a Synchronizer object for a PDF file. // It creates either a SyncTex or PdfSync object // based on the synchronization file found in the folder containing the PDF file. int Synchronizer::Create(const WCHAR *pdffilename, PdfEngine *engine, Synchronizer **sync) { if (!sync || !engine) return PDFSYNCERR_INVALID_ARGUMENT; const WCHAR *fileExt = path::GetExt(pdffilename); if (!str::EqI(fileExt, L".pdf")) return PDFSYNCERR_INVALID_ARGUMENT; ScopedMem<WCHAR> baseName(str::DupN(pdffilename, fileExt - pdffilename)); // Check if a PDFSYNC file is present ScopedMem<WCHAR> syncFile(str::Join(baseName, PDFSYNC_EXTENSION)); if (file::Exists(syncFile)) { *sync = new Pdfsync(syncFile, engine); return *sync ? PDFSYNCERR_SUCCESS : PDFSYNCERR_OUTOFMEMORY; } // check if SYNCTEX or compressed SYNCTEX file is present ScopedMem<WCHAR> texGzFile(str::Join(baseName, SYNCTEXGZ_EXTENSION)); ScopedMem<WCHAR> texFile(str::Join(baseName, SYNCTEX_EXTENSION)); if (file::Exists(texGzFile) || file::Exists(texFile)) { // due to a bug with synctex_parser.c, this must always be // the path to the .synctex file (even if a .synctex.gz file is used instead) *sync = new SyncTex(texFile, engine); return *sync ? PDFSYNCERR_SUCCESS : PDFSYNCERR_OUTOFMEMORY; } return PDFSYNCERR_SYNCFILE_NOTFOUND; }
void MediaDialog::addAudioPressed() { QString path = audioFile->text(); if (score->audio() || path.isEmpty()) return; QFile f(path); if (!f.open(QIODevice::ReadOnly)) return; QByteArray ba = f.readAll(); f.close(); Audio* audio = new Audio; audio->setPath(path); audio->setData(ba); score->setAudio(audio); score->setDirty(true); mscore->updatePlayMode(); #if 0 QString wavPath = QDir::tempPath() + "/score.wav"; mscore->saveAs(score, true, wavPath, "wav"); QString program = "D:/HACK/sonic-annotator/bologna.bat"; QStringList arguments; arguments << QDir::toNativeSeparators(path)<< QDir::toNativeSeparators(wavPath); QProcess myProcess(this); myProcess.start(program, arguments); myProcess.waitForFinished(); qDebug() << myProcess.readAll(); #endif QFileInfo fi(path); QFile syncFile(fi.absolutePath() + "/" + fi.baseName() + ".txt"); TempoMap* tmo = score->tempomap(); if (!syncFile.open(QIODevice::ReadOnly)) return; qreal t = 0; int tick = 0; qreal lastTempo = tmo->tempo(0); TempoMap* tmn = new TempoMap(); tmn->setTempo(0, lastTempo); int resolution = 25; while (!syncFile.atEnd()) { for (int i = 0; !syncFile.atEnd() && i < resolution-1; i++) syncFile.readLine(); if (syncFile.atEnd()) break; QByteArray line = syncFile.readLine(); QString s(line); QStringList sl = s.split(":"); qreal tScore = sl[0].trimmed().toDouble(); qreal tPerformance = sl[1].trimmed().toDouble(); // timestamp of last int scoreTick = tmo->time2tick(tScore); qreal deltaError = tmo->tick2time(scoreTick) - tScore; int dt = scoreTick - tick; qreal deltaTime = tPerformance - t; if (deltaTime > 0) { qreal tempo = dt / (480 * deltaTime); if(tempo != lastTempo) { qDebug() << tempo; tmn->setTempo(tick, tempo); lastTempo = tempo; } } t = tPerformance - deltaError; tick = scoreTick; } score->setTempomap(tmn); syncFile.close(); QMessageBox::information(0, "Done", "Done"); }