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

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

# 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 *
    00015 * osc::COscillator型に周波数を指定するときの単位として作用する定数。
    00016 */
    00017 const int Hz = (int)(65536.0*65536.0/48000.0);
    00018
    00019 /**
    00020 * 一時データ用バッファ
    00021 *
    00022 * データを一時的に格納するために使う。
    00023 */
    00024     shortfract * temp;
    00025 /**
    00026 * 周波数偏移
    00027 *
    00028 * 周波数偏移を格納する。偏移をd[Hz]とすると、各エレメントにはd* \ref Hzを
    00029 * 格納しておく。
    00030 */
    00031     int * deviation;
    00032 /**
    00033 * LFO用バッファ
    00034 *
    00035 * afw::lfoの出力データを一時的に格納するために使う。
    00036 */
    00037     shortfract * lfotemp;
    00038 /**
    00039 * トーン・ジェネレーター変数
    00040 *
    00041 * 発振器型のオブジェクトを確保して、トーンジェネレータとする。
    00042 */
    00043     osc::COscillator * tone ;
    00044 /**
    00045 * 低周波発振器
    00046 *
    00047 * トーンジェネレーターに変調をかけるための低周波発振用変数。
    00048 */
    00049     osc::COscillator * lfo ;
    00050 /** コールバック関数の初期化
    00051     * @param count afw::processDataが呼ばれる際、各バッファに格納されているオーディオデータの数
    00052     *
    00053     * afw::processData()関数を呼ぶ前に初期化の必要がある場合は、この関数内部で行う。
    00054 */
    00055     void initProcessData(int count)
    00056     {
    00057         temp = new shortfract[count];
    00058         deviation = new int[count];
    00059         tone = new osc::CTableLookup( 440*Hz );
    00060         lfo  = new osc::CTableLookup( 440*Hz );
    00061     }
    00062
    00063 /** オーディオ・コールバック関数
    00064    *
    00065    * @param leftIn 左チャンネルの入力データバッファ
    00066    * @param rightIn 右チャンネルの入力データバッファ
    00067    * @param leftOut 左チャンネルの出力データバッファ
    00068    * @param rightOut 右チャンネルの出力データバッファ
    00069    * @param count 各バッファに格納されているオーディオデータの数
    00070    *
    00071    * この関数はDMAが受信バッファをいっぱいにするたびに割り込み経由で呼ばれる。
    00072    * 引数として渡されるのは受信データを含む入力バッファのほか、送信データを
    00073    * 格納するために使う出力バッファとデータ個数である。
    00074    * ユーザーは関数内部で入力バッファのデータを加工して、出力バッファに送信すべき
    00075    * データをおく。呼び出しに先立って初期化が必要な場合は、 afw::initProcessData()
    00076    * 関数で行う。
    00077    *
    00078    * 配列はshortfract型である。この16bit固定小数点型はshortと同じ大きさを
    00079    * 持つが、四則は固定小数点領域で定義されている。
    00080    *
    00081    * 呼び出されると、ボリュームの値を読み込んでgainとfreqを設定する。次に afw::lfoの
    00082    * 周波数をボリューム値を元に設定し、LFOの出力を得る。この値を周波数偏移とするため、
    00083    * 調整して afw::deviationに格納する。 afw::deviationは afw::tone::run()の引数として
    00084    * あたえる。これは toneの周波数に揺らぎをあたえる。
    00085    *
    00086    * 割り込みソースのクリアなどは、この関数の呼び出し側で行うので、関数内で
    00087    * 処理する必要はない。
    00088    */
    00089
    00090     void processData(
    00091                       const shortfract leftIn[],
    00092                       const shortfract rightIn[],
    00093                       shortfract leftOut[],
    00094                       shortfract rightOut[],
    00095                       int count
    00096                      )
    00097     {
    00098         shortfract gain, freq;
    00099
    00100         gain = ad7998::getValue(ad7998::Vin1);  // ボリュームの値を読み取る
    00101         freq = ad7998::getValue(ad7998::Vin2);  // ボリュームの値を読み取る
    00102
    00103         lfo->setFreq( (freq.v >> 12) * Hz );    // 周波数を更新。最大8Hz
    00104         lfo->run( lfotemp, count );             // LFOの出力
    00105
    00106         for ( int i=0; i<count; i++ ){          // 周波数偏移用データを作る
    00107             deviation[i] = (lfotemp[i]*gain >> (short)8 ).v * Hz; // 最大128Hzの偏移
    00108         }
    00109
    00110         tone->run( temp, deviation, count );    // トーン生成
    00111         for ( int i=0; i<count; i++ ){          // 引数配列のすべてのデータを処理する。
    00112             leftOut[i] = temp[i] >> (short)2;   // 振幅は適当に調整する
    00113             rightOut[i]= temp[i] >> (short)2;
    00114         }
    00115
    00116     }   // processData
    00117
    00118 };  // namespace afw
    00119
    00120