OSDN Git Service

#40396 64bit環境でMIDI入力を受け付けない問題を修正。callback内のint→IntPtr置き換えが漏れていた。
authoryyagi <yyagi.dtxmania@gmail.com>
Sat, 9 May 2020 08:30:27 +0000 (17:30 +0900)
committeryyagi <yyagi.dtxmania@gmail.com>
Sat, 9 May 2020 08:30:27 +0000 (17:30 +0900)
FDK/コード/00.共通/CWin32.cs
FDK/コード/02.入力/CInputMIDI.cs
FDK/コード/02.入力/CInput管理.cs
MidiInChecker2_Solution/MidiInChecker2_Project/PsuedoFDK/CInputManager.cs
MidiInChecker2_Solution/MidiInChecker2_Project/PsuedoFDK/CInputMidi.cs
MidiInChecker2_Solution/MidiInChecker2_Project/PsuedoFDK/CWin32.cs

index 71a9a57..64ce2ea 100644 (file)
@@ -808,6 +808,6 @@ namespace FDK
 
                // Win32 メッセージ処理デリゲート
 
-               public delegate void MidiInProc( IntPtr hMidiIn, uint wMsg, int dwInstance, int dwParam1, int dwParam2 );
+               public delegate void MidiInProc( IntPtr hMidiIn, uint wMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2 );
        }
 }
index 28c5d29..78da4d7 100644 (file)
@@ -28,15 +28,18 @@ namespace FDK
 
                // メソッド
 
-               public void tメッセージからMIDI信号のみ受信( uint wMsg, int dwInstance, int dwParam1, int dwParam2, long n受信システム時刻 )
+               public void tメッセージからMIDI信号のみ受信( uint wMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2, long n受信システム時刻 )
                {
                        if( wMsg == CWin32.MIM_DATA )
                        {
-                               int nMIDIevent = dwParam1 & 0xF0;
-                               int nPara1 = ( dwParam1 >> 8 ) & 0xFF;
-                               int nPara2 = ( dwParam1 >> 16 ) & 0xFF;
+                               int nMIDIevent = (int)dwParam1 & 0xF0;
+                               int nPara1 = ( (int)dwParam1 >> 8 ) & 0xFF;
+                               int nPara2 = ( (int)dwParam1 >> 16 ) & 0xFF;
+                               int nPara3 = ((int)dwParam2 >> 8) & 0xFF;
+                               int nPara4 = ((int)dwParam2 >> 16) & 0xFF;
 
-// Trace.TraceInformation( "MIDIevent={0:X2} para1={1:X2} para2={2:X2}", nMIDIevent, nPara1, nPara2 );
+
+//                             Trace.TraceInformation( "MIDIevent={0:X2} para1={1:X2} para2={2:X2} para3={3:X2} para4={4:X2}", nMIDIevent, nPara1, nPara2, nPara3, nPara4 );
                        
                                if( ( nMIDIevent == 0x90 ) && ( nPara2 != 0 ) )         // Note ON
                                {
index dc7dca1..26415b2 100644 (file)
@@ -113,17 +113,21 @@ namespace FDK
                                        {
                                                Trace.TraceError( "MIDI In: Device{0}: midiInDevCaps(): {1:X2}: ", i, num3 );
                                        }
-                                       else if ( ( CWin32.midiInOpen( ref item.hMidiIn, i, this.proc, IntPtr.Zero, 0x30000 ) == 0 ) && ( item.hMidiIn != IntPtr.Zero ) )
-                                       {
-                                               CWin32.midiInStart( item.hMidiIn );
-                                               Trace.TraceInformation( "MIDI In: [{0}] \"{1}\" の入力受付を開始しました。", i, lpMidiInCaps.szPname );
-                                       }
                                        else
                                        {
-                                               Trace.TraceError( "MIDI In: [{0}] \"{1}\" の入力受付の開始に失敗しました。", i, lpMidiInCaps.szPname );
+                                               uint ret = CWin32.midiInOpen(ref item.hMidiIn, i, this.proc, IntPtr.Zero, 0x30000);
+                                               Trace.TraceInformation("midiInOpen()==" + ret);
+                                               Trace.TraceInformation("item.hMidiIn==" + item.hMidiIn.ToString());
+                                               if ((ret == 0) && (item.hMidiIn != IntPtr.Zero))
+                                               {
+                                                       CWin32.midiInStart(item.hMidiIn);
+                                                       Trace.TraceInformation("MIDI In: [{0}] \"{1}\" の入力受付を開始しました。", i, lpMidiInCaps.szPname);
+                                                       item.strDeviceName = lpMidiInCaps.szPname;
+                                                       this.list入力デバイス.Add(item);
+                                                       continue;
+                                               }
                                        }
-                                       item.strDeviceName = lpMidiInCaps.szPname;
-                                       this.list入力デバイス.Add(item);
+                                       Trace.TraceError( "MIDI In: [{0}] \"{1}\" の入力受付の開始に失敗しました。", i, lpMidiInCaps.szPname );
                                }
                        }
                        else
@@ -263,15 +267,17 @@ namespace FDK
                private CWin32.MidiInProc proc;
 //             private CTimer timer;
 
-               private void MidiInCallback( IntPtr hMidiIn, uint wMsg, int dwInstance, int dwParam1, int dwParam2 )
+               private void MidiInCallback( IntPtr hMidiIn, uint wMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2 )
                {
-                       int p = dwParam1 & 0xF0;
+                       int p = (int)dwParam1 & 0xF0;
                        if( wMsg != CWin32.MIM_DATA || ( p != 0x80 && p != 0x90 && p != 0xB0 ) )
                                return;
 
-            long time = CSound管理.rc演奏用タイマ.nシステム時刻; // lock前に取得。演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+            long time = CSound管理.rc演奏用タイマ.nシステム時刻;  // lock前に取得。演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
 
-                       lock( this.objMidiIn排他用 )
+//Trace.TraceInformation($"MidiInCallback: hMidiIn={hMidiIn.ToString("X4")}, dwInstance={dwInstance.ToString("X4")}, dwParam1={dwParam1.ToString("X4")}, dwParam2={dwParam2.ToString("X4")}");
+
+                       lock ( this.objMidiIn排他用 )
                        {
                                if( ( this.list入力デバイス != null ) && ( this.list入力デバイス.Count != 0 ) )
                                {
index 7e0b632..5f7464d 100644 (file)
@@ -154,9 +154,9 @@ namespace MidiInChecker2
                private object objMidiIn排他用 = new object();\r
                private CWin32.MidiInProc proc;\r
 \r
-               private void MidiInCallback( IntPtr hMidiIn, uint wMsg, int dwInstance, int dwParam1, int dwParam2 )\r
+               private void MidiInCallback( IntPtr hMidiIn, uint wMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2 )\r
                {\r
-                       int p = dwParam1 & 0xF0;\r
+                       int p = (int)dwParam1 & 0xF0;\r
                        if ( wMsg != CWin32.MIM_DATA )  // || ( p != 0x80 && p != 0x90 && p != 0xB0 ) )\r
                                return;\r
 \r
index b5810a0..86f5698 100644 (file)
@@ -28,13 +28,13 @@ namespace MidiInChecker2
 \r
                // メソッド\r
 \r
-               public void tメッセージからMIDI信号のみ受信( uint wMsg, int dwInstance, int dwParam1, int dwParam2, long n受信システム時刻 )\r
+               public void tメッセージからMIDI信号のみ受信( uint wMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2, long n受信システム時刻 )\r
                {\r
                        if ( wMsg == CWin32.MIM_DATA )\r
                        {\r
-                               int nMIDIevent = dwParam1 & 0xFF;\r
-                               int nPara1 = ( dwParam1 >> 8 ) & 0xFF;\r
-                               int nPara2 = ( dwParam1 >> 16 ) & 0xFF;\r
+                               int nMIDIevent = (int)dwParam1 & 0xFF;\r
+                               int nPara1 = ( (int)dwParam1 >> 8 ) & 0xFF;\r
+                               int nPara2 = ( (int)dwParam1 >> 16 ) & 0xFF;\r
 \r
                                Trace.TraceInformation( "MIDIevent={0:X2} para1={1:X2} para2={2:X2}", nMIDIevent, nPara1, nPara2 );\r
 \r
@@ -42,7 +42,7 @@ namespace MidiInChecker2
                                {\r
                                        STInputEvent item = new STInputEvent();\r
                                        // item.nKey = nPara1;\r
-                                       item.nKey = dwParam1;\r
+                                       item.nKey = (int)dwParam1;\r
                                        item.b押された = true;\r
                                        item.nTimeStamp = n受信システム時刻;\r
                                        item.nVelocity = nPara2;\r
index 816addf..2eb85fb 100644 (file)
@@ -496,6 +496,6 @@ namespace MidiInChecker2
 \r
                // Win32 メッセージ処理デリゲート\r
 \r
-               public delegate void MidiInProc( IntPtr hMidiIn, uint wMsg, int dwInstance, int dwParam1, int dwParam2 );\r
+               public delegate void MidiInProc( IntPtr hMidiIn, uint wMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2 );\r
        }\r
 }\r