Ik maak gebruik van de Windows Multimedia API om geluid te samplen. Ik voer meerdere buffers aan, en als er een vol is ontvangt mijn applicatie een message MM_WIM_DATA. Op dat moment voeg ik een nieuwe buffer toe, en lees ik de oude uit.
Nou wil ik controleren of de volle buffer ook de eerst aangevoerde buffer is, vooral om debugging redenen. Volgens de MSDN documentatie bevat de MM_WIM_DATA message een double lParam, met daarin de pointer naar de buffer. Deze wil ik dus vergelijken met de pointer naar de oudst bestaande buffer. De buffers zijn gepinned in het geheugen.
Het probleem is dat die vergelijking nooit uitkomt. Ik zal wel iets triviaal fout doen, maar ik weet niet hoe het dan wel moet. Kan iemand me op weg helpen?
Relevante codeknipsels:
Nou wil ik controleren of de volle buffer ook de eerst aangevoerde buffer is, vooral om debugging redenen. Volgens de MSDN documentatie bevat de MM_WIM_DATA message een double lParam, met daarin de pointer naar de buffer. Deze wil ik dus vergelijken met de pointer naar de oudst bestaande buffer. De buffers zijn gepinned in het geheugen.
Het probleem is dat die vergelijking nooit uitkomt. Ik zal wel iets triviaal fout doen, maar ik weet niet hoe het dan wel moet. Kan iemand me op weg helpen?
Relevante codeknipsels:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| public void handleData(Message m) { // Get the olderst buffer Buffer buf = buffers[0]; Console.WriteLine(buf.ptr == m.LParam); // geeft false } private class Buffer : IDisposable { private WinAudio.WAVEHDR wihdr; private GCHandle hwihdr; public Buffer(IntPtr hin, int bts, int size, int chnnls) { wihdr = new WinAudio.WAVEHDR(); hwihdr = GCHandle.Alloc(wihdr, GCHandleType.Pinned); WinAudio.waveInPrepareHeader(hwavein, ref wihdr, Marshal.SizeOf(wihdr)); WinAudio.waveInAddBuffer(hwavein, ref wihdr, Marshal.SizeOf(wihdr)); } public IntPtr ptr { get { return (IntPtr)hwihdr; } } } |