OSDN Git Service

#33689 CONFIGURATION/System/UseOSTimer で、WASAPI/ASIO時の演奏タイマーの種類を選択できるようにした。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Tue, 17 Jun 2014 16:22:46 +0000 (16:22 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Tue, 17 Jun 2014 16:22:46 +0000 (16:22 +0000)
OFFにすると従来通りFDKの独自タイマーを使い、音ズレはないが、スクロールががたつく。
ONにすると、この反対になる。ただしONの時に限り、AdjustWavesと併用可能としたため、これで音ズレは吸収できるはず。

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/branches/140113(DTXMania098%20with%2028821%20DTXVmode)@722 16f42ceb-6dc6-49c8-ba94-f2d53467949d

12 files changed:
DTXManiaプロジェクト/DTXManiaプロジェクト.csproj
DTXManiaプロジェクト/コード/ステージ/04.コンフィグ/CActConfigList.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CStage演奏画面共通.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/ギター画面/CStage演奏ギター画面.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/ドラム画面/CStage演奏ドラム画面.cs
DTXManiaプロジェクト/コード/全体/CConfigIni.cs
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
FDK17プロジェクト/コード/03.サウンド/CSound.cs
FDK17プロジェクト/コード/03.サウンド/CSoundTimer.cs
実行時フォルダ(DTXCreator)/dll/FDK.dll
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/dll/FDK.dll

index f7b045b..5438450 100644 (file)
@@ -39,7 +39,7 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">\r
     <DebugSymbols>true</DebugSymbols>\r
     <OutputPath>bin\x86\Debug\</OutputPath>\r
-    <DefineConstants>TRACE;DEBUG;_TEST_ENGLISH_ TEST_Direct3D9Ex_ _WindowedFullscreen</DefineConstants>\r
+    <DefineConstants>TRACE;DEBUG;_TEST_ENGLISH TEST_Direct3D9Ex_ _WindowedFullscreen</DefineConstants>\r
     <DebugType>full</DebugType>\r
     <PlatformTarget>x86</PlatformTarget>\r
     <ErrorReport>prompt</ErrorReport>\r
index 2c472a5..283d14a 100644 (file)
@@ -346,6 +346,33 @@ namespace DTXMania
                        //    "     the setting take effect." );\r
                        //this.list項目リスト.Add( this.iSystemASIOBufferSizeMs );\r
 \r
+                       // #33689 2014.6.17 yyagi\r
+                       this.iSystemSoundTimerType = new CItemToggle( "UseOSTimer", CDTXMania.ConfigIni.bUseOSTimer,\r
+                               "OSタイマーを使用するかどうか:\n" +\r
+                               "演奏タイマーとして、DTXMania独自の\n" +\r
+                               "タイマーを使うか、OS標準のタイマー\n" +\r
+                               "を使うかを選択します。\n" +\r
+                               "OS標準タイマーを使うとスクロールが\n" +\r
+                               "滑らかになりますが、演奏で音ズレが\n" +\r
+                               "発生することがあります。(そのため\n" +\r
+                               "AdjustWavesの効果が適用されます。)\n" +\r
+                               "\n" +\r
+                               "この指定はWASAPI/ASIO使用時のみ有効\n" +\r
+                               "です。\n",\r
+                               "Use OS Timer or not:\n" +\r
+                               "If this settings is ON, DTXMania uses\n" +\r
+                               "OS Standard timer. It brings smooth\n" +\r
+                               "scroll, but may cause some sound lag.\n" +\r
+                               "(so AdjustWaves is also avilable)\n" +\r
+                               "\n" +\r
+                               "If OFF, DTXMania uses its original\n" +\r
+                               "timer and the effect is vice versa.\n" +\r
+                               "\n" +\r
+                               "This settings is avilable only when\n" +\r
+                               "you uses WASAPI/ASIO.\n"\r
+                       );\r
+                       this.list項目リスト.Add( this.iSystemSoundTimerType );\r
+\r
                        // #33700 2013.1.3 yyagi\r
                        this.iSystemMasterVolume = new CItemInteger( "MasterVolume", 0, 100, CDTXMania.ConfigIni.nMasterVolume,\r
                                "マスターボリュームの設定:\n" +\r
@@ -1725,6 +1752,7 @@ namespace DTXMania
                        // this.iSystemWASAPIBufferSizeMs_initial       = this.iSystemWASAPIBufferSizeMs.n現在の値;                         // CONFIG脱出時にこの値から変更されているようなら\r
                        // this.iSystemASIOBufferSizeMs_initial = this.iSystemASIOBufferSizeMs.n現在の値;                           // サウンドデバイスを再構築する\r
                        this.iSystemASIODevice_initial                  = this.iSystemASIODevice.n現在選択されている項目番号;      //\r
+                       this.iSystemSoundTimerType_initial      = this.iSystemSoundTimerType.GetIndex();                                //\r
                        base.On活性化();\r
                }\r
                public override void On非活性化()\r
@@ -1745,11 +1773,13 @@ namespace DTXMania
                        #endregion\r
 \r
                        // #24820 2013.1.22 yyagi CONFIGでWASAPI/ASIO/DirectSound関連の設定を変更した場合、サウンドデバイスを再構築する。\r
+                       // #33689 2014.6.17 yyagi CONFIGでSoundTimerTypeの設定を変更した場合も、サウンドデバイスを再構築する。\r
                        #region [ サウンドデバイス変更 ]\r
                        if ( this.iSystemSoundType_initial != this.iSystemSoundType.n現在選択されている項目番号 ||\r
                                // this.iSystemWASAPIBufferSizeMs_initial != this.iSystemWASAPIBufferSizeMs.n現在の値 ||\r
                                // this.iSystemASIOBufferSizeMs_initial != this.iSystemASIOBufferSizeMs.n現在の値 ||\r
-                               this.iSystemASIODevice_initial != this.iSystemASIODevice.n現在選択されている項目番号 )\r
+                               this.iSystemASIODevice_initial != this.iSystemASIODevice.n現在選択されている項目番号 ||\r
+                               this.iSystemSoundTimerType_initial != this.iSystemSoundTimerType.GetIndex() )\r
                        {\r
                                ESoundDeviceType soundDeviceType;\r
                                switch ( this.iSystemSoundType.n現在選択されている項目番号 )\r
@@ -1773,7 +1803,8 @@ namespace DTXMania
                                                                                // this.iSystemWASAPIBufferSizeMs.n現在の値,\r
                                                                                0,\r
                                                                                // this.iSystemASIOBufferSizeMs.n現在の値,\r
-                                                                               this.iSystemASIODevice.n現在選択されている項目番号 );\r
+                                                                               this.iSystemASIODevice.n現在選択されている項目番号,\r
+                                                                               this.iSystemSoundTimerType.bON );\r
                                CDTXMania.app.ShowWindowTitleWithSoundType();\r
                        }\r
                        #endregion\r
@@ -2194,6 +2225,8 @@ namespace DTXMania
 //             private int iSystemWASAPIBufferSizeMs_initial;\r
 //             private int iSystemASIOBufferSizeMs_initial;\r
                private int iSystemASIODevice_initial;\r
+               private CItemToggle iSystemSoundTimerType;                      // #33689 2014.6.17 yyagi\r
+               private int iSystemSoundTimerType_initial;                      // #33689 2014.6.17 yyagi\r
 \r
                private CItemToggle iSystemTimeStretch;                         // #23664 2013.2.24 yyagi\r
 \r
@@ -2401,6 +2434,7 @@ namespace DTXMania
 //                     CDTXMania.ConfigIni.nWASAPIBufferSizeMs = this.iSystemWASAPIBufferSizeMs.n現在の値;                         // #24820 2013.1.15 yyagi\r
 //                     CDTXMania.ConfigIni.nASIOBufferSizeMs = this.iSystemASIOBufferSizeMs.n現在の値;                                     // #24820 2013.1.3 yyagi\r
                        CDTXMania.ConfigIni.nASIODevice = this.iSystemASIODevice.n現在選択されている項目番号;                      // #24820 2013.1.17 yyagi\r
+                       CDTXMania.ConfigIni.bUseOSTimer = this.iSystemSoundTimerType.bON;                                                               // #33689 2014.6.17 yyagi\r
 \r
                        CDTXMania.ConfigIni.bTimeStretch = this.iSystemTimeStretch.bON;                                                                 // #23664 2013.2.24 yyagi\r
 //Trace.TraceInformation( "saved" );\r
index c184727..9f7d3ca 100644 (file)
@@ -296,6 +296,7 @@ namespace DTXMania
 \r
                        queueMixerSound = new Queue<stmixer>( 64 );\r
                        bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
+                       bUseOSTimer = CDTXMania.ConfigIni.bUseOSTimer;\r
                        this.bPAUSE = false;\r
                        if ( CDTXMania.DTXVmode.Enabled )\r
                        {\r
@@ -642,6 +643,7 @@ namespace DTXMania
                protected List<CDTX.CChip> listChip;\r
                protected Dictionary<int, CDTX.CWAV> listWAV;\r
                protected CInvisibleChip cInvisibleChip;\r
+               protected bool bUseOSTimer;\r
 \r
                protected Stopwatch sw;         // 2011.6.13 最適化検討用のストップウォッチ\r
                protected Stopwatch sw2;\r
index 7b1e928..3d3696f 100644 (file)
@@ -718,7 +718,7 @@ namespace DTXMania
                        {\r
                                pChip.bHit = true;\r
                                this.actPlayInfo.n小節番号 = n小節番号plus1 - 1;\r
-                               if ( configIni.bWave再生位置自動調整機能有効 && bIsDirectSound )\r
+                               if ( configIni.bWave再生位置自動調整機能有効 && ( bIsDirectSound || bUseOSTimer ) )\r
                                {\r
                                        dTX.tWave再生位置自動補正();\r
                                }\r
index bfc4360..6a01232 100644 (file)
@@ -2415,7 +2415,7 @@ Trace.TraceInformation( "rc演奏用タイマ.n現在時刻=" + CSound管理.rc
                        {\r
                                pChip.bHit = true;\r
                                this.actPlayInfo.n小節番号 = n小節番号plus1 - 1;\r
-                               if ( configIni.bWave再生位置自動調整機能有効 && bIsDirectSound )\r
+                               if ( configIni.bWave再生位置自動調整機能有効 && ( bIsDirectSound || bUseOSTimer ) )\r
                                {\r
                                        dTX.tWave再生位置自動補正();\r
                                }\r
index d498572..71476c9 100644 (file)
@@ -665,6 +665,7 @@ namespace DTXMania
 //             public int nWASAPIBufferSizeMs;                         // #24820 2013.1.15 yyagi WASAPIのバッファサイズ\r
 //             public int nASIOBufferSizeMs;                           // #24820 2012.12.28 yyagi ASIOのバッファサイズ\r
                public int nASIODevice;                                         // #24820 2013.1.17 yyagi ASIOデバイス\r
+               public bool bUseOSTimer;                                        // #33689 2014.6.6 yyagi 演奏タイマーの種類\r
                public bool bDynamicBassMixerManagement;        // #24820\r
                public bool bTimeStretch;                                       // #23664 2013.2.24 yyagi ピッチ変更無しで再生速度を変更するかどうか\r
                public STDGBVALUE<EInvisible> eInvisible;       // #32072 2013.9.20 yyagi チップを非表示にする\r
@@ -1166,6 +1167,7 @@ namespace DTXMania
 //                     this.nWASAPIBufferSizeMs = 0;                           // #24820 2013.1.15 yyagi 初期値は0(自動設定)\r
                        this.nASIODevice = 0;                                           // #24820 2013.1.17 yyagi\r
 //                     this.nASIOBufferSizeMs = 0;                                     // #24820 2012.12.25 yyagi 初期値は0(自動設定)\r
+                       this.bUseOSTimer = false;;                                      // #33689 2014.6.6 yyagi 初期値はfalse (FDKのタイマー。FROM氏考案の独自タイマー)\r
                        this.bDynamicBassMixerManagement = true;        //\r
                        this.bTimeStretch = false;                                      // #23664 2013.2.24 yyagi 初期値はfalse (再生速度変更を、ピッチ変更にて行う)\r
                        this.nDisplayTimesMs = 3000;                            // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップ再表示期間\r
@@ -1358,12 +1360,19 @@ namespace DTXMania
                        //sw.WriteLine( "DynamicBassMixerManagement={0}", this.bDynamicBassMixerManagement ? 1 : 0 );\r
                        //sw.WriteLine();\r
 \r
+                       sw.WriteLine( "; WASAPI/ASIO時に使用する演奏タイマーの種類" );\r
+                       sw.WriteLine( "; Playback timer used for WASAPI/ASIO" );\r
+                       sw.WriteLine( "; (0=FDK Timer, 1=System Timer)" );\r
+                       sw.WriteLine( "SoundTimerType={0}", this.bUseOSTimer ? 1 : 0 );\r
+                       sw.WriteLine();\r
+\r
                        sw.WriteLine( "; 全体ボリュームの設定" );\r
                        sw.WriteLine( "; (0=無音 ~ 100=最大。WASAPI/ASIO時のみ有効)" );\r
                        sw.WriteLine( "; Master volume settings" );\r
                        sw.WriteLine( "; (0=Silent - 100=Max)" );\r
                        sw.WriteLine( "MasterVolume={0}", this.nMasterVolume );\r
                        sw.WriteLine();\r
+\r
                        #endregion\r
                        #region [ ギター/ベース/ドラム 有効/無効 ]\r
                        sw.WriteLine( "; ギター/ベース有効(0:OFF,1:ON)" );\r
@@ -2199,6 +2208,10 @@ namespace DTXMania
                                                                                        //{\r
                                                                                        //    this.bDynamicBassMixerManagement = C変換.bONorOFF( str4[ 0 ] );\r
                                                                                        //}\r
+                                                                                       else if ( str3.Equals( "SoundTimerType" ) )                     // #33689 2014.6.6 yyagi\r
+                                                                                       {\r
+                                                                                               this.bUseOSTimer = C変換.bONorOFF( str4[ 0 ] );\r
+                                                                                       }\r
                                                                                        else if ( str3.Equals( "MasterVolume" ) )\r
                                                                                        {\r
                                                                                                this.nMasterVolume = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 100, this.nMasterVolume );\r
index 7a29234..e7d37bb 100644 (file)
@@ -2102,7 +2102,7 @@ for (int i = 0; i < 3; i++) {
                        Trace.TraceInformation( "サウンドデバイスの初期化を行います。" );\r
                        Trace.Indent();\r
                        try\r
-                       {                               \r
+                       {\r
                                ESoundDeviceType soundDeviceType;\r
                                switch ( CDTXMania.ConfigIni.nSoundDeviceType )\r
                                {\r
@@ -2125,7 +2125,8 @@ for (int i = 0; i < 3; i++) {
                                                                                        0,\r
                                        // CDTXMania.ConfigIni.nASIOBufferSizeMs,\r
                                                                                        0,\r
-                                                                                       CDTXMania.ConfigIni.nASIODevice\r
+                                                                                       CDTXMania.ConfigIni.nASIODevice,\r
+                                                                                       CDTXMania.ConfigIni.bUseOSTimer\r
                                );\r
                                //Sound管理 = FDK.CSound管理.Instance;\r
                                //Sound管理.t初期化( soundDeviceType, 0, 0, CDTXMania.ConfigIni.nASIODevice, base.Window.Handle );\r
index 25c2f88..7b263ba 100644 (file)
@@ -34,6 +34,9 @@ namespace FDK
                                                                                                        // DTXC(DirectSound)でCSoundTimerを使うと、内部で無音のループサウンドを再生するため\r
                                                                                                        // サウンドデバイスを占有してしまい、Viewerとして呼び出されるDTXManiaで、ASIOが使えなくなる。\r
 \r
+                                                                                                       // DTXMania単体でこれをtrueにすると、WASAPI/ASIO時に演奏タイマーとしてFDKタイマーではなく\r
+                                                                                                       // システムのタイマーを使うようになる。こうするとスクロールは滑らかになるが、音ズレが出るかもしれない。\r
+               \r
                public static IntPtr WindowHandle;\r
 \r
                public static bool bIsTimeStretch = false;\r
@@ -204,12 +207,13 @@ namespace FDK
                /// <param name="nSoundDelayExclusiveWASAPI"></param>\r
                /// <param name="nSoundDelayASIO"></param>\r
                /// <param name="nASIODevice"></param>\r
-               public CSound管理( IntPtr handle, ESoundDeviceType soundDeviceType, int nSoundDelayExclusiveWASAPI, int nSoundDelayASIO, int nASIODevice )\r
+               public CSound管理( IntPtr handle, ESoundDeviceType soundDeviceType, int nSoundDelayExclusiveWASAPI, int nSoundDelayASIO, int nASIODevice, bool _bUseOSTimer )\r
                {\r
                        WindowHandle = handle;\r
                        SoundDevice = null;\r
-                       bUseOSTimer = false;\r
-                       t初期化( soundDeviceType, nSoundDelayExclusiveWASAPI, nSoundDelayASIO, nASIODevice );\r
+                       bUseOSTimer = _bUseOSTimer;\r
+                       //bUseOSTimer = false;\r
+                       t初期化( soundDeviceType, nSoundDelayExclusiveWASAPI, nSoundDelayASIO, nASIODevice, _bUseOSTimer );\r
                }\r
                public void Dispose()\r
                {\r
@@ -230,9 +234,13 @@ namespace FDK
                                //bInitialized = true;\r
                        }\r
                }\r
-\r
                public void t初期化( ESoundDeviceType soundDeviceType, int _nSoundDelayExclusiveWASAPI, int _nSoundDelayASIO, int _nASIODevice )\r
                {\r
+                       t初期化( soundDeviceType, _nSoundDelayExclusiveWASAPI, _nSoundDelayASIO, _nASIODevice, false );\r
+               }\r
+\r
+               public void t初期化( ESoundDeviceType soundDeviceType, int _nSoundDelayExclusiveWASAPI, int _nSoundDelayASIO, int _nASIODevice, bool bUseOSTimer )\r
+               {\r
                        //SoundDevice = null;                                           // 後で再初期化することがあるので、null初期化はコンストラクタに回す\r
                        rc演奏用タイマ = null;                                            // Global.Bass 依存(つまりユーザ依存)\r
                        nMixing = 0;\r
index 1f5e8fa..d5aa3ee 100644 (file)
@@ -42,9 +42,16 @@ namespace FDK
                                        }\r
                                        else\r
                                        {\r
-                                               return this.Device.n経過時間ms\r
-                                                       + ( this.Device.tmシステムタイマ.nシステム時刻ms - this.Device.n経過時間を更新したシステム時刻ms );\r
-                                               //return ctDInputTimer.nシステム時刻ms;                           // 仮にCSoundTimerをCTimer相当の動作にしてみた\r
+                                               if ( FDK.CSound管理.bUseOSTimer )\r
+                                               //if ( true )\r
+                                               {\r
+                                                       return ctDInputTimer.nシステム時刻ms;                             // 仮にCSoundTimerをCTimer相当の動作にしてみた\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       return this.Device.n経過時間ms\r
+                                                               + ( this.Device.tmシステムタイマ.nシステム時刻ms - this.Device.n経過時間を更新したシステム時刻ms );\r
+                                               }\r
                                        }\r
                                }\r
                                else if( this.Device.e出力デバイス == ESoundDeviceType.DirectSound )\r
index 6b1beef..c219214 100644 (file)
Binary files a/実行時フォルダ(DTXCreator)/dll/FDK.dll and b/実行時フォルダ(DTXCreator)/dll/FDK.dll differ
index 5a0abbe..404d415 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 6b1beef..c219214 100644 (file)
Binary files a/実行時フォルダ/dll/FDK.dll and b/実行時フォルダ/dll/FDK.dll differ