22 return m_playbackRate;
36 m_softSyncData = makeSoftSyncData(m_softSyncData->srcTimePoint, m_softSyncData->srcPosition,
37 m_softSyncData->dstTimePoint);
42 sync(Clock::now(), trackPos);
47 m_softSyncData.reset();
48 m_position = TrackTime(
pos);
54 const auto srcTime = Clock::now();
56 const auto dstTime = srcTime + fixingTime;
58 m_position = TrackTime(
pos);
61 m_softSyncData = makeSoftSyncData(srcTime, TrackTime(srcPos), dstTime);
71 if (m_paused == paused)
80 tp = m_paused && !ignorePause ? m_timePoint : tp;
82 if (m_softSyncData && tp < m_softSyncData->dstTimePoint) {
84 tp > m_softSyncData->srcTimePoint ? m_softSyncData->internalRate : m_playbackRate;
86 return (m_softSyncData->srcPosition
87 + toTrackTime((tp - m_softSyncData->srcTimePoint) *
rate))
91 return positionFromTimeInternal(tp).count();
96 auto position = m_paused && !ignorePause ? m_position : TrackTime(
pos);
98 if (m_softSyncData && position < m_softSyncData->dstPosition) {
99 const auto rate =
position > m_softSyncData->srcPosition ? m_softSyncData->internalRate
101 return m_softSyncData->srcTimePoint
102 + toClockTime((
position - m_softSyncData->srcPosition) /
rate);
105 return timeFromPositionInternal(
position);
108TimeController::SoftSyncData TimeController::makeSoftSyncData(
const TimePoint &srcTp,
109 const TrackTime &srcPos,
110 const TimePoint &dstTp)
const
113 result.srcTimePoint = srcTp;
114 result.srcPosition = srcPos;
115 result.dstTimePoint = dstTp;
116 result.srcPosOffest = srcPos - positionFromTimeInternal(srcTp);
117 result.dstPosition = positionFromTimeInternal(dstTp);
119 static_cast<PlaybackRate>(toClockTime(TrackTime(
result.dstPosition - srcPos)).count())
120 / (dstTp - srcTp).count();
125TimeController::TrackTime TimeController::positionFromTimeInternal(
const TimePoint &tp)
const
127 return m_position + toTrackTime((tp - m_timePoint) * m_playbackRate);
132 return m_timePoint + toClockTime(TrackTime(
pos - m_position) / m_playbackRate);
135void TimeController::scrollTimeTillNow()
137 const auto now = Clock::now();
139 m_position = positionFromTimeInternal(
now);
140 else if (m_softSyncData) {
141 m_softSyncData->dstTimePoint +=
now - m_timePoint;
142 m_softSyncData->srcTimePoint +=
now - m_timePoint;
149TimeController::Clock::duration TimeController::toClockTime(
const T &
t)
151 return std::chrono::duration_cast<Clock::duration>(
t);
155TimeController::TrackTime TimeController::toTrackTime(
const T &
t)
157 return std::chrono::duration_cast<TrackTime>(
t);
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)
float playbackRate() const
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)