@@ -35,13 +35,15 @@
|
||||
|
||||
class EffectChain;
|
||||
class FloatModel;
|
||||
class BoolModel;
|
||||
|
||||
class AudioPort : public ThreadableJob
|
||||
{
|
||||
MM_OPERATORS
|
||||
public:
|
||||
AudioPort( const QString & _name, bool _has_effect_chain = true,
|
||||
FloatModel * volumeModel = NULL, FloatModel * panningModel = NULL );
|
||||
AudioPort( const QString & _name, bool _has_effect_chain = true,
|
||||
FloatModel * volumeModel = NULL, FloatModel * panningModel = NULL,
|
||||
BoolModel * mutedModel = NULL );
|
||||
virtual ~AudioPort();
|
||||
|
||||
inline sampleFrame * buffer()
|
||||
@@ -117,14 +119,15 @@ private:
|
||||
fx_ch_t m_nextFxChannel;
|
||||
|
||||
QString m_name;
|
||||
|
||||
|
||||
EffectChain * m_effects;
|
||||
|
||||
PlayHandleList m_playHandles;
|
||||
QMutex m_playHandleLock;
|
||||
|
||||
|
||||
FloatModel * m_volumeModel;
|
||||
FloatModel * m_panningModel;
|
||||
BoolModel * m_mutedModel;
|
||||
|
||||
friend class Mixer;
|
||||
friend class MixerWorkerThread;
|
||||
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
{
|
||||
return m_length;
|
||||
}
|
||||
|
||||
|
||||
virtual void movePosition( const MidiTime & _pos );
|
||||
virtual void changeLength( const MidiTime & _length );
|
||||
|
||||
@@ -539,7 +539,9 @@ private:
|
||||
QString m_name;
|
||||
int m_height;
|
||||
|
||||
protected:
|
||||
BoolModel m_mutedModel;
|
||||
private:
|
||||
BoolModel m_soloModel;
|
||||
bool m_mutedBeforeSolo;
|
||||
|
||||
|
||||
@@ -33,8 +33,9 @@
|
||||
#include "panning.h"
|
||||
|
||||
|
||||
AudioPort::AudioPort( const QString & _name, bool _has_effect_chain,
|
||||
FloatModel * volumeModel, FloatModel * panningModel ) :
|
||||
AudioPort::AudioPort( const QString & _name, bool _has_effect_chain,
|
||||
FloatModel * volumeModel, FloatModel * panningModel,
|
||||
BoolModel * mutedModel ) :
|
||||
m_bufferUsage( false ),
|
||||
m_portBuffer( NULL ),
|
||||
m_extOutputEnabled( false ),
|
||||
@@ -42,7 +43,8 @@ AudioPort::AudioPort( const QString & _name, bool _has_effect_chain,
|
||||
m_name( "unnamed port" ),
|
||||
m_effects( _has_effect_chain ? new EffectChain( NULL ) : NULL ),
|
||||
m_volumeModel( volumeModel ),
|
||||
m_panningModel( panningModel )
|
||||
m_panningModel( panningModel ),
|
||||
m_mutedModel( mutedModel )
|
||||
{
|
||||
Engine::mixer()->addAudioPort( this );
|
||||
setExtOutputEnabled( true );
|
||||
@@ -102,6 +104,11 @@ bool AudioPort::processEffects()
|
||||
|
||||
void AudioPort::doProcessing()
|
||||
{
|
||||
if( m_mutedModel && m_mutedModel->value() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const fpp_t fpp = Engine::mixer()->framesPerPeriod();
|
||||
|
||||
m_portBuffer = BufferManager::acquire(); // get buffer for processing
|
||||
@@ -118,11 +125,11 @@ void AudioPort::doProcessing()
|
||||
m_bufferUsage = true;
|
||||
MixHelpers::add( m_portBuffer, ph->buffer(), fpp );
|
||||
}
|
||||
ph->releaseBuffer(); // gets rid of playhandle's buffer and sets
|
||||
ph->releaseBuffer(); // gets rid of playhandle's buffer and sets
|
||||
// pointer to null, so if it doesn't get re-acquired we know to skip it next time
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( m_bufferUsage )
|
||||
{
|
||||
// handle volume and panning
|
||||
@@ -131,7 +138,7 @@ void AudioPort::doProcessing()
|
||||
{
|
||||
ValueBuffer * volBuf = m_volumeModel->valueBuffer();
|
||||
ValueBuffer * panBuf = m_panningModel->valueBuffer();
|
||||
|
||||
|
||||
// both vol and pan have s.ex.data:
|
||||
if( volBuf && panBuf )
|
||||
{
|
||||
@@ -143,7 +150,7 @@ void AudioPort::doProcessing()
|
||||
m_portBuffer[f][1] *= ( p >= 0 ? 1.0f : 1.0f + p ) * v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// only vol has s.ex.data:
|
||||
else if( volBuf )
|
||||
{
|
||||
@@ -157,7 +164,7 @@ void AudioPort::doProcessing()
|
||||
m_portBuffer[f][1] *= v * r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// only pan has s.ex.data:
|
||||
else if( panBuf )
|
||||
{
|
||||
@@ -169,7 +176,7 @@ void AudioPort::doProcessing()
|
||||
m_portBuffer[f][1] *= ( p >= 0 ? 1.0f : 1.0f + p ) * v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// neither has s.ex.data:
|
||||
else
|
||||
{
|
||||
@@ -182,12 +189,12 @@ void AudioPort::doProcessing()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// has vol model only
|
||||
else if( m_volumeModel )
|
||||
{
|
||||
ValueBuffer * volBuf = m_volumeModel->valueBuffer();
|
||||
|
||||
|
||||
if( volBuf )
|
||||
{
|
||||
for( f_cnt_t f = 0; f < fpp; ++f )
|
||||
@@ -210,7 +217,7 @@ void AudioPort::doProcessing()
|
||||
}
|
||||
// as of now there's no situation where we only have panning model but no volume model
|
||||
// if we have neither, we don't have to do anything here - just pass the audio as is
|
||||
|
||||
|
||||
// handle effects
|
||||
const bool me = processEffects();
|
||||
if( me || m_bufferUsage )
|
||||
@@ -219,7 +226,7 @@ void AudioPort::doProcessing()
|
||||
// TODO: improve the flow here - convert to pull model
|
||||
m_bufferUsage = false;
|
||||
}
|
||||
|
||||
|
||||
BufferManager::release( m_portBuffer ); // release buffer, we don't need it anymore
|
||||
}
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ InstrumentTrack::InstrumentTrack( TrackContainer* tc ) :
|
||||
tr( "Base note" ) ),
|
||||
m_volumeModel( DefaultVolume, MinVolume, MaxVolume, 0.1f, this, tr( "Volume" ) ),
|
||||
m_panningModel( DefaultPanning, PanningLeft, PanningRight, 0.1f, this, tr( "Panning" ) ),
|
||||
m_audioPort( tr( "unnamed_track" ), true, &m_volumeModel, &m_panningModel ),
|
||||
m_audioPort( tr( "unnamed_track" ), true, &m_volumeModel, &m_panningModel, &m_mutedModel ),
|
||||
m_pitchModel( 0, MinPitchDefault, MaxPitchDefault, 1, this, tr( "Pitch" ) ),
|
||||
m_pitchRangeModel( 1, 1, 24, this, tr( "Pitch range" ) ),
|
||||
m_effectChannelModel( 0, 0, 0, this, tr( "FX channel" ) ),
|
||||
@@ -339,7 +339,7 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -848,7 +848,7 @@ InstrumentTrackView::InstrumentTrackView( InstrumentTrack * _it, TrackContainerV
|
||||
{
|
||||
widgetWidth = DEFAULT_SETTINGS_WIDGET_WIDTH_COMPACT;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
widgetWidth = DEFAULT_SETTINGS_WIDGET_WIDTH;
|
||||
}
|
||||
@@ -955,8 +955,8 @@ InstrumentTrackWindow * InstrumentTrackView::topLevelInstrumentTrackWindow()
|
||||
|
||||
|
||||
|
||||
// TODO: Add windows to free list on freeInstrumentTrackWindow.
|
||||
// But, don't NULL m_window or disconnect signals. This will allow windows
|
||||
// TODO: Add windows to free list on freeInstrumentTrackWindow.
|
||||
// But, don't NULL m_window or disconnect signals. This will allow windows
|
||||
// that are being show/hidden frequently to stay connected.
|
||||
void InstrumentTrackView::freeInstrumentTrackWindow()
|
||||
{
|
||||
@@ -981,7 +981,7 @@ void InstrumentTrackView::freeInstrumentTrackWindow()
|
||||
{
|
||||
delete m_window;
|
||||
}
|
||||
|
||||
|
||||
m_window = NULL;
|
||||
}
|
||||
}
|
||||
@@ -1008,7 +1008,7 @@ InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow()
|
||||
else if( !s_windowCache.isEmpty() )
|
||||
{
|
||||
m_window = s_windowCache.dequeue();
|
||||
|
||||
|
||||
m_window->setInstrumentTrackView( this );
|
||||
m_window->setModel( model() );
|
||||
m_window->updateInstrumentView();
|
||||
@@ -1034,7 +1034,7 @@ InstrumentTrackWindow * InstrumentTrackView::getInstrumentTrackWindow()
|
||||
s_windowCache << m_window;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return m_window;
|
||||
}
|
||||
|
||||
@@ -1065,7 +1065,7 @@ void InstrumentTrackView::dropEvent( QDropEvent * _de )
|
||||
void InstrumentTrackView::toggleInstrumentWindow( bool _on )
|
||||
{
|
||||
getInstrumentTrackWindow()->toggleVisibility( _on );
|
||||
|
||||
|
||||
if( !_on )
|
||||
{
|
||||
freeInstrumentTrackWindow();
|
||||
@@ -1125,10 +1125,10 @@ void InstrumentTrackView::midiConfigChanged()
|
||||
|
||||
|
||||
|
||||
class fxLineLcdSpinBox : public LcdSpinBox
|
||||
class fxLineLcdSpinBox : public LcdSpinBox
|
||||
{
|
||||
public:
|
||||
fxLineLcdSpinBox( int _num_digits, QWidget * _parent,
|
||||
fxLineLcdSpinBox( int _num_digits, QWidget * _parent,
|
||||
const QString & _name ) :
|
||||
LcdSpinBox( _num_digits, _parent, _name ) {}
|
||||
|
||||
@@ -1342,7 +1342,7 @@ void InstrumentTrackWindow::modelChanged()
|
||||
this, SLOT( updateName() ) );
|
||||
connect( m_track, SIGNAL( instrumentChanged() ),
|
||||
this, SLOT( updateInstrumentView() ) );
|
||||
|
||||
|
||||
m_volumeKnob->setModel( &m_track->m_volumeModel );
|
||||
m_panningKnob->setModel( &m_track->m_panningModel );
|
||||
m_effectChannelNumber->setModel( &m_track->m_effectChannelModel );
|
||||
|
||||
@@ -387,11 +387,11 @@ void SampleTCOView::paintEvent( QPaintEvent * _pe )
|
||||
{
|
||||
p.setFont( pointSize<7>( p.font() ) );
|
||||
|
||||
p.setPen( QColor( 0, 0, 0 ) );
|
||||
p.setPen( QColor( 0, 0, 0 ) );
|
||||
p.drawText( 10, p.fontMetrics().height()+1, "Rec" );
|
||||
p.setPen( textColor() );
|
||||
p.setPen( textColor() );
|
||||
p.drawText( 9, p.fontMetrics().height(), "Rec" );
|
||||
|
||||
|
||||
p.setBrush( QBrush( textColor() ) );
|
||||
p.drawEllipse( 4, 5, 4, 4 );
|
||||
}
|
||||
@@ -408,7 +408,7 @@ SampleTrack::SampleTrack( TrackContainer* tc ) :
|
||||
tr( "Volume" ) ),
|
||||
m_panningModel( DefaultPanning, PanningLeft, PanningRight, 0.1f,
|
||||
this, tr( "Panning" ) ),
|
||||
m_audioPort( tr( "Sample track" ), true, &m_volumeModel, &m_panningModel )
|
||||
m_audioPort( tr( "Sample track" ), true, &m_volumeModel, &m_panningModel, &m_mutedModel )
|
||||
{
|
||||
setName( tr( "Sample track" ) );
|
||||
m_panningModel.setCenterValue( DefaultPanning );
|
||||
@@ -610,8 +610,3 @@ void SampleTrackView::modelChanged()
|
||||
|
||||
TrackView::modelChanged();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user