I2S操作関数群. More...
#include <LPC17xx.h>
#include <kernel.h>
#include <t_syslog.h>
Go to the source code of this file.
Defines | |
#define | AUDIOBUFSIZE 64 |
I2S DMAバッファの長さ. | |
Typedefs | |
typedef int | AUDIOSAMPLE |
オーディオデータ型 | |
Functions | |
void | i2s_init () |
I2S 初期化ルーチン. | |
void | i2s_dma_init () |
DMA初期化. | |
void | i2s_start () |
I2S 開始。DMA初期化後に行う. | |
void | i2s_dma_intr_handler () |
I2S DMA 割り込みハンドラの初期化を行う. | |
void | process_audio (AUDIOSAMPLE input[2][AUDIOBUFSIZE/2], AUDIOSAMPLE output[2][AUDIOBUFSIZE/2], int count) |
オーディオ信号処理関数 | |
void | audio_task (intptr_t exinf) |
オーディオDMAに同期して動くタスク |
I2S操作関数群.
i2s_init 関数を使ってI2Sペリフェラルを初期化し、次に i2s_dma_init 関数を 使ってDMA機能を初期化する。最後に i2s_start 関数を呼ぶことで実際のI2S動作が 始まる。
I2Sはダブルバッファを使う。バッファのデータ転送が終わるたびにDMA割り込みが入る。 この割り込みを処理するにはDMA割り込みが起きるたびに、 i2s_dma_intr_handler 関数を 割り込みハンドラ内部から呼べばよい。
audio_task 関数は、オーディオ処理タスクの実態であり、TOPPERS/ASPのタスクに すること。この関数はSEM_I2SDMAセマフォを使って i2s_dma_intr_handler と 同期するため、SEM_I2SDMAセマフォを用意しておかなければならない。
process_audio 関数は、audio_processing.c でユーザーが実装すべき オーディオ信号処理関数である。この関数は audio_task から呼び出される。
#define AUDIOBUFSIZE 64 |
I2S DMAバッファの長さ.
一回のDMA転送に使うデータバッファの長さ。AUDIOBUFSIZEがNならば、ステレオなので、 N/2サンプルのデータを一回のDMAで転送することになる。
typedef int AUDIOSAMPLE |
オーディオデータ型
プログラム内部で使うオーディオの基本型。左詰めの符号付き固定小数点型である。小数点はMSBの すぐ右にある。
void audio_task | ( | intptr_t | exinf | ) |
オーディオDMAに同期して動くタスク
exinf | コンフィギュレータがタスクに引き渡す変数。このタスクは無視する。 |
dma_intr_handler からのSEM_I2SDMA セマフォ・シグナルを受けて しかるべきデータ・バッファを特定し、信号処理を行う。
なお、このタスクはシステム起動時にはインアクティブである。 main_task から明示的にアクティベートして始めて動作を開始する。
void i2s_dma_init | ( | ) |
DMA初期化.
I2Sに関連づけされたDMAを初期化する。同時に、LLIを初期化して、ピンポンバッファをすぐに使えるような 状態にする。受信DMAは各バッファの受信完了ごとにDMA割り込みをおこす。送信では起こさない。プログラムは これに同期してタスクと協調動作をする。
DMA受信割り込みは dma_intr_handler で処理を行う。
void i2s_dma_intr_handler | ( | ) |
I2S DMA 割り込みハンドラの初期化を行う.
LPC1768のDMA割り込みステータスをチェックし、I2S DMA 受信TC割り込みが発生していたら、その割り込みに対処する。
void i2s_init | ( | ) |
void i2s_start | ( | ) |
I2S 開始。DMA初期化後に行う.
i2s_init ルーチンと i2s_dma_init ルーチンによって準備を終えた後、 このルーチンを呼び出してi2sによる転送を始める。
void process_audio | ( | AUDIOSAMPLE | input[2][AUDIOBUFSIZE/2], | |
AUDIOSAMPLE | output[2][AUDIOBUFSIZE/2], | |||
int | count | |||
) |
オーディオ信号処理関数
input | 入力のオーディオデータ列。LchとRchに分かれて配列になっている | |
output | 出力のオーディオデータ列。LchとRchに分かれて配列になっている | |
count | 入出力データオンサンプル数。count=8のとき、入出力のデータ数はステレオなのでそれぞれ16となる。 |
ユーザー信号処理を行う関数である。入力はあらかじめLとRに分離されて関数に渡される。同様に出力は LとRを分離して受け取る。配列の添字としては、Lが0、Rが1である。
countはサンプル数を表す。