PCMデータはどのように届いているの
Qt5でのPCMデータの出力方法はサンプルソースをよく読んでみたので大体察しがついて来ました。
おおまかに言うと届いたPCMデータをバッファリングし、フォーマットを指定した上で、再生開始の指示を出す、という感じのようです。PullとPushの2つの方法があって、オーディオデバイスのタイミングでデータをPullしてもらう方法と、明示的にデータをオーディオデバイスに送りつける方法の2つらしいです。
どちらにしてもネットワーク経由で届いたPCMデータをどこかにバッファリングして、適切に受け渡せるようにする必要がありそうです。
でも、BrynhildrサーバさんからどのようにPCMデータが届くのでしょうか?これが分からないと適切に扱えないような気がします。
これを確認するには、やはりデバッグプリントを挿入して調べてみるくらいしか方法が浮かびません。おおよそのPCMデータの再生の処理をサンプルソースを参考に実装します。そこへデバッグプリントを実装し、届いたデータのサイズやらエラーの種類、オーディオデバイスの状態、オーディオデバイスから要求されたデータサイズなどの情報を適当なタイミングで表示するようにしました。
表示させたデバッグプリントのサンプルが以下です。制御用の通信とグラフィックデータ用の通信のデバッグ表示は今はOFFにしてサウンド関係のみ表示するようにしています。
Assertion SUCCESS : brynhildr.cpp : LINE : 199
[control] Connected for control.
[graphics] Connected for graphics.
[sound] Connected for sound.
[sound] sample rate -> 48000
[sound] SoundDevice.setData():size = 3840
[sound] start
[sound] stop : ActiveState
[sound] SoundDevice.readData():len = 38400
[sound] SoundDevice.readData():len = 0
[sound] stop : IdleState
[sound] stop : StopppedState
[sound] sample rate -> 48000
[sound] SoundDevice.setData():size = 7680
[sound] start
[sound] stop : ActiveState
[sound] SoundDevice.readData():len = 38400
[sound] SoundDevice.readData():len = 0
[sound] stop : IdleState
[sound] stop : StopppedState
[sound] sample rate -> 48000
[sound] SoundDevice.setData():size = 7680
[sound] start
[sound] stop : ActiveState
[sound] SoundDevice.readData():len = 38400
[sound] SoundDevice.readData():len = 0
[sound] stop : IdleState
[sound] stop : StopppedState
[sound] sample rate -> 48000
[sound] SoundDevice.setData():size = 7680
[sound] start
[sound] stop : ActiveState
[sound] SoundDevice.readData():len = 38400
[sound] SoundDevice.readData():len = 0
[sound] stop : IdleState
[sound] stop : StopppedState
[sound] sample rate -> 48000
[sound] SoundDevice.setData():size = 7680
[sound] start
[sound] stop : ActiveState
最初に3840バイトのPCMデータが送られてきた後は、7680バイトごとのPCMデータが送られているようです。
サウンドデバイス再生用に要求されるデータサイズは38400バイトを1つの単位としているようですね。
一応確認のため、もう一度ログを取ってみました。すると最初の数回のやりとりはデータサイズが異なっていました。安定するとおおよそ7680バイトに安定するようです。最初の数回は1792バイトだったり、5888バイトだったりしますが、そのうち7680バイトに落ち着きます。(これは今回のサンプルの場合で送られてくるデータサイズはマチマチだと思われます。
これまでのログの解析の結果考えられる方法は大雑把に言って以下の様な感じでしょうか。
1,サウンドデバイスから要求されたデータサイズ分のPCMデータが届くまで待つ。
届いたPCMデータはバッファへ順次コピーしておく。
2,要求されたサイズ分のPCMデータが溜まったら、サウンドデバイスへ転送する。
3,バッファをクリアし、1へ戻る。
上記のバッファリングをうまく行う必要がありそうです。
« すべてはイベントである…らしい | トップページ | PCMデータを確認する »
コメント