+mp3

Dependencies:   mbed

Fork of VS1053 by SGMP Coperations

Revision:
0:58524d569dfd
Child:
1:17913cff05a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/player.cpp	Fri Dec 02 19:37:00 2016 +0000
@@ -0,0 +1,201 @@
+#include "player.h"
+#include"SDFileSystem.h"
+
+SDFileSystem sd(D11, D12, D13, D9, "sd"); // the pinout on the mbed Cool
+vs10xx vs1053(D11, D12, D13, D6, D7, D2, D8);//mosi,miso,sclk,xcs,xdcs,dreq,xreset
+Serial pc(USBTX, USBRX);
+playerStatetype  playerState;
+ctrlStatetype ctrlState;
+static unsigned char fileBuf[1024];
+unsigned char *bufptr;
+
+char list[20][14];            //song list
+char index = 0;      //song play index
+char index_MAX;      //how many song in all
+unsigned char vlume = 0x40;   //vlume
+unsigned char vlumeflag = 0;  //set vlume flag
+
+void Player::begin(void)
+{
+    DirHandle *dir;
+    struct dirent *ptr;
+		FileHandle *fp;
+   
+    vs1053.reset();
+    dir = opendir("/sd");
+    printf("\r\n**********playing list**********\r\n");
+    unsigned char i = 0,j=0;
+    while(((ptr = dir->readdir()) != NULL)&&(i <20))
+    {
+        if(strstr(ptr->d_name,".mp3")||strstr(ptr->d_name,".MP3")||strstr(ptr->d_name,".WAV")||strstr(ptr->d_name,".wav")
+            ||strstr(ptr->d_name,".WMA")||strstr(ptr->d_name,".wma")||strstr(ptr->d_name,".OGG")||strstr(ptr->d_name,".ogg")
+            ||strstr(ptr->d_name,".AAC")||strstr(ptr->d_name,".aac")||strstr(ptr->d_name,".FLAC")||strstr(ptr->d_name,".flac"))
+        {
+							fp =sd.open(ptr->d_name, O_RDONLY);
+							if(fp != NULL) 
+							{
+								char *byte = ptr->d_name;
+                j=0;
+                while(*byte)
+                {
+                    list[i][j++]  = *byte++;
+                }
+                pc.printf("%2d . %s\r\n", i,list[i++]);
+								//fp->close();
+							}
+        }
+    }
+    index_MAX = i-1;
+		dir->closedir();
+    printf("\r\n");
+}
+
+/*  This function plays back an audio file.  */
+void Player::playFile(char *file) {
+    int bytes;        // How many bytes in buffer left
+    char n;
+  
+    
+    playerState = PS_PLAY;
+    
+    if (strstr(file, ".flac"))
+    {
+        printf("Loading FLAC Plugin...\r\n");
+        vs1053.loadPlugin(flacPlugin,sizeof(flacPlugin)/sizeof(flacPlugin[0]));   
+    }
+
+    vs1053.setFreq(24000000);     //hight speed
+     
+    FileHandle *fp =sd.open(file, O_RDONLY);
+    
+    if(fp == NULL) {
+        printf("Could not open %s\r\n",file);
+
+    }
+    else
+    {
+        printf("Playing %s ...\r\n",file);
+        
+        /* Main playback loop */
+        while((bytes = fp->read(fileBuf,512)) > 0)
+        {
+            bufptr = fileBuf;
+            
+            // actual audio data gets sent to VS10xx.
+            while(bytes > 0)
+            {
+                n = (bytes < 32)?bytes:32; 
+                vs1053.writeData(bufptr,n);
+                bytes -= n;
+                bufptr += n;
+            }
+            while(playerState == PS_PAUSE);         //Pause
+            
+           if(vlumeflag)                          //set vlume
+            {
+                vs1053.setFreq(12000000);     //low speed
+                vs1053.writeRegister(SPI_VOL, vlume*0x101);     //Set volume level
+                vs1053.setFreq(24000000);     //higth speed
+                vlumeflag = 0;  //clear flag;            
+            }
+            
+            if(playerState != PS_PLAY)         //stop
+            {
+                fp->close();
+                vs1053.softReset();
+                return;
+            }
+        }
+        fp->close();
+        vs1053.softReset(); 
+        printf("[done!]\r\n");
+    }
+    if(index != index_MAX)index++;
+    else index = 0;
+}
+
+
+/* PCM file Header */
+unsigned char pcmHeader[44] = {
+  'R', 'I', 'F', 'F',
+  0xFF, 0xFF, 0xFF, 0xFF,
+  'W', 'A', 'V', 'E',
+  'f', 'm', 't', ' ',
+  0x10, 0, 0, 0,          /* 16 */
+  0x1, 0,                 /* PCM */
+  0x1, 0,                 /* chan */
+  0x40, 0x1F, 0x0, 0x0,     /* sampleRate */
+  0x80, 0x3E, 0x0, 0x0,     /* byteRate */
+  2, 0,                   /* blockAlign */
+  0x10, 0,                /* bitsPerSample */
+  'd', 'a', 't', 'a',
+  0xFF, 0xFF, 0xFF, 0xFF
+};
+
+void Set32(unsigned char *d, unsigned int n) {
+  int i;
+  for (i=0; i<4; i++) {
+    *d++ = (unsigned char)n;
+    n >>= 8;
+  }
+}
+
+/*  This function records an audio file in WAV formats.Use LINK1,left channel  */
+void Player::recordFile(char *file) {
+    unsigned int fileSize = 0;
+    unsigned int n;
+
+    vs1053.writeRegister(SPI_BASS, 0x0055);    //set accent
+    vs1053.writeRegister(SPI_AICTRL0,8000);    //samplerate 8k
+    vs1053.writeRegister(SPI_AICTRL1,0);       //record gain
+    vs1053.writeRegister(SPI_AICTRL2,0);       //Set the gain maximum,65536=64X
+    vs1053.writeRegister(SPI_AICTRL3,7);       //PCM Mode ,left channel,earphone mic
+    //vs1053.writeRegister(SPI_AICTRL3,6);     //PCM Mode ,right channel,board mic
+    vs1053.writeRegister(SPI_CLOCKF,0x2000);   //set clock
+    
+    printf("loading recording plugin......\r\n");
+    vs1053.writeRegister(SPI_MODE,0x1804);   //Initialize recording
+    
+    vs1053.loadPlugin(recPlugin,sizeof(recPlugin)/sizeof(recPlugin[0]));
+    sd.remove(file);
+    FileHandle *fp =sd.open(file, O_WRONLY|O_CREAT);
+    if(fp == NULL) {
+        printf("Could not open file for write\r\n");
+    }
+    else
+    {
+        printf("recording......\r\n");
+        while(playerState == PS_RECORDING)
+        {
+            unsigned int i;
+            unsigned char *rbp = fileBuf;
+            /* See if there is some data available */
+            if ((n = vs1053.readRegister(SPI_HDAT1)) > 0) {
+                /* Make little-endian conversion for 16-bit PCM .WAV files */
+                if(n>511)n=511;
+                for (i=0; i<n;i++) {
+                    unsigned int w = vs1053.readRegister(SPI_HDAT0);
+                    *rbp++ = (unsigned char)(w & 0xFF);
+                    *rbp++ = (unsigned char)(w >> 8);
+                }
+                fp->write(fileBuf,2*n);
+                fileSize += 2*n;
+            }
+                
+        } 
+        
+        /* Update file sizes for an RIFF PCM .WAV file */
+        fp->lseek(0, SEEK_SET);
+        Set32(pcmHeader+4, fileSize-8);
+        Set32(pcmHeader+40, fileSize-36);
+        fp->write(pcmHeader, sizeof(pcmHeader));
+        fp->close();
+
+        printf("recording end\r\n");
+    }
+    /* Finally, reset the VS10xx software, including realoading the
+       patches package, to make sure everything is set up properly. */
+    vs1053.softReset();
+
+}
+