Skip to content

Commit

Permalink
Fix min:sec:msec display when playMode is chnged and TimeLineWidget i…
Browse files Browse the repository at this point in the history
…s moved.
  • Loading branch information
PhysSong committed Jul 21, 2017
1 parent ffca6e4 commit df75bcf
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 23 deletions.
29 changes: 24 additions & 5 deletions include/Song.h
Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down
5 changes: 3 additions & 2 deletions include/TimeLineWidget.h
Expand Up @@ -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; }
Expand Down Expand Up @@ -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;
Expand Down
17 changes: 10 additions & 7 deletions src/core/Song.cpp
Expand Up @@ -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() ),
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 );

Expand Down Expand Up @@ -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 ) )
{
Expand All @@ -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() &&
Expand All @@ -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 );
Expand Down
12 changes: 9 additions & 3 deletions src/gui/TimeLineWidget.cpp
Expand Up @@ -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 ),
Expand All @@ -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 ),
Expand Down Expand Up @@ -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();
Expand Down
3 changes: 2 additions & 1 deletion src/gui/editors/AutomationEditor.cpp
Expand Up @@ -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 & ) ),
Expand Down
3 changes: 2 additions & 1 deletion src/gui/editors/PianoRoll.cpp
Expand Up @@ -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 & ) ),
Expand Down
3 changes: 2 additions & 1 deletion src/gui/editors/SongEditor.cpp
Expand Up @@ -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 & ) ) );
Expand Down
8 changes: 5 additions & 3 deletions src/gui/widgets/TimeDisplayWidget.cpp
Expand Up @@ -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:
Expand Down

0 comments on commit df75bcf

Please sign in to comment.