サンプルプログラムSample1を コンパイルして実行してみましょう。 コンパイル時に下記の警告が出ますが、無視してください。 最適化に関するものなので、動作には支障はありません。
このプログラムは下図のような動作をします。 サンプリング周波数は48kHzで、約20kHzまでの音を処理できます。
まず、実験装置を下図のように接続します。 アナログ出力は8チャンネルあるので、 必要に応じてスピーカを差し替えてください。 CH4は、ピンジャックとヘッドホン端子に同じ信号が出力されるので、 どちらを使用してもかまいません。
この接続方法でPCから音を出す時は、 音の再生デバイスを「SB Live! 24-bit External」にしてください。 「SoundMAX Digital Audio」になっている時、 PC内蔵スピーカから音が出ている時は、 設定変更が必要です。 「コントロールパネル」→「サウンド、音声、およびオーディオデバイス」 →「サウンドとオーディオデバイス」を起動し、 「オーディオ」タブの「音の再生 規定のデバイス」を 「SB Live! 24-bit External」に変更します。 画面右下のスピーカアイコンを右クリックしても 「サウンドとオーディオデバイス」を起動できます。
プログラムをコンパイル、実行したら、マイクに向かって話したり、 PCから音を出したりしてみましょう。 特にPC用の音源 (CDやファイル) を用意していない場合には、 「マイ ミュージック」の「Sample Music」が利用できます。
サンプルプログラムは10個以上のファイルから構成されています。 ここでは、サンプルプログラムを改造するために必要な部分にしぼって説明します。
重要なファイルは下記の3個になります。
「ProcessInput.c」は以下のようなプログラムです。 内容は、
//////////////////////////////////////////////////////////////////////////////////////// // //Sample-based talkthrough for 4 inputs and 8 outputs // 2 inputs from ADC, 2 inputs from SPDIF // //Original program "blockProcess.c" from Ez-Kit Lite example //Modifided by Akihiro HIRANO <hirano@t.kanazawa-u.ac.jp> //Last update: Apr 12, 2007 // //History // Apr 06, 2007 First version // Apr 12, 2007 Blink control fix //////////////////////////////////////////////////////////////////////////////////////// #include "tt.h" #define DELAYLEN 48000 float *delay0; float *delay1; int delayptr = 0; // Place the initialization code for the audio processing here. void Init(void){ delay0 = AllocFloat(DELAYLEN); // Allocate large array on SDRAM delay1 = AllocFloat(DELAYLEN); } // Place the audio processing algorith here. // The input and output are given as arrays of float. void ProcessInput(void) { static int count = 0; //Clear the Block Ready Semaphore //Do not modify. blockReady = 0; //Set the Processing Active Semaphore before starting processing //Do not modify isProcessing = 1; output_buf[0] = input_buf[0]; // Analog Right to CH1 Right output_buf[1] = input_buf[1]; // Analog Left to CH1 Left output_buf[2] = input_buf[2]; // SPDIF Right to CH2 Right output_buf[3] = input_buf[3]; // SPDIF Left to CH2 Left output_buf[4] = delay0[delayptr]; output_buf[5] = delay1[delayptr]; output_buf[6] = delay0[delayptr]; output_buf[7] = delay1[delayptr]; delay0[delayptr] = input_buf[0] + input_buf[2]; // Analog Right + SPDIF Right delay1[delayptr] = input_buf[1] + input_buf[3]; // Analog Left + SPDIF Left if (++delayptr == DELAYLEN) // Ring buffer delayptr = 0; // Blink LED 1 count++; if ((count & 0x0fff) == 0) { if (count & 0x8000) { OffLED(1); } else { OnLED(1); } } //Clear the Processing Active Semaphore after processing is complete //Do not modify isProcessing = 0; }
信号処理の主要部分は関数「ProcessInput()
」です。
入力信号が1組揃う度に呼び出され、出力信号を計算します。
この関数は、
float
型の配列input_buf[4]
に格納されている
入力信号を処理して、
処理結果をfloat
型の配列output_buf[8]
に格納します。
入力信号はアナログオーディオ入力右、左、
SPDIFディジタルオーディオ入力右、左の順に格納されています。
出力信号は、CH1右、左、…CH4右、左の順になります。
信号値は-1〜+1の単精度実数です。
これを超える値を出力しようとしても-1〜+1の範囲に打ち切られます。
関数「ProcessInput()
」の先頭にある
「blockReady = 0;
」と
「isProcessing = 1;
」、
最後にある「isProcessing = 0;
」の3行は変更しないでください。
変更するとプログラムが正常に動作しなくなることがあります。
関数「Init()
」は、
プログラムの実行開始時に一度だけ呼び出されます。
メモリの確保、初期値の設定などを行います。
このサンプルプログラムではメモリの確保を行っています。
関数「AllocFloat()
」は
「malloc()
」と同じような動作をする関数です。
4MワードのSDRAMに領域を確保し、その先頭へのポインタを返します。
ただし、割り当てられた領域を開放する関数はありません。
サンプルプログラムを改造して、動作が変化するかどうかを確認しましょう。
チャンネルを入れ替える、定数倍するなどが簡単でしょう。
出力が2チャンネルで済む場合には、
CH4 右/左 (output_buf[6]
, output_buf[7]
)
を使うと、スピーカをヘッドホン端子に直結できるので接続が楽です。