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); } }
private bool OnBufferRequest(uint *pBuffer, int sampleCount) { uint[] source; if (!_playQueue.TryDequeue(out source)) { var sample = _lastSample.HasValue ? _lastSample.Value : _zeroValue; // TODO: native optimization? for (var i = 0; i < sampleCount; i++) { pBuffer[i] = sample; } return(true); } try { fixed(uint *psrc = source) { NativeHelper.CPBLK(pBuffer, psrc, sampleCount * 4); //NativeMethods.CopyMemory(pBuffer, psrc, sampleCount * 4); _lastSample = pBuffer[sampleCount - 1]; } return(true); } finally { _fillQueue.Enqueue(source); _frameEvent.Set(); } }
public unsafe byte[] GetButtons() { var offset = 8 * 4 + 4 * 4; // rgbButtons0 offset var length = sizeof(DIJOYSTATE) - offset; var button = new byte[length]; fixed(void *pStruct = &this) fixed(void *pButton = button) { NativeHelper.CPBLK(pButton, (byte *)pStruct + offset, length); } return(button); }
public unsafe void SetStringAnsi(string value) { if (string.IsNullOrEmpty(value)) { fixed(void *pDst = &this) { *(byte *)pDst = (byte)0; } return; } var maxLength = Marshal.SizeOf(this); var length = Math.Min(value.Length, maxLength); var pSrc = Marshal.StringToHGlobalAnsi(value); fixed(void *pDst = &this) { NativeHelper.CPBLK(pDst, (void *)pSrc, length); } Marshal.FreeHGlobal(pSrc); }