void ThreadFunction() { unsafe { DSound.CoInitialize(null); } while (true) { criticalSection.Enter(); for (int n = 0; n < fileStreamRealChannels.Count; n++) { fileStreamRealChannels[n].UpdateStream(); } criticalSection.Leave(); while (!IsActive()) { Thread.Sleep(100); } Thread.Sleep(10); if (needAbortThread) { break; } } }
unsafe void GenerateRecordDriverList() { DSENUMCALLBACKW callback = new DSENUMCALLBACKW(SoundCaptureCallback); DSound.DirectSoundCaptureEnumerateW(callback, null); recordDriverIndex = recordDriverGuids.Count != 0 ? 0 : -1; }
public unsafe bool RestoreSoundBuffers(out bool restored) { IDirectSoundBuffer *soundBuffer = (IDirectSoundBuffer *)soundBuffers[0].ToPointer(); int hr; restored = false; uint status; hr = IDirectSoundBuffer.GetStatus(soundBuffer, out status); if (Wrapper.FAILED(hr)) { DirectSoundWorld.Warning("IDirectSoundBuffer.GetStatus", hr); return(false); } if ((status & DSound.DSBSTATUS_BUFFERLOST) != 0) { int DSERR_BUFFERLOST = DSound.Get_DSERR_BUFFERLOST(); // Since the app could have just been activated, then // DirectSound may not be giving us control yet, so // the restoring the buffer may fail. // If it does, sleep until DirectSound gives us control. do { hr = IDirectSoundBuffer.Restore(soundBuffer); if (hr == DSERR_BUFFERLOST) { Thread.Sleep(10); } }while((hr = IDirectSoundBuffer.Restore(soundBuffer)) == DSERR_BUFFERLOST); restored = true; } return(true); }
unsafe public DirectCaptureSound(SoundMode mode, int channels, int frequency, int bufferSize) { SoundMode newMode = mode | SoundMode.Loop | SoundMode.Software; int hr; if (DirectSoundWorld.Instance.recordDriverIndex == -1) { DirectSoundWorld.Warning("Recording failed. No active device."); return; } GUID deviceGuid = DirectSoundWorld.Instance.recordDriverGuids[ DirectSoundWorld.Instance.recordDriverIndex]; //soundCapture void */*IDirectSoundCapture8*/ tempSoundCapture; hr = DSound.DirectSoundCaptureCreate(&deviceGuid, out tempSoundCapture, null); if (Wrapper.FAILED(hr)) { DirectSoundWorld.Warning("DirectSoundCaptureCreate", hr); return; } soundCapture = (IDirectSoundCapture8 *)tempSoundCapture; //waveFormat waveFormat = (WAVEFORMATEX *)NativeUtils.Alloc(NativeMemoryAllocationType.SoundAndVideo, sizeof(WAVEFORMATEX)); NativeUtils.ZeroMemory((IntPtr)waveFormat, sizeof(WAVEFORMATEX)); waveFormat->wFormatTag = DSound.WAVE_FORMAT_PCM; waveFormat->nChannels = (ushort)channels; waveFormat->nSamplesPerSec = (uint)frequency; waveFormat->wBitsPerSample = 16; waveFormat->nBlockAlign = (ushort)((waveFormat->nChannels * waveFormat->wBitsPerSample) / 8); waveFormat->nAvgBytesPerSec = waveFormat->nSamplesPerSec * waveFormat->nBlockAlign; //captureBuffer DSCBUFFERDESC bufferDesc = new DSCBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSCBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof(DSCBUFFERDESC); bufferDesc.dwBufferBytes = (uint)bufferSize; bufferDesc.lpwfxFormat = waveFormat; void */*IDirectSoundCaptureBuffer*/ tempCaptureBuffer; hr = IDirectSoundCapture8.CreateCaptureBuffer(soundCapture, ref bufferDesc, out tempCaptureBuffer, null); if (Wrapper.FAILED(hr)) { DirectSoundWorld.Warning("CreateCaptureBuffer", hr); IDirectSoundCapture8.Release(soundCapture); soundCapture = null; return; } captureBuffer = (IDirectSoundCaptureBuffer *)tempCaptureBuffer; //get bufferSize DSCBCAPS bufferCaps = new DSCBCAPS(); //ZeroMemory( &bufferCaps, sizeof( DSCBCAPS ) ); bufferCaps.dwSize = (uint)sizeof(DSCBCAPS); IDirectSoundCaptureBuffer.GetCaps(captureBuffer, ref bufferCaps); this.bufferSize = (int)bufferCaps.dwBufferBytes; Init(null, newMode, 100000.0f, channels, frequency); }
public static void Error(string methodName, int /*HRESULT*/ result) { string error = DSound.GetOutString(DSound.DXGetErrorStringW(result)); Error(string.Format("{0} ({1})", error, methodName)); }
unsafe protected override bool InitLibrary(IntPtr mainWindowHandle, int maxReal2DChannels, int maxReal3DChannels) { NativeLibraryManager.PreLoadLibrary("libogg"); NativeLibraryManager.PreLoadLibrary("libvorbis"); NativeLibraryManager.PreLoadLibrary("libvorbisfile"); NativeLibraryManager.PreLoadLibrary("DirectSoundNativeWrapper"); { DSoundStructureSizes sizes = new DSoundStructureSizes(); sizes.Init(); DSoundStructureSizes originalSizes; DSound.GetStructureSizes(out originalSizes); FieldInfo[] fields = sizes.GetType().GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (FieldInfo field in fields) { int originalSize = (int)field.GetValue(originalSizes); int size = (int)field.GetValue(sizes); if (originalSize != size) { Log.Fatal("DirectXSoundSystem: Invalid unmanaged bridge. " + "Invalid \"{0}\". Native size = \"{1}\". Managed size = \"{2}\".", field.Name, originalSize, size); return(false); } } } instance = this; criticalSection = CriticalSection.Create(); DSound.CoInitialize(null); int hr; //create IDirectSound using the primary sound device void */*IDirectSound8*/ directSoundTemp; hr = DSound.DirectSoundCreate8(null, out directSoundTemp, null); if (Wrapper.FAILED(hr)) { if (hr == DSound.Get_DSERR_NODRIVER()) { Log.InvisibleInfo("DirectXSoundSystem: No sound driver."); return(false); } Error("DirectSoundCreate8", hr); return(false); } directSound = (IDirectSound8 *)directSoundTemp; //set DirectSound cooperative level hWnd = mainWindowHandle; hr = IDirectSound8.SetCooperativeLevel(directSound, hWnd, DSound.DSSCL_PRIORITY); if (Wrapper.FAILED(hr)) { Error("SetCooperativeLevel", hr); return(false); } //set primary buffer format { hr = SetPrimaryBufferFormat(2, 44100, 16, false); if (Wrapper.FAILED(hr)) { hr = SetPrimaryBufferFormat(2, 22050, 16, true); } if (Wrapper.FAILED(hr)) { return(false); } } //get listener { void */*IDirectSoundBuffer*/ primaryBuffer = null; // Obtain primary buffer, asking it for 3D control DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof(DSBUFFERDESC); bufferDesc.dwFlags = DSound.DSBCAPS_CTRL3D | DSound.DSBCAPS_PRIMARYBUFFER; hr = IDirectSound8.CreateSoundBuffer(directSound, ref bufferDesc, out primaryBuffer, null); if (Wrapper.FAILED(hr)) { Error("CreateSoundBuffer", hr); return(false); } void */*IDirectSound3DListener*/ listenerTemp = null; GUID guid = DSound.IID_IDirectSound3DListener; if (Wrapper.FAILED(hr = IDirectSoundBuffer.QueryInterface(primaryBuffer, ref guid, &listenerTemp))) { IDirectSoundBuffer.Release(primaryBuffer); Error("QueryInterface", hr); return(false); } listener = (IDirectSound3DListener *)listenerTemp; IDirectSoundBuffer.Release(primaryBuffer); } //update general parameters { DS3DLISTENER parameters = new DS3DLISTENER(); parameters.dwSize = (uint)sizeof(DS3DLISTENER); IDirectSound3DListener.GetAllParameters(listener, ref parameters); parameters.flDistanceFactor = 1; parameters.flRolloffFactor = 0; parameters.flDopplerFactor = DopplerScale; hr = IDirectSound3DListener.SetAllParameters(listener, ref parameters, DSound.DS3D_IMMEDIATE); if (Wrapper.FAILED(hr)) { Warning("IDirectSound3DListener.SetAllParameters", hr); } } GenerateRecordDriverList(); //Channels realChannels = new List <DirectSoundRealChannel>(); for (int n = 0; n < maxReal2DChannels; n++) { DirectSoundRealChannel realChannel = new DirectSoundRealChannel(); AddRealChannel(realChannel, false); realChannels.Add(realChannel); } for (int n = 0; n < maxReal3DChannels; n++) { DirectSoundRealChannel realChannel = new DirectSoundRealChannel(); AddRealChannel(realChannel, true); realChannels.Add(realChannel); } fileStreamRealChannels = new List <DirectSoundRealChannel>(); thread = new Thread(new ThreadStart(ThreadFunction)); thread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); thread.IsBackground = true; thread.Start(); return(true); }