• R/O
  • HTTP
  • SSH
  • HTTPS

CsWin10Desktop3: Commit

Visual C# 7.0, Windows10 Desktop App


Commit MetaInfo

Revisionb076ee5136f79a60eccba2c14ce535faf4d50cb6 (tree)
Time2017-10-15 17:14:49
Authorくまかみ工房 <kumakamikoubou@gmai...>
Commiterくまかみ工房

Log Message

MediaFoundationSampleSource で扱う SourceReader を、CSCore のものから SharpDX のものに変更。

CSCoreのコンストラクタで例外を出しすぎると、ファイナライザでぶっとぶ不具合があるため。

Change Summary

Incremental Difference

--- a/FDK/メディア/サウンド/WASAPI/MediaFoundationSampleSource.cs
+++ b/FDK/メディア/サウンド/WASAPI/MediaFoundationSampleSource.cs
@@ -64,23 +64,35 @@ namespace FDK.メディア.サウンド.WASAPI
6464 deviceFormat.SampleRate, // 指定されたレート
6565 32, // 32bit 固定
6666 deviceFormat.Channels, // 指定されたチャンネル数
67- AudioEncoding.IeeeFloat ); // IeeeFloat 固定
67+ AudioEncoding.IeeeFloat ); // IeeeFloat 固定
6868
69- using( var sourceReader = new MFSourceReader( path ) ) // SourceReader は、SharpDX ではなく CSCore のものを使う。(MediaType から WaveFormat に一発で変換できるので。)
69+ //using( var sourceReader = new MFSourceReader( path ) ) // SourceReader は、SharpDX ではなく CSCore のものを使う。(WaveFormat から MediaType に一発で変換できるので。)
70+ // → CSCore.Win32.Comobject のファイナライザに不具合があるので、SourceReader には CSCore ではなく SharpDX のものを使う。
71+ // _MediaType, WaveFormat フィールドは CSCore のものなので注意。
72+ using( var sourceReader1 = new SourceReader( path ) )
73+ using( var sourceReader = sourceReader1.QueryInterfaceOrNull<SourceReaderEx>() )
7074 using( var waveStream = new MemoryStream() )
7175 {
7276 // (1) 最初のオーディオストリームを選択し、その他のすべてのストリームを非選択にする。
73- sourceReader.SetStreamSelection( (int) SourceReaderIndex.AllStreams, false );
74- sourceReader.SetStreamSelection( (int) SourceReaderIndex.FirstAudioStream, true );
77+ sourceReader.SetStreamSelection( SourceReaderIndex.AllStreams, false );
78+ sourceReader.SetStreamSelection( SourceReaderIndex.FirstAudioStream, true );
7579
7680 // (2) デコード後フォーマットを持つメディアタイプを作成し、SourceReader に登録する。
77- using( var partialMediaType = MFMediaType.FromWaveFormat( this.WaveFormat ) ) // WaveFormatEx にも対応。
81+
82+ // CSCore の場合。WaveFormatEx にも対応。
83+ //using( var partialMediaType = MFMediaType.FromWaveFormat( this.WaveFormat ) )
84+
85+ // SharpDX の場合。
86+ var wf = SharpDX.Multimedia.WaveFormat.CreateIeeeFloatWaveFormat( deviceFormat.SampleRate, deviceFormat.Channels );
87+ MediaFactory.CreateAudioMediaType( ref wf, out AudioMediaType partialMediaType );
88+
89+ using( partialMediaType )
7890 {
7991 // 作成したメディアタイプを sourceReader にセットする。必要なデコーダが見つからなかったら、ここで例外が発生する。
80- sourceReader.SetCurrentMediaType( (int) SourceReaderIndex.FirstAudioStream, partialMediaType );
92+ sourceReader.SetCurrentMediaType( SourceReaderIndex.FirstAudioStream, partialMediaType );
8193
8294 // 完成されたメディアタイプを取得する。
83- this._MediaType = sourceReader.GetCurrentMediaType( (int) SourceReaderIndex.FirstAudioStream );
95+ this._MediaType = new MFMediaType( sourceReader.GetCurrentMediaType( SourceReaderIndex.FirstAudioStream ).NativePointer ); // ネイティブポインタを使って、SharpDX → CSCore へ変換。SharpDX側オブジェクトは解放したらダメ。
8496
8597 // メディアタイプからフォーマットを取得する。(同じであるはずだが念のため)
8698 this.WaveFormat = this._MediaType.ToWaveFormat( MFWaveFormatExConvertFlags.Normal );
--- a/FDK/メディア/サウンド/WASAPI/Sound.cs
+++ b/FDK/メディア/サウンド/WASAPI/Sound.cs
@@ -125,9 +125,9 @@ namespace FDK.メディア.サウンド.WASAPI
125125 }
126126 public void Stop()
127127 {
128- if( this._DeviceRef.TryGetTarget( out SoundDevice device ) )
128+ if( (null != this._DeviceRef ) && this._DeviceRef.TryGetTarget( out SoundDevice device ) )
129129 {
130- device.Mixer.RemoveSound( this );
130+ device.Mixer?.RemoveSound( this );
131131 }
132132 }
133133
Show on old repository browser