Instrument: also render sound for MIDI-based instruments when muted

In order to provide smooth muting functionality (i.e. immediate proper
sound when unmuting) always render audio buffers for MIDI-based
instruments. This is more important than potentially reduced CPU usage
while muted.

Closes #69.
This commit is contained in:
Tobias Doerffel
2014-01-22 21:55:33 +01:00
parent 3ff6d8499a
commit 2dc02001b7
6 changed files with 11 additions and 31 deletions

View File

@@ -2,7 +2,7 @@
* Instrument.h - declaration of class Instrument, which provides a
* standard interface for all instrument plugins
*
* Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -117,8 +117,6 @@ public:
virtual bool isFromTrack( const track * _track ) const;
bool isMuted() const;
protected:
inline InstrumentTrack * instrumentTrack() const

View File

@@ -1,7 +1,7 @@
/*
* InstrumentPlayHandle.h - play-handle for driving an instrument
*
* Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -45,10 +45,7 @@ public:
virtual void play( sampleFrame * _working_buffer )
{
if( !m_instrument->isMuted() )
{
m_instrument->play( _working_buffer );
}
m_instrument->play( _working_buffer );
}
virtual bool done() const

View File

@@ -238,7 +238,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me,
//
int key;
static int lastvoice=0;
if( _me.m_type == MidiNoteOn && !isMuted() ) {
if( _me.m_type == MidiNoteOn ) {
// to get us in line with MIDI
key = _me.key() +12;
for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) {

View File

@@ -313,15 +313,13 @@ void vestigeInstrument::play( sampleFrame * _buf )
bool vestigeInstrument::handleMidiEvent( const midiEvent & _me,
const midiTime & _time )
{
if( !isMuted() )
m_pluginMutex.lock();
if( m_plugin != NULL )
{
m_pluginMutex.lock();
if( m_plugin != NULL )
{
m_plugin->processMidiEvent( _me, _time );
}
m_pluginMutex.unlock();
m_plugin->processMidiEvent( _me, _time );
}
m_pluginMutex.unlock();
return true;
}

View File

@@ -1,7 +1,7 @@
/*
* ZynAddSubFx.cpp - ZynAddSubxFX-embedding plugin
*
* Copyright (c) 2008-2013 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2008-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -343,14 +343,9 @@ void ZynAddSubFxInstrument::play( sampleFrame * _buf )
bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me,
const midiTime & _time )
{
// do not send NoteOn events if muted
if( _me.type() == MidiNoteOn && isMuted() )
{
return true;
}
// do not forward external MIDI Control Change events if the according
// LED is not checked
else if( _me.type() == MidiControlChange &&
if( _me.type() == MidiControlChange &&
_me.sourcePort() != this &&
m_forwardMidiCcModel.value() == false )
{

View File

@@ -96,14 +96,6 @@ bool Instrument::isFromTrack( const track * _track ) const
bool Instrument::isMuted() const
{
return m_instrumentTrack->isMuted();
}
void Instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n )
{
const fpp_t frames = _n->framesLeftForCurrentPeriod();