From df75bcf5866aca2c3bf19b4a59c256f9c16ec82e Mon Sep 17 00:00:00 2001 From: Hyunin Song Date: Sun, 16 Jul 2017 20:38:08 +0900 Subject: [PATCH] Fix min:sec:msec display when playMode is chnged and TimeLineWidget is moved. --- include/Song.h | 29 ++++++++++++++++++++++----- include/TimeLineWidget.h | 5 +++-- src/core/Song.cpp | 17 +++++++++------- src/gui/TimeLineWidget.cpp | 12 ++++++++--- src/gui/editors/AutomationEditor.cpp | 3 ++- src/gui/editors/PianoRoll.cpp | 3 ++- src/gui/editors/SongEditor.cpp | 3 ++- src/gui/widgets/TimeDisplayWidget.cpp | 8 +++++--- 8 files changed, 57 insertions(+), 23 deletions(-) diff --git a/include/Song.h b/include/Song.h index 5b6e6899b0f..890d8aff86a 100644 --- a/include/Song.h +++ b/include/Song.h @@ -104,17 +104,36 @@ class EXPORT Song : public TrackContainer inline int getMilliseconds() const { - return m_elapsedMilliSeconds; + return m_elapsedMilliSeconds[m_playMode]; } - inline void setToTime( MidiTime const & midiTime ) + inline int getMilliseconds(PlayModes playMode) const { - m_elapsedMilliSeconds = midiTime.getTimeInMilliseconds(getTempo()); + return m_elapsedMilliSeconds[playMode]; + } + + inline void setToTime(MidiTime const & midiTime) + { + m_elapsedMilliSeconds[m_playMode] = midiTime.getTimeInMilliseconds(getTempo()); + m_playPos[m_playMode].setTicks(midiTime.getTicks()); + } + + inline void setToTime(MidiTime const & midiTime, PlayModes playMode) + { + m_elapsedMilliSeconds[playMode] = midiTime.getTimeInMilliseconds(getTempo()); + m_playPos[playMode].setTicks(midiTime.getTicks()); } inline void setToTimeByTicks(tick_t ticks) { - m_elapsedMilliSeconds = MidiTime::ticksToMilliseconds(ticks, getTempo()); + m_elapsedMilliSeconds[m_playMode] = MidiTime::ticksToMilliseconds(ticks, getTempo()); + m_playPos[m_playMode].setTicks(ticks); + } + + inline void setToTimeByTicks(tick_t ticks, PlayModes playMode) + { + m_elapsedMilliSeconds[playMode] = MidiTime::ticksToMilliseconds(ticks, getTempo()); + m_playPos[playMode].setTicks(ticks); } inline int getTacts() const @@ -376,7 +395,7 @@ private slots: const Pattern* m_patternToPlay; bool m_loopPattern; - double m_elapsedMilliSeconds; + double m_elapsedMilliSeconds[Mode_Count]; tick_t m_elapsedTicks; tact_t m_elapsedTacts; diff --git a/include/TimeLineWidget.h b/include/TimeLineWidget.h index 46a1009a396..7629694caa8 100644 --- a/include/TimeLineWidget.h +++ b/include/TimeLineWidget.h @@ -72,8 +72,8 @@ class TimeLineWidget : public QWidget, public JournallingObject } ; - TimeLineWidget( int xoff, int yoff, float ppt, Song::PlayPos & pos, - const MidiTime & begin, QWidget * parent ); + TimeLineWidget(int xoff, int yoff, float ppt, Song::PlayPos & pos, + const MidiTime & begin, Song::PlayModes mode, QWidget * parent); virtual ~TimeLineWidget(); inline QColor const & getBarLineColor() const { return m_barLineColor; } @@ -217,6 +217,7 @@ public slots: float m_ppt; Song::PlayPos & m_pos; const MidiTime & m_begin; + const Song::PlayModes m_mode; MidiTime m_loopPos[2]; MidiTime m_savedPos; diff --git a/src/core/Song.cpp b/src/core/Song.cpp index f40616e2186..670cebab2a7 100644 --- a/src/core/Song.cpp +++ b/src/core/Song.cpp @@ -91,10 +91,10 @@ Song::Song() : m_length( 0 ), m_patternToPlay( NULL ), m_loopPattern( false ), - m_elapsedMilliSeconds( 0 ), m_elapsedTicks( 0 ), m_elapsedTacts( 0 ) { + for(int i = 0; i < Mode_Count; ++i) m_elapsedMilliSeconds[i] = 0; connect( &m_tempoModel, SIGNAL( dataChanged() ), this, SLOT( setTempo() ) ); connect( &m_tempoModel, SIGNAL( dataUnchanged() ), @@ -388,7 +388,7 @@ void Song::processNextBuffer() framesPlayed += framesToPlay; m_playPos[m_playMode].setCurrentFrame( framesToPlay + currentFrame ); - m_elapsedMilliSeconds += MidiTime::ticksToMilliseconds( framesToPlay / framesPerTick, getTempo()); + m_elapsedMilliSeconds[m_playMode] += MidiTime::ticksToMilliseconds(framesToPlay / framesPerTick, getTempo()); m_elapsedTacts = m_playPos[Mode_PlaySong].getTact(); m_elapsedTicks = ( m_playPos[Mode_PlaySong].getTicks() % ticksPerTact() ) / 48; } @@ -598,7 +598,7 @@ void Song::setPlayPos( tick_t ticks, PlayModes playMode ) { tick_t ticksFromPlayMode = m_playPos[playMode].getTicks(); m_elapsedTicks += ticksFromPlayMode - ticks; - m_elapsedMilliSeconds += MidiTime::ticksToMilliseconds( ticks - ticksFromPlayMode, getTempo() ); + m_elapsedMilliSeconds[m_playMode] += MidiTime::ticksToMilliseconds( ticks - ticksFromPlayMode, getTempo() ); m_playPos[playMode].setTicks( ticks ); m_playPos[playMode].setCurrentFrame( 0.0f ); @@ -652,8 +652,8 @@ void Song::stop() switch( tl->behaviourAtStop() ) { case TimeLineWidget::BackToZero: - m_playPos[m_playMode].setTicks( 0 ); - m_elapsedMilliSeconds = 0; + m_playPos[m_playMode].setTicks(0); + m_elapsedMilliSeconds[m_playMode] = 0; if( gui && gui->songEditor() && ( tl->autoScroll() == TimeLineWidget::AutoScrollEnabled ) ) { @@ -664,7 +664,7 @@ void Song::stop() case TimeLineWidget::BackToStart: if( tl->savedPos() >= 0 ) { - m_playPos[m_playMode].setTicks( tl->savedPos().getTicks() ); + m_playPos[m_playMode].setTicks(tl->savedPos().getTicks()); setToTime(tl->savedPos()); if( gui && gui->songEditor() && @@ -684,10 +684,13 @@ void Song::stop() else { m_playPos[m_playMode].setTicks( 0 ); - m_elapsedMilliSeconds = 0; + m_elapsedMilliSeconds[m_playMode] = 0; } m_playing = false; + m_elapsedMilliSeconds[Mode_None] = m_elapsedMilliSeconds[m_playMode]; + m_playPos[Mode_None].setTicks(m_playPos[m_playMode].getTicks()); + m_playPos[m_playMode].setCurrentFrame( 0 ); m_vstSyncController.setPlaybackState( m_exporting ); diff --git a/src/gui/TimeLineWidget.cpp b/src/gui/TimeLineWidget.cpp index 742da93885b..86dd43b5144 100644 --- a/src/gui/TimeLineWidget.cpp +++ b/src/gui/TimeLineWidget.cpp @@ -48,7 +48,7 @@ QPixmap * TimeLineWidget::s_posMarkerPixmap = NULL; TimeLineWidget::TimeLineWidget( const int xoff, const int yoff, const float ppt, - Song::PlayPos & pos, const MidiTime & begin, + Song::PlayPos & pos, const MidiTime & begin, Song::PlayModes mode, QWidget * parent ) : QWidget( parent ), m_inactiveLoopColor( 52, 63, 53, 64 ), @@ -69,6 +69,7 @@ TimeLineWidget::TimeLineWidget( const int xoff, const int yoff, const float ppt, m_ppt( ppt ), m_pos( pos ), m_begin( begin ), + m_mode( mode ), m_savedPos( -1 ), m_hint( NULL ), m_action( NoAction ), @@ -370,8 +371,13 @@ void TimeLineWidget::mouseMoveEvent( QMouseEvent* event ) switch( m_action ) { case MovePositionMarker: - m_pos.setTicks( t.getTicks() ); - Engine::getSong()->setToTime(t); + m_pos.setTicks(t.getTicks()); + Engine::getSong()->setToTime(t, m_mode); + if (!( Engine::getSong()->isPlaying())) + { + //Song::Mode_None is used when nothing is being played. + Engine::getSong()->setToTime(t, Song::Mode_None); + } m_pos.setCurrentFrame( 0 ); updatePosition(); positionMarkerMoved(); diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index 1e94c1b50e7..ca99920cc2a 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -152,7 +152,8 @@ AutomationEditor::AutomationEditor() : m_timeLine = new TimeLineWidget( VALUES_WIDTH, 0, m_ppt, Engine::getSong()->getPlayPos( Song::Mode_PlayAutomationPattern ), - m_currentPosition, this ); + m_currentPosition, + Song::Mode_PlayAutomationPattern, this ); connect( this, SIGNAL( positionChanged( const MidiTime & ) ), m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 9b65c684798..1a41bb44db7 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -313,7 +313,8 @@ PianoRoll::PianoRoll() : m_timeLine = new TimeLineWidget( WHITE_KEY_WIDTH, 0, m_ppt, Engine::getSong()->getPlayPos( Song::Mode_PlayPattern ), - m_currentPosition, this ); + m_currentPosition, + Song::Mode_PlayPattern, this ); connect( this, SIGNAL( positionChanged( const MidiTime & ) ), m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), diff --git a/src/gui/editors/SongEditor.cpp b/src/gui/editors/SongEditor.cpp index cf561f17928..36379a2da94 100644 --- a/src/gui/editors/SongEditor.cpp +++ b/src/gui/editors/SongEditor.cpp @@ -90,7 +90,8 @@ SongEditor::SongEditor( Song * song ) : m_timeLine = new TimeLineWidget( widgetTotal, 32, pixelsPerTact(), m_song->m_playPos[Song::Mode_PlaySong], - m_currentPosition, this ); + m_currentPosition, + Song::Mode_PlaySong, this ); connect( this, SIGNAL( positionChanged( const MidiTime & ) ), m_song->m_playPos[Song::Mode_PlaySong].m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); diff --git a/src/gui/widgets/TimeDisplayWidget.cpp b/src/gui/widgets/TimeDisplayWidget.cpp index e8262a05b26..2805aa8f414 100644 --- a/src/gui/widgets/TimeDisplayWidget.cpp +++ b/src/gui/widgets/TimeDisplayWidget.cpp @@ -101,9 +101,11 @@ void TimeDisplayWidget::updateTime() switch( m_displayMode ) { case MinutesSeconds: - m_majorLCD.setValue( s->getMilliseconds() / 60000 ); - m_minorLCD.setValue( ( s->getMilliseconds() / 1000 ) % 60 ); - m_milliSecondsLCD.setValue( s->getMilliseconds() % 1000 ); + int msec; + msec = s->getMilliseconds(); + m_majorLCD.setValue(msec / 60000); + m_minorLCD.setValue((msec / 1000) % 60); + m_milliSecondsLCD.setValue(msec % 1000); break; case BarsTicks: