fixed updating loop markers when notation is changed

This commit is contained in:
RomanPudashkin 2021-02-15 13:17:38 +02:00 committed by Igor Korsukov
parent bc4160c452
commit 18f26dd3a5
4 changed files with 41 additions and 11 deletions

View file

@ -83,7 +83,7 @@ Notation::Notation(Ms::Score* score)
m_undoStack = std::make_shared<NotationUndoStack>(this, m_notationChanged);
m_interaction = std::make_shared<NotationInteraction>(this, m_undoStack);
m_playback = std::make_shared<NotationPlayback>(this);
m_playback = std::make_shared<NotationPlayback>(this, m_notationChanged);
m_midiInput = std::make_shared<NotationMidiInput>(this, m_undoStack);
m_accessibility = std::make_shared<NotationAccessibility>(this, m_interaction->selectionChanged());
m_parts = std::make_shared<NotationParts>(this, m_interaction, m_undoStack);

View file

@ -48,12 +48,16 @@ using namespace mu::midi;
static constexpr int MIN_CHUNK_SIZE(10); // measure
NotationPlayback::NotationPlayback(IGetScore* getScore)
NotationPlayback::NotationPlayback(IGetScore* getScore, async::Notification notationChanged)
: m_getScore(getScore)
{
m_midiStream = std::make_shared<MidiStream>();
m_midiStream->isStreamingAllowed = true;
m_midiStream->request.onReceive(this, [this](tick_t tick) { onChunkRequest(tick); });
notationChanged.onNotify(this, [this]() {
updateLoopBoundaries();
});
}
Ms::Score* NotationPlayback::score() const
@ -79,16 +83,24 @@ void NotationPlayback::init()
if (Ms::POS::CURRENT == pos) {
m_playPositionTickChanged.send(tick);
} else {
LoopBoundaries boundaries;
boundaries.loopInTick = score()->loopInTick().ticks();
boundaries.loopOutTick = score()->loopOutTick().ticks();
boundaries.loopInRect = loopBoundaryRectByTick(LoopBoundaryType::LoopIn, boundaries.loopInTick);
boundaries.loopOutRect = loopBoundaryRectByTick(LoopBoundaryType::LoopOut, boundaries.loopOutTick);
m_loopBoundariesChanged.send(boundaries);
updateLoopBoundaries();
}
});
}
void NotationPlayback::updateLoopBoundaries()
{
LoopBoundaries boundaries;
boundaries.loopInTick = score()->loopInTick().ticks();
boundaries.loopOutTick = score()->loopOutTick().ticks();
boundaries.loopInRect = loopBoundaryRectByTick(LoopBoundaryType::LoopIn, boundaries.loopInTick);
boundaries.loopOutRect = loopBoundaryRectByTick(LoopBoundaryType::LoopOut, boundaries.loopOutTick);
if (m_loopBoundaries.val != boundaries) {
m_loopBoundaries.set(boundaries);
}
}
std::shared_ptr<MidiStream> NotationPlayback::midiStream() const
{
if (!score()) {
@ -705,7 +717,7 @@ QRect NotationPlayback::loopBoundaryRectByTick(LoopBoundaryType boundaryType, in
mu::async::Channel<LoopBoundaries> NotationPlayback::loopBoundariesChanged() const
{
return m_loopBoundariesChanged;
return m_loopBoundaries.ch;
}
Tempo NotationPlayback::tempo(int tick) const

View file

@ -40,7 +40,7 @@ class NotationPlayback : public INotationPlayback, public async::Asyncable
INJECT(notation, INotationConfiguration, configuration)
public:
NotationPlayback(IGetScore* getScore);
NotationPlayback(IGetScore* getScore, async::Notification notationChanged);
void init();
@ -91,6 +91,7 @@ private:
void addLoopIn(int tick);
void addLoopOut(int tick);
QRect loopBoundaryRectByTick(LoopBoundaryType boundaryType, int tick) const;
void updateLoopBoundaries();
const Ms::TempoText* tempoText(int tick) const;
@ -98,7 +99,7 @@ private:
std::shared_ptr<midi::MidiStream> m_midiStream;
std::unique_ptr<Ms::MidiRenderer> m_midiRenderer;
async::Channel<int> m_playPositionTickChanged;
async::Channel<LoopBoundaries> m_loopBoundariesChanged;
ValCh<LoopBoundaries> m_loopBoundaries;
};
}

View file

@ -343,6 +343,23 @@ struct LoopBoundaries
{
return loopInTick == 0 && loopOutTick == 0;
}
bool operator==(const LoopBoundaries& boundaries) const
{
bool equals = true;
equals &= loopInTick == boundaries.loopInTick;
equals &= loopOutTick == boundaries.loopOutTick;
equals &= loopInRect == boundaries.loopInRect;
equals &= loopOutRect == boundaries.loopOutRect;
return equals;
}
bool operator!=(const LoopBoundaries& boundaries) const
{
return !(*this == boundaries);
}
};
inline QString staffTypeToString(StaffType type)