Skip to content

Commit

Permalink
Instrument track, mixer...
Browse files Browse the repository at this point in the history
  • Loading branch information
diizy committed Jul 9, 2014
1 parent 4eb486b commit f33d1f4
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 14 deletions.
4 changes: 3 additions & 1 deletion include/InstrumentTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,9 @@ protected slots:
AudioPort m_audioPort;
MidiPort m_midiPort;

QAtomicPointer<NotePlayHandle> m_notes[NumKeys];
NotePlayHandle* m_notes[NumKeys];
QMutex m_notesMutex;

int m_runningMidiNotes[NumKeys];
bool m_sustainPedalPressed;

Expand Down
8 changes: 5 additions & 3 deletions include/Mixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,9 +211,9 @@ class EXPORT Mixer : public QObject
{
if( criticalXRuns() == false )
{
lock();
m_playHandles.push_back( handle );
unlock();
m_playHandleMutex.lock();
m_newPlayHandles.append( handle );
m_playHandleMutex.unlock();
return true;
}

Expand Down Expand Up @@ -428,6 +428,8 @@ class EXPORT Mixer : public QObject
int m_numWorkers;
QWaitCondition m_queueReadyWaitCond;

PlayHandleList m_newPlayHandles; // place where new playhandles are added temporarily
QMutex m_playHandleMutex; // mutex used only for adding playhandles

PlayHandleList m_playHandles;
ConstPlayHandleList m_playHandlesToRemove;
Expand Down
5 changes: 5 additions & 0 deletions src/core/Mixer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,11 @@ const surroundSampleFrame * Mixer::renderNextBuffer()
// now we have to make sure no other thread does anything bad
// while we're acting...
lock();
// add all play-handles that have to be added
m_playHandleMutex.lock();
m_playHandles += m_newPlayHandles;
m_newPlayHandles.clear();
m_playHandleMutex.unlock();

// remove all play-handles that have to be deleted and delete
// them if they still exist...
Expand Down
33 changes: 23 additions & 10 deletions src/tracks/InstrumentTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ MidiEvent InstrumentTrack::applyMasterKey( const MidiEvent& event )

void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& time, f_cnt_t offset )
{
qDebug( "pIE" );
bool eventHandled = false;

switch( event.type() )
Expand All @@ -275,27 +276,36 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti
if( event.velocity() > 0 )
{
NotePlayHandle* nph;
m_notes[event.key()].testAndSetOrdered( NULL, ( nph = new NotePlayHandle( this, offset,
typeInfo<f_cnt_t>::max() / 2,
note( MidiTime(), MidiTime(), event.key(), event.volume( midiPort()->baseVelocity() ) ),
NULL, event.channel(),
NotePlayHandle::OriginMidiInput ) ) );
if( ! engine::mixer()->addPlayHandle( nph ) )
if( m_notes[event.key()] == NULL )
{
m_notes[event.key()].testAndSetOrdered( nph, NULL );
qDebug( "note on" );
m_notesMutex.lock();
nph = new NotePlayHandle( this, offset,
typeInfo<f_cnt_t>::max() / 2,
note( MidiTime(), MidiTime(), event.key(), event.volume( midiPort()->baseVelocity() ) ),
NULL, event.channel(),
NotePlayHandle::OriginMidiInput );
m_notes[event.key()] = nph;
if( ! engine::mixer()->addPlayHandle( nph ) )
{
m_notes[event.key()] = NULL;
delete nph;
}
m_notesMutex.unlock();
}
qDebug( "ok" );
eventHandled = true;
break;
}

case MidiNoteOff:
if( m_notes[event.key()] != NULL )
{
m_notesMutex.lock();
// do actual note off and remove internal reference to NotePlayHandle (which itself will
// be deleted later automatically)
m_notes[event.key()]->noteOff( offset );
m_notes[event.key()] = NULL;
m_notesMutex.unlock();
}
eventHandled = true;
break;
Expand Down Expand Up @@ -372,6 +382,7 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti

void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time, f_cnt_t offset )
{
qDebug( "pOE" );
// do nothing if we do not have an instrument instance (e.g. when loading settings)
if( m_instrument == NULL )
{
Expand All @@ -388,7 +399,7 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t

if( key >= 0 && key < NumKeys )
{

qDebug( "poe noteon" );
if( m_runningMidiNotes[key] > 0 )
{
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time, offset );
Expand Down Expand Up @@ -424,13 +435,15 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t

void InstrumentTrack::silenceAllNotes( bool removeIPH )
{
engine::mixer()->lock();
m_notesMutex.lock();
for( int i = 0; i < NumKeys; ++i )
{
m_notes[i] = NULL;
m_runningMidiNotes[i] = 0;
}
m_notesMutex.unlock();

engine::mixer()->lock();
// invalidate all NotePlayHandles linked to this track
m_processHandles.clear();
engine::mixer()->removePlayHandles( this, removeIPH );
Expand Down

0 comments on commit f33d1f4

Please sign in to comment.