22 return m_playbackRate;
36 m_softSyncData = makeSoftSyncData(m_timePoint, m_position, m_softSyncData->dstTimePoint);
41 sync(Clock::now(), trackPos);
46 m_softSyncData.reset();
47 m_position = TrackTime(
pos);
53 const auto srcTime = Clock::now();
55 const auto dstTime = srcTime + fixingTime;
57 m_position = TrackTime(
pos);
60 m_softSyncData = makeSoftSyncData(srcTime, TrackTime(srcPos), dstTime);
70 if (m_paused == paused)
79 tp = m_paused && !ignorePause ? m_timePoint : tp;
81 if (m_softSyncData && tp < m_softSyncData->dstTimePoint) {
83 tp > m_softSyncData->srcTimePoint ? m_softSyncData->internalRate : m_playbackRate;
85 return (m_softSyncData->srcPosition
86 + toTrackTime((tp - m_softSyncData->srcTimePoint) *
rate))
90 return positionFromTimeInternal(tp).count();
95 auto position = m_paused && !ignorePause ? m_position : TrackTime(
pos);
97 if (m_softSyncData && position < m_softSyncData->dstPosition) {
98 const auto rate =
position > m_softSyncData->srcPosition ? m_softSyncData->internalRate
100 return m_softSyncData->srcTimePoint
101 + toClockTime((
position - m_softSyncData->srcPosition) /
rate);
104 return timeFromPositionInternal(
position);
107TimeController::SoftSyncData TimeController::makeSoftSyncData(
const TimePoint &srcTp,
108 const TrackTime &srcPos,
109 const TimePoint &dstTp)
const
112 result.srcTimePoint = srcTp;
113 result.srcPosition = srcPos;
114 result.dstTimePoint = dstTp;
115 result.srcPosOffest = srcPos - positionFromTimeInternal(srcTp);
116 result.dstPosition = positionFromTimeInternal(dstTp);
118 static_cast<PlaybackRate>(toClockTime(TrackTime(
result.dstPosition - srcPos)).count())
119 / (dstTp - srcTp).count();
124TimeController::TrackTime TimeController::positionFromTimeInternal(
const TimePoint &tp)
const
126 return m_position + toTrackTime((tp - m_timePoint) * m_playbackRate);
131 return m_timePoint + toClockTime(TrackTime(
pos - m_position) / m_playbackRate);
134void TimeController::scrollTimeTillNow()
136 const auto now = Clock::now();
138 m_position = positionFromTimeInternal(
now);
141 if (m_softSyncData && m_softSyncData->dstTimePoint <=
now)
142 m_softSyncData.reset();
143 }
else if (m_softSyncData) {
144 m_softSyncData->dstTimePoint +=
now - m_timePoint;
145 m_softSyncData->srcTimePoint +=
now - m_timePoint;
152TimeController::Clock::duration TimeController::toClockTime(
const T &
t)
154 return std::chrono::duration_cast<Clock::duration>(
t);
158TimeController::TrackTime TimeController::toTrackTime(
const T &
t)
160 return std::chrono::duration_cast<TrackTime>(
t);
PlaybackRate playbackRate() const
void sync(qint64 trackPos=0)
qint64 positionFromTime(TimePoint tp, bool ignorePause=false) const
Clock::time_point TimePoint
TimePoint timeFromPosition(qint64 pos, bool ignorePause=false) const
void setPlaybackRate(PlaybackRate playbackRate)
qint64 currentPosition(const Clock::duration &offset=Clock::duration{ 0 }) const
void setPaused(bool paused)
void syncSoft(const TimePoint &tp, qint64 pos, const Clock::duration &fixingTime=std::chrono::seconds(4))
Combined button and popup list for selecting options.
GLenum GLuint GLintptr offset
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)