OSDN Git Service

一部のwavで音が鳴らないミスを修正。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 15 Oct 2017 06:54:02 +0000 (15:54 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 15 Oct 2017 06:54:02 +0000 (15:54 +0900)
Sound.Dispose で SampleSource を解放しないよう修正。
Mixer.AddSound でフォーマットが Extensible であるときに不適合とされるミスを修正。

FDK/メディア/サウンド/WASAPI/Mixer.cs
FDK/メディア/サウンド/WASAPI/SampleSourceFactory.cs
FDK/メディア/サウンド/WASAPI/Sound.cs

index 2101a3f..7563df4 100644 (file)
@@ -100,9 +100,7 @@ namespace FDK.メディア.サウンド.WASAPI
                                }
 
                                // Soundのフォーマットがミキサーのフォーマットと適合するかをチェック。
-                               if( ( sound.WaveFormat.Channels != this._WaveFormat.Channels ) ||       // 同じチャンネル数、
-                                       ( sound.WaveFormat.SampleRate != this._WaveFormat.SampleRate ) ||   // 同じ周波数、
-                                       ( sound.WaveFormat.WaveFormatTag != AudioEncoding.IeeeFloat ) )     // 常に 32bit-float であること。
+                               if( !( this._フォーマットがミキサーと互換性がある( sound.WaveFormat ) ) )
                                {
                                        // 違った場合の変換はサポートしない。
                                        throw new ArgumentException( "ミキサーと同じチャンネル数、サンプルレート、かつ 32bit float 型である必要があります。" );
@@ -211,5 +209,35 @@ namespace FDK.メディア.サウンド.WASAPI
                private WaveFormat _WaveFormat = null;
                private float[] _中間バッファ = null;
                private readonly object _スレッド間同期 = new object();
+
+               private bool _フォーマットがミキサーと互換性がある( WaveFormat waveFormat )
+               {
+                       // チャンネル数が違うと NG
+                       if( waveFormat.Channels != this._WaveFormat.Channels )
+                               return false;
+
+                       // サンプルレートが違うと NG
+                       if( waveFormat.SampleRate != this._WaveFormat.SampleRate )
+                               return false;
+
+                       // 以下、ミキサーフォーマットは IEEE Float であると想定。
+
+                       // IeeeFloat なら OK
+                       if( waveFormat.WaveFormatTag == AudioEncoding.IeeeFloat )
+                               return true;
+
+                       // Extensible である場合、
+                       if( waveFormat.WaveFormatTag == AudioEncoding.Extensible )
+                       {
+                               var waveFormatEx = waveFormat as WaveFormatExtensible;
+
+                               // サブフォーマットが IEEE Float なら OK
+                               if( waveFormatEx.SubFormat == CSCore.AudioSubTypes.IeeeFloat )
+                                       return true;
+                       }
+
+                       // それ以外は NG
+                       return false;
+               }
        }
 }
index 56dcdf3..fb1e281 100644 (file)
@@ -14,7 +14,7 @@ namespace FDK.メディア.サウンド.WASAPI
                ///             指定されたファイルから <see cref="ISampleSource"/> を生成して返す。
                ///             失敗すれば例外発生。
                /// </summary>
-               public static ISampleSource Create( SoundDevice device, string ファイルパス, bool オンメモリ = true )
+               public static ISampleSource Create( SoundDevice device, string ファイルパス )
                {
                        var path = Folder.絶対パスに含まれるフォルダ変数を展開して返す( ファイルパス );
 
index f3e6e50..a2ebd34 100644 (file)
@@ -81,7 +81,7 @@ namespace FDK.メディア.サウンド.WASAPI
                {
                        this.Stop();
 
-                       this._SampleSource?.Dispose();
+                       //this._SampleSource?.Dispose();        Dispose は外部で。(SampleSource は複数の Sound で共有されている可能性があるため。)
                        this._SampleSource = null;
 
                        this._DeviceRef = null;