18 #include "playbackmanager.h"
21 #include <QElapsedTimer>
26 #include "layersound.h"
27 #include "layermanager.h"
28 #include "soundclip.h"
29 #include "toolmanager.h"
36 PlaybackManager::~PlaybackManager()
41 bool PlaybackManager::init()
46 mFlipTimer =
new QTimer(
this);
49 mScrubTimer =
new QTimer(
this);
51 mSoundclipsToPLay.
clear();
54 mFps = settings.value(SETTING_FPS).toInt();
55 mMsecSoundScrub = settings.value(SETTING_SOUND_SCRUB_MSEC).toInt();
56 if (mMsecSoundScrub == 0) { mMsecSoundScrub = 100; }
57 mSoundScrub = settings.value(SETTING_SOUND_SCRUB_ACTIVE).toBool();
69 mIsLooping = data->isLooping();
70 mIsRangedPlayback = data->isRangedPlayback();
71 mMarkInFrame = data->getMarkInFrameNumber();
72 mMarkOutFrame = data->getMarkOutFrameNumber();
73 mFps = data->getFrameRate();
84 data->setLooping(mIsLooping);
85 data->setRangedPlayback(mIsRangedPlayback);
86 data->setMarkInFrameNumber(mMarkInFrame);
87 data->setMarkOutFrameNumber(mMarkOutFrame);
88 data->setFrameRate(mFps);
89 data->setCurrentFrame(editor()->currentFrame());
93 bool PlaybackManager::isPlaying()
98 void PlaybackManager::play()
105 bool switchLayer = editor()->tools()->currentTool()->switchingLayer();
106 if (!switchLayer)
return;
108 int frame = editor()->currentFrame();
109 if (frame >= mEndFrame || frame < mStartFrame)
111 editor()->scrubTo(mStartFrame);
112 frame = editor()->currentFrame();
115 mListOfActiveSoundFrames.
clear();
117 mCheckForSoundsHalfway =
true;
120 mTimer->
setInterval(static_cast<int>(1000.f / mFps));
124 mPlayingFrameCounter = 1;
125 mElapsedTimer->
start();
127 emit playStateChanged(
true);
130 void PlaybackManager::stop()
134 emit playStateChanged(
false);
137 void PlaybackManager::playFlipRoll()
139 if (isPlaying()) {
return; }
141 int start = editor()->currentFrame();
145 mFlipRollMax = settings.value(SETTING_FLIP_ROLL_DRAWINGS).toInt();
146 for (
int i = 0; i < mFlipRollMax; i++)
148 int prev = editor()->layers()->currentLayer()->getPreviousKeyFramePosition(tmp);
155 if (mFlipList.
isEmpty()) {
return; }
158 mFlipRollInterval = settings.value(SETTING_FLIP_ROLL_MSEC).toInt();
162 editor()->scrubTo(mFlipList[0]);
164 emit playStateChanged(
true);
167 void PlaybackManager::playFlipInBetween()
169 if (isPlaying()) {
return; }
172 int start = editor()->currentFrame();
174 int prev = layerMgr->currentLayer()->getPreviousKeyFramePosition(start);
175 int next = layerMgr->currentLayer()->getNextKeyFramePosition(start);
177 if (prev < start && next > start &&
178 layerMgr->currentLayer()->keyExists(prev) &&
179 layerMgr->currentLayer()->keyExists(next))
195 mFlipInbetweenInterval = settings.value(SETTING_FLIP_INBETWEEN_MSEC).toInt();
198 editor()->scrubTo(mFlipList[0]);
200 emit playStateChanged(
true);
203 void PlaybackManager::playScrub(
int frame)
205 if (!mSoundScrub || !mSoundclipsToPLay.
isEmpty()) {
return; }
207 auto layerMan = editor()->layers();
208 for (
int i = 0; i < layerMan->count(); i++)
210 Layer* layer = layerMan->getLayer(i);
211 if (layer->type() == Layer::SOUND && layer->visible())
213 KeyFrame* key = layer->getKeyFrameWhichCovers(frame);
217 mSoundclipsToPLay.
append(clip);
222 if (mSoundclipsToPLay.
isEmpty()) {
return; }
224 mScrubTimer->
singleShot(mMsecSoundScrub,
this, &PlaybackManager::stopScrubPlayback);
225 for (
int i = 0; i < mSoundclipsToPLay.
count(); i++)
227 mSoundclipsToPLay.
at(i)->playFromPosition(frame, mFps);
231 void PlaybackManager::setFps(
int fps)
237 settings.setValue(SETTING_FPS, fps);
238 emit fpsChanged(mFps);
242 for (
int i = 0; i < object()->getLayerCount(); ++i)
244 Layer* layer = object()->getLayer(i);
245 if (layer->type() == Layer::SOUND)
247 auto soundLayer =
dynamic_cast<LayerSound *
>(layer);
248 soundLayer->updateFrameLengths(mFps);
254 void PlaybackManager::playSounds(
int frame)
262 std::vector< LayerSound* > kSoundLayers;
263 for (
int i = 0; i < object()->getLayerCount(); ++i)
265 Layer* layer = object()->getLayer(i);
266 if (layer->type() == Layer::SOUND)
268 kSoundLayers.push_back(static_cast<LayerSound*>(layer));
274 KeyFrame* key = layer->getLastKeyFrameAtPosition(frame);
276 if (!layer->getVisibility())
284 if (key->pos() + key->length() >= frame)
286 if (!mListOfActiveSoundFrames.
contains(key->pos()))
288 mListOfActiveSoundFrames.
append(key->pos());
293 if (mCheckForSoundsHalfway)
296 for (
int i = 0; i < mListOfActiveSoundFrames.
count(); i++)
298 int listPosition = mListOfActiveSoundFrames.
at(i);
299 if (layer->keyExistsWhichCovers(listPosition))
301 key = layer->getKeyFrameWhichCovers(listPosition);
303 clip->playFromPosition(frame, mFps);
307 else if (layer->keyExists(frame))
309 key = layer->getKeyFrameAt(frame);
315 mActiveSoundFrame = frame;
318 if (frame >= mEndFrame)
320 if (layer->keyExists(mActiveSoundFrame))
322 key = layer->getKeyFrameWhichCovers(mActiveSoundFrame);
327 if (!mListOfActiveSoundFrames.
isEmpty())
328 mListOfActiveSoundFrames.
clear();
335 mCheckForSoundsHalfway =
false;
350 int t = qRound((mPlayingFrameCounter - 1) * (1000.f / mFps));
351 if (mElapsedTimer->
elapsed() < t)
357 ++mPlayingFrameCounter;
361 void PlaybackManager::stopSounds()
363 std::vector<LayerSound*> kSoundLayers;
365 for (
int i = 0; i < object()->getLayerCount(); ++i)
367 Layer* layer = object()->getLayer(i);
368 if (layer->type() == Layer::SOUND)
370 kSoundLayers.push_back(static_cast<LayerSound*>(layer));
376 layer->foreachKeyFrame([](
KeyFrame* key)
384 void PlaybackManager::stopScrubPlayback()
386 for (
int i = 0; i < mSoundclipsToPLay.
count(); i++)
388 mSoundclipsToPLay.
at(i)->pause();
390 mSoundclipsToPLay.
clear();
393 void PlaybackManager::timerTick()
395 int currentFrame = editor()->currentFrame();
398 if (currentFrame >= mEndFrame)
402 editor()->scrubTo(mStartFrame);
403 mCheckForSoundsHalfway =
true;
416 editor()->scrubForward();
418 int newFrame = editor()->currentFrame();
419 playSounds(newFrame);
422 void PlaybackManager::flipTimerTick()
424 if (mFlipList.
count() < 2 || editor()->currentFrame() != mFlipList[0])
427 editor()->scrubTo(mFlipList.
last());
428 emit playStateChanged(
false);
432 editor()->scrubTo(mFlipList[1]);
437 void PlaybackManager::setLooping(
bool isLoop)
439 if (mIsLooping != isLoop)
442 emit loopStateChanged(mIsLooping);
446 void PlaybackManager::enableRangedPlayback(
bool b)
448 if (mIsRangedPlayback != b)
450 mIsRangedPlayback = b;
455 emit rangedPlaybackStateChanged(mIsRangedPlayback);
459 void PlaybackManager::setRangedStartFrame(
int frame)
461 mMarkInFrame = frame;
465 void PlaybackManager::setRangedEndFrame(
int frame)
467 mMarkOutFrame = frame;
471 void PlaybackManager::updateStartFrame()
473 mStartFrame = (mIsRangedPlayback) ? mMarkInFrame : 1;
476 void PlaybackManager::updateEndFrame()
479 mEndFrame = (mIsRangedPlayback) ? mMarkOutFrame : projectLength;
482 void PlaybackManager::enableSound(
bool b)
492 mCheckForSoundsHalfway =
true;
void setInterval(int msec)
void append(const T &value)
bool isActive() const const
bool contains(const T &value) const const
bool skipFrame()
PlaybackManager::skipFrame() Small errors accumulate while playing animation If the error is greater ...
const T & at(int i) const const
bool isEmpty() const const
int count(const T &value) const const
void setTimerType(Qt::TimerType atype)
int animationLength(bool includeSounds=true)
Get the length of current project.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
qint64 elapsed() const const