void SoundManager::onDurationChanged( SoundPlayer* player, int64_t duration ) { SoundClip* clip = player->clip(); double fps = static_cast< double >( editor()->fps() ); double frameLength = duration * fps / 1000.0; clip->setLength( frameLength ); emit soundClipDurationChanged(); }
Status SoundManager::loadSound(Layer* soundLayer, int frameNumber, QString strSoundFile) { Q_ASSERT(soundLayer); if (soundLayer->type() != Layer::SOUND) { return Status::ERROR_INVALID_LAYER_TYPE; } if (frameNumber < 0) { return Status::ERROR_INVALID_FRAME_NUMBER; } if (!QFile::exists(strSoundFile)) { return Status::FILE_NOT_FOUND; } KeyFrame* key = soundLayer->getKeyFrameAt(frameNumber); if (key == nullptr) { key = new SoundClip; soundLayer->addKeyFrame(frameNumber, key); } if (!key->fileName().isEmpty()) { // file path should be empty. // we can only load a audio clip to an empty key! return Status::FAIL; } QString strCopyFile = soundLayer->object()->copyFileToDataFolder(strSoundFile); Q_ASSERT(!strCopyFile.isEmpty()); QString sOriginalName = QFileInfo(strSoundFile).fileName(); SoundClip* soundClip = dynamic_cast<SoundClip*>(key); soundClip->init(strCopyFile); soundClip->setSoundClipName(sOriginalName); Status st = createMediaPlayer(soundClip); if (!st.ok()) { delete soundClip; return st; } return Status::OK; }
Status SoundManager::loadSound( Layer* soundLayer, int frameNumber, QString strSoundFile ) { Q_ASSERT( soundLayer ); if ( soundLayer->type() != Layer::SOUND ) { return Status::ERROR_INVALID_LAYER_TYPE; } if ( frameNumber < 0 ) { return Status::ERROR_INVALID_FRAME_NUMBER; } if ( !QFile::exists( strSoundFile ) ) { return Status::FILE_NOT_FOUND; } KeyFrame* key = soundLayer->getKeyFrameAt( frameNumber ); if ( key == nullptr ) { key = new SoundClip; } if ( !key->fileName().isEmpty() ) { return Status::FAIL; } SoundClip* soundClip = dynamic_cast< SoundClip* >( key ); soundClip->init( strSoundFile ); Status st = mSoundPlayer->addSound( soundClip ); if ( !st.ok() ) { delete soundClip; return st; } bool bAddOK = soundLayer->addKeyFrame( frameNumber, soundClip ); if ( !bAddOK ) { delete soundClip; return Status::FAIL; } return Status::OK; }
Status LayerSound::loadSoundAtFrame( QString strFilePath, int frameNumber ) { if ( !QFile::exists( strFilePath ) ) { return Status::FILE_NOT_FOUND; } QFileInfo info( strFilePath ); if ( !info.isFile() ) { strFilePath = ""; } SoundClip* clip = new SoundClip; clip->init( strFilePath ); clip->setPos( frameNumber ); loadKey( clip ); return Status::OK; }
void PlaybackManager::stopSounds() { std::vector< LayerSound* > kSoundLayers; for ( int i = 0; i < object()->getLayerCount(); ++i ) { Layer* layer = object()->getLayer( i ); if ( layer->type() == Layer::SOUND ) { kSoundLayers.push_back( static_cast< LayerSound* >( layer ) ); } } for ( LayerSound* layer : kSoundLayers ) { layer->foreachKeyFrame( []( KeyFrame* key ) { SoundClip* clip = static_cast< SoundClip* >( key ); clip->stop(); } ); } }
void PlaybackManager::playSounds( int frame ) { std::vector< LayerSound* > kSoundLayers; for ( int i = 0; i < object()->getLayerCount(); ++i ) { Layer* layer = object()->getLayer( i ); if ( layer->type() == Layer::SOUND ) { kSoundLayers.push_back( static_cast< LayerSound* >( layer ) ); } } for ( LayerSound* layer : kSoundLayers ) { if ( layer->keyExists( frame ) ) { KeyFrame* key = layer->getKeyFrameAt( frame ); SoundClip* clip = static_cast< SoundClip* >( key ); clip->play(); } } }
void Editor::backup(int backupLayer, int backupFrame, QString undoText) { while (mBackupList.size() - 1 > mBackupIndex && mBackupList.size() > 0) { delete mBackupList.takeLast(); } while (mBackupList.size() > 19) // we authorize only 20 levels of cancellation { delete mBackupList.takeFirst(); mBackupIndex--; } Layer* layer = mObject->getLayer(backupLayer); if (layer != nullptr) { if (layer->type() == Layer::BITMAP) { BitmapImage* bitmapImage = static_cast<LayerBitmap*>(layer)->getLastBitmapImageAtFrame(backupFrame, 0); if (currentFrame() == 1) { int previous = layer->getPreviousKeyFramePosition(backupFrame); bitmapImage = static_cast<LayerBitmap*>(layer)->getBitmapImageAtFrame(previous); } if (bitmapImage != nullptr) { BackupBitmapElement* element = new BackupBitmapElement(bitmapImage); element->layer = backupLayer; element->frame = backupFrame; element->undoText = undoText; element->somethingSelected = getScribbleArea()->isSomethingSelected(); element->mySelection = getScribbleArea()->mySelection; element->myTransformedSelection = getScribbleArea()->myTransformedSelection; element->myTempTransformedSelection = getScribbleArea()->myTempTransformedSelection; mBackupList.append(element); mBackupIndex++; } } else if (layer->type() == Layer::VECTOR) { VectorImage* vectorImage = static_cast<LayerVector*>(layer)->getLastVectorImageAtFrame(backupFrame, 0); if (vectorImage != nullptr) { BackupVectorElement* element = new BackupVectorElement(vectorImage); element->layer = backupLayer; element->frame = backupFrame; element->undoText = undoText; element->somethingSelected = getScribbleArea()->isSomethingSelected(); element->mySelection = getScribbleArea()->mySelection; element->myTransformedSelection = getScribbleArea()->myTransformedSelection; element->myTempTransformedSelection = getScribbleArea()->myTempTransformedSelection; mBackupList.append(element); mBackupIndex++; } } else if (layer->type() == Layer::SOUND) { int previous = layer->getPreviousKeyFramePosition(backupFrame); KeyFrame* key = layer->getLastKeyFrameAtPosition(backupFrame); // in case tracks overlap, get previous frame if (key == nullptr) { KeyFrame* previousKey = layer->getKeyFrameAt(previous); key = previousKey; } if (key != nullptr) { SoundClip* clip = static_cast<SoundClip*>(key); if (clip) { BackupSoundElement* element = new BackupSoundElement(clip); element->layer = backupLayer; element->frame = backupFrame; element->undoText = undoText; element->fileName = clip->fileName(); mBackupList.append(element); mBackupIndex++; } } } } updateAutoSaveCounter(); emit updateBackup(); }