Skip to content

Commit

Permalink
Fixed tempo label actions index bug
Browse files Browse the repository at this point in the history
  • Loading branch information
FangCunWuChang committed Jul 18, 2024
1 parent 29d2566 commit 5344930
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 26 deletions.
8 changes: 4 additions & 4 deletions src/audioCore/action/ActionAdd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ bool ActionAddTempoTempo::doAction() {
ACTION_WRITE_DB();

ACTION_DATA(index) = PlayPosition::getInstance()
->addTempoLabelTempo(ACTION_DATA(time), ACTION_DATA(tempo));
->addTempoLabelTempo(ACTION_DATA(time), ACTION_DATA(tempo), ACTION_DATA(index));
ACTION_RESULT(true);
}

Expand All @@ -657,7 +657,7 @@ ActionAddTempoBeat::ActionAddTempoBeat(
double time, int numerator, int denominator)
: ACTION_DB{ time, numerator, denominator } {}

bool ActionAddTempoBeat::ActionAddTempoBeat::doAction() {
bool ActionAddTempoBeat::doAction() {
ACTION_CHECK_RENDERING(
"Don't do this while rendering.");

Expand All @@ -668,11 +668,11 @@ bool ActionAddTempoBeat::ActionAddTempoBeat::doAction() {

ACTION_DATA(index) = PlayPosition::getInstance()
->addTempoLabelBeat(ACTION_DATA(time),
ACTION_DATA(numerator), ACTION_DATA(denominator));
ACTION_DATA(numerator), ACTION_DATA(denominator), ACTION_DATA(index));
ACTION_RESULT(true);
}

bool ActionAddTempoBeat::ActionAddTempoBeat::undo() {
bool ActionAddTempoBeat::undo() {
ACTION_CHECK_RENDERING(
"Don't do this while rendering.");

Expand Down
4 changes: 2 additions & 2 deletions src/audioCore/action/ActionRemove.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1119,11 +1119,11 @@ bool ActionRemoveTempo::undo() {

if (ACTION_DATA(isTempo)) {
PlayPosition::getInstance()->addTempoLabelTempo(
ACTION_DATA(time), ACTION_DATA(tempo));
ACTION_DATA(time), ACTION_DATA(tempo), ACTION_DATA(index));
}
else {
PlayPosition::getInstance()->addTempoLabelBeat(
ACTION_DATA(time), ACTION_DATA(numerator), ACTION_DATA(denominator));
ACTION_DATA(time), ACTION_DATA(numerator), ACTION_DATA(denominator), ACTION_DATA(index));
}
ACTION_RESULT(true);
}
11 changes: 4 additions & 7 deletions src/audioCore/action/ActionSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1854,12 +1854,8 @@ bool ActionSetTempoTime::doAction() {
if (ACTION_DATA(index) >= 0 && ACTION_DATA(index) < PlayPosition::getInstance()->getTempoLabelNum()) {
ACTION_DATA(oldTime) = PlayPosition::getInstance()->getTempoLabelTime(ACTION_DATA(index));

ACTION_DATA(newIndex) = PlayPosition::getInstance()->getTempoInsertIndex(ACTION_DATA(time));
if (ACTION_DATA(newIndex) > ACTION_DATA(index)) {
ACTION_DATA(newIndex)--;
}

PlayPosition::getInstance()->setTempoLabelTime(ACTION_DATA(index), ACTION_DATA(time));
ACTION_DATA(newIndex) = PlayPosition::getInstance()->setTempoLabelTime(
ACTION_DATA(index), ACTION_DATA(time));

ACTION_RESULT(true);
}
Expand All @@ -1875,7 +1871,8 @@ bool ActionSetTempoTime::undo() {
ACTION_WRITE_TYPE_UNDO(ActionSetTempoTime);
ACTION_WRITE_DB();

PlayPosition::getInstance()->setTempoLabelTime(ACTION_DATA(newIndex), ACTION_DATA(oldTime));
PlayPosition::getInstance()->setTempoLabelTime(
ACTION_DATA(newIndex), ACTION_DATA(oldTime), ACTION_DATA(index));

ACTION_RESULT(true);
}
Expand Down
44 changes: 35 additions & 9 deletions src/audioCore/misc/PlayPosition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -242,20 +242,22 @@ bool MovablePlayHead::checkOverflow() const {
return this->overflowFlag;
}

int MovablePlayHead::addTempoLabelTempo(double time, double tempo) {
int MovablePlayHead::addTempoLabelTempo(
double time, double tempo, int newIndex) {
/** Insert Label */
int index = this->insert(juce::MidiMessage::tempoMetaEvent(
1000000.0 / (tempo / 60.0)).withTimeStamp(time));
1000000.0 / (tempo / 60.0)).withTimeStamp(time), newIndex);
this->updateTempoTemp();

/** Return Index */
return index;
}

int MovablePlayHead::addTempoLabelBeat(double time, int numerator, int denominator) {
int MovablePlayHead::addTempoLabelBeat(
double time, int numerator, int denominator, int newIndex) {
/** Insert Label */
int index = this->insert(juce::MidiMessage::timeSignatureMetaEvent(
numerator, denominator).withTimeStamp(time));
numerator, denominator).withTimeStamp(time), newIndex);
this->updateTempoTemp();

/** Return Index */
Expand All @@ -281,7 +283,7 @@ bool MovablePlayHead::isTempoLabelTempoEvent(int index) const {
return false;
}

int MovablePlayHead::setTempoLabelTime(int index, double time) {
int MovablePlayHead::setTempoLabelTime(int index, double time, int newIndex) {
if (index >= 0 && index < this->tempos.size()) {
/** Remove */
auto event = this->remove(index);
Expand All @@ -291,13 +293,13 @@ int MovablePlayHead::setTempoLabelTime(int index, double time) {
event.setTimeStamp(time);

/** Add */
int newIndex = this->insert(event);
int indexTemp = this->insert(event, newIndex);

/** Update Temp */
this->updateTempoTemp();

/** Return */
return newIndex;
return indexTemp;
}
return index;
}
Expand Down Expand Up @@ -361,8 +363,32 @@ std::tuple<int, int> MovablePlayHead::getTempoLabelBeat(int index) const {
return { 4, 4 };
}

int MovablePlayHead::insert(const juce::MidiMessage& mes) {
int index = this->getTempoInsertIndex(mes.getTimeStamp());
int MovablePlayHead::insert(const juce::MidiMessage& mes, int newIndex) {
int index = newIndex;
if (index < 0 || index > this->tempos.size()) {
index = this->getTempoInsertIndex(mes.getTimeStamp());
}
else {
do {
double time = mes.getTimeStamp();
if (index > 0) {
auto& last = this->tempos.getReference(index - 1);
if (!(last.getTimeStamp() <= time)) {
index = this->getTempoInsertIndex(time);
break;
}
}
if (index < this->tempos.size() - 1) {
auto& next = this->tempos.getReference(index + 1);
double time = mes.getTimeStamp();
if (!(next.getTimeStamp() >= time)) {
index = this->getTempoInsertIndex(time);
break;
}
}
} while (false);
}

this->tempos.insert(index, mes);
return index;
}
Expand Down
8 changes: 4 additions & 4 deletions src/audioCore/misc/PlayPosition.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,12 @@ class MovablePlayHead : public juce::AudioPlayHead {
void setOverflow();
bool checkOverflow() const;

int addTempoLabelTempo(double time, double tempo);
int addTempoLabelBeat(double time, int numerator, int denominator);
int addTempoLabelTempo(double time, double tempo, int newIndex = -1);
int addTempoLabelBeat(double time, int numerator, int denominator, int newIndex = -1);
void removeTempoLabel(int index);
int getTempoLabelNum() const;
bool isTempoLabelTempoEvent(int index) const;
int setTempoLabelTime(int index, double time);
int setTempoLabelTime(int index, double time, int newIndex = -1);
void setTempoLabelTempo(int index, double tempo);
void setTempoLabelBeat(int index, int numerator, int denominator);
double getTempoLabelTime(int index) const;
Expand All @@ -75,7 +75,7 @@ class MovablePlayHead : public juce::AudioPlayHead {
std::atomic_bool overflowFlag = false;
std::atomic<double> loopStartSec = 0, loopEndSec = 0;

int insert(const juce::MidiMessage& mes);
int insert(const juce::MidiMessage& mes, int newIndex = -1);
const juce::MidiMessage remove(int index);

void updatePositionByTimeInSecond();
Expand Down

0 comments on commit 5344930

Please sign in to comment.