<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
// " 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
// 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
#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
// 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
// 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
// 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
\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
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
{\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
{\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
// 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
// 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
//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
//{\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
Trace.TraceInformation( "サウンドデバイスの初期化を行います。" );\r
Trace.Indent();\r
try\r
- { \r
+ {\r
ESoundDeviceType soundDeviceType;\r
switch ( CDTXMania.ConfigIni.nSoundDeviceType )\r
{\r
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
// 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
/// <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
//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
}\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