2 using System.Collections.Generic;
4 using System.Diagnostics;
5 using System.Runtime.InteropServices;
7 namespace MidiInChecker2
9 public class CInputManager : IDisposable
13 public static int n通常音量 = 110;
18 public List<IInputDevice> list入力デバイス
24 public uint nInputMidiDevices;
25 public List<string> listStrMidiDevices;
29 //public CInputManager( IntPtr hWnd )
30 public CInputManager()
32 this.list入力デバイス = new List<IInputDevice>( 10 );
33 this.listStrMidiDevices = new List<string>();
35 this.proc = new CWin32.MidiInProc( this.MidiInCallback );
36 nInputMidiDevices = CWin32.midiInGetNumDevs();
37 Trace.TraceInformation( "MIDI入力デバイス数: {0}", nInputMidiDevices );
38 for ( uint i = 0; i < nInputMidiDevices; i++ )
40 CInputMIDI item = new CInputMIDI( i );
41 this.list入力デバイス.Add( item );
42 CWin32.MIDIINCAPS lpMidiInCaps = new CWin32.MIDIINCAPS();
43 uint retcode = CWin32.midiInGetDevCaps( i, ref lpMidiInCaps, (uint) Marshal.SizeOf( lpMidiInCaps ) );
46 Trace.TraceError( "MIDI In: Device{0}: midiInDevCaps(): {1:X2}: ", i, retcode );
48 else if ( ( CWin32.midiInOpen( ref item.hMidiIn, i, this.proc, 0, 0x30000 ) == 0 ) && ( item.hMidiIn != 0 ) )
50 CWin32.midiInStart( item.hMidiIn );
51 Trace.TraceInformation( "MIDI In: [{0}] \"{1}\" の入力受付を開始しました。", i, lpMidiInCaps.szPname );
52 this.listStrMidiDevices.Add( "MIDI In [" + i + "] = " + lpMidiInCaps.szPname );
56 Trace.TraceError( "MIDI In: [{0}] \"{1}\" の入力受付の開始に失敗しました。", i, lpMidiInCaps.szPname );
64 public IInputDevice MidiIn( int ID )
66 foreach ( IInputDevice device in this.list入力デバイス )
68 if ( ( device.e入力デバイス種別 == E入力デバイス種別.MidiIn ) && ( device.ID == ID ) )
75 public void tポーリング( bool bWindowがアクティブ中, bool bバッファ入力を使用する )
77 lock ( this.objMidiIn排他用 )
79 for ( int i = this.list入力デバイス.Count - 1; i >= 0; i-- ) // #24016 2011.1.6 yyagi: change not to use "foreach" to avoid InvalidOperation exception by Remove().
81 IInputDevice device = this.list入力デバイス[ i ];
84 device.tポーリング( bWindowがアクティブ中, bバッファ入力を使用する );
86 catch ( Exception ) // #24016 2011.1.6 yyagi: catch exception for unplugging USB joystick, and remove the device object from the polling items.
88 this.list入力デバイス.Remove( device );
90 Trace.TraceError( "tポーリング時に対象deviceが抜かれており例外発生。同deviceをポーリング対象からRemoveしました。" );
96 #region [ IDisposable+α ]
100 this.Dispose( true );
102 public void Dispose( bool disposeManagedObjects )
104 if ( !this.bDisposed済み )
106 if ( disposeManagedObjects )
108 foreach ( IInputDevice device in this.list入力デバイス )
110 CInputMIDI tmidi = device as CInputMIDI;
113 CWin32.midiInStop( tmidi.hMidiIn );
114 CWin32.midiInReset( tmidi.hMidiIn );
115 CWin32.midiInClose( tmidi.hMidiIn );
116 Trace.TraceInformation( "MIDI In: [{0}] を停止しました。", tmidi.ID );
119 foreach ( IInputDevice device2 in this.list入力デバイス )
123 lock ( this.objMidiIn排他用 )
125 this.list入力デバイス.Clear();
128 //this.directInput.Dispose();
130 //if ( this.timer != null )
132 // this.timer.Dispose();
133 // this.timer = null;
136 this.bDisposed済み = true;
141 this.Dispose( false );
142 GC.KeepAlive( this );
152 private bool bDisposed済み;
153 private List<uint> listHMIDIIN = new List<uint>( 8 );
154 private object objMidiIn排他用 = new object();
155 private CWin32.MidiInProc proc;
157 private void MidiInCallback( uint hMidiIn, uint wMsg, int dwInstance, int dwParam1, int dwParam2 )
159 int p = dwParam1 & 0xF0;
160 if ( wMsg != CWin32.MIM_DATA || ( p != 0x80 && p != 0x90 ) )
163 //long time = this.timer.nシステム時刻; // lock前に取得
164 long time = System.DateTime.Now.Ticks; // lock前に取得
166 lock ( this.objMidiIn排他用 )
168 if ( ( this.list入力デバイス != null ) && ( this.list入力デバイス.Count != 0 ) )
170 foreach ( IInputDevice device in this.list入力デバイス )
172 CInputMIDI tmidi = device as CInputMIDI;
173 if ( ( tmidi != null ) && ( tmidi.hMidiIn == hMidiIn ) )
175 tmidi.tメッセージからMIDI信号のみ受信( wMsg, dwInstance, dwParam1, dwParam2, time );