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 

Oscillatorに対してWed Jul 25 11:09:33 2007に生成されました。  doxygen 1.5.2