Mixer::Mixer() : m_framesPerPeriod( qBound<int>( 32, configManager::inst()->value( "mixer", "framesperaudiobuffer" ).toInt(), DEFAULT_BUFFER_SIZE ) ), m_workingBuf( NULL ), m_inputBufferRead( 0 ), m_inputBufferWrite( 1 ), m_readBuf( NULL ), m_writeBuf( NULL ), m_cpuLoad( 0 ), m_workers(), m_numWorkers( QThread::idealThreadCount()-1 ), m_queueReadyWaitCond(), m_masterGain( 1.0f ), m_audioOutputContext( NULL ), m_defaultAudioOutputContext( NULL ), m_globalMutex( QMutex::Recursive ) { for( int i = 0; i < 2; ++i ) { m_inputBufferFrames[i] = 0; m_inputBufferSize[i] = DEFAULT_BUFFER_SIZE * 100; m_inputBuffer[i] = CPU::allocFrames( DEFAULT_BUFFER_SIZE * 100 ); clearAudioBuffer( m_inputBuffer[i], m_inputBufferSize[i] ); } m_workingBuf = CPU::allocFrames( m_framesPerPeriod ); for( Uint8 i = 0; i < 3; i++ ) { m_readBuf = CPU::allocFrames( m_framesPerPeriod ); clearAudioBuffer( m_readBuf, m_framesPerPeriod ); m_bufferPool.push_back( m_readBuf ); } for( int i = 0; i < m_numWorkers+1; ++i ) { MixerWorkerThread * wt = new MixerWorkerThread( this ); if( i < m_numWorkers ) { wt->start( QThread::TimeCriticalPriority ); } m_workers.push_back( wt ); } m_poolDepth = 2; m_readBuffer = 0; m_writeBuffer = 1; // initialize default AudioOutputContext m_defaultAudioOutputContext = new AudioOutputContext( this, NULL, AudioOutputContext::QualitySettings::Preset_Draft ); m_audioOutputContext = m_defaultAudioOutputContext; }
Mixer::Mixer( bool renderOnly ) : m_framesPerPeriod( DEFAULT_BUFFER_SIZE ), m_workingBuf( NULL ), m_inputBufferRead( 0 ), m_inputBufferWrite( 1 ), m_readBuf( NULL ), m_writeBuf( NULL ), m_workers(), m_numWorkers( QThread::idealThreadCount()-1 ), m_queueReadyWaitCond(), m_qualitySettings( qualitySettings::Mode_Draft ), m_masterGain( 1.0f ), m_audioDev( NULL ), m_oldAudioDev( NULL ), m_globalMutex( QMutex::Recursive ), m_profiler(), m_metronomeActive(false) { for( int i = 0; i < 2; ++i ) { m_inputBufferFrames[i] = 0; m_inputBufferSize[i] = DEFAULT_BUFFER_SIZE * 100; m_inputBuffer[i] = new sampleFrame[ DEFAULT_BUFFER_SIZE * 100 ]; clearAudioBuffer( m_inputBuffer[i], m_inputBufferSize[i] ); } // determine FIFO size and number of frames per period int fifoSize = 1; // if not only rendering (that is, using the GUI), load the buffer // size from user configuration if( renderOnly == false ) { m_framesPerPeriod = ( fpp_t ) ConfigManager::inst()-> value( "mixer", "framesperaudiobuffer" ).toInt(); // if the value read from user configuration is not set or // lower than the minimum allowed, use the default value and // save it to the configuration if( m_framesPerPeriod < MINIMUM_BUFFER_SIZE ) { ConfigManager::inst()->setValue( "mixer", "framesperaudiobuffer", QString::number( DEFAULT_BUFFER_SIZE ) ); m_framesPerPeriod = DEFAULT_BUFFER_SIZE; } else if( m_framesPerPeriod > DEFAULT_BUFFER_SIZE ) { fifoSize = m_framesPerPeriod / DEFAULT_BUFFER_SIZE; m_framesPerPeriod = DEFAULT_BUFFER_SIZE; } } // allocte the FIFO from the determined size m_fifo = new fifo( fifoSize ); // now that framesPerPeriod is fixed initialize global BufferManager BufferManager::init( m_framesPerPeriod ); m_workingBuf = (sampleFrame*) MemoryHelper::alignedMalloc( m_framesPerPeriod * sizeof( sampleFrame ) ); for( int i = 0; i < 3; i++ ) { m_readBuf = (surroundSampleFrame*) MemoryHelper::alignedMalloc( m_framesPerPeriod * sizeof( surroundSampleFrame ) ); clearAudioBuffer( m_readBuf, m_framesPerPeriod ); m_bufferPool.push_back( m_readBuf ); } for( int i = 0; i < m_numWorkers+1; ++i ) { MixerWorkerThread * wt = new MixerWorkerThread( this ); if( i < m_numWorkers ) { wt->start( QThread::TimeCriticalPriority ); } m_workers.push_back( wt ); } m_poolDepth = 2; m_readBuffer = 0; m_writeBuffer = 1; }
Mixer::Mixer() : m_framesPerPeriod( DEFAULT_BUFFER_SIZE ), m_workingBuf( NULL ), m_inputBufferRead( 0 ), m_inputBufferWrite( 1 ), m_readBuf( NULL ), m_writeBuf( NULL ), m_workers(), m_numWorkers( QThread::idealThreadCount()-1 ), m_queueReadyWaitCond(), m_qualitySettings( qualitySettings::Mode_Draft ), m_masterGain( 1.0f ), m_audioDev( NULL ), m_oldAudioDev( NULL ), m_globalMutex( QMutex::Recursive ), m_profiler() { for( int i = 0; i < 2; ++i ) { m_inputBufferFrames[i] = 0; m_inputBufferSize[i] = DEFAULT_BUFFER_SIZE * 100; m_inputBuffer[i] = new sampleFrame[ DEFAULT_BUFFER_SIZE * 100 ]; clearAudioBuffer( m_inputBuffer[i], m_inputBufferSize[i] ); } // just rendering? if( !Engine::hasGUI() ) { m_framesPerPeriod = DEFAULT_BUFFER_SIZE; m_fifo = new fifo( 1 ); } else if( ConfigManager::inst()->value( "mixer", "framesperaudiobuffer" ).toInt() >= 32 ) { m_framesPerPeriod = (fpp_t) ConfigManager::inst()->value( "mixer", "framesperaudiobuffer" ).toInt(); if( m_framesPerPeriod > DEFAULT_BUFFER_SIZE ) { m_fifo = new fifo( m_framesPerPeriod / DEFAULT_BUFFER_SIZE ); m_framesPerPeriod = DEFAULT_BUFFER_SIZE; } else { m_fifo = new fifo( 1 ); } } else { ConfigManager::inst()->setValue( "mixer", "framesperaudiobuffer", QString::number( m_framesPerPeriod ) ); m_fifo = new fifo( 1 ); } // now that framesPerPeriod is fixed initialize global BufferManager BufferManager::init( m_framesPerPeriod ); m_workingBuf = (sampleFrame*) MemoryHelper::alignedMalloc( m_framesPerPeriod * sizeof( sampleFrame ) ); for( int i = 0; i < 3; i++ ) { m_readBuf = (surroundSampleFrame*) MemoryHelper::alignedMalloc( m_framesPerPeriod * sizeof( surroundSampleFrame ) ); clearAudioBuffer( m_readBuf, m_framesPerPeriod ); m_bufferPool.push_back( m_readBuf ); } for( int i = 0; i < m_numWorkers+1; ++i ) { MixerWorkerThread * wt = new MixerWorkerThread( this ); if( i < m_numWorkers ) { wt->start( QThread::TimeCriticalPriority ); } m_workers.push_back( wt ); } m_poolDepth = 2; m_readBuffer = 0; m_writeBuffer = 1; }