« 画像データもバッファリングする その3 | トップページ | AnyDeskも使ってみますかねぇ »

2014年7月12日 (土)

PCMデータが足りません

一時期サウンドの再生に関して問題はなかったのですが、久しぶりにサーバ側で音を出しながらwindows版で確認したらノイズだらけでした…

デバッグ情報をログに出力してみますと、

[debug] : : 2014.07.10 14:30:28.054 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.109 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.288 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.291 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.327 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.360 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.417 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.420 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.451 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.485 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.542 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.547 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.602 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.611 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.652 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.671 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.739 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.741 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.772 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.795 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.852 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.920 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:28.962 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:28.986 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:29.166 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:29.170 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:29.222 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:29.257 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:29.754 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:29.757 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:29.902 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:29.920 : [sound] StateChanged : ActiveState
[debug] : : 2014.07.10 14:30:29.972 : [sound] StateChanged : IdleState
[debug] : : 2014.07.10 14:30:29.984 : [sound] StateChanged : ActiveState

Qtの内部にあるサウンド用バッファが空になると再生できないので状態がIdleStateになります。つまりこのIdleStateになった瞬間から次の再生が始まるActiveSateに移行するまでは音の再生が止まって無音状態となります。これがノイズに聴こえるのですね…

テスト用のWindows 7 Home Edition (x64)のノートPCではサンプリングレート48KHz, 16bit, 2chステレオのPCMデータをクライアントに返しているので、単純に計算すれば、

48000 (Hz) * 2 (bytes - 16bit) * 2 (channel) = 192000 (bytes/s)

1秒間サウンドを再生するのに192000バイトのPCMデータが必要になります。デバッグログから、ネットワーク経由で受け取っているデータのサイズを確認します。これはネットワーク経由で届いたPCMデータをローカルなリングバッファに格納する時にそのサイズを出力したものです。結構小さな単位で送られてきてるようですね。

[debug] : : 2014.07.10 14:30:28.055 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.065 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.095 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.111 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.141 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.157 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.288 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.329 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.359 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.417 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.469 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.471 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.516 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.531 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.564 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.609 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.641 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.655 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.689 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.767 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.781 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:28.889 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:28.907 : [sound] writtenSize: 1920
[debug] : : 2014.07.10 14:30:28.967 : [sound] writtenSize: 7680
[debug] : : 2014.07.10 14:30:28.984 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:29.016 : [sound] writtenSize: 1920
[debug] : : 2014.07.10 14:30:29.030 : [sound] writtenSize: 7680
[debug] : : 2014.07.10 14:30:29.074 : [sound] writtenSize: 1920
[debug] : : 2014.07.10 14:30:29.093 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:29.110 : [sound] writtenSize: 5760
[debug] : : 2014.07.10 14:30:29.140 : [sound] writtenSize: 3840
[debug] : : 2014.07.10 14:30:29.187 : [sound] writtenSize: 5760

リングバッファに格納したPCMデータは、一定時間ごとに関数を呼び出すタイマー機能を利用して、定期的にサウンド出力用のバッファへ書き込めば、あとは裏方のサウンド再生処理が勝手に処理、再生してくれる手はずになっています。

1秒間に192000バイトのPCMデータが必要なのですが、現在は50msごとに前述の関数を呼び出しているので、

192000 * 0.05 = 9600 (bytes)

のPCMデータが最低限途切れなく再生するために必要になります。

デバッグログからタイマー一回ごとのPCMデータ書き込みサイズの情報を拾ってくると、

[debug] : : 2014.07.10 14:30:28.109 : [timerExpired()] : write (13440)
[debug] : : 2014.07.10 14:30:28.172 : [timerExpired()] : write (15360)
[debug] : : 2014.07.10 14:30:28.291 : [timerExpired()] : write (3840)
[debug] : : 2014.07.10 14:30:28.360 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:28.420 : [timerExpired()] : write (5760)
[debug] : : 2014.07.10 14:30:28.485 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:28.547 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:28.611 : [timerExpired()] : write (7680)
[debug] : : 2014.07.10 14:30:28.670 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:28.741 : [timerExpired()] : write (5760)
[debug] : : 2014.07.10 14:30:28.795 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:28.920 : [timerExpired()] : write (7680)
[debug] : : 2014.07.10 14:30:28.986 : [timerExpired()] : write (13440)
[debug] : : 2014.07.10 14:30:29.047 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:29.109 : [timerExpired()] : write (7680)
[debug] : : 2014.07.10 14:30:29.170 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:29.257 : [timerExpired()] : write (15360)
[debug] : : 2014.07.10 14:30:29.296 : [timerExpired()] : write (5760)
[debug] : : 2014.07.10 14:30:29.359 : [timerExpired()] : write (19200)
[debug] : : 2014.07.10 14:30:29.422 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:29.484 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:29.566 : [timerExpired()] : write (13440)
[debug] : : 2014.07.10 14:30:29.609 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:29.673 : [timerExpired()] : write (5760)
[debug] : : 2014.07.10 14:30:29.756 : [timerExpired()] : write (11520)
[debug] : : 2014.07.10 14:30:29.798 : [timerExpired()] : write (13440)
[debug] : : 2014.07.10 14:30:29.880 : [timerExpired()] : write (1920)
[debug] : : 2014.07.10 14:30:29.920 : [timerExpired()] : write (9600)
[debug] : : 2014.07.10 14:30:29.984 : [timerExpired()] : write (11520)
[debug] : : 2014.07.10 14:30:30.085 : [timerExpired()] : write (3840)
[debug] : : 2014.07.10 14:30:30.109 : [timerExpired()] : write (7680)
[debug] : : 2014.07.10 14:30:30.181 : [timerExpired()] : write (13440)
[debug] : : 2014.07.10 14:30:30.235 : [timerExpired()] : write (17280)
[debug] : : 2014.07.10 14:30:30.359 : [timerExpired()] : write (15360)
[debug] : : 2014.07.10 14:30:30.422 : [timerExpired()] : write (1920)

9600バイト以上毎回書き込めてればよさそうなんですが、1920バイトしか書き込めていない場合もあります…

Brynhildr 1.0.3をクライアントモードで起動してみるとサウンド再生に問題はないことから、サーバからのPCMデータ転送には問題なく、受け取る方の問題ということになりそうです…

« 画像データもバッファリングする その3 | トップページ | AnyDeskも使ってみますかねぇ »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: PCMデータが足りません:

« 画像データもバッファリングする その3 | トップページ | AnyDeskも使ってみますかねぇ »