<?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=MMC_MP3_Player</id>
		<title>MMC MP3 Player - 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=MMC_MP3_Player"/>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=MMC_MP3_Player&amp;action=history"/>
		<updated>2026-04-28T22:50:57Z</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=MMC_MP3_Player&amp;diff=158&amp;oldid=prev</id>
		<title>Harald: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=MMC_MP3_Player&amp;diff=158&amp;oldid=prev"/>
				<updated>2016-10-27T16:02:57Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 16:02, 27 October 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;' lang='en'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=MMC_MP3_Player&amp;diff=157&amp;oldid=prev</id>
		<title>Harald: /* Playing a file */</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=MMC_MP3_Player&amp;diff=157&amp;oldid=prev"/>
				<updated>2009-03-11T12:05:22Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Playing a file&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Test Environments ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;smalldiv&amp;quot;&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; |&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; | Hardware&amp;lt;br&amp;gt;Comments&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; | '''Nut/OS&amp;lt;br&amp;gt;4.7.4'''&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; | '''Nut/OS&amp;lt;br&amp;gt;4.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:gray&amp;quot;&amp;gt;Ethernut 3.0 E&amp;lt;/span&amp;gt;&lt;br /&gt;
| requires [http://www.ethernut.de/en/hardware/medianut2/index.html Medianut]&lt;br /&gt;
| Compiler Error&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;EIR 1.0 C&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| OK&amp;lt;br&amp;gt;[http://ethernut.de/arc/WIKI_BINARIES_ZIPPED/mp3-player-EIR1C-nutos-4.7.4.zip '''Binaries''']&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:gray&amp;quot;&amp;gt;AT91SAM7X-EK&amp;lt;/span&amp;gt;&lt;br /&gt;
| requires [http://www.ethernut.de/en/documents/sam-web-radio.html Calypso]&lt;br /&gt;
| NT&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:gray&amp;quot;&amp;gt;AT91SAM9260-EK&amp;lt;/span&amp;gt;&lt;br /&gt;
| requires [http://www.ethernut.de/en/documents/sam-web-radio.html Calypso]&lt;br /&gt;
| NT&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| id=&amp;quot;compilertd&amp;quot; colspan=&amp;quot;4&amp;quot; |'''Compiler:''' ARM-GCC 4.2.2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This is a simple MP3 player. It scans a MultiMedia Card for files with extension &amp;lt;code&amp;gt;.mp3&amp;lt;/code&amp;gt; and sends the contents to an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
This code requires Nut/OS 4.8 or later. Check the page's history (Nov 2008) for previous versions.&lt;br /&gt;
&lt;br /&gt;
=== Main routine ===&lt;br /&gt;
&lt;br /&gt;
The main program does some initialization and then enters an endless loop, reading the MMC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cfg/os.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;fs/phatfs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/timer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/board.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;cfg/arch/gpio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;cfg/audio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#define VERSION     &amp;quot;1.4.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#if defined(AT91SAM7X_EK) || defined(AT91SAM9260_EK)&lt;br /&gt;
#include &amp;lt;dev/hxcodec.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#define CS_HARDWARE_CODEC   1&lt;br /&gt;
#include &amp;lt;dev/vscodec.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
static int ScanFolder(char *root);&lt;br /&gt;
static int PlayFile(int fd);&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    u_long baud = 115200;&lt;br /&gt;
    int volid;&lt;br /&gt;
 &lt;br /&gt;
    NutRegisterDevice(&amp;amp;DEV_DEBUG, 0, 0);&lt;br /&gt;
    freopen(DEV_DEBUG_NAME, &amp;quot;w&amp;quot;, stdout);&lt;br /&gt;
    _ioctl(_fileno(stdout), UART_SETSPEED, &amp;amp;baud);&lt;br /&gt;
    puts(&amp;quot;\nNut/OS MMC MP3 Player &amp;quot; VERSION);&lt;br /&gt;
 &lt;br /&gt;
#ifdef CS_HARDWARE_CODEC&lt;br /&gt;
    NutRegisterSpiDevice(&amp;amp;devSpiVsCodec0, &amp;amp;DEV_SPIBUS, CS_HARDWARE_CODEC);&lt;br /&gt;
#else&lt;br /&gt;
    NutRegisterDevice(&amp;amp;devHelixCodec, 0, 0);&lt;br /&gt;
#endif&lt;br /&gt;
    NutRegisterDevice(&amp;amp;devPhat0, 0, 0);&lt;br /&gt;
    NutRegisterDevice(&amp;amp;DEV_MMCARD, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
    for (;;) {&lt;br /&gt;
        for (;;) {&lt;br /&gt;
            printf(&amp;quot;Card...&amp;quot;);&lt;br /&gt;
            if ((volid = _open(DEV_MMCARD_NAME &amp;quot;:1/PHAT0&amp;quot;, _O_RDWR | _O_BINARY)) != -1) {&lt;br /&gt;
                puts(&amp;quot;ready&amp;quot;);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            puts(&amp;quot;not found&amp;quot;);&lt;br /&gt;
            NutSleep(2000);&lt;br /&gt;
        }&lt;br /&gt;
        ScanFolder(&amp;quot;PHAT0:/&amp;quot;);&lt;br /&gt;
        _close(volid);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the top all required header files are included.&lt;br /&gt;
&lt;br /&gt;
The MP3 Player can either use a hardware decoder chip or do decoding by software.&lt;br /&gt;
&lt;br /&gt;
=== Scanning a folder ===&lt;br /&gt;
&lt;br /&gt;
The following routine scans a specified folder for MP3 files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int ScanFolder(char *root)&lt;br /&gt;
{&lt;br /&gt;
    int rc = 0;&lt;br /&gt;
    DIR *dir;&lt;br /&gt;
    int fd;&lt;br /&gt;
    char *path;&lt;br /&gt;
 &lt;br /&gt;
    printf(&amp;quot;Scanning %s\n&amp;quot;, root);&lt;br /&gt;
    dir = opendir(root);&lt;br /&gt;
    if(dir) {&lt;br /&gt;
        struct dirent *dep;&lt;br /&gt;
 &lt;br /&gt;
        path = malloc(256);&lt;br /&gt;
        while(rc == 0 &amp;amp;&amp;amp; (dep = readdir(dir)) != NULL) {&lt;br /&gt;
            if (strcmp(dep-&amp;gt;d_name, &amp;quot;.&amp;quot;) &amp;amp;&amp;amp; strcmp(dep-&amp;gt;d_name, &amp;quot;..&amp;quot;)) {&lt;br /&gt;
                if (dep-&amp;gt;d_type) {&lt;br /&gt;
                    strcpy(path, root);&lt;br /&gt;
                    strcat(path, dep-&amp;gt;d_name);&lt;br /&gt;
                    strcat(path, &amp;quot;/&amp;quot;);&lt;br /&gt;
                    rc = ScanFolder(path);&lt;br /&gt;
                } else {&lt;br /&gt;
                    char *cp = strrchr(dep-&amp;gt;d_name, '.');&lt;br /&gt;
                    if (cp &amp;amp;&amp;amp; stricmp(cp, &amp;quot;.mp3&amp;quot;) == 0) {&lt;br /&gt;
                        strcpy(path, root);&lt;br /&gt;
                        strcat(path, dep-&amp;gt;d_name);&lt;br /&gt;
                        sprintf(path, &amp;quot;%s%s&amp;quot;, root, dep-&amp;gt;d_name);&lt;br /&gt;
                        printf(&amp;quot;Playing %s\n&amp;quot;, path);&lt;br /&gt;
                        fd = _open(path, _O_RDONLY | _O_BINARY);&lt;br /&gt;
                        if (fd == -1) {&lt;br /&gt;
                            rc = -1;&lt;br /&gt;
                        } else {&lt;br /&gt;
                            rc = PlayFile(fd);&lt;br /&gt;
                            _close(fd);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        closedir(dir);&lt;br /&gt;
        free(path);&lt;br /&gt;
    }&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Playing a file ===&lt;br /&gt;
&lt;br /&gt;
The routine PlayFile expects a file handle of an opened MP3 file and streams its contents to the audio decoder driver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static int PlayFile(int fd)&lt;br /&gt;
{&lt;br /&gt;
    int codec;&lt;br /&gt;
    uint8_t *mp3buff;&lt;br /&gt;
 &lt;br /&gt;
    codec = _open(&amp;quot;audio0&amp;quot;, _O_WRONLY | _O_BINARY);&lt;br /&gt;
    if (codec == -1) {&lt;br /&gt;
        printf(&amp;quot;No codec\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    mp3buff = malloc(512);&lt;br /&gt;
    for (;;) {&lt;br /&gt;
        int got;&lt;br /&gt;
        uint8_t *bp;&lt;br /&gt;
 &lt;br /&gt;
        bp = mp3buff;&lt;br /&gt;
        got = _read(fd, bp, 512);&lt;br /&gt;
        if (got &amp;lt;= 0) {&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        while (got) {&lt;br /&gt;
            int sent;&lt;br /&gt;
 &lt;br /&gt;
            sent = _write(codec, bp, got);&lt;br /&gt;
            if (sent &amp;lt; 0) {&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            if (sent == 0) {&lt;br /&gt;
                NutSleep(1);&lt;br /&gt;
            } else {&lt;br /&gt;
                got -= sent;&lt;br /&gt;
                bp += sent;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    free(mp3buff);&lt;br /&gt;
    _close(codec);&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Here's the Makefile to build the MP3 player.&lt;br /&gt;
Note, that the spaces before &amp;lt;code&amp;gt;-rm -f $...&amp;lt;/code&amp;gt; have to be tabs instead of spaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
PROJ = cs_mp3mmc&lt;br /&gt;
&lt;br /&gt;
include ../Makedefs&lt;br /&gt;
&lt;br /&gt;
SRCS =  $(PROJ).c&lt;br /&gt;
OBJS =  $(SRCS:.c=.o)&lt;br /&gt;
LIBS =  $(LIBDIR)/nutinit.o -lnutfs -lnutos -lnutcrt -lnutdev -lnutarch -lnutcontrib&lt;br /&gt;
TARG =  $(PROJ).hex&lt;br /&gt;
&lt;br /&gt;
all: $(OBJS) $(TARG) $(ITARG) $(DTARG)&lt;br /&gt;
&lt;br /&gt;
include ../Makerules&lt;br /&gt;
&lt;br /&gt;
clean:&lt;br /&gt;
        -rm -f $(OBJS)&lt;br /&gt;
        -rm -f $(TARG) $(ITARG) $(DTARG)&lt;br /&gt;
        -rm -f $(PROJ).obj&lt;br /&gt;
        -rm -f $(PROJ).map&lt;br /&gt;
        -rm -f $(SRCS:.c=.lst)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Reading PHAT Files]]&lt;br /&gt;
* [[Reading PHAT Directories]]&lt;br /&gt;
* More [[Nut/OS Examples]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Fopen C file input/output] The C programming language provides many standard library functions for file input and output.&lt;br /&gt;
* [http://en.wikipedia.org/wiki/MP3 MP3] MPEG-1 Audio Layer 3, more commonly referred to as MP3, is a digital audio encoding format using a form of lossy data compression.&lt;br /&gt;
&lt;br /&gt;
[[Category:Code Snippets]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Languages}}&lt;/div&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	</feed>