void CueControl::hotcueSet(HotcueControl* pControl, double v) { //qDebug() << "CueControl::hotcueSet" << v; if (!v) return; QMutexLocker lock(&m_mutex); if (!m_pLoadedTrack) return; int hotcue = pControl->getHotcueNumber(); detachCue(hotcue); Cue* pCue = m_pLoadedTrack->addCue(); double cuePosition = (m_pQuantizeEnabled->get() > 0.0 && m_pClosestBeat->get() != -1) ? floorf(m_pClosestBeat->get()) : floorf(getCurrentSample()); if (!even(cuePosition)) cuePosition--; pCue->setPosition(cuePosition); pCue->setHotCue(hotcue); pCue->setLabel(""); pCue->setType(Cue::CUE); // TODO(XXX) deal with spurious signals attachCue(pCue, hotcue); // If quantize is enabled and we are not playing, jump to the cue point // since it's not necessarily where we currently are. TODO(XXX) is this // potentially invalid for vinyl control? bool playing = m_pPlayButton->get() > 0; if (!playing && m_pQuantizeEnabled->get() > 0.0) { lock.unlock(); // prevent deadlock. // Enginebuffer will quantize more exactly than we can. seekAbs(cuePosition); } }
void CueControl::hotcueClear(HotcueControl* pControl, double v) { if (!v) return; QMutexLocker lock(&m_mutex); if (!m_pLoadedTrack) return; Cue* pCue = pControl->getCue(); if (pCue) { pCue->setHotCue(-1); } detachCue(pControl->getHotcueNumber()); }
void CueControl::hotcuePositionChanged(HotcueControl* pControl, double newPosition) { QMutexLocker lock(&m_mutex); if (!m_pLoadedTrack) return; Cue* pCue = pControl->getCue(); if (pCue) { // Setting the position to -1 is the same as calling hotcue_x_clear if (newPosition == -1) { pCue->setHotCue(-1); detachCue(pControl->getHotcueNumber()); } else if (newPosition > 0 && newPosition < m_pTrackSamples->get()) { int position = newPosition; // People writing from MIDI land, elsewhere might be careless. if (position % 2 != 0) { position--; } pCue->setPosition(position); } } }
void DlgTrackInfo::saveTrack() { if (!m_pLoadedTrack) return; m_pLoadedTrack->setTitle(txtTrackName->text()); m_pLoadedTrack->setArtist(txtArtist->text()); m_pLoadedTrack->setAlbum(txtAlbum->text()); m_pLoadedTrack->setAlbumArtist(txtAlbumArtist->text()); m_pLoadedTrack->setGenre(txtGenre->text()); m_pLoadedTrack->setComposer(txtComposer->text()); m_pLoadedTrack->setGrouping(txtGrouping->text()); m_pLoadedTrack->setYear(txtYear->text()); m_pLoadedTrack->setTrackNumber(txtTrackNumber->text()); m_pLoadedTrack->setComment(txtComment->toPlainText()); if (!m_pLoadedTrack->hasBpmLock()) { m_pLoadedTrack->setBpm(spinBpm->value()); } QSet<int> updatedRows; for (int row = 0; row < cueTable->rowCount(); ++row) { QTableWidgetItem* rowItem = cueTable->item(row, 0); QTableWidgetItem* hotcueItem = cueTable->item(row, 2); QTableWidgetItem* labelItem = cueTable->item(row, 3); if (!rowItem || !hotcueItem || !labelItem) continue; int oldRow = rowItem->data(Qt::DisplayRole).toInt(); Cue* pCue = m_cueMap.value(oldRow, NULL); if (pCue == NULL) { continue; } updatedRows.insert(oldRow); QVariant vHotcue = hotcueItem->data(Qt::DisplayRole); if (vHotcue.canConvert<int>()) { int iTableHotcue = vHotcue.toInt(); // The GUI shows hotcues as 1-indexed, but they are actually // 0-indexed, so subtract 1 pCue->setHotCue(iTableHotcue-1); } else { pCue->setHotCue(-1); } QString label = labelItem->data(Qt::DisplayRole).toString(); pCue->setLabel(label); } QMutableHashIterator<int,Cue*> it(m_cueMap); // Everything that was not processed above was removed. while (it.hasNext()) { it.next(); int oldRow = it.key(); // If cue's old row is not in updatedRows then it must have been // deleted. if (updatedRows.contains(oldRow)) { continue; } Cue* pCue = it.value(); it.remove(); qDebug() << "Deleting cue" << pCue->getId() << pCue->getHotCue(); m_pLoadedTrack->removeCue(pCue); } }