/// <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); }