private void InitializeInternal() { //Use Desktophandle as default handle IntPtr handle = DSUtils.GetDesktopWindow(); IntPtr pdsound; DirectSoundException.Try(NativeMethods.DirectSoundCreate8(ref _device, out pdsound, IntPtr.Zero), "DSInterop", "DirectSoundCreate8"); _directSound = new DirectSound8(pdsound); _directSound.SetCooperativeLevel(handle, DSCooperativeLevelType.Normal); //use normal as default if (!_directSound.SupportsFormat(_source.WaveFormat)) { if (_source.WaveFormat.WaveFormatTag == AudioEncoding.IeeeFloat) //directsound does not support ieeefloat _source = _source.ToSampleSource().ToWaveSource(16); WaveFormat format16Bit = (WaveFormat) _source.WaveFormat.Clone(); format16Bit.BitsPerSample = 16; WaveFormat format8Bit = (WaveFormat)_source.WaveFormat.Clone(); format8Bit.BitsPerSample = 8; if (_directSound.SupportsFormat(format16Bit)) _source = _source.ToSampleSource().ToWaveSource(16); else if (_directSound.SupportsFormat(format8Bit)) _source = _source.ToSampleSource().ToWaveSource(8); else { throw new NotSupportedException( "WaveFormat of the source is not supported."); } if (!_directSound.SupportsFormat(_source.WaveFormat)) { throw new NotSupportedException( "WaveFormat of the source is not supported."); } } WaveFormat waveFormat = _source.WaveFormat; var bufferSize = (int) waveFormat.MillisecondsToBytes(_latency); _primaryBuffer = new DirectSoundPrimaryBuffer(_directSound); _secondaryBuffer = new DirectSoundSecondaryBuffer(_directSound, waveFormat, bufferSize * 2); }
private void CleanupResources() { if (_directSoundNotify != null) { _directSoundNotify.Dispose(); _directSoundNotify = null; } if (_secondaryBuffer != null) { _secondaryBuffer.Stop(); _secondaryBuffer.Dispose(); _secondaryBuffer = null; } if (_primaryBuffer != null) { _primaryBuffer.Stop(); _primaryBuffer.Dispose(); _primaryBuffer = null; } if (_directSound != null) { _directSound.Dispose(); _directSound = null; } _isInitialized = false; }