TOPPERS/JSP上でのAD1836Aオーディオ入出力環境が整ったので、DDSを使って音を出してみました。
MCMもそうでしたが、この手の丸抱え環境が完成するとプログラマの仕事はほとんどありません。タスクの先頭でDDSのオブジェクトを生成し、あとは受信データが来るタイミングにあわせてrunメソッドを呼び出します。受信データは廃棄して送信データとして生成した正弦波をコピーします。
#include "t_services.h"
#include "kernel_id.h"
#include "pll.h"
#include "ad1836a.h"
#include "stk.h"
static struct CODEC_BUFFER tx_buf;
static short c[SAMPLE_PER_INTR], s[SAMPLE_PER_INTR];
void plltest_task(VP_INT extinf)
{
struct CODEC_BUFFER * rx_buf;
stk::CDDS *dds;
dds = new stk::CDDS( 0x04000000 );
act_tsk( CODEC_TASK );
while( 1 )
{
int sample;
rcv_dtq( CODEC_RX_DTQ, (VP_INT*)& rx_buf );
dds->run( c, s, SAMPLE_PER_INTR );
for ( sample = 0; sample < SAMPLE_PER_INTR; sample++ )
tx_buf.data[sample][0] = c[sample] << 8;
snd_dtq( CODEC_TX_DTQ, (VP_INT) & tx_buf );
}
}
これを書いているときに「あっ!」と気づいたのですがプログラム名がDDSではなくPLLになっています。あーあ。ちょっと風邪気味で面倒なので勘弁してもらってそのままアップロードします。
ダウンロード : 497KB