読者です 読者をやめる 読者になる 読者になる

MusicShieldのコードを少し読んでみる

Arduino OTM-PJ

microSDを1GBにしたら動いたので、コードを見てみる。
やりたいこととしては、
 ・センサの入力値に合わせて再生する曲を選択する
というのがある。
なので、毎ループごとに呼ばれている箇所を探してそこにセンサの値を読む処理を割りこませる必要がある。

調べてみると、player.cppのAvailableProcessorTime()という関数のdo while文が毎回呼ばれていることがわかった。
また、ここでMusicShieldについているスイッチの入力を見るためのCheckKey()という関数を呼んでいる。
CheckKey()では入力に合わせて音量や選曲の処理を行なっているようなので、ここを参考にすれば良いみたい。
読むと、playingStateという変数をPS_NEXT_SONGにすると次の曲へ、PS_PREVIOUS_SONGにすると前の曲が再生されるようになっている。

今日はひとまずここまで。
センサを読むところを加えて、playingStateの状態を変更してやればあとは勝手にやってくれそうだ。
しかし、任意の曲番号を指定して再生するのはどうする・・・?

[追記]
なんだかまだ全然良くわかってないけど、PlayCurentFile()という関数の最後に曲を流し終わった時の処理を書くとうまくいけそうなことがわかった。
サンプルコードのままだと
 ・1曲再生し終わった時、SDカード内の次の曲を再生する。
という処理になっているが、
 ・1曲再生し終わった時に一時停止し、次に再生する曲はSDカード内の3番目の曲にする。
という処理にしたい場合は下記のように書くと良い。

/* player.cpp */
void PlayCurrentFile()
{
    char c, nFragments;

    /* 中略 */

    SendZerosToVS10xx();

    // After finishing normally default to requesting to play next song        
    //playingState = PS_NEXT_SONG; //サンプルコードだとここがアクティブになっているのでコメントアウト

    // ここに曲を流し終わったときの処理をどうするか書く!
    playingState = PS_NORMAL; // 単曲再生(次の曲へ進まない)
    playStop = 0;                       // 一時停止する(1にするとループ再生)
    currentFile = 3;                   // 次に再生する曲の番号
}

AvailableProcessorTime()でやればいいのか、PlayCurentFile()でやればいいのかわからないが、ひとまず
 ・playingState = PS_NORMALで固定
 ・playStopを0にしたら停止、1にしたら再生しっぱなし
 ・currentFileを再生したいファイル番号にする
というように適宜変更してやれば良さそう。