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
1.5.2