<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=Hardware%2FEIR%2FVorbis_Rec</id>
		<title>Hardware/EIR/Vorbis Rec - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=Hardware%2FEIR%2FVorbis_Rec"/>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Hardware/EIR/Vorbis_Rec&amp;action=history"/>
		<updated>2026-04-28T22:50:56Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=Hardware/EIR/Vorbis_Rec&amp;diff=407&amp;oldid=prev</id>
		<title>Harald: Created page with &quot;&lt;div id=&quot;content&quot;&gt;  = 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 enc...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Hardware/EIR/Vorbis_Rec&amp;diff=407&amp;oldid=prev"/>
				<updated>2017-07-13T09:10:30Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;  = 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 enc...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= EIR Ogg Vorbis Recorder =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The code presented on this page assumes, that you are familiar with Nut/OS. If not, you may look to the examples at our [http://www.ethernut.de/nutwiki/Nut/OS_Examples Nutwiki].&lt;br /&gt;
&lt;br /&gt;
== Using Memory Cards ==&lt;br /&gt;
&lt;br /&gt;
The document [[mmc.html|EIR Memory Card Support]] explains how configure Nut/OS and the EIR board for using the card socket. The main requirements are&lt;br /&gt;
&lt;br /&gt;
* Nut/OS 5.0.5 or later&lt;br /&gt;
* Shortening SSC TK and RK signals on connector K1 (pins 17 with pin 20)&lt;br /&gt;
&lt;br /&gt;
== Loading Plug-Ins ==&lt;br /&gt;
&lt;br /&gt;
The following routine can be used to load a plug-in into the VS1053 chip:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;coding&amp;quot;&amp;gt;int LoadPlugInImage(int dh, int ph)&lt;br /&gt;
{&lt;br /&gt;
    int got;&lt;br /&gt;
    uint_fast16_t i;&lt;br /&gt;
    uint8_t buf[5];&lt;br /&gt;
    int rec_type;&lt;br /&gt;
    VS_WRAM_DATA vswd;&lt;br /&gt;
&lt;br /&gt;
    got = _read(ph, buf, 3);&lt;br /&gt;
    if (got != 3) {&lt;br /&gt;
        puts(&amp;amp;quot;Read error&amp;amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    if (buf[0] != 'P' || buf[1] != '&amp;amp;amp;' || buf[2] != 'H') {&lt;br /&gt;
        puts(&amp;amp;quot;Not a plug-in?&amp;amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    /* Prepare plug-in upload. */&lt;br /&gt;
    putchar('(');&lt;br /&gt;
    if (_ioctl(dh, AUDIO_WRITE_CMEM, NULL)) {&lt;br /&gt;
        puts(&amp;amp;quot;ioctl-err&amp;amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    for (;;) {&lt;br /&gt;
        got = _read(ph, buf, 5);&lt;br /&gt;
        if (got != 5) {&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        rec_type = buf[0];&lt;br /&gt;
&lt;br /&gt;
        vswd.vswd_size = buf[1];&lt;br /&gt;
        vswd.vswd_size &amp;amp;lt;&amp;amp;lt;= 8;&lt;br /&gt;
        vswd.vswd_size |= buf[2];&lt;br /&gt;
        vswd.vswd_addr = buf[3];&lt;br /&gt;
        vswd.vswd_addr &amp;amp;lt;&amp;amp;lt;= 8;&lt;br /&gt;
        vswd.vswd_addr |= buf[4];&lt;br /&gt;
        if (rec_type == VSIMG_RECTYP_I) {&lt;br /&gt;
            vswd.vswd_addr += 0x8000;&lt;br /&gt;
        }&lt;br /&gt;
        else if (rec_type == VSIMG_RECTYP_Y) {&lt;br /&gt;
            vswd.vswd_addr += 0x4000;&lt;br /&gt;
        }&lt;br /&gt;
        else if (rec_type == VSIMG_RECTYP_E) {&lt;br /&gt;
            vswd.vswd_data = NULL;&lt;br /&gt;
            putchar(')');&lt;br /&gt;
            if (_ioctl(dh, AUDIO_WRITE_CMEM, &amp;amp;amp;vswd)) {&lt;br /&gt;
                puts(&amp;amp;quot;ioctl-err&amp;amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return 0;&lt;br /&gt;
        }&lt;br /&gt;
        vswd.vswd_data = (uint16_t *) malloc(vswd.vswd_size);&lt;br /&gt;
        vswd.vswd_size &amp;amp;gt;&amp;amp;gt;= 1;&lt;br /&gt;
        for (i = 0; i &amp;amp;lt; vswd.vswd_size; i++) {&lt;br /&gt;
            got = _read(ph, buf, 2);&lt;br /&gt;
            if (got != 2) {&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            vswd.vswd_data[i] = buf[0];&lt;br /&gt;
            vswd.vswd_data[i] &amp;amp;lt;&amp;amp;lt;= 8;&lt;br /&gt;
            vswd.vswd_data[i] |= buf[1];&lt;br /&gt;
        }&lt;br /&gt;
        putchar('.');&lt;br /&gt;
        if (_ioctl(dh, AUDIO_WRITE_CMEM, &amp;amp;amp;vswd)) {&lt;br /&gt;
            puts(&amp;amp;quot;ioctl-err&amp;amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        free(vswd.vswd_data);&lt;br /&gt;
    }&lt;br /&gt;
    return -1;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
This function expects 2 arguments&lt;br /&gt;
&lt;br /&gt;
* dh Handle of the previously opened audio device&lt;br /&gt;
* ph Handle of a previously opened file that contains the plug-in&lt;br /&gt;
&lt;br /&gt;
This code snippet shows how to open the audio device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;coding&amp;quot;&amp;gt;int fh;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;amp;quot;Open audio device...&amp;amp;quot;);&lt;br /&gt;
dh = _open(&amp;amp;quot;audio0&amp;amp;quot;, _O_RDWR | _O_BINARY);&lt;br /&gt;
if (dh == -1) {&lt;br /&gt;
    printf(&amp;amp;quot;Error %d\n&amp;amp;quot;, errno);&lt;br /&gt;
} else {&lt;br /&gt;
    puts(&amp;amp;quot;OK&amp;amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note, that the audio device needs to be registered first.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;coding&amp;quot;&amp;gt;printf(&amp;amp;quot;Register audio device...&amp;amp;quot;);&lt;br /&gt;
if (NutRegisterSpiDevice(&amp;amp;amp;devSpiVsCodec0, &amp;amp;amp;spiBus0At91, 1)) {&lt;br /&gt;
    puts(&amp;amp;quot;failed&amp;amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    puts(&amp;amp;quot;OK&amp;amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
The next code snippet shows how to open a plug-in file located on the memory card.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;coding&amp;quot;&amp;gt;int fh;&lt;br /&gt;
&lt;br /&gt;
fh = _open(&amp;amp;quot;PHAT0:/venc44k2q05.img&amp;amp;quot;, _O_RDWR | _O_BINARY);&lt;br /&gt;
if (fh == -1) {&lt;br /&gt;
    printf(&amp;amp;quot;Error %d\n&amp;amp;quot;, errno);&lt;br /&gt;
} else {&lt;br /&gt;
    LoadPlugInImage(dh, fh);&lt;br /&gt;
    _close(fh);&lt;br /&gt;
    puts(&amp;amp;quot;OK&amp;amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Recording is simply done by reading from the audio device and writing to a file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;coding&amp;quot;&amp;gt;static uint8_t ogg_buff[512];&lt;br /&gt;
&lt;br /&gt;
fh = _open(&amp;amp;quot;PHAT0:/myrecording.ogg&amp;amp;quot;, _O_CREAT | _O_TRUNC | _O_WRONLY | _O_BINARY);&lt;br /&gt;
if (fh == -1) {&lt;br /&gt;
    printf(&amp;amp;quot;Error %d, can't open audio file\n&amp;amp;quot;, errno);&lt;br /&gt;
} else {&lt;br /&gt;
    stop_recording = 0;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        got = _read(dh, ogg_buff, sizeof(ogg_buff));&lt;br /&gt;
        if (got &amp;amp;lt;= 0 || stop_recording) {&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        if (_write(fh, ogg_buff, got) != got) {&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        _close(fh);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Return to the [[index.html|EIR project page]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	</feed>