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 

Vibratoに対してWed Jul 25 11:10:00 2007に生成されました。  doxygen 1.5.2