mirror of
https://github.com/LMMS/lmms.git
synced 2026-05-19 04:06:17 -04:00
Merge pull request #6867 from michaelgregorius/RemoveIdenticalCalls
(Re)move identical calls to `InstrumentTrack::processAudioBuffer`
This commit is contained in:
@@ -26,62 +26,33 @@
|
||||
#define LMMS_INSTRUMENT_PLAY_HANDLE_H
|
||||
|
||||
#include "PlayHandle.h"
|
||||
#include "Instrument.h"
|
||||
#include "NotePlayHandle.h"
|
||||
#include "lmms_export.h"
|
||||
|
||||
namespace lmms
|
||||
{
|
||||
|
||||
class Instrument;
|
||||
class InstrumentTrack;
|
||||
|
||||
class LMMS_EXPORT InstrumentPlayHandle : public PlayHandle
|
||||
{
|
||||
public:
|
||||
InstrumentPlayHandle( Instrument * instrument, InstrumentTrack* instrumentTrack );
|
||||
InstrumentPlayHandle(Instrument * instrument, InstrumentTrack* instrumentTrack);
|
||||
|
||||
~InstrumentPlayHandle() override = default;
|
||||
|
||||
|
||||
void play( sampleFrame * _working_buffer ) override
|
||||
{
|
||||
// ensure that all our nph's have been processed first
|
||||
ConstNotePlayHandleList nphv = NotePlayHandle::nphsOfInstrumentTrack( m_instrument->instrumentTrack(), true );
|
||||
|
||||
bool nphsLeft;
|
||||
do
|
||||
{
|
||||
nphsLeft = false;
|
||||
for( const NotePlayHandle * constNotePlayHandle : nphv )
|
||||
{
|
||||
NotePlayHandle * notePlayHandle = const_cast<NotePlayHandle *>( constNotePlayHandle );
|
||||
if( notePlayHandle->state() != ThreadableJob::ProcessingState::Done &&
|
||||
!notePlayHandle->isFinished())
|
||||
{
|
||||
nphsLeft = true;
|
||||
notePlayHandle->process();
|
||||
}
|
||||
}
|
||||
}
|
||||
while( nphsLeft );
|
||||
|
||||
m_instrument->play( _working_buffer );
|
||||
}
|
||||
void play(sampleFrame * working_buffer) override;
|
||||
|
||||
bool isFinished() const override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isFromTrack( const Track* _track ) const override
|
||||
{
|
||||
return m_instrument->isFromTrack( _track );
|
||||
}
|
||||
|
||||
bool isFromTrack(const Track* track) const override;
|
||||
|
||||
private:
|
||||
Instrument* m_instrument;
|
||||
|
||||
} ;
|
||||
|
||||
};
|
||||
|
||||
} // namespace lmms
|
||||
|
||||
|
||||
@@ -171,9 +171,6 @@ void AudioFileProcessor::playNote( NotePlayHandle * _n,
|
||||
static_cast<SampleBuffer::LoopMode>( m_loopModel.value() ) ) )
|
||||
{
|
||||
applyRelease( _working_buffer, _n );
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer,
|
||||
frames + offset, _n );
|
||||
|
||||
emit isPlaying( ((handleState *)_n->m_pluginData)->frameIndex() );
|
||||
}
|
||||
else
|
||||
|
||||
@@ -307,8 +307,6 @@ void BitInvader::playNote( NotePlayHandle * _n,
|
||||
}
|
||||
|
||||
applyRelease( _working_buffer, _n );
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -508,7 +508,6 @@ void CarlaInstrument::play(sampleFrame* workingBuffer)
|
||||
|
||||
if (fHandle == nullptr)
|
||||
{
|
||||
instrumentTrack()->processAudioBuffer(workingBuffer, bufsize, nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -556,8 +555,6 @@ void CarlaInstrument::play(sampleFrame* workingBuffer)
|
||||
workingBuffer[i][0] = buf1[i];
|
||||
workingBuffer[i][1] = buf2[i];
|
||||
}
|
||||
|
||||
instrumentTrack()->processAudioBuffer(workingBuffer, bufsize, nullptr);
|
||||
}
|
||||
|
||||
bool CarlaInstrument::handleMidiEvent(const MidiEvent& event, const TimePos&, f_cnt_t offset)
|
||||
|
||||
@@ -419,7 +419,6 @@ void FreeBoyInstrument::playNote(NotePlayHandle* nph, sampleFrame* workingBuffer
|
||||
}
|
||||
framesLeft -= count;
|
||||
}
|
||||
instrumentTrack()->processAudioBuffer(workingBuffer, frames + offset, nph);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -494,8 +494,6 @@ void GigInstrument::play( sampleFrame * _working_buffer )
|
||||
_working_buffer[i][0] *= m_gain.value();
|
||||
_working_buffer[i][1] *= m_gain.value();
|
||||
}
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames, nullptr );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -197,8 +197,6 @@ void KickerInstrument::playNote( NotePlayHandle * _n,
|
||||
_working_buffer[f+offset][1] *= fac;
|
||||
}
|
||||
}
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -790,7 +790,6 @@ void Lb302Synth::play( sampleFrame * _working_buffer )
|
||||
const fpp_t frames = Engine::audioEngine()->framesPerPeriod();
|
||||
|
||||
process( _working_buffer, frames );
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames, nullptr );
|
||||
// release_frame = 0; //removed for issue # 1432
|
||||
}
|
||||
|
||||
|
||||
@@ -197,8 +197,6 @@ void Lv2Instrument::play(sampleFrame *buf)
|
||||
|
||||
copyModelsToLmms();
|
||||
copyBuffersToLmms(buf, fpp);
|
||||
|
||||
instrumentTrack()->processAudioBuffer(buf, fpp, nullptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1040,8 +1040,6 @@ void MonstroInstrument::playNote( NotePlayHandle * _n,
|
||||
ms->renderOutput( frames, _working_buffer + offset );
|
||||
|
||||
//applyRelease( _working_buffer, _n ); // we have our own release
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
void MonstroInstrument::deleteNotePluginData( NotePlayHandle * _n )
|
||||
|
||||
@@ -561,8 +561,6 @@ void NesInstrument::playNote( NotePlayHandle * n, sampleFrame * workingBuffer )
|
||||
nes->renderOutput( workingBuffer + offset, frames );
|
||||
|
||||
applyRelease( workingBuffer, n );
|
||||
|
||||
instrumentTrack()->processAudioBuffer( workingBuffer, frames + offset, n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -412,10 +412,6 @@ void OpulenzInstrument::play( sampleFrame * _working_buffer )
|
||||
}
|
||||
}
|
||||
emulatorMutex.unlock();
|
||||
|
||||
// Throw the data to the track...
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frameCount, nullptr );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -312,8 +312,6 @@ void OrganicInstrument::playNote( NotePlayHandle * _n,
|
||||
}
|
||||
|
||||
// -- --
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -157,8 +157,6 @@ void PatmanInstrument::playNote( NotePlayHandle * _n,
|
||||
play_freq, m_loopedModel.value() ? SampleBuffer::LoopMode::On : SampleBuffer::LoopMode::Off ) )
|
||||
{
|
||||
applyRelease( _working_buffer, _n );
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer,
|
||||
frames + offset, _n );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -848,7 +848,6 @@ void Sf2Instrument::play( sampleFrame * _working_buffer )
|
||||
if( m_playingNotes.isEmpty() )
|
||||
{
|
||||
renderFrames( frames, _working_buffer );
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames, nullptr );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -906,7 +905,6 @@ void Sf2Instrument::play( sampleFrame * _working_buffer )
|
||||
{
|
||||
renderFrames( frames - currentFrame, _working_buffer + currentFrame );
|
||||
}
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames, nullptr );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -480,9 +480,6 @@ void SfxrInstrument::playNote( NotePlayHandle * _n, sampleFrame * _working_buffe
|
||||
delete[] pitchedBuffer;
|
||||
|
||||
applyRelease( _working_buffer, _n );
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frameNum + offset, _n );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -429,8 +429,6 @@ void SidInstrument::playNote( NotePlayHandle * _n,
|
||||
_working_buffer[frame+offset][ch] = s;
|
||||
}
|
||||
}
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -359,8 +359,6 @@ void MalletsInstrument::playNote( NotePlayHandle * _n,
|
||||
_working_buffer[frame][1] = ps->nextSampleRight() *
|
||||
( m_scalers[p] + add_scale );
|
||||
}
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -380,8 +380,6 @@ void TripleOscillator::playNote( NotePlayHandle * _n,
|
||||
|
||||
applyFadeIn(_working_buffer, _n);
|
||||
applyRelease( _working_buffer, _n );
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -399,8 +399,6 @@ void VestigeInstrument::play( sampleFrame * _buf )
|
||||
{
|
||||
if (!m_pluginMutex.tryLock(Engine::getSong()->isExporting() ? -1 : 0)) {return;}
|
||||
|
||||
const fpp_t frames = Engine::audioEngine()->framesPerPeriod();
|
||||
|
||||
if( m_plugin == nullptr )
|
||||
{
|
||||
m_pluginMutex.unlock();
|
||||
@@ -409,8 +407,6 @@ void VestigeInstrument::play( sampleFrame * _buf )
|
||||
|
||||
m_plugin->process( nullptr, _buf );
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _buf, frames, nullptr );
|
||||
|
||||
m_pluginMutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -251,8 +251,6 @@ void Vibed::playNote(NotePlayHandle* n, sampleFrame* workingBuffer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
instrumentTrack()->processAudioBuffer(workingBuffer, frames + offset, n);
|
||||
}
|
||||
|
||||
void Vibed::deleteNotePluginData(NotePlayHandle* n)
|
||||
|
||||
@@ -445,8 +445,6 @@ void WatsynInstrument::playNote( NotePlayHandle * _n,
|
||||
}
|
||||
|
||||
applyRelease( _working_buffer, _n );
|
||||
|
||||
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -233,8 +233,6 @@ void Xpressive::playNote(NotePlayHandle* nph, sampleFrame* working_buffer) {
|
||||
const f_cnt_t offset = nph->noteOffset();
|
||||
|
||||
ps->renderOutput(frames, working_buffer + offset);
|
||||
|
||||
instrumentTrack()->processAudioBuffer(working_buffer, frames + offset, nph);
|
||||
}
|
||||
|
||||
void Xpressive::deleteNotePluginData(NotePlayHandle* nph) {
|
||||
|
||||
@@ -341,7 +341,6 @@ void ZynAddSubFxInstrument::play( sampleFrame * _buf )
|
||||
m_plugin->processAudio( _buf );
|
||||
}
|
||||
m_pluginMutex.unlock();
|
||||
instrumentTrack()->processAudioBuffer( _buf, Engine::audioEngine()->framesPerPeriod(), nullptr );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -24,18 +24,57 @@
|
||||
|
||||
|
||||
#include "InstrumentPlayHandle.h"
|
||||
#include "Instrument.h"
|
||||
#include "InstrumentTrack.h"
|
||||
#include "Engine.h"
|
||||
#include "AudioEngine.h"
|
||||
|
||||
namespace lmms
|
||||
{
|
||||
|
||||
|
||||
InstrumentPlayHandle::InstrumentPlayHandle( Instrument * instrument, InstrumentTrack* instrumentTrack ) :
|
||||
PlayHandle( Type::InstrumentPlayHandle ),
|
||||
m_instrument( instrument )
|
||||
InstrumentPlayHandle::InstrumentPlayHandle(Instrument * instrument, InstrumentTrack* instrumentTrack) :
|
||||
PlayHandle(Type::InstrumentPlayHandle),
|
||||
m_instrument(instrument)
|
||||
{
|
||||
setAudioPort( instrumentTrack->audioPort() );
|
||||
setAudioPort(instrumentTrack->audioPort());
|
||||
}
|
||||
|
||||
void InstrumentPlayHandle::play(sampleFrame * working_buffer)
|
||||
{
|
||||
InstrumentTrack * instrumentTrack = m_instrument->instrumentTrack();
|
||||
|
||||
// ensure that all our nph's have been processed first
|
||||
auto nphv = NotePlayHandle::nphsOfInstrumentTrack(instrumentTrack, true);
|
||||
|
||||
bool nphsLeft;
|
||||
do
|
||||
{
|
||||
nphsLeft = false;
|
||||
for (const NotePlayHandle * constNotePlayHandle : nphv)
|
||||
{
|
||||
if (constNotePlayHandle->state() != ThreadableJob::ProcessingState::Done &&
|
||||
!constNotePlayHandle->isFinished())
|
||||
{
|
||||
nphsLeft = true;
|
||||
NotePlayHandle * notePlayHandle = const_cast<NotePlayHandle *>(constNotePlayHandle);
|
||||
notePlayHandle->process();
|
||||
}
|
||||
}
|
||||
}
|
||||
while (nphsLeft);
|
||||
|
||||
m_instrument->play(working_buffer);
|
||||
|
||||
// Process the audio buffer that the instrument has just worked on...
|
||||
const fpp_t frames = Engine::audioEngine()->framesPerPeriod();
|
||||
instrumentTrack->processAudioBuffer(working_buffer, frames, nullptr);
|
||||
}
|
||||
|
||||
bool InstrumentPlayHandle::isFromTrack(const Track* track) const
|
||||
{
|
||||
return m_instrument->isFromTrack(track);
|
||||
}
|
||||
|
||||
|
||||
} // namespace lmms
|
||||
} // namespace lmms
|
||||
|
||||
@@ -570,6 +570,10 @@ f_cnt_t InstrumentTrack::beatLen( NotePlayHandle * _n ) const
|
||||
|
||||
void InstrumentTrack::playNote( NotePlayHandle* n, sampleFrame* workingBuffer )
|
||||
{
|
||||
// Note: under certain circumstances the working buffer is a nullptr.
|
||||
// These cases are triggered in PlayHandle::doProcessing when the play method is called with a nullptr.
|
||||
// TODO: Find out if we can skip processing at a higher level if the buffer is nullptr.
|
||||
|
||||
// arpeggio- and chord-widget has to do its work -> adding sub-notes
|
||||
// for chords/arpeggios
|
||||
m_noteStacking.processNote( n );
|
||||
@@ -579,6 +583,15 @@ void InstrumentTrack::playNote( NotePlayHandle* n, sampleFrame* workingBuffer )
|
||||
{
|
||||
// all is done, so now lets play the note!
|
||||
m_instrument->playNote( n, workingBuffer );
|
||||
|
||||
// This is effectively the same as checking if workingBuffer is not a nullptr.
|
||||
// Calling processAudioBuffer with a nullptr leads to crashes. Hence the check.
|
||||
if (n->usesBuffer())
|
||||
{
|
||||
const fpp_t frames = n->framesLeftForCurrentPeriod();
|
||||
const f_cnt_t offset = n->noteOffset();
|
||||
processAudioBuffer(workingBuffer, frames + offset, n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user