Changed how looping occurs in recordings

This commit is contained in:
Atlante45 2014-09-16 14:49:47 -07:00
parent 42857bce33
commit f649cd1a6e
2 changed files with 42 additions and 28 deletions

View file

@ -129,6 +129,7 @@ void Recorder::startRecording() {
bool wantDebug = false; bool wantDebug = false;
if (wantDebug) { if (wantDebug) {
qDebug() << "Recorder::startRecording(): Recording Context"; qDebug() << "Recorder::startRecording(): Recording Context";
qDebug() << "Global timestamp:" << context.globalTimestamp;
qDebug() << "Domain:" << context.domain; qDebug() << "Domain:" << context.domain;
qDebug() << "Position:" << context.position; qDebug() << "Position:" << context.position;
qDebug() << "Orientation:" << context.orientation; qDebug() << "Orientation:" << context.orientation;
@ -240,18 +241,7 @@ qint64 Player::elapsed() const {
void Player::startPlaying() { void Player::startPlaying() {
if (_recording && _recording->getFrameNumber() > 0) { if (_recording && _recording->getFrameNumber() > 0) {
// Setup audio thread _currentContext.globalTimestamp = usecTimestampNow();
_audioThread = new QThread();
_options.setPosition(_avatar->getPosition());
_options.setOrientation(_avatar->getOrientation());
_injector.reset(new AudioInjector(_recording->getAudio(), _options), &QObject::deleteLater);
_injector->moveToThread(_audioThread);
_audioThread->start();
QMetaObject::invokeMethod(_injector.data(), "injectAudio", Qt::QueuedConnection);
// Fake faceshift connection
_avatar->setForceFaceshiftConnected(true);
_currentContext.domain = NodeList::getInstance()->getDomainHandler().getHostname(); _currentContext.domain = NodeList::getInstance()->getDomainHandler().getHostname();
_currentContext.position = _avatar->getPosition(); _currentContext.position = _avatar->getPosition();
_currentContext.orientation = _avatar->getOrientation(); _currentContext.orientation = _avatar->getOrientation();
@ -284,8 +274,12 @@ void Player::startPlaying() {
} }
} }
// Fake faceshift connection
_avatar->setForceFaceshiftConnected(true);
qDebug() << "Recorder::startPlaying()"; qDebug() << "Recorder::startPlaying()";
_currentFrame = 0; _currentFrame = 0;
setupAudioThread();
_timer.start(); _timer.start();
} }
} }
@ -294,12 +288,27 @@ void Player::stopPlaying() {
if (!isPlaying()) { if (!isPlaying()) {
return; return;
} }
_timer.invalidate(); _timer.invalidate();
cleanupAudioThread();
_avatar->clearJointsData(); _avatar->clearJointsData();
// Cleanup audio thread // Turn off fake faceshift connection
_avatar->setForceFaceshiftConnected(false);
qDebug() << "Recorder::stopPlaying()";
}
void Player::setupAudioThread() {
_audioThread = new QThread();
_options.setPosition(_avatar->getPosition());
_options.setOrientation(_avatar->getOrientation());
_injector.reset(new AudioInjector(_recording->getAudio(), _options), &QObject::deleteLater);
_injector->moveToThread(_audioThread);
_audioThread->start();
QMetaObject::invokeMethod(_injector.data(), "injectAudio", Qt::QueuedConnection);
}
void Player::cleanupAudioThread() {
_injector->stop(); _injector->stop();
QObject::connect(_injector.data(), &AudioInjector::finished, QObject::connect(_injector.data(), &AudioInjector::finished,
_injector.data(), &AudioInjector::deleteLater); _injector.data(), &AudioInjector::deleteLater);
@ -309,11 +318,14 @@ void Player::stopPlaying() {
_audioThread, &QThread::deleteLater); _audioThread, &QThread::deleteLater);
_injector.clear(); _injector.clear();
_audioThread = NULL; _audioThread = NULL;
}
void Player::loopRecording() {
cleanupAudioThread();
setupAudioThread();
_currentFrame = 0;
_timer.restart();
// Turn off fake faceshift connection
_avatar->setForceFaceshiftConnected(false);
qDebug() << "Recorder::stopPlaying()";
} }
void Player::loadFromFile(QString file) { void Player::loadFromFile(QString file) {
@ -332,24 +344,23 @@ void Player::loadRecording(RecordingPointer recording) {
void Player::play() { void Player::play() {
computeCurrentFrame(); computeCurrentFrame();
if (_currentFrame < 0 || (_currentFrame >= _recording->getFrameNumber() - 1)) { if (_currentFrame < 0 || (_currentFrame >= _recording->getFrameNumber() - 1)) {
// If it's the end of the recording, stop playing
stopPlaying();
if (_loop) { if (_loop) {
startPlaying(); loopRecording();
} else {
stopPlaying();
} }
return; return;
} }
RecordingContext& context = _recording->getContext(); const RecordingContext* context = &_recording->getContext();
if (_playFromCurrentPosition) { if (_playFromCurrentPosition) {
context = _currentContext; context = &_currentContext;
} }
const RecordingFrame& currentFrame = _recording->getFrame(_currentFrame); const RecordingFrame& currentFrame = _recording->getFrame(_currentFrame);
_avatar->setPosition(context.position + context.orientation * currentFrame.getTranslation()); _avatar->setPosition(context->position + context->orientation * currentFrame.getTranslation());
_avatar->setOrientation(context.orientation * currentFrame.getRotation()); _avatar->setOrientation(context->orientation * currentFrame.getRotation());
_avatar->setTargetScale(context.scale * currentFrame.getScale()); _avatar->setTargetScale(context->scale * currentFrame.getScale());
_avatar->setJointRotations(currentFrame.getJointRotations()); _avatar->setJointRotations(currentFrame.getJointRotations());
HeadData* head = const_cast<HeadData*>(_avatar->getHeadData()); HeadData* head = const_cast<HeadData*>(_avatar->getHeadData());

View file

@ -172,6 +172,9 @@ public slots:
void setLoop(bool loop); void setLoop(bool loop);
private: private:
void setupAudioThread();
void cleanupAudioThread();
void loopRecording();
bool computeCurrentFrame(); bool computeCurrentFrame();
QElapsedTimer _timer; QElapsedTimer _timer;