Ticket #37231

Win10での低遅延サウンド再生方式対応

Open Date: 2017-05-30 22:32 Last Update: 2017-11-29 02:01

Reporter: yyagi Owner: yyagi
Type: 性能改善 Status: Open [Owner assigned]
Component: FDK MileStone: 既存機能の仕様変更
Priority: 5 - Medium Severity: 5 - Medium
Resolution: None

Details

Win10では、WASAPI共有での出力遅延を10ms程度に収めるような実装が可能とのことで、これに対応する。

BASS_Mixerの出力まではBASSで扱って、最終出力を自力実装するような感じでしょうか。

Attachment File List

No attachments

Ticket History (3/7 Histories)

2017-05-30 22:32 Updated by: yyagi
  • New Ticket "Win10での低遅延サウンド再生方式対応" created
2017-06-04 01:33 Updated by: yyagi
Comment

まず、manifestを修正して、Win8.0互換モードで動かさないようにだけしてみました。その結果、Win10 Creators Update, オンマザーサウンドでバッファが

  • WASAPI排他: 14ms (Win8.0互換時は4msと表示されていた)
  • WASAPI共有: 44ms (Win8.0互換時は22msと表示されていた。しかし体感としては100msくらい(DirectSoundと同等って感じ) )

になりました。

なんでWASAPI排他で悪化するかなー。

一方、WASAPI共有はぎりぎり我慢できなくもないくらいの体感になりました。

2017-06-14 00:34 Updated by: yyagi
  • Owner Update from (None) to yyagi
Comment

その後、うちの環境で何度も実験してみましたが、どうも、manifestでWin10モードを使わないようにして、Win8.0互換で動かすようにしたほうが、バッファを小さく設定できて、動作負荷も軽いようです。(具体的な結果はひとつ前のコメントを参照ください)

Win8.0互換に戻そうかな・・・

うちの環境:

  • Win10 Pro, Creators Update, x64
  • Realtek HD Audio (ここしばらく、USB Audioを使っていません)
  • HaswellのそこそこのCPU
2017-06-15 00:05 Updated by: from
Comment

おつですー。

最近WASAPIの勉強しなおしてみようと思っていろいろなサイト見てたら気づいたんですけど、(低遅延じゃない場合の)WASAPI共有のバッファサイズって「遅延」じゃないっぽいですね。

ほぼすべての技術ページで(MSDNのLowLatencyAudioでも)「latency」じゃなく「period」と言ってるので、バッファサイズから算出できるのは、WASAPI排他でいう「更新間隔」だけなんじゃないかなと。

ついでに、その「バッファ」というのも「AudioEngineのバッファ」じゃなくて「アプリのバッファ」なんじゃないかなと。

また、実測によると、WASAPI共有モードでは指定したperiodが10msであるなら、バッファのサイズが22msであっても、10msごとにイベント駆動されてるなと。

結論、共有モードの実際の遅延はやっぱり100msくらいありそうですね……

2017-06-15 01:49 Updated by: yyagi
Comment

WASAPI共有について、BASS.NET APIの、BassWasapi.BASS_WASAPI_Init Methodのところを読んでみると、最後にこんなことが書いてありました。

WASAPI共有時は "it's the other way round" (periodとbufferの依存関係が逆転する)、つまりbufferサイズにperiodが影響を受けて、更に結局それはdefperiodのサイズにアラインされるということです。FROMさんのご指摘は正解のようです。

In EXCLUSIVE mode, the "period" value will affect what's an acceptable "buffer" value (it appears that the buffer must be at least 4x the period).

In SHARED mode, it's the other way round, the "period" will be reduced to fit the "buffer" if necessary (with a minimum of the "defperiod" value).

The system will limit them to an acceptable range, so for example, you could use a very small value (eg. 0.0001) for both, to get the minimum possible latency.

初期化のロジックは、WASAPIの排他と共有で、別々に作りこまないといけなさそうですね。明日にでもコードを組みなおします。

WASAPI共有のラグが結局100msくらいありそうだというのには同感です。私の体感でも、その程度だと感じています。

# しかし、いい加減、WASAPI周りをこねくり回すのにも飽きてきました(苦笑;;;

2017-11-28 23:30 Updated by: yyagi
  • Details Updated
Comment

つい先日、BASSWASAPIがWIndows10のlow latency audioに対応しました! これで試してみます。

http://www.un4seen.com/

BASSWASAPI 2.4.2 released
Adds support for lower latency shared mode on Windows 10, more precise latency measurement, buffer size specification in samples, and notification of unexpected stoppages.

2017-11-29 02:01 Updated by: yyagi
Comment

というわけで、軽くテスト版を作りました。(実はちょっとてこずった・・・) お試しくださいますか。

https://osdn.net/users/yyagi/pf/DTXMania_TestBuilds/files/?id=2724

  • 起動時のログ出力も大幅に強化していますが気にしない。
  • Win10以外の人でも、「CONFIG内でサウンド関係の設定変更をして、いちいちアプリを再起動しなくてよくなる」分、Rel109/110より使い勝手が上がります。
  • ウチの環境(Win10RS3)だと、バッファ量0のCONFIG設定(=最小値になるよう自動設定)で、WASAPI排他時14ms, WASAPI共有時11msになりました。うーん、後者は以前44msだったので、確かに改善はしているのですが、本来なら数msまで行けるはず。明日以降に見直してみます。そしてそもそも排他設定時よりレイテンシが小さくなるとは一体なんなのか。

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login