From b1fe2dcbdf92dc7a866b1600e22f7b8b8d03ce93 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 16 Mar 2009 16:51:35 +0100 Subject: [PATCH] Sf2Player: fixed hanging notes with enabled panning support If SF2_PANNING_SUPPORT is set, overlapping notes of the same key played on different MIDI channel caused some notes to hang. This commit fixes the issue. --- plugins/sf2_player/sf2_player.cpp | 14 +++++++++----- plugins/sf2_player/sf2_player.h | 11 +++++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/plugins/sf2_player/sf2_player.cpp b/plugins/sf2_player/sf2_player.cpp index 147b56079..7ddd10f16 100644 --- a/plugins/sf2_player/sf2_player.cpp +++ b/plugins/sf2_player/sf2_player.cpp @@ -77,6 +77,7 @@ struct SF2PluginData } ; + // Static map of current sfonts QMap sf2Instrument::s_fonts; QMutex sf2Instrument::s_fontsMutex; @@ -91,7 +92,6 @@ sf2Instrument::sf2Instrument( instrumentTrack * _instrument_track ) : m_filename( "" ), m_lastMidiPitch( 8192 ), m_channel( 1 ), - m_maxChannels( 5 ), m_bankNum( 0, 0, 999, this, tr("Bank") ), m_patchNum( 0, 0, 127, this, tr("Patch") ), m_gain( 1.0f, 0.0f, 5.0f, 0.01f, this, tr( "Gain" ) ), @@ -116,7 +116,10 @@ sf2Instrument::sf2Instrument( instrumentTrack * _instrument_track ) : { for( int i = 0; i < 128; ++i ) { - m_notesRunning[i] = 0; + for( int j = 0; j < MaxFluidChannels; ++j ) + { + m_notesRunning[i][j] = 0; + } } m_settings = new_fluid_settings(); @@ -602,7 +605,7 @@ void sf2Instrument::playNote( notePlayHandle * _n, sampleFrame * ) _n->getMidiVelocity() ); #ifdef SF2_PANNING_SUPPORT - if( ++m_channel > m_maxChannels ) + if( ++m_channel > MaxFluidChannels ) { m_channel = 1; } @@ -611,7 +614,7 @@ void sf2Instrument::playNote( notePlayHandle * _n, sampleFrame * ) m_synthMutex.unlock(); m_notesRunningMutex.lock(); - ++m_notesRunning[midiNote]; + ++m_notesRunning[midiNote][pluginData->midiChannel-1]; m_notesRunningMutex.unlock(); } @@ -693,7 +696,8 @@ void sf2Instrument::deleteNotePluginData( notePlayHandle * _n ) SF2PluginData * pluginData = static_cast( _n->m_pluginData ); m_notesRunningMutex.lock(); - const int n = --m_notesRunning[pluginData->midiNote]; + const int n = --m_notesRunning[pluginData->midiNote] + [pluginData->midiChannel-1]; m_notesRunningMutex.unlock(); if( n <= 0 ) diff --git a/plugins/sf2_player/sf2_player.h b/plugins/sf2_player/sf2_player.h index 7dc09c07a..6509b0851 100644 --- a/plugins/sf2_player/sf2_player.h +++ b/plugins/sf2_player/sf2_player.h @@ -37,6 +37,7 @@ #include "fluidsynth.h" #include "sample_buffer.h" + class sf2InstrumentView; class sf2Font; class notePlayHandle; @@ -44,6 +45,9 @@ class notePlayHandle; class patchesDialog; class QLabel; +const int MaxFluidChannels = 5; + + class sf2Instrument : public instrument { Q_OBJECT @@ -72,12 +76,12 @@ public: virtual f_cnt_t desiredReleaseFrames( void ) const { - return( 0 ); + return 0; } virtual bool isMidiBased( void ) const { - return( true ); + return true; } virtual pluginView * instantiateView( QWidget * _parent ); @@ -124,11 +128,10 @@ private: QMutex m_synthMutex; QMutex m_loadMutex; - int m_notesRunning[128]; + int m_notesRunning[128][MaxFluidChannels]; sample_rate_t m_internalSampleRate; int m_lastMidiPitch; int m_channel; - int m_maxChannels; lcdSpinBoxModel m_bankNum; lcdSpinBoxModel m_patchNum;