OSDN Git Service

#34732 To avoid WASAPI/ASIO BGM Sync issue, decode "RIFF chunked Vorbis” by DirectSho...
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Fri, 26 Dec 2014 22:42:46 +0000 (22:42 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Fri, 26 Dec 2014 22:42:46 +0000 (22:42 +0000)
#xxxxx デバッグログを若干強化した。
#xxxxx 演奏中のデバッグ情報表示から、BASS.DLL関連のものを削除した。

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@788 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CAct演奏演奏情報.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CStage演奏画面共通.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/ドラム画面/CStage演奏ドラム画面.cs
FDK17プロジェクト/コード/03.サウンド/CSound.cs
実行時フォルダ(DTXCreator)/dll/FDK.dll
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/dll/FDK.dll

index 21fd34f..436fe0a 100644 (file)
@@ -1772,11 +1772,40 @@ namespace DTXMania
                                                        //);\r
                                                        // wc.rSound[ i ].t再生位置を変更する( wc.rSound[ i ].t時刻から位置を返す( nAbsTimeFromStartPlaying ) );\r
                                                        wc.rSound[ i ].t再生位置を変更する( nAbsTimeFromStartPlaying );        // WASAPI/ASIO用\r
+//Debug.WriteLine( "再生位置を変更: " + Path.GetFileName( wc.strファイル名 ) + nAbsTimeFromStartPlaying + "ms");\r
                                                }\r
                                        }\r
                                }\r
                        }\r
                }\r
+\r
+               /// <summary>\r
+               /// デバッグ用\r
+               /// </summary>\r
+               public void tWaveBGM再生位置表示()\r
+               {\r
+                       foreach ( CWAV wc in this.listWAV.Values )\r
+                       {\r
+                               if ( wc.rSound[ 0 ] != null && wc.rSound[ 0 ].n総演奏時間ms >= 5000 )\r
+                               {\r
+                                       for ( int i = 0; i < nPolyphonicSounds; i++ )\r
+                                       {\r
+                                               if ( ( wc.rSound[ i ] != null ) && ( wc.rSound[ i ].b再生中 ) )\r
+                                               {\r
+                                                       long n位置byte;\r
+                                                       double db位置ms;\r
+                                                       wc.rSound[ i ].t再生位置を取得する( out n位置byte, out db位置ms );\r
+                                                       Trace.TraceInformation( "再生位置: {0}, seek先={1}ms / {2}byte, 全音長={3}ms",\r
+                                                           Path.GetFileName( wc.rSound[ 0 ].strファイル名 ),\r
+                                                           db位置ms, n位置byte,\r
+                                                           wc.rSound[ 0 ].n総演奏時間ms\r
+                                                       );\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
                public void tWavの再生停止( int nWaveの内部番号 )\r
                {\r
                        tWavの再生停止( nWaveの内部番号, false );\r
index 1d27bc6..0a4f5e3 100644 (file)
@@ -56,12 +56,12 @@ namespace DTXMania
                                //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Frame:         {0:####0} fps", CDTXMania.FPS.n現在のFPS ) );\r
                                CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Frame:         {0} fps", CDTXMania.FPS.n現在のFPS ) );\r
                                y -= 0x10 * 2;\r
-                               CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound CPU :    {0:####0.00}%", CDTXMania.Sound管理.GetCPUusage() ) );\r
-                               y -= 0x10 * 2;\r
-                               CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Mixing:  {0:####0}", CDTXMania.Sound管理.GetMixingStreams() ) );\r
-                               y -= 0x10 * 2;\r
-                               CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Streams: {0:####0}", CDTXMania.Sound管理.GetStreams() ) );\r
-                               y -= 0x10 * 2;\r
+                               //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound CPU :    {0:####0.00}%", CDTXMania.Sound管理.GetCPUusage() ) );\r
+                               //y -= 0x10 * 2;\r
+                               //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Mixing:  {0:####0}", CDTXMania.Sound管理.GetMixingStreams() ) );\r
+                               //y -= 0x10 * 2;\r
+                               //CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.白, string.Format( "Sound Streams: {0:####0}", CDTXMania.Sound管理.GetStreams() ) );\r
+                               //y -= 0x10 * 2;\r
                        }\r
                }\r
        }\r
index bcba1c1..3eeeb1a 100644 (file)
@@ -1846,6 +1846,8 @@ namespace DTXMania
                                                        pChip.bHit = true;\r
                                                        if ( configIni.bBGM音を発声する )\r
                                                        {\r
+//long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;\r
+//Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );\r
                                                                dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
                                                        }\r
                                                }\r
index 506bcad..0b74239 100644 (file)
@@ -2436,6 +2436,11 @@ namespace DTXMania
                                {\r
                                        dTX.tWave再生位置自動補正();\r
                                }\r
+//#if DEBUG\r
+//                {\r
+//                    dTX.tWaveBGM再生位置表示();                //デバッグ用\r
+//                }\r
+//#endif\r
                        }\r
                        #region [ Drumsの小節線と、小節番号 ]\r
                        if ( configIni.bDrums有効 )\r
index 563a2f1..881e870 100644 (file)
@@ -1207,16 +1207,20 @@ Debug.WriteLine("更に再生に失敗: " + Path.GetFileName(this.strファイ
                                }\r
                                catch( Exception e )\r
                                {\r
-                                       Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + e.ToString() );\r
+                                       Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + e.ToString() + ": " + n位置ms + "ms" );\r
                                }\r
                                finally\r
                                {\r
                                        if ( !b )\r
                                        {\r
                                                BASSError be = Bass.BASS_ErrorGetCode();\r
-                                               Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + be.ToString() );\r
+                                               Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seek error: " + be.ToString() + ": " + n位置ms + "MS" );\r
                                        }\r
                                }\r
+                               //if ( this.n総演奏時間ms > 5000 )\r
+                               //{\r
+                               //    Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seeked to " + n位置ms + "ms = " + Bass.BASS_ChannelSeconds2Bytes( this.hBassStream, n位置ms * this.db周波数倍率 * this.db再生速度 / 1000.0 ) );\r
+                               //}\r
                        }\r
                        else if( this.bDirectSoundである )\r
                        {\r
@@ -1229,9 +1233,37 @@ Debug.WriteLine("更に再生に失敗: " + Path.GetFileName(this.strファイ
                                {\r
                                        Trace.TraceError( "{0}: Seek error: {1}", Path.GetFileName( this.strファイル名 ), n位置ms, e.Message );\r
                                }\r
+                               //if ( this.n総演奏時間ms > 5000 )\r
+                               //{\r
+                               //    Trace.TraceInformation( Path.GetFileName( this.strファイル名 ) + ": Seeked to " + n位置ms + "ms = " + n位置sample );\r
+                               //}\r
+                       }\r
+               }\r
+               /// <summary>\r
+               /// デバッグ用\r
+               /// </summary>\r
+               /// <param name="n位置byte"></param>\r
+               /// <param name="db位置ms"></param>\r
+               public void t再生位置を取得する( out long n位置byte, out double db位置ms )\r
+               {\r
+                       if ( this.bBASSサウンドである )\r
+                       {\r
+                               n位置byte = BassMix.BASS_Mixer_ChannelGetPosition( this.hBassStream );\r
+                               db位置ms = Bass.BASS_ChannelBytes2Seconds( this.hBassStream, n位置byte );\r
+                       }\r
+                       else if ( this.bDirectSoundである )\r
+                       {\r
+                               n位置byte = this.Buffer.CurrentPlayPosition;\r
+                               db位置ms = n位置byte / this.Buffer.Format.SamplesPerSecond / 0.001 / _db周波数倍率 / _db再生速度;\r
+                       }\r
+                       else\r
+                       {\r
+                               n位置byte = 0;\r
+                               db位置ms = 0.0;\r
                        }\r
                }\r
 \r
+\r
                public static void tすべてのサウンドを初期状態に戻す()\r
                {\r
                        foreach ( var sound in CSound.listインスタンス )\r
@@ -1451,11 +1483,25 @@ Debug.WriteLine("更に再生に失敗: " + Path.GetFileName(this.strファイ
 \r
                private void tBASSサウンドを作成する( string strファイル名, int hMixer, BASSFlag flags )\r
                {\r
-                       if ( String.Compare( Path.GetExtension( strファイル名 ), ".xa", true ) == 0 )      // caselessで文字列比較\r
+                       #region [ xaとwav(RIFF chunked vorbis)に対しては専用の処理をする ]\r
+                       switch ( Path.GetExtension( strファイル名 ) )\r
                        {\r
-                               tBASSサウンドを作成するXA( strファイル名, hMixer, flags );\r
-                               return;\r
+                               case ".xa":\r
+                                       tBASSサウンドを作成するXA( strファイル名, hMixer, flags );\r
+                                       return;\r
+\r
+                               case ".wav":\r
+                                       if ( tRIFFchunkedVorbisならDirectShowでDecodeする( strファイル名, ref byArrWAVファイルイメージ ) )\r
+                                       {\r
+                                               tBASSサウンドを作成する( byArrWAVファイルイメージ, hMixer, flags );\r
+                                               return;\r
+                                       }\r
+                                       break;\r
+\r
+                               default:\r
+                                       break;\r
                        }\r
+                       #endregion\r
 \r
                        this.e作成方法 = E作成方法.ファイルから;\r
                        this.strファイル名 = strファイル名;\r
@@ -1488,6 +1534,43 @@ Debug.WriteLine("更に再生に失敗: " + Path.GetFileName(this.strファイ
        \r
                        tBASSサウンドを作成する・ストリーム生成後の共通処理( hMixer );\r
                }\r
+\r
+               /// <summary>\r
+               /// Decode "RIFF chunked Vorbis" to "raw wave"\r
+               /// because BASE.DLL has two problems for RIFF chunked Vorbis;\r
+               /// 1. time seek is not fine  2. delay occurs (about 10ms)\r
+               /// </summary>\r
+               /// <param name="strファイル名">wave filename</param>\r
+               /// <param name="byArrWAVファイルイメージ">wav file image</param>\r
+               /// <returns></returns>\r
+               private bool tRIFFchunkedVorbisならDirectShowでDecodeする( string strファイル名, ref byte[] byArrWAVファイルイメージ )\r
+               {\r
+                       bool bファイルにVorbisコンテナが含まれている = false;\r
+\r
+                       #region [ ファイルがWAVかつ、Vorbisコンテナが含まれているかを調べ、それに該当するなら、DirectShowでデコードする。]\r
+                       //-----------------\r
+                       try\r
+                       {\r
+                               using ( var ws = new WaveStream( strファイル名 ) )\r
+                               {\r
+                                       if ( ws.Format.FormatTag == (WaveFormatTag) 0x6770 ||   // Ogg Vorbis Mode 2+\r
+                                                ws.Format.FormatTag == (WaveFormatTag) 0x6771 )        // Ogg Vorbis Mode 3+\r
+                                       {\r
+                                               Trace.TraceInformation( Path.GetFileName( strファイル名 ) + ": RIFF chunked Vorbis. Decode to raw Wave first, to avoid BASS.DLL troubles" );\r
+                                               CDStoWAVFileImage.t変換( strファイル名, out byArrWAVファイルイメージ );\r
+                                               bファイルにVorbisコンテナが含まれている = true;\r
+                                       }\r
+                               }\r
+                       }\r
+                       catch\r
+                       {\r
+                               Trace.TraceWarning( "Error: " + Path.GetFileName( strファイル名 ) + " : RIFF chunked Vorbisのデコードに失敗しました。" );\r
+                       }\r
+                       #endregion\r
+\r
+                       return bファイルにVorbisコンテナが含まれている;\r
+               }\r
+\r
                private void tBASSサウンドを作成するXA( string strファイル名, int hMixer, BASSFlag flags )\r
                {\r
                        int nPCMデータの先頭インデックス;\r
index 19ae174..e4895ca 100644 (file)
Binary files a/実行時フォルダ(DTXCreator)/dll/FDK.dll and b/実行時フォルダ(DTXCreator)/dll/FDK.dll differ
index d44bd67..dc38d91 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 19ae174..e4895ca 100644 (file)
Binary files a/実行時フォルダ/dll/FDK.dll and b/実行時フォルダ/dll/FDK.dll differ