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