Пример #1
0
        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);
        }
Пример #2
0
        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;
        }