qAnimationDlg::qAnimationDlg(ccGLWindow* view3d, QWidget* parent) : QDialog(parent, Qt::Tool) , Ui::AnimationDialog() , m_view3d(view3d) { setupUi(this); //restore previous settings { QSettings settings; settings.beginGroup("qAnimation"); //last filename { QString defaultDir; #ifdef _MSC_VER defaultDir = QApplication::applicationDirPath(); #else defaultDir = QDir::homePath(); #endif const QString defaultFileName( defaultDir + "/animation.mp4" ); QString lastFilename = settings.value("filename", defaultFileName ).toString(); #ifndef QFFMPEG_SUPPORT lastFilename = QFileInfo(lastFilename).absolutePath(); #endif outputFileLineEdit->setText( lastFilename ); } //other parameters { bool startPreviewFromSelectedStep = settings.value("previewFromSelected", previewFromSelectedCheckBox->isChecked()).toBool(); bool loop = settings.value("loop", loopCheckBox->isChecked()).toBool(); int frameRate = settings.value("frameRate", fpsSpinBox->value()).toInt(); int superRes = settings.value("superRes", superResolutionSpinBox->value()).toInt(); int bitRate = settings.value("bitRate", bitrateSpinBox->value()).toInt(); previewFromSelectedCheckBox->setChecked(startPreviewFromSelectedStep); loopCheckBox->setChecked(loop); fpsSpinBox->setValue(frameRate); superResolutionSpinBox->setValue(superRes); bitrateSpinBox->setValue(bitRate); } settings.endGroup(); } connect ( fpsSpinBox, SIGNAL( valueChanged(int) ), this, SLOT( onFPSChanged(int) ) ); connect ( totalTimeDoubleSpinBox, SIGNAL( valueChanged(double) ), this, SLOT( onTotalTimeChanged(double) ) ); connect ( stepTimeDoubleSpinBox, SIGNAL( valueChanged(double) ), this, SLOT( onStepTimeChanged(double) ) ); connect ( loopCheckBox, SIGNAL( toggled(bool) ), this, SLOT( onLoopToggled(bool) ) ); connect ( browseButton, SIGNAL( clicked() ), this, SLOT( onBrowseButtonClicked() ) ); connect ( previewButton, SIGNAL( clicked() ), this, SLOT( preview() ) ); connect ( renderButton, SIGNAL( clicked() ), this, SLOT( renderAnimation() ) ); connect ( exportFramesPushButton, SIGNAL( clicked() ), this, SLOT( renderFrames() ) ); connect ( buttonBox, SIGNAL( accepted() ), this, SLOT( onAccept() ) ); }
void sf2Instrument::play( sampleFrame * _working_buffer ) { const fpp_t frames = Engine::mixer()->framesPerPeriod(); // set midi pitch for this period const int currentMidiPitch = instrumentTrack()->midiPitch(); if( m_lastMidiPitch != currentMidiPitch ) { m_lastMidiPitch = currentMidiPitch; m_synthMutex.lock(); fluid_synth_pitch_bend( m_synth, m_channel, m_lastMidiPitch ); m_synthMutex.unlock(); } const int currentMidiPitchRange = instrumentTrack()->midiPitchRange(); if( m_lastMidiPitchRange != currentMidiPitchRange ) { m_lastMidiPitchRange = currentMidiPitchRange; m_synthMutex.lock(); fluid_synth_pitch_wheel_sens( m_synth, m_channel, m_lastMidiPitchRange ); m_synthMutex.unlock(); } // if we have no new noteons/noteoffs, just render a period and call it a day if( m_playingNotes.isEmpty() ) { renderFrames( frames, _working_buffer ); instrumentTrack()->processAudioBuffer( _working_buffer, frames, NULL ); return; } // processing loop // go through noteplayhandles in processing order f_cnt_t currentFrame = 0; while( ! m_playingNotes.isEmpty() ) { // find the note with lowest offset NotePlayHandle * currentNote = m_playingNotes[0]; for( int i = 1; i < m_playingNotes.size(); ++i ) { SF2PluginData * currentData = static_cast<SF2PluginData *>( currentNote->m_pluginData ); SF2PluginData * iData = static_cast<SF2PluginData *>( m_playingNotes[i]->m_pluginData ); if( currentData->offset > iData->offset ) { currentNote = m_playingNotes[i]; } } // process the current note: // first see if we're synced in frame count SF2PluginData * currentData = static_cast<SF2PluginData *>( currentNote->m_pluginData ); if( currentData->offset > currentFrame ) { renderFrames( currentData->offset - currentFrame, _working_buffer + currentFrame ); currentFrame = currentData->offset; } if( currentData->isNew ) { noteOn( currentData ); if( currentNote->isReleased() ) // if the note is released during the same period, we have to process it again for noteoff { currentData->isNew = false; currentData->offset = currentNote->framesBeforeRelease(); } else // otherwise remove the handle { m_playingNotesMutex.lock(); m_playingNotes.remove( m_playingNotes.indexOf( currentNote ) ); m_playingNotesMutex.unlock(); } } else { noteOff( currentData ); m_playingNotesMutex.lock(); m_playingNotes.remove( m_playingNotes.indexOf( currentNote ) ); m_playingNotesMutex.unlock(); } } if( currentFrame < frames ) { renderFrames( frames - currentFrame, _working_buffer + currentFrame ); } instrumentTrack()->processAudioBuffer( _working_buffer, frames, NULL ); }