diff --git a/include/midi_winmm.h b/include/midi_winmm.h index 5f243893d..3c8fdd70c 100644 --- a/include/midi_winmm.h +++ b/include/midi_winmm.h @@ -33,8 +33,6 @@ #include #endif -#include - #include "midi_client.h" #include "midi_port.h" @@ -129,13 +127,19 @@ private: void closeDevices( void ); #ifdef LMMS_BUILD_WIN32 + static DWORD WINAPI midiThreadProc( midiWinMM * _midi ); + DWORD threadProc( void ); + static void CALLBACK inputCallback( HMIDIIN _hm, UINT _msg, DWORD_PTR _inst, DWORD_PTR _param1, DWORD_PTR _param2 ); void handleInputEvent( HMIDIIN _hm, DWORD _ev ); - QTimer m_deviceListUpdateTimer; + HANDLE m_threadHandle; + DWORD m_threadId; + volatile bool m_isRunning; + QMap m_inputDevices; QMap m_outputDevices; #endif diff --git a/src/core/midi/midi_winmm.cpp b/src/core/midi/midi_winmm.cpp index 4e27cdc4b..6cd5368b7 100644 --- a/src/core/midi/midi_winmm.cpp +++ b/src/core/midi/midi_winmm.cpp @@ -40,15 +40,19 @@ midiWinMM::midiWinMM( void ) : midiClient(), - m_deviceListUpdateTimer( this ) + m_threadHandle( 0 ), + m_threadId( 0 ), + m_isRunning( false ), + m_inputDevices(), + m_outputDevices(), + m_inputSubs(), + m_outputSubs() { - // initial list-update - updateDeviceList(); + m_threadHandle = CreateThread( NULL, 0, + (LPTHREAD_START_ROUTINE) midiThreadProc, + this, 0, &m_threadId ); - connect( &m_deviceListUpdateTimer, SIGNAL( timeout() ), - this, SLOT( updateDeviceList() ) ); - // we check for port-changes every second -// m_deviceListUpdateTimer.start( 1000 ); + m_isRunning = true; } @@ -56,7 +60,9 @@ midiWinMM::midiWinMM( void ) : midiWinMM::~midiWinMM() { - closeDevices(); + m_isRunning = false; + WaitForSingleObject( m_threadHandle, INFINITE ); + CloseHandle( m_threadHandle ); } @@ -163,10 +169,30 @@ void midiWinMM::subscribeWriteablePort( midiPort * _port, +DWORD WINAPI midiWinMM::midiThreadProc( midiWinMM * _midi ) +{ + return _midi->threadProc(); +} + + + + +DWORD midiWinMM::threadProc( void ) +{ + openDevices(); + while( m_isRunning ) + { + Sleep( 100 ); + } + closeDevices(); +} + + + + void midiWinMM::inputCallback( HMIDIIN _hm, UINT _msg, DWORD_PTR _inst, DWORD_PTR _param1, DWORD_PTR _param2 ) { - printf( "callback: %d %d\n", _msg, _param1 ); if( _msg == MIM_DATA ) { ( (midiWinMM *) _inst )->handleInputEvent( _hm, _param1 ); @@ -286,10 +312,10 @@ void midiWinMM::openDevices( void ) CALLBACK_FUNCTION ); if( res == MMSYSERR_NOERROR ) { - midiInStart( hm ); MIDIINCAPS c; midiInGetDevCaps( (UINT) hm, &c, sizeof( c ) ); m_inputDevices[hm] = c.szPname; + midiInStart( hm ); } } }