EIR Ogg Vorbis Recorder
By default, the VS1053 audio codec on the EIR board offers PCM recording only. However, VLSI Solution offers an Ogg Vorbis encoder plug-in. We will use this here to record an audio source connected to the EIR audio input, encode the data to Ogg Vorbis and store the result on a memory cards.
The code presented on this page assumes, that you are familiar with Nut/OS. If not, you may look to the examples at our Nutwiki.
Using Memory Cards
The document EIR Memory Card Support explains how configure Nut/OS and the EIR board for using the card socket. The main requirements are
- Nut/OS 5.0.5 or later
- Shortening SSC TK and RK signals on connector K1 (pins 17 with pin 20)
Loading Plug-Ins
The following routine can be used to load a plug-in into the VS1053 chip:
int LoadPlugInImage(int dh, int ph)
{
int got;
uint_fast16_t i;
uint8_t buf[5];
int rec_type;
VS_WRAM_DATA vswd;
got = _read(ph, buf, 3);
if (got != 3) {
puts("Read error");
return -1;
}
if (buf[0] != 'P' || buf[1] != '&' || buf[2] != 'H') {
puts("Not a plug-in?");
return -1;
}
/* Prepare plug-in upload. */
putchar('(');
if (_ioctl(dh, AUDIO_WRITE_CMEM, NULL)) {
puts("ioctl-err");
}
for (;;) {
got = _read(ph, buf, 5);
if (got != 5) {
break;
}
rec_type = buf[0];
vswd.vswd_size = buf[1];
vswd.vswd_size <<= 8;
vswd.vswd_size |= buf[2];
vswd.vswd_addr = buf[3];
vswd.vswd_addr <<= 8;
vswd.vswd_addr |= buf[4];
if (rec_type == VSIMG_RECTYP_I) {
vswd.vswd_addr += 0x8000;
}
else if (rec_type == VSIMG_RECTYP_Y) {
vswd.vswd_addr += 0x4000;
}
else if (rec_type == VSIMG_RECTYP_E) {
vswd.vswd_data = NULL;
putchar(')');
if (_ioctl(dh, AUDIO_WRITE_CMEM, &vswd)) {
puts("ioctl-err");
}
return 0;
}
vswd.vswd_data = (uint16_t *) malloc(vswd.vswd_size);
vswd.vswd_size >>= 1;
for (i = 0; i < vswd.vswd_size; i++) {
got = _read(ph, buf, 2);
if (got != 2) {
break;
}
vswd.vswd_data[i] = buf[0];
vswd.vswd_data[i] <<= 8;
vswd.vswd_data[i] |= buf[1];
}
putchar('.');
if (_ioctl(dh, AUDIO_WRITE_CMEM, &vswd)) {
puts("ioctl-err");
}
free(vswd.vswd_data);
}
return -1;
}
This function expects 2 arguments
- dh Handle of the previously opened audio device
- ph Handle of a previously opened file that contains the plug-in
This code snippet shows how to open the audio device:
int fh;
printf("Open audio device...");
dh = _open("audio0", _O_RDWR | _O_BINARY);
if (dh == -1) {
printf("Error %d\n", errno);
} else {
puts("OK");
}
Note, that the audio device needs to be registered first.
printf("Register audio device...");
if (NutRegisterSpiDevice(&devSpiVsCodec0, &spiBus0At91, 1)) {
puts("failed");
} else {
puts("OK");
}
The next code snippet shows how to open a plug-in file located on the memory card.
int fh;
fh = _open("PHAT0:/venc44k2q05.img", _O_RDWR | _O_BINARY);
if (fh == -1) {
printf("Error %d\n", errno);
} else {
LoadPlugInImage(dh, fh);
_close(fh);
puts("OK");
}
Recording is simply done by reading from the audio device and writing to a file.
static uint8_t ogg_buff[512];
fh = _open("PHAT0:/myrecording.ogg", _O_CREAT | _O_TRUNC | _O_WRONLY | _O_BINARY);
if (fh == -1) {
printf("Error %d, can't open audio file\n", errno);
} else {
stop_recording = 0;
while (1) {
got = _read(dh, ogg_buff, sizeof(ogg_buff));
if (got <= 0 || stop_recording) {
break;
}
if (_write(fh, ogg_buff, got) != got) {
break;
}
_close(fh);
}
}
Return to the EIR project page.
