Ejemplo n.º 1
0
        public void Init(XA.XAudio2 xaudio, MF.SourceReader mfSourceReader)
        {
            IntPtr waveFormatPtr = IntPtr.Zero;

            for (int i = 0; i < this._audioRingBuffers.Count(); ++i)
            {
                this._audioRingBuffers[i] = new NativeBufferSet();
                this._audioRingBuffers[i].ExpandNativeBuffer(OneRingBufferInitialSizeInBytes);
            }

            try
            {
                this._mfSourceReader = mfSourceReader;
                using (var mfMediaType = this._mfSourceReader.GetCurrentMediaType(MF.SourceReaderIndex.FirstAudioStream))
                {
                    int waveFormatLength;
                    // ExtracttWaveFormat は多分スペルミス。SharpDX.ComObject.ComObject(object iunknowObject) にも引数名にスペルミスあり。
                    var waveFormatWrapper = mfMediaType.ExtracttWaveFormat(out waveFormatLength, MF.WaveFormatExConvertFlags.ForceExtensible);
                    waveFormatPtr       = SharpDX.Multimedia.WaveFormat.MarshalToPtr(waveFormatWrapper);
                    this._xaSourceVoice = new XA.SourceVoice(xaudio, waveFormatWrapper, XA.VoiceFlags.NoPitch, 1.0f, false);
                    waveFormatWrapper   = null;
                }
            }
            finally
            {
                // CoTaskMemFree() 呼び出し相当。
                System.Runtime.InteropServices.Marshal.FreeCoTaskMem(waveFormatPtr);

                // マネージスレッド ID はネイティブスレッド ID とは異なる。
                // もしイベントベースで実装し、XAudio2 が用意するコールバックスレッドと比較する場合は、ネイティブスレッドをチェックするようにしたほうがよい。
                System.Diagnostics.Debug.WriteLine("CurrentThreadID = {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            }
        }
Ejemplo n.º 2
0
        public MyAudioManager()
        {
            // foobar2000 など、WASAPI 排他モードを使えるアプリケーションを起動しておくことで、XAudio2 の初期化エラーをエミュレート&テストできるはず。

            this._xaudio           = new XA.XAudio2();
            this._xaMasteringVoice = new XA.MasteringVoice(_xaudio);

            this.SetMasterVolume(0);
        }