« Qt Brynhildr Android版 Alpha Version (Ver.2.0.90相当) | トップページ | Ver.2.0.91 リリース »

2020年5月 9日 (土)

Qt Brynhildr Android版 Alpha Version クラッシュの原因

Android版で発生していた、

1. サーバのスピーカー設定が16bit/48kHzの時にクラッシュする

という不具合の原因がわかりました。

サウンドデータをCELTライブラリで圧縮したものを受け取る場合にのみ発生し、生のPCMデータを送る場合は発生しません。

 

Qt Creatorで例外発生時のアセンブルリストを見ると

 

0xaebee4fa <+ 62> 40 cc ldmia r4!, {r6}

 

という命令で例外が発生しているようです。

命令の内容は簡単に言うとレジスタr4の値が示すメモリからr6レジスタに4バイト読み込んでr4レジスタを読み込んだ分だけ進める(加算する)ということのようです。で、r4の値を見ると、最後が0x3になってます、まずいですよね。

ARMの場合4バイトデータは4の倍数のアドレスに配置されていないと一度に読み込むことが出来ません。通常コンパイラは4バイトデータを4の倍数のアドレスに自動的に配置します。しかし、なんにも考えずに以下のように書くとコンパイラは4バイトデータを一気に読み込むんだなぁと想定して上記のコードを生成してしまいます。

 

celt_int32 chunkSize = *((celt_int32 *)chunkTop);

 

Brynhildrサーバから送られてくるCELTのサウンドデータは複数のデータの塊(チャンク)で送られてきます。

 

チャンクのCELTデータサイズ(4バイト)、CELTデータ、チャンクのCELTデータサイズ(4バイト)、CELTデータ

 

という感じです。CELTデータが必ず4の倍数サイズであればいいのですけどそうでないことがあるのですね。

INTELやAMDのCPUの場合4の倍数のアドレスに配置されていない場合でも取り敢えず読み込んではくれます、ちょっと時間はかかりますけど。

 

というわけで、チャンクのCELTデータサイズ(リトルエンディアンの4バイトデータ)を読み込むために

 

celt_int32 chunkSize = *chunkTop | *(chunkTop+1) << 8 | *(chunkTop+2) << 16 | *(chunkTop+3) << 24;

 

のようなコードに書き換えました。

 

早速ビルドし直して、GitHubのパッケージを置き換えました。一気にapkのサイズが3MBほど小さくなりました…

#ああ、スッキリしました…

(追記)

Ubuntu 20.04 日本語Remix がリリースされました。ありがとうございます。

https://www.ubuntulinux.jp/News/ubuntu2004-ja-remix

 

« Qt Brynhildr Android版 Alpha Version (Ver.2.0.90相当) | トップページ | Ver.2.0.91 リリース »

コメント

ふんふんさんこんにちは。 
 0509版で16bit48k対応の正式版を入れて、当方のもつすべてのアンドロイド端末で該当部分が正常動作していることを確認できました。素早い対応に感謝です。
 別件で、すこしだけ、気になった点がありましたので、とりあえず報告を兼ねて記載させていただきます。
 メニューから「オプション」→「デスクトップ圧縮モード」で「1/2圧縮」「1/4圧縮」「1/8圧縮」が選べますが、どれも表示は等倍のままで変化がありません。一方「スクリーンタッチ」の認識は左上をゼロ起点として、「1/2圧縮」「1/4圧縮」「1/8圧縮」の位置らしきモードに変換されています。もしかしたら、「2020年4月21日 (火)」の記載している、表示の拡大処理部分の無効化等の処置等で変更された部分でなにか影響があるのかもしれません。 
 縮小処理はBrynhildrサーバ側の仕事なので、おそらくは、クライタント側から、縮小処理の通知の依頼が飛んでないだけかと思いますが、現在アルファ版の状態の為、意図的そのようにしているのかもしれませんが、万が一意図しない状態ならば、お耳に入れていた方が良いかと思いまして、報告しておきます。

 なお、縮小処置は使用せずに、等倍では、非常に快適動作中で、布団に寝転がって、PCのゲームをアンドロイド端末からリモートプレイであります。感謝感謝でございます。

ふんふんです。

ご報告ありがとうございます。

「デスクトップ圧縮モード」はデスクトップ向けの機能なのでタッチパネルデバイスの場合無効化しなければならないですね。
圧縮したデスクトップ画像を受け取った後その画像を再び画面いっぱいにスケールアップしているはずです。座標系は圧縮したままで。

Ver.2.0.91 をリリースするのに合わせてAndroid版もアップデートする予定です。

> なお、縮小処置は使用せずに、等倍では、非常に快適動作中で、布団に寝転がって、PCのゲームをアンドロイド端末からリモートプレイであります。感謝感謝でございます。

#STAY HOMEにご協力ありがとうございます! (^_^)

コメントを書く

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

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

« Qt Brynhildr Android版 Alpha Version (Ver.2.0.90相当) | トップページ | Ver.2.0.91 リリース »