スレッドの変遷のメモ その2
結局…3つのネットワーク通信をシングルスレッド内で処理すると十分なPCMデータを受信できないと判明しました…
30ms毎に起動するタイマーを設定し、届いたPCMデータを定期的に再生用バッファに書き込むのですが、
30ms再生するのに必要なPCMデータはサンプリングレート48000HZ, 2チャンネル,16ビットの場合5760バイトとなります。
で、再生用バッファは1秒間分のデータを保持できるように確保しますので、この場合192000バイト確保しているのですが、一度再生を開始しAcftive状態になったあと、再生用バッファが空になってIdle状態に遷移しています。
これはIdle状態になったあとに再生用バッファの空きサイズが192000バイトになっていることからも分かります。
もちろん、ずっと十分なPCMデータを供給できればIdle状態になることはありません。
タイマー起動による定期的な再生用バッファへの転送ではなく、受け取ったらすぐ書き込む方式にしてもやはり足らないようです。
ちなみにzeroshikikai.cppでは、0.1秒分のバッファリングを行い、DirectSoundのバッファへ書き込むようになっていますね。再生用バッファのサイズは3秒間分のデータサイズになっているようです。
というわけで…3つのスレッドでそれぞれQTcpSocketを生成し、ネットワーク通信をしなくてはなりません。
Qtでソケットとマルチスレッドでハマっているという記事がたっくさんありますね…
[シングルスレッド版ネットワーク通信のログ(サウンド関連のみ)]
------------------------------------------
changeSamplerate()
------------------------------------------
sampleRate : 48000
sampleSize : 16
channelCount : 2
byteOrder : LittleEndian
sampleType : SignedInt
------------------------------------------
bytesForDuration : 5760
------------------------------------------
format is valid.
bufferSize (bytes) = 192000
------------------------------------------
[SoundThread] handleStateChanged(): IdleState 0
[SoundThread] timerExpired() : soundBuffer->size() = 1920
[SoundThread] timerExpired() : audioOutput->bytesFree() = 192000
[SoundThread] handleStateChanged(): ActiveState 1
output->write() : size = 1920
[SoundThread] handleStateChanged(): IdleState 2
[SoundThread] timerExpired() : soundBuffer->size() = 13440
[SoundThread] timerExpired() : audioOutput->bytesFree() = 192000
[SoundThread] handleStateChanged(): ActiveState 3
output->write() : size = 13440
[SoundThread] timerExpired() : soundBuffer->size() = 1920
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 1920
[SoundThread] timerExpired() : soundBuffer->size() = 5760
[SoundThread] timerExpired() : audioOutput->bytesFree() = 115200
output->write() : size = 5760
[SoundThread] timerExpired() : soundBuffer->size() = 9600
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 9600
[SoundThread] timerExpired() : soundBuffer->size() = 5760
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 5760
[SoundThread] timerExpired() : soundBuffer->size() = 3840
[SoundThread] timerExpired() : audioOutput->bytesFree() = 115200
output->write() : size = 3840
[SoundThread] handleStateChanged(): IdleState 4
[SoundThread] timerExpired() : soundBuffer->size() = 7680
[SoundThread] timerExpired() : audioOutput->bytesFree() = 192000
[SoundThread] handleStateChanged(): ActiveState 5
output->write() : size = 7680
[SoundThread] timerExpired() : soundBuffer->size() = 13440
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 13440
[SoundThread] timerExpired() : soundBuffer->size() = 7680
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 7680
[SoundThread] timerExpired() : soundBuffer->size() = 3840
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 3840
[SoundThread] timerExpired() : soundBuffer->size() = 5760
[SoundThread] timerExpired() : audioOutput->bytesFree() = 115200
output->write() : size = 5760
[SoundThread] timerExpired() : soundBuffer->size() = 5760
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 5760
[SoundThread] timerExpired() : soundBuffer->size() = 3840
[SoundThread] timerExpired() : audioOutput->bytesFree() = 153600
output->write() : size = 3840
[SoundThread] handleStateChanged(): IdleState 6
[SoundThread] timerExpired() : soundBuffer->size() = 5760
[SoundThread] timerExpired() : audioOutput->bytesFree() = 192000
[SoundThread] handleStateChanged(): ActiveState 7
output->write() : size = 5760
« スレッドの変遷のメモ | トップページ | Qt Brynhildr(仮称) の その後のこと »
コメント