修订版 | 28baac6e6ca524066756b45069492e0e51f14691 (tree) |
---|---|
时间 | 2017-06-19 23:24:22 |
作者 | yyagi <yyagi.dtxmania@gmai...> |
Commiter | yyagi |
#37243 WASAPI排他/共有をどちらも不自然な挙動なく設定できるよう修正。更新間隔を排他時はminperiodに、共有時はdefperiodにしたうえで、バッファ量を少なくとも更新間隔+1msとしてBASS_WASAPI_Iniit()に投げるようにした。
#xxxxx 演奏画面での各フレームの時間測定のためのテストコードを追加。(DTXManiaのプロジェクトでTEST_MEASUREFRAMEDRAWTIMEを有効にすることで、演奏画面を抜ける際にlogに出力する)
#xxxxx readmeを更新。
@@ -42,7 +42,7 @@ | ||
42 | 42 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> |
43 | 43 | <DebugSymbols>true</DebugSymbols> |
44 | 44 | <OutputPath>bin\x86\Debug\</OutputPath> |
45 | - <DefineConstants>TRACE;DEBUG;_TEST_ENGLISH TEST_Direct3D9Ex_ WindowedFullscreen</DefineConstants> | |
45 | + <DefineConstants>TRACE;DEBUG;_TEST_ENGLISH TEST_Direct3D9Ex_ WindowedFullscreen TEST_MEASUREFRAMEDRAWTIME_</DefineConstants> | |
46 | 46 | <DebugType>full</DebugType> |
47 | 47 | <PlatformTarget>x86</PlatformTarget> |
48 | 48 | <ErrorReport>prompt</ErrorReport> |
@@ -8,6 +8,8 @@ using System.Drawing.Imaging; | ||
8 | 8 | using System.IO; |
9 | 9 | using System.Diagnostics; |
10 | 10 | using System.Threading; |
11 | +using System.Threading.Tasks; | |
12 | + | |
11 | 13 | using SharpDX; |
12 | 14 | using SharpDX.Direct3D9; |
13 | 15 | using FDK; |
@@ -102,6 +104,12 @@ namespace DTXMania | ||
102 | 104 | |
103 | 105 | STDGBSValue<CScoreIni.C演奏記録> record; |
104 | 106 | |
107 | +#if TEST_MEASUREFRAMEDRAWTIME | |
108 | + Stopwatch sw = new Stopwatch(); | |
109 | + List<long> swlist = new List<long>(100000); | |
110 | + List<long> tmlist = new List<long>(100000); | |
111 | +#endif | |
112 | + | |
105 | 113 | public CStage演奏画面共通() |
106 | 114 | { |
107 | 115 | base.eステージID = CStage.Eステージ.演奏; |
@@ -500,6 +508,15 @@ namespace DTXMania | ||
500 | 508 | strPanel += " (" + strLabel + ")"; |
501 | 509 | } |
502 | 510 | this.actPanel.SetPanelString( strPanel ); |
511 | + | |
512 | +#if TEST_MEASUREFRAMEDRAWTIME | |
513 | + swlist.Clear(); | |
514 | + swlist.Capacity = 100000; | |
515 | + sw.Reset(); | |
516 | + sw.Start(); | |
517 | + tmlist.Clear(); | |
518 | + tmlist.Capacity = 100000; | |
519 | +#endif | |
503 | 520 | } |
504 | 521 | } |
505 | 522 | public override void On非活性化() |
@@ -523,6 +540,27 @@ namespace DTXMania | ||
523 | 540 | cInvisibleChip.Dispose(); |
524 | 541 | cInvisibleChip = null; |
525 | 542 | base.On非活性化(); |
543 | + | |
544 | +#if TEST_MEASUREFRAMEDRAWTIME | |
545 | + sw.Stop(); | |
546 | + Trace.TraceInformation("Freq={0:F10}", Stopwatch.Frequency); | |
547 | + Trace.TraceInformation("IsHighResolution=" + Stopwatch.IsHighResolution); | |
548 | + Trace.TraceInformation("Count=" + swlist.Count ); | |
549 | + double last_d = 0; | |
550 | + long last_t = 0; | |
551 | + int p = 0; | |
552 | + foreach (long l in swlist) | |
553 | + { | |
554 | + double d = (double)l / Stopwatch.Frequency; | |
555 | + double d2 = d - last_d; | |
556 | + long t = tmlist[p++]; | |
557 | + long t2 = t - last_t; | |
558 | + Trace.TraceInformation("{0:F10}, {1:F10}, {2:d6}, {3:d3}", d, d2, t, t2); | |
559 | + last_d = d; | |
560 | + last_t = t; | |
561 | + } | |
562 | + swlist.Clear(); | |
563 | +#endif | |
526 | 564 | } |
527 | 565 | } |
528 | 566 | public override void OnManagedリソースの作成() |
@@ -779,6 +817,11 @@ namespace DTXMania | ||
779 | 817 | { |
780 | 818 | this.tキー入力(); |
781 | 819 | } |
820 | + | |
821 | +#if TEST_MEASUREFRAMEDRAWTIME | |
822 | + swlist.Add(sw.ElapsedTicks); | |
823 | + tmlist.Add(CSound管理.rc演奏用タイマ.n現在時刻ms); | |
824 | +#endif | |
782 | 825 | } |
783 | 826 | return 0; |
784 | 827 | } |
@@ -835,11 +878,17 @@ namespace DTXMania | ||
835 | 878 | STMixer stm = queueMixerSound.Dequeue(); |
836 | 879 | if (stm.bIsAdd) |
837 | 880 | { |
838 | - CDTXMania.Instance.Sound管理.AddMixer(stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである); | |
881 | + // var task = Task.Run(() => | |
882 | + // { | |
883 | + CDTXMania.Instance.Sound管理.AddMixer(stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである); | |
884 | + // }); | |
839 | 885 | } |
840 | 886 | else |
841 | 887 | { |
842 | - CDTXMania.Instance.Sound管理.RemoveMixer(stm.csound); | |
888 | + // var task = Task.Run(() => | |
889 | + // { | |
890 | + CDTXMania.Instance.Sound管理.RemoveMixer(stm.csound); | |
891 | + // }); | |
843 | 892 | } |
844 | 893 | } |
845 | 894 | } |
@@ -138,12 +138,12 @@ namespace FDK | ||
138 | 138 | /// <para>排他WASAPIバッファの更新間隔。出力間隔ではないので注意。</para> |
139 | 139 | /// <para>→ 自動設定されるのでSoundDelay よりも小さい値であること。(小さすぎる場合はBASSによって自動修正される。)</para> |
140 | 140 | /// </summary> |
141 | - public static int SoundUpdatePeriodExclusiveWASAPI = 6; | |
141 | + public static int SoundUpdatePeriodExclusiveWASAPI = 1; | |
142 | 142 | /// <summary> |
143 | 143 | /// <para>共有WASAPIバッファの更新間隔。出力間隔ではないので注意。</para> |
144 | 144 | /// <para>SoundDelay よりも小さい値であること。(小さすぎる場合はBASSによって自動修正される。)</para> |
145 | 145 | /// </summary> |
146 | - public static int SoundUpdatePeriodSharedWASAPI = 6; | |
146 | + public static int SoundUpdatePeriodSharedWASAPI = 10; | |
147 | 147 | /// <summary> |
148 | 148 | /// WASAPI利用時に、サウンドバッファの更新をevent drivenにするか、pollingにするかの設定。 |
149 | 149 | /// デフォルト設定はpolling。event drivenにすることで、よりラグを小さくできるが、CPU負荷は若干上昇する。 |
@@ -227,17 +227,15 @@ namespace FDK | ||
227 | 227 | |
228 | 228 | // Trace.TraceInformation( "Selected Default WASAPI Device: {0}", deviceInfo.name ); |
229 | 229 | // Trace.TraceInformation( "MinPeriod={0}, DefaultPeriod={1}", deviceInfo.minperiod, deviceInfo.defperiod ); |
230 | - //n更新間隔ms = (long) ( deviceInfo.minperiod * 1000 ); | |
231 | 230 | |
232 | - n更新間隔ms = Convert.ToInt64(Math.Ceiling(deviceInfo.minperiod * 1000.0f)); | |
231 | + // n更新間隔ms = ( mode == Eデバイスモード.排他 )? Convert.ToInt64(Math.Ceiling(deviceInfo.minperiod * 1000.0f)) : Convert.ToInt64(Math.Ceiling(deviceInfo.defperiod * 1000.0f)); | |
232 | + // 更新間隔として、WASAPI排他時はminperiodより大きい最小のms値を、WASAPI共有時はdefperiodより大きい最小のms値を用いる | |
233 | + // Win10では、更新間隔がminperiod以下だと、確実にBASS_ERROR_UNKNOWNとなる。 | |
233 | 234 | |
234 | - //n更新間隔ms = Convert.ToInt64((deviceInfo.minperiod + 0.0005) * 1000.0f); // Win10では、更新間隔がminperiod以下だと、確実にBASS_ERROR_UNKNOWN | |
235 | - //n更新間隔ms = Convert.ToInt64((deviceInfo.defperiod + 0.0005) * 1000.0f); // Win10では、更新間隔がminperiod以下だと、確実にBASS_ERROR_UNKNOWN | |
236 | - | |
237 | - if ( n希望バッファサイズms <= 0 || n希望バッファサイズms < n更新間隔ms + 1 ) | |
238 | - { | |
239 | - n希望バッファサイズms = n更新間隔ms + 1; // 2013.4.25 #31237 yyagi; バッファサイズ設定の完全自動化。更新間隔=バッファサイズにするとBASS_ERROR_UNKNOWNになるので+1する。 | |
240 | - } | |
235 | + //if ( n希望バッファサイズms <= 0 || n希望バッファサイズms < n更新間隔ms + 1 ) | |
236 | + //{ | |
237 | + // n希望バッファサイズms = n更新間隔ms + 1; // 2013.4.25 #31237 yyagi; バッファサイズ設定の完全自動化。更新間隔=バッファサイズにするとBASS_ERROR_UNKNOWNになるので+1する。 | |
238 | + //} | |
241 | 239 | } |
242 | 240 | else |
243 | 241 | { |
@@ -273,10 +271,29 @@ namespace FDK | ||
273 | 271 | } |
274 | 272 | n周波数 = deviceInfo.mixfreq; |
275 | 273 | nチャンネル数 = deviceInfo.mixchans; |
276 | - Trace.TraceInformation("n希望バッファサイズms=" + n希望バッファサイズms); | |
277 | - Trace.TraceInformation("n更新間隔ms=" + n更新間隔ms); | |
278 | - float f希望バッファサイズsec = (n希望バッファサイズms > 0) ? (n希望バッファサイズms / 1000.0f) : deviceInfo.minperiod * 4; | |
279 | - float f更新間隔sec = (n更新間隔ms > 0)? (n更新間隔ms / 1000.0f) : deviceInfo.minperiod; | |
274 | + | |
275 | + Trace.TraceInformation("n希望バッファサイズms=" + n希望バッファサイズms); | |
276 | + Trace.TraceInformation("n更新間隔ms=" + n更新間隔ms); | |
277 | + | |
278 | + | |
279 | + // 更新間隔として、WASAPI排他時はminperiodより大きい最小のms値を、WASAPI共有時はdefperiodより大きい最小のms値を用いる | |
280 | + float fPeriod = (mode == Eデバイスモード.排他) ? deviceInfo.minperiod : deviceInfo.defperiod; | |
281 | + Trace.TraceInformation("fPeriod=" + fPeriod); | |
282 | + float f更新間隔sec = (n更新間隔ms > 0) ? (n更新間隔ms / 1000.0f) : fPeriod; | |
283 | + if (f更新間隔sec < fPeriod) | |
284 | + { | |
285 | + f更新間隔sec = fPeriod; // Win10では、更新間隔がminperiod以下だと、確実にBASS_ERROR_UNKNOWNとなる。 | |
286 | + } | |
287 | + // バッファサイズは、更新間隔より大きくする必要あり。(イコールだと、WASAPI排他での初期化時にBASS_ERROR_UNKNOWNとなる) | |
288 | + // そのため、最低でも、更新間隔より1ms大きく設定する。 | |
289 | + float f希望バッファサイズsec = (n希望バッファサイズms > 0) ? (n希望バッファサイズms / 1000.0f) : fPeriod + 0.001f; | |
290 | + if (f希望バッファサイズsec < fPeriod) | |
291 | + { | |
292 | + f希望バッファサイズsec = fPeriod + 0.001f; | |
293 | + } | |
294 | + Trace.TraceInformation("f希望バッファサイズsec=" + f希望バッファサイズsec); | |
295 | + Trace.TraceInformation("f更新間隔sec=" + f更新間隔sec); | |
296 | + | |
280 | 297 | Trace.TraceInformation("Start Bass_Wasapi_Init(device=" + nDevNo + ", freq=" + n周波数 + ", nchans=" + nチャンネル数 + ", flags=" + flags + "," + |
281 | 298 | " buffer=" + f希望バッファサイズsec + ", period=" + f更新間隔sec); |
282 | 299 | if (BassWasapi.BASS_WASAPI_Init(nDevNo, n周波数, nチャンネル数, flags, f希望バッファサイズsec, f更新間隔sec, this.tWasapiProc, IntPtr.Zero)) |
@@ -1,11 +1,11 @@ | ||
1 | 1 | ============================================================ |
2 | 2 | DTXMania .NET style |
3 | - (C) 2000 2016 DTXMania Group | |
3 | + (C) 2000 2017 DTXMania Group | |
4 | 4 | ============================================================ |
5 | 5 | |
6 | 6 | * Requirements |
7 | 7 | |
8 | -(1) OS ... Windows Vista / 7 (x86, x64) / 8 (x86, x64) / 10 (x86, x64) | |
8 | +(1) OS ... Windows 7 (x86, x64) / 8 (x86, x64) / 10 (x86, x64) | |
9 | 9 | (2) .NET Framework ... Version 4.5.1 |
10 | 10 | (You'll need to install .NET Framework 4.5.1 additionaly on Win8.1 or before) |
11 | 11 | (3) DirectX End User Runtime ... June 2010 Version or later |
@@ -1,11 +1,11 @@ | ||
1 | 1 | ============================================================ |
2 | 2 | DTXMania .NET style |
3 | - (C) 2000 2016 DTXMania Group | |
3 | + (C) 2000 2017 DTXMania Group | |
4 | 4 | ============================================================ |
5 | 5 | |
6 | 6 | ¡®ìÉKvÈàÌ |
7 | 7 | |
8 | -(1) OS ... Windows Vista / 7 (x86, x64) / 8 (x86, x64) / 10 (x86, x64) | |
8 | +(1) OS ... Windows 7 (x86, x64) / 8 (x86, x64) / 8.1 (x86, x64) / 10 (x86, x64) | |
9 | 9 | (2) .NET Framework ... 4.5.1 |
10 | 10 | @(Win8.1ÈOÌOSÅÍA.NET Framework 4.5.1ÌÇÁCXg[ªKvÅ·) |
11 | 11 | (3) DirectX Gh[U ^C ... June 2010 È~ |
@@ -43,29 +43,31 @@ DTXMania | ||
43 | 43 | |
44 | 44 | ¡Èf[^ÌCXg[ |
45 | 45 | |
46 | -Èf[^iDTX, GDAÈÇjÍ{A[JCuÉÍÜÜêĢܹñÌÅA | |
47 | -úóÔÅÍȪPÂà\¦³êܹñB | |
46 | +Èf[^(DTX, GDAÈÇ)Í{A[JCuÉÍÜÜêĢܹñÌÅA | |
47 | +úóÔÅÍȪ1Âà\¦³êܹñB | |
48 | 48 | e©A¢ë¢ëÈèiÅüèµÄº³¢Bi¾ |
49 | 49 | |
50 | 50 | üèµ½Èf[^ÍADTXManiaGR.exe Ư¶tH_ÌÉ |
51 | -KȼOi½Åàæ¢jÌtH_ðìèA»ÌÉRs[µÄ | |
51 | +KȼO(½Åàæ¢)ÌtH_ðìèA»ÌÉRs[µÄ | |
52 | 52 | º³¢B |
53 | 53 | |
54 | -DTXMania ÍAConfig.xmliDTXManiað1ñÅàN®·éÆ©®IÉ | |
55 | -쬳êÜ·jÌ strSongDataPath Åwè³ê½tH_ð[gtH_ | |
56 | -ƵÄÈf[^ðõµÜ·B | |
54 | +DTXMania ÍAÊíADTXManiaGR.exeª étH_ð[gtH_Æ | |
55 | +µÄAÈf[^ðõµÜ·B | |
56 | + | |
57 | +[gtH_©çÌKwÌ[³Íâ¢Ü¹ñBDZÜÅà[TµÉ | |
58 | +s«Ü·B | |
59 | + | |
60 | +Config.xmliDTXManiað1ñÅàN®·éÆADTXManiaGR.exeƯ¶ | |
61 | +tH_É©®IÉ쬳êÜ·jÌ strSongDataPath ÌàeðÏX | |
62 | +·é±ÆÅA[gtH_ðÏXÅ«Ü·B | |
63 | +(±ÌÛÉA[gtH_ÍAZ~RÅæØÁÄA¡wèÅ«Ü·) | |
57 | 64 | |
58 | -[gtH_©çÌKwÌ[³Íâ¢Ü¹ñB | |
59 | -DZÜÅà[TµÉs«Ü·B | |
60 | 65 | |
61 | -yÓz | |
62 | -úóÔÅÍAstrSongDataPath ÉÍ DTXManiaGR.exe ̶ݷétH_ª | |
63 | -wè³êĢܷB | |
64 | 66 | |
65 | 67 | DTXMania ÍAÈÌtÊðAÈf[^̶ݷétH_àÉ |
66 | 68 | socre.ini t@CƵÄo͵ܷB»Ì½ßA |
67 | -uÈf[^̶ݷétH_É"«Ý À"ª³¯êÎADTXMania ª | |
68 | -@G[I¹·é©AܽÍL^ªc³êܹñBv | |
69 | +Èf[^̶ݷétH_É"«Ý À"ª³¯êÎADTXMania ª | |
70 | +G[I¹·é©AܽÍL^ªc³êܹñB | |
69 | 71 | |
70 | 72 | æÁÄAPC ÌÇÒÈOÌlª DTXMania ÅVÔêÍAÈf[^Ìzu |
71 | 73 | êɲӾ³¢B |
@@ -73,26 +75,23 @@ socre.ini | ||
73 | 75 | |
74 | 76 | ¡WASAPI/ASIOÎÉ墀 |
75 | 77 | DTXManiaÍARelease 096È~AWASAPI/ASIOÉεĢܷB |
76 | -]Ìo[WÆä×ÄApbhð@¢Ä©ç¹ªoéÜÅÌOð | |
77 | -¬³·é±ÆªÅ«Ü·B(ÁÉVistaÈ~ÌOSÅÌøʪ°Å·B) | |
78 | +ܽARelease 109È~ÅÍAWASAPIÍAWASAPI-Exclusive(WASAPIr¼)Æ | |
79 | +WASAPI-Shared(WASAPI¤L)̼ûÉεܵ½B | |
80 | +(Release 096`108ÌWASAPIÎÍAWASAPIr¼ÌÝŵ½) | |
81 | + | |
82 | +WASAPIr¼ÍASIOðgp·é±ÆÅA]Ìo[WÆä×ÄA | |
83 | +pbhð@¢Ä©ç¹ªoéÜÅÌO𬳷é±ÆªÅ«Ü·B | |
78 | 84 | |
79 | -VistaÈ~ÌOSÅÍAúóÔÅÍWASAPIÅTEhðĶ·éÝèÉ | |
80 | -ÈÁĢܷBASIOÉÏX·éêÍACONFIGURATIONÅASoundTypeð | |
81 | -ASIOÉÏXµÄº³¢B | |
85 | +úóÔÅÍWASAPIr¼ÅTEhðĶ·éÝèÉÈÁĢܷB | |
86 | +ASIOÉÏX·éêÍACONFIGURATIONÅASoundTypeðASIOÉÏXµÄº³¢B | |
82 | 87 | (XPð¨g¢ÌêÍAúÝèÍDirectSound(]Ư¶)Å·B) |
83 | 88 | |
84 | -WASAPIðgp·éæ¤ÉÝèµÄàAWASAPIªgpūȢƫÍA | |
85 | -©®IÉASIOðg¤æ¤ÝÜ·B | |
86 | -¯lÉAASIOªgpūȢƫÍADirectSoundðg¢Ü·B | |
87 | 89 | |
88 | -****************dvÈÓ******************************** | |
89 | -WASAPI/ASIOgpÍA]ÆÍÙÈét^C}[ðg¤½ßA | |
90 | -ù¶ÌÈf[^ŹYª¶·é±Æª èÜ·B | |
91 | -(ÁÉWindows7ÆDTXCreator(DTXView)ÌgÝí¹ÅìÁ½ | |
92 | - Èf[^ÅN±éÂ\«ª¢Å·) | |
93 | -»_ÅA±êÉηéLøÈÝ·«ÛÌÎôð©¢¾¹Ä | |
94 | -¨èܹñBÈf[^ÌIJ®ªKvÅ·B | |
95 | -********************************************************** | |
90 | +ASIOðgp·éæ¤ÉÝèµÄàA±êªgpÅ«È¢êÍA©®IÉ | |
91 | +WASAPI_Exclusive(WASAPIr¼)ðg¤æ¤ÝÜ·BXÉWASAPIr¼ªgp | |
92 | +Å«È¢êÍWASAPI_Shared(WASAPI¤L)ðAWASAPI¤LªgpÅ«È¢ | |
93 | +Æ«ÍADirectSoundðg¢Ü·B | |
94 | + | |
96 | 95 | |
97 | 96 | EChEÌ^CgÉAgpµÄ¢éTEhoÍû®ÆA |
98 | 97 | obt@TCYð\¦µÄ¢Ü·B |
@@ -105,24 +104,28 @@ WASAPI/ASIO | ||
105 | 104 | ȺÌÓðæÇñÅA³µÝèµÄ²gpº³¢B |
106 | 105 | |
107 | 106 | |
108 | -¡WASAPIgpÌÓ | |
107 | +¡WASAPIr¼/¤LgpÌÓ | |
109 | 108 | WASAPIÍAVistaÈ~ÅgpÅ«Ü·BXPÅÍgpūܹñB |
110 | 109 | |
111 | 110 | ¡ASIOgpÌÓ |
112 | 111 | ASIOÍAXPÅàgpÂ\Å·ªAASIOÉε½TEhJ[hª |
113 | -KvÅ·B | |
112 | +KvÅ·BASIOÉεĢȢTEhJ[hÅASIOðg¤ | |
113 | +êÍAt[\tgÌ"ASIO4ALL"ðCXg[µÄ¨±ÆÅA | |
114 | + éöxASIOÌ«\ðp·é±ÆªÅ«Ü·B | |
114 | 115 | |
115 | 116 | ASIOgpÍAASIOÌobt@TCYðKØÉÝèµÄº³¢B |
116 | 117 | ±Ìobt@TCYÍADTXManiaÅÝè·éÌÅÍÈA |
117 | 118 | TEhfoCX¤ÅÝè·éKvª èÜ·B |
118 | 119 | (TEhfoCXÉÝèc[ªt®µÄ¢È¢êÍA |
119 | 120 | t[\tgÌ"ASIO caps"ÈǪgpÂ\Å·) |
120 | -ÝèªKØÅÈ¢êADTXManiaÍASIOÅ®ìÅ«¸A | |
121 | -ãíèÉDirectSoundÅ®ìµÜ·B | |
122 | 121 | |
123 | 122 | ܽAASIOðg¤êÍAXÉTEhoÍfoCXð |
124 | -ASIODeviceÅIð·éKvª èÜ·B | |
123 | +CONFIGURATION/System/Sound Options/ASIODeviceÅIð·éKvª | |
124 | + èÜ·B | |
125 | 125 | (WASAPIÆDirectSoundÌêÍAOSÌùèÌTEhfoCXð |
126 | - g¢Ü·ÌÅATEhoÍfoCXÌIðÍsvÅ·B) | |
126 | + g¤½ßATEhoÍfoCXÌIðÍsvÅ·B) | |
127 | 127 | ±±Å¶ÝµÈ¢foCXÈǪwè³êÄ¢éêÍA |
128 | 128 | DTXManiaªN®µÈ¢±Æª èÜ·B |
129 | + | |
130 | +ASIOÌÝèªKØÅÈ¢êADTXManiaÍASIOÅ®ìÅ«¸A | |
131 | +ãíèÉWASAPI(r¼/¤L)âDirectSoundÅ®ìµÜ·B |