public unsafe void Write(int position, void *pBuffer, int length, DSBLOCK flags) { IntPtr pvAudioPtr1; int dwAudioBytes1; IntPtr pvAudioPtr2; int dwAudioBytes2; this.Lock( position, length, out pvAudioPtr1, out dwAudioBytes1, out pvAudioPtr2, out dwAudioBytes2, flags); try { int count1 = Math.Min(dwAudioBytes1, length); int count2 = length - count1; NativeHelper.CPBLK((void *)pvAudioPtr1, (void *)pBuffer, count1); if (count2 > 0) { NativeHelper.CPBLK((void *)(pvAudioPtr1 + count1), (void *)((byte *)pBuffer + count1), count2); } } finally { this.Unlock(pvAudioPtr1, dwAudioBytes1, pvAudioPtr2, dwAudioBytes2); } }
// <unmanaged>HRESULT IDirectSoundBuffer::Lock([In] unsigned int dwOffset,[In] unsigned int dwBytes,[Out] void** ppvAudioPtr1,[Out] unsigned int* pdwAudioBytes1,[Out] void** ppvAudioPtr2,[Out, Optional] unsigned int* pdwAudioBytes2,[In] DSBLOCK_ENUM dwFlags)</unmanaged> internal unsafe void Lock(int offset, int bytes, out IntPtr audioPtr1Out, out int audioBytes1Ref, out IntPtr audioPtr2Out, out int audioBytes2Ref, DSBLOCK flags) { IntPtr pvAudioPtr1; int dwAudioBytes1; IntPtr pvAudioPtr2; int dwAudioBytes2; //result = calli(System.Int32(System.Void*,System.Int32,System.Int32,System.Void*,System.Void*,System.Void*,System.Void*,System.Int32), this._nativePointer, offset, bytes, ptr, ptr2, ptr3, ptr4, flags, *(*(IntPtr*)this._nativePointer + (IntPtr)11 * (IntPtr)sizeof(void*))); var result = (HRESULT)NativeHelper.CalliInt32(11, _nativePointer, offset, bytes, (void *)&pvAudioPtr1, (void *)&dwAudioBytes1, (void *)&pvAudioPtr2, (void *)&dwAudioBytes2, (int)flags); audioPtr1Out = pvAudioPtr1; audioBytes1Ref = dwAudioBytes1; audioPtr2Out = pvAudioPtr2; audioBytes2Ref = dwAudioBytes2; result.CheckError(); }