VG-Engineの音声システムは、100ミリ秒の周期で発音情報をD/A変換(ディジタルデータを音に変換)する形で音声を鳴らしています。WindowsとAndroidで、この部分の実装に用いる仕組みは違いますが、理屈は同じ。
- Windows(DirectSound)の場合: 次の動作をする専用スレッドでループ処理
- 100ms分の音バッファを作る
- D/A変換
- 100再生完了のイベント待機
- Android(OpenSL|ES)の場合: 100ms再生完了する都度、次の処理を実行(コールバック)
- 100ms分の音バッファを作る
- D/A変換
で、独自PSG音源+ドライバ(音源を発音させたり、消音させたりする処理部分のこと)は、何れも「100ms分の音バッファを作る」処理部分で実装してます。
問題があったのは、独自PSG音源の①発音(キーオン)、②消音(キーオフ)、③無音で処理をスイッチ的に切り分けていたこと。だから、そこでドライバのキーオンやキーオフの指示を処理するのが難しかった訳です。
なので、その部分の処理をスイッチ的に切り分けるのではなく、キーオン、キーオフ、無音などの状態に関係無く、常に(元々の)①発音(キーオン)相当として処理すれば良い訳です。
偉そうに言ってますが、実はコレ(スイッチ的に切り分けること自体が)、単純なバグじゃないか・・・
・・・ということに、この記事を書いていて気付きました。
何故昨日、気付かなかったし。
まぁ、バグとは得てしてそういうものか。
(ロジック的なバグは、処理を言葉で書いて整理すれば、解決し易い)
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。