【Cocos2d-x】 非同期なので 【pd-for-android】


以前、作ったアプリを、例の Android 6 のパーミッション許可方法に対応させようと思ったら、意外に大変で、大改造になってしまった。

cocos2d-x の createScene() の最後で、Pd へ初期化データを送っていたんだけど、パーミッションの許可を求めるダイアログを表示している最中、つまりオーディオ関係の初期化なんか全然済んでいない時点で、じゃんじゃんデータを送ろうとしていた模様。

で、じゃぁ、Pd の初期化

bindService(new Intent(this, PdService.class), pdConnection, BIND_AUTO_REATE);

を呼び出したあとに、cocos 側へ、データを送って良しと知らせてやればどうかと思ったんだけど、こっちも Service を使っているもんで、いつ初期化が完了したかが分からず、失敗。

しょうがないので、github で推奨しているやり方 を、自分のアプリに対応させて、「Starting and stopping Pd audio」の、真ん中あたりの、

 try {
  /* sleep for one second to give Pd a chance to load samples and such;
    this is not always necessary, but not doing this may give rise to
    obscure glitches when the patch contains audio files */
  Thread.sleep(1000);
 } catch (InterruptedException e) {
   // do nothing
 }
}


のあとに、「データ送って良し!」と cocos側にお知らせするコードを書いて対処しました。

cocos側では、「初期データ送ってちょ」フラグを立てて、update でチェックして、データを送り出すような感じ。

まぁ、Thread.sleep の値によっては、機種によってコケる可能性もありそうだけど、AVD 上では上手くいっているようです。

起動時、1回だけの処理で、update を使うのは癪なのだが。
しかも、パーミッション許可のダイアログを表示するときだけ。

ドイツもコイツも非同期で動くのは困りもの。

スポンサーサイト

コメント

非公開コメント