- メインページ
- ネームスペース
- クラス
- ファイル

- ファイル一覧
- ファイルメンバ

# processdata.cpp

説明を見る。

    00001 #include "afw.h"
    00002 #include "ad7998.h"
    00003 #include "osc.h"
    00004
    00005 /** \file processdata.cpp
    00006  *  \brief オーディオコールバック関数
    00007  *  \author アナログ・デバイセズ株式会社
    00008  *
    00009  * このファイルは、オーディオ処理のコールバック関数を含む。
    00010  */
    00011 namespace afw{
    00012 /** 周波数指定用定数
    00013 *
    00014 * osc::COscillatorに対して周波数を指定する際、周波数単位として用いる。
    00015 * たとえば440Hzの信号を生成したい場合は、440*Hzとする。
    00016 */
    00017 const int Hz = (int)(65536.0*65536.0/48000.0);
    00018
    00019 /** 一時データ用バッファ
    00020 *
    00021 * データを一時的に格納するために使う。
    00022 */
    00023     shortfract * temp;
    00024 /** トーン・ジェネレーター変数
    00025 *
    00026 * 発振器型のオブジェクトを確保して、トーンジェネレータとする。
    00027 */
    00028     osc::COscillator * tone ;
    00029 /** コールバック関数の初期化
    00030     * @param count afw::processDataが呼ばれる際、各バッファに格納されているオーディオデータの数
    00031     *
    00032     * バッファ変数と発振器オブジェクトを生成して実行に備える。
    00033 */
    00034     void initProcessData(int count)
    00035     {
    00036         temp = new shortfract[count];
    00037         tone = new osc::CTableLookup( 440*Hz );
    00038     }
    00039
    00040 /** オーディオ・コールバック関数
    00041    *
    00042    * @param leftIn 左チャンネルの入力データバッファ
    00043    * @param rightIn 右チャンネルの入力データバッファ
    00044    * @param leftOut 左チャンネルの出力データバッファ
    00045    * @param rightOut 右チャンネルの出力データバッファ
    00046    * @param count 各バッファに格納されているオーディオデータの数
    00047    *
    00048    * この関数はDMAが受信バッファをいっぱいにするたびに割り込み経由で呼ばれる。
    00049    * 引数として渡されるのは受信データを含む入力バッファのほか、送信データを
    00050    * 格納するために使う出力バッファとデータ個数である。
    00051    * ユーザーは関数内部で入力バッファのデータを加工して、出力バッファに送信すべき
    00052    * データをおく。呼び出しに先立って初期化が必要な場合は、 afw::initProcessData()
    00053    * 関数で行う。
    00054    *
    00055    * 配列はshortfract型である。この16bit固定小数点型はshortと同じ大きさを
    00056    * 持つが、四則は固定小数点領域で定義されている。
    00057    *
    00058    * 呼び出されると、gein変数とfreq変数に、外部ボリュームの値を設定する。この
    00059    * 値は 0..+1の範囲を取る。この値を元に、生成する信号の周波数を指定し、振幅を
    00060    * 調整して出力する。
    00061    *
    00062    * 割り込みソースのクリアなどは、この関数の呼び出し側で行うので、関数内で
    00063    * 処理する必要はない。
    00064    */
    00065
    00066     void processData(
    00067                       const shortfract leftIn[],
    00068                       const shortfract rightIn[],
    00069                       shortfract leftOut[],
    00070                       shortfract rightOut[],
    00071                       int count
    00072                      )
    00073     {
    00074         shortfract gain, freq;
    00075
    00076         gain = ad7998::getValue(ad7998::Vin1);  // ボリュームの値を読み取る
    00077         freq = ad7998::getValue(ad7998::Vin2);  // ボリュームの値を読み取る
    00078
    00079         tone->setFreq( (freq.v >> 5) * Hz );    // 周波数をボリュームの値にあわせて更新。最大1023Hz
    00080         tone->run( temp, count );               // 信号を生成
    00081         for ( int i=0; i<count; i++ ){        // 引数配列のすべてのデータを処理する。
    00082             leftOut[i] = temp[i] * gain;      // 振幅を設定
    00083             rightOut[i]= temp[i] * gain;
    00084         }
    00085
    00086     }   // processData
    00087
    00088 };  // namespace afw
    00089
    00090