Tíquete #34707

WASAPIを使うと譜面がガタ付く (フォーラムメッセージ #75049 からの引用)

: 2014-12-15 11:15 Última Atualização: 2014-12-16 13:48

Relator:
Dono:
Tipo:
Estado:
Aberto [Owner assigned]
Componente:
Prioridade:
5 - Medium
Gravidade:
5 - Medium
Resolução:
Nenhum
Arquivo:
Nenhum
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

フォーラム ユーザフォーラム [#75049] からの引用

[forum: 75049]

ところでWASAPIのタイマー計算に問題があると伺いました。 適当に直していただけますと助かります。 私が以前タイマー周りのコードを見た時には、特に問題なさそうでした。 (もともとのfromさんのコードから私が加えた機能差分は、ASIO4ALL環境で 演奏初めにタイマー値が巻き戻ることがある現象への対策だけです。 スクロールががたつく問題に対しては、結局OSタイマーを使用する オプションを追加して逃げただけなので、まだ実質未解決です)

ツイート、見てますね……?(ニヤリ

それはともかく、この件についてチケットを起こしておきます。 ソースとしては既にFDK23にて実装が終わっているのですが、利用する側が対応してないので未検証なのですよ。

この問題の仮説は、更新間隔ごとにtWASAPI処理()で行う処理であるところの

「BASSへデータ転送 → BASSから未再生データ取得 → 時刻算出 → 累積転送数へ今回の転送データ数を加算」

の順番が間違っているのでは?というものです。

BASSにデータを同期処理で送った後に未再生データ数を取得してるので、それにはさっき送ったばかりのデータの数も含まれているはずですよね。 でも、時刻算出時の累積転送数にはまだ反映されていない。 そして、現在時刻を(累積転送数-未再生数)で算出してます。

つまり、最初に転送したデータの分だけ過去に戻ってしまうのです。

しかし、ここでもし毎回のデータ転送数が固定量ならば、最初だけ遅れてそれ以降タイムトラベルは発生しないはずだったのですが……、 WASAPIでは固定値にはなりません。毎回転送するデータの数は、バッファ全体のサイズや再生位置と書込位置、サンプルのサイズ(サンプリングバイト数×チャンネル数)、PCの負荷(更新間隔呼び出しの遅れ)などによって増減します。 例えば、簡単に考えてみても、チャンネル数8のPCはチャンネル数2のPCより4倍多くのデータ転送を行うので、更新間隔が1回遅れると現在時刻も4倍過去へトリップします。

この仮説への対策は、累積転送数への加算を時刻算出より前に持ってくるだけです。 このチケットでは、それを検証してみたいと思います。

p.s. 古いVSとSVNとDirectX SDKをインストールせねば(汗

Ticket History (3/4 Histories)

2014-12-15 11:15 Updated by: from
  • New Ticket "WASAPIを使うと譜面がガタ付く (フォーラムメッセージ #75049 からの引用)" created
2014-12-15 11:23 Updated by: from
Comentário

あと、ASIOの場合は毎回の転送データ数が固定量なので、先述したとおり、最初だけ巻き戻って、あとは順当に進むことになります。 なので、ASIO4ALLで発生していた現象とも符合すると思います。

2014-12-15 11:28 Updated by: from
Comentário

あ、最初の記事の「チャンネル数8のPCはチャンネル数2のPCより4倍多くのデータ転送を行うので、更新間隔が1回遅れると現在時刻も4倍過去へトリップ」の部分は誤りですね。累積転送数も4倍になっているはずなので……。

2014-12-16 13:48 Updated by: from
Comentário

検証してみた結果、この仮説以前の問題があったのでまとめておきます。(仮説が課題に変わります。)

  • 修正前の経過時間と、仮説に基づく修正後の経過時間のログをとり、それぞれに「経過時間の差分」の分布を調べた結果、有意な違いは見られなかった。
  • BASS_DATA_AVAILABLEで得られる値がミキサーの出力をWASAPIバッファに転送するBASS_ChannelGetData()文の前後でどう変わるかを調べた結果、前より後の方が数ミリ秒減少していた。そのため、これは「未再生データ数」ではなく「バッファの空きスペース」が得られているものだと推測される。未再生データ数が期待する値ではないため、それを基に算出する経過時間msも期待通りではないと見なせる。

なので、WASAPIタイマは設計から見直しが必要になります。

であれば、なぜ今WASAPIで(あまり)問題なく演奏できているのかについては、

  • スペックに余裕のあるPCでは、バッファの空きスペースはほぼ固定となる。さらに、ミキサーからWASAPIデバイスへ転送するデータ量もまた更新間隔に等しいデータ量となる。このため、スペックに余裕のあるPCでは、初回に空きスペース分(ほぼ更新時間に等しい)だけ時間が巻き戻る以外、リニアに増加する。

ということが関与していると思われます。 Windows8 タブレット(Atom Z3770)でも、ときどき突っかかる以外、譜面のスクロールは滑らかでした。

同時再生数が増えるなどでかなりの高負荷にならない限り、ASIOと同じ現象が(安定して)起きる、ということになります。

このチケットの課題はまだ残っているので、引き続き、このチケットにてWASAPIで正確なタイマが得られないかどうかの再設計を行いますね。

Attachment File List

No attachments

Editar

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