マイク入力は、タッチスクリーンコントローラを通して行われます。

ARM7側からのみアクセス可能です。


**初期化 (mainの中に書き込む) [#kba619e8]
 writePowerManagement(2, 1);


電源管理レジスタ 2 に、1 を書き込む
**電源管理レジスタ [#baf92ab8]
レジスタ 2 (マイクロフォンアンプコントロール) R/W
|ビット|内容|設定|h
|0|Amplifier|0=無効, 1=有効|
|1 〜 7|未使用||

レジスタ 3 (マイクロフォンアンプゲインコントロール) R/W
|ビット|内容|設定|h
|0|Gain|0=Gain 20, 1 = 40, 2 = 80, 3 = 160|
|1 〜 7|未使用||


**データ取得 [#n828aa11]
 uint16 aux;
 
 // タッチスクリーンセンサを通してマイク入力を取得
 aux = touchRead(TSC_MEASURE_AUX);
 
 // 共有メモリに取得した値をセット。ARM9から読み込み可能
 IPC->aux = aux;


**値の範囲 [#x4cd2296]
取得した値は、0 〜 4095 の範囲で変化するようです。
無音に近い状態の時は 2048 、波形に変化があった時は最大 0 まで下がるか、 4095 まで上がるかします。


**実際に使ってみる [#jd0754b4]
ARM7 側で共有メモリにマイク入力の値を入れ、それを ARM9 側で操作するというような形にするのがやりやすいと思います。
マイク入力は、取得リクエストを出した瞬間の音量を 12 ビットの値として得られるので、操作しやすい 8 ビットの形式にするには、右に 4 ビットシフトする必要があります。

ARM7、ARM9ともに、タイマ割り込みを使って処理するのが理解しやすいと思います。


-ARM7のソース

 // タイマー1の割り込みハンドラ
 void timer1Handler()
 {
    uint16 aux = 0;
    aux  = touchRead(TSC_MEASURE_AUX);
    IPC->aux = aux;
 }
 
 int main(int argc, char ** argv) {
    // マイク入力 ON
    writePowerManagement(2, 1);
 
    // タイマ割り込みハンドラ有効
    irqInit();
    irqSet(IRQ_TIMER1, timer1Handler);
    irqEnable(IRQ_TIMER1);
 
    // 2097 * 1 cycles
    //  = (59.595ns(GBAの速度) / 2(の2倍)) * 2097(タイマ間隔)
    //  = 1回の割り込み間隔 62.48マイクロ秒 → 約 16 kHz
    TIMER1_DATA = -2097;
    TIMER1_CR = 0x00C0;  // 割り込み有効、タイマ間隔のセット
 
    // 割り込みだけ有効にして後は待つ
    while (1) swiWaitForVBlank();
 }

-ARM9のソース

 volatile static u8 aux_buf[2048]; // なんとなく余分に取得。実際はきっちりで良いと思います。
 volatile static int aux_buf_count = 0;
 
 void timer0Handler()
 {
    // 共有メモリからデータ取得。12ビットのデータを8ビットにシフト。
    // シフトの処理はARM7 側で済ませておいたほうが良いかもしれません。
    aux_buf[aux_buf_count] = IPC->aux >> 4;
    aux_buf_count++;
 
    if ( aux_buf_count > 1023 ) {
        aux_buf_count = 0;
 
	// バッファを使って音を鳴らすとか、データを送るとか。
        // 鳴らすだけなら、バッファ自体使う必要ありません。
 
    }
 }
 
 int main(void) {
 
    // … 画面とか色々初期化
 
    irqSet(IRQ_TIMER0, timer0Handler);
    irqEnable(IRQ_TIMER0);
    TIMER0_DATA = -2097; // 16 kHz
    TIMER0_CR = 0x00C0;  // タイマ有効
 
    while (1) {
 
        // ここで入力レベルメータ描いたり
 
        swiWaitForVBlank();
    }
 }

この例では、ARM7 にタイマー1、ARM9 にタイマー0 というような書き方をしてますが、実際には ARM7側、ARM9側共に タイマー0 が1個ずつ存在するので、両方ともタイマー0を使うように書いても問題ないと思います。
タイマーは各CPUに4つずつ、合計8個ついてるそうです。

**参考リンク [#neb30689]
-Wavファイルフォーマット
http://www.kk.iij4u.or.jp/~kondo/wave/

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS