Beispiel #1
0
        /// <summary>
        ///		指定されたファイルの音声をデコードし、<see cref="ISampleSource"/> オブジェクトを返す。
        ///		失敗すれば null 。
        /// </summary>
        public static ISampleSource?Create(SoundDevice device, VariablePath path, double 再生速度 = 1.0)
        {
            if (!(File.Exists(path.数なしパス)))
            {
                Log.ERROR($"ファイルが存在しません。[{path.変数付きパス}]");
                return(null);
            }

            var 拡張子 = Path.GetExtension(path.数なしパス).ToLower();

            if (".ogg" == 拡張子)
            {
                #region " OggVorvis "
                //----------------
                try
                {
                    // ファイルを読み込んで IWaveSource を生成。
                    using var audioStream = new FileStream(path.数なしパス, FileMode.Open, FileAccess.Read);
                    using var waveSource  = new NVorbisOnStreamingSampleSource(audioStream, device.WaveFormat).ToWaveSource();

                    // IWaveSource をリサンプルして ISampleSource を生成。
                    return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }
            if (".wav" == 拡張子)
            {
                #region " WAV "
                //----------------
                try
                {
                    // ファイルを読み込んで IWaveSource を生成。
                    using var waveSource = new WavOnStreamingWaveSource(path, device.WaveFormat);

                    if (waveSource.WaveFormat.WaveFormatTag == AudioEncoding.Pcm)   // ここでは PCM WAV のみサポート
                    {
                        // IWaveSource をリサンプルして ISampleSource を生成。
                        return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                    }

                    // PCM WAV 以外は次へ。
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }
            if (".xa" == 拡張子)
            {
                #region " XA "
                //----------------
                try
                {
                    // ファイルを読み込んで IWaveSource を生成。
                    using var waveSource = new XAOnMemoryWaveSource(path, device.WaveFormat);

                    // IWaveSource をリサンプルして ISampleSource を生成。
                    return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }

            #region " 全部ダメだったら MediaFoundation で試みる。"
            //----------------
            try
            {
                // ファイルを読み込んで IWaveSource を生成。
                using var waveSource = new MediaFoundationOnMemoryWaveSource(path, device.WaveFormat);

                // デコード完了まで待機。
                if (!waveSource.DecodeComplete.Wait(60_1000))    // 最大1分
                {
                    throw new TimeoutException($"デコードタスクがタイムアウトしました。[{path.変数付きパス}]");
                }

                // IWaveSource をリサンプルして ISampleSource を生成。
                return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
            }
            catch
            {
                // ダメだった
            }
            //----------------
            #endregion

            Log.ERROR($"未対応のオーディオファイルです。{path.変数付きパス}");
            return(null);
        }
        /// <summary>
        ///		指定されたファイルの音声をデコードし、<see cref="ISampleSource"/> オブジェクトを返す。
        ///		失敗すれば null 。
        /// </summary>
        public static ISampleSource Create(サウンドデバイス device, VariablePath ファイルパス, double 再生速度 = 1.0)
        {
            if (!(File.Exists(ファイルパス.数なしパス)))
            {
                Log.ERROR($"ファイルが存在しません。[{ファイルパス.変数付きパス}]");
                return(null);
            }

            var 拡張子 = Path.GetExtension(ファイルパス.数なしパス).ToLower();

            if (".ogg" == 拡張子)
            {
                #region " OggVorvis "
                //----------------
                try
                {
                    using (var audioStream = new FileStream(ファイルパス.数なしパス, FileMode.Open, FileAccess.Read))
                    {
                        // ファイルを読み込んで IWaveSource を生成。
                        using (var waveSource = new NVorbisOnStreamingSampleSource(audioStream, device.WaveFormat).ToWaveSource())
                        {
                            // IWaveSource をリサンプルして ISampleSource を生成。
                            return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                        }
                    }
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }
            if (".wav" == 拡張子)
            {
                #region " WAV "
                //----------------
                try
                {
                    // ファイルを読み込んで IWaveSource を生成。
                    using (var waveSource = new WavOnMemoryWaveSource(ファイルパス, device.WaveFormat))
                    {
                        // IWaveSource をリサンプルして ISampleSource を生成。
                        return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                    }
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }
            if (".xa" == 拡張子)
            {
                #region " XA "
                //----------------
                try
                {
                    // ファイルを読み込んで IWaveSource を生成。
                    using (var waveSource = new XAOnMemoryWaveSource(ファイルパス, device.WaveFormat))
                    {
                        // IWaveSource をリサンプルして ISampleSource を生成。
                        return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                    }
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }
            else
            {
                #region " MediaFoundation "
                //----------------
                try
                {
                    // ファイルを読み込んで IWaveSource を生成。
                    using (var waveSource = new MediaFoundationOnMemoryWaveSource(ファイルパス, device.WaveFormat))
                    {
                        // IWaveSource をリサンプルして ISampleSource を生成。
                        return(new ResampledOnMemoryWaveSource(waveSource, device.WaveFormat, 再生速度).ToSampleSource());
                    }
                }
                catch
                {
                    // ダメだったので次へ。
                }
                //----------------
                #endregion
            }

            Log.ERROR($"未対応のオーディオファイルです。{ファイルパス.変数付きパス}");
            return(null);
        }