06/08/29 02:58:26 E7nNg1D8
>>300
ARM7ソースをざっと見た感じでは、やっぱり割り込みが原因だと思います。以下Timer1をPCMに使ってるとして。
FIFOを使っているようですが、現在libndsの割り込みハンドラは再入禁止コードなので、たとえばVsync割り込み中にTimer1割り込みが発生したりするとダメです。
Vsync割り込み発生->割り込みハンドラ開始->Vsyncユーザーコード->割り込みハンドラ終了->割り込みハンドラ開始->Timer1ユーザーコード->割り込みハンドラ終了
という感じになったとして、Vsync割り込みが完了する前にTimer1割り込みが発生すると、VsyncとTimer1が重なっている時間だけ、Timer1割り込みの実行が遅れます。
サウンドバッファの再生が完了しても次が開始されない時間がプチノイズになります。Timer1の周期が変わる訳じゃないので、そのバッファは再生が終わる前に次に進んでしまいます。
周期的にもVsyncとTimer1は同期していないと思うので、たとえば数秒プチノイズが入り、数分後に数秒プチノイズが入る、というような感じで。
で。解決方法は思いつくのは2つ。ひとつは、多重割り込みを許可する割り込みハンドラを書いて、Timer1割り込み実行中だけ多重割り込みを許可しない、という方法です。
ただこの方法も、割り込みハンドラが割り込み要因を判定する間は多重割り込みできないので、極まれに周期的なノイズが入ります。聞き取れませんけどね。気になる人は気になるということで。
確か、PowerLEDのグラデーションをしたときに、PWM用Timerが秒間1万回、PCM用Timerが秒間100回くらいで動作したので、普通は大丈夫だと思います。