SMART WAV audio processor connected together with the SMART GPU graphics processor, a \"windows media player\" application is demostrated, be sure to download demo\'s used files to the microSD card. http://vizictechnologies.com/#/software-demos-sw/4560115377
Dependencies: SMARTGPU mbed SMARTWAV
main.cpp
- Committer:
- emmanuelchio
- Date:
- 2012-02-12
- Revision:
- 0:a38a3a6a3724
File content as of revision 0:a38a3a6a3724:
/**************************************************************************************/ /*SMARTWAV intelligent embedded Audio processor unit those examples are for use the SMARTWAV with the mbed microcontoller, just connect tx,rx,and reset Board: http://vizictechnologies.com/#/smart-wav/4559021187 This example requires pre-loaded content to the micro SD card, Audio .WAV files! www.vizictechnologies.com Vizic Technologies copyright 2012 */ /**************************************************************************************/ /**************************************************************************************/ #include "mbed.h" #include "SMARTWAV.h" #include "SMARTGPU.h" SMARTWAV sWav(p13,p14,p15); //(TX,RX,Reset); SMARTGPU lcd(p28,p27,p29); //(TX,RX,Reset); //Each times we use the touchscreen we must define a int array that stores the X and Y readed or touched coordinates. int touch[2]; //Each times we use the touchicon we must define a char array that stores the name of the touched icon. char icon[3]; //Global Variables char playList[500]; //an array for storing the retrieved list of Audio files char dirList[500]; //an array for storing the retrieved list of Folders/Dirs char songName[9]; // 8 characters + null character char times[6]={0}; //array to store the times unsigned char audioItems=0; //variable storing the total of audio files on the 'playlist' array unsigned char dirItems=0; //variable storing the total of Folders/Dirs on the 'dirList' array unsigned char totalAudioItems=0; unsigned char songPointer=0; unsigned char minutes=0,seconds=0; unsigned int progress=0; //to draw song progress /************************************************************************************************/ //Simple function to count the number of items on a list /************************************************************************************************/ unsigned char getListItems(char *list){ // returns the number of audio files on current folder/Dir, if none or fails returns 0 unsigned int i=0; unsigned char counter=0; while(1){ if(list[i]==','){ counter ++; } if(list[i]==0x00){ return counter; } i++; } } /************************************************************************************************/ //Simple function that returns the name of a given item number of a list /************************************************************************************************/ unsigned char getListNameItem(char *list, unsigned char itemNo, char *name){ // returns the name of the sWav file number 'Item' on the given 'name' buffer; on current buffer, fails or end of items return 0, succesfull returns 1; unsigned int i=0; unsigned char counter=0,x=0; while(1){ if(counter==itemNo){ break; } while(1){ if(list[i]==','){ i++; counter ++; break; } if(list[i]==0x00){ return 0; } i++; } } while(1){ name[x]=list[i]; i++; x++; if(list[i]==','){ name[x]=0x00; return 1; } if(x>7){ return 0; } } } /************************************************************************************************/ /************************************************************************************************/ //This function gets the existing folders and songs on the microSD root, and displays them void getData(){ unsigned char x; char name[9]={0}; wait_ms(50); sWav.getFolderList(dirList); wait_ms(50); sWav.getFileList(playList); audioItems=getListItems(playList); dirItems=getListItems(dirList); if(dirItems>8){ //Show up to 8 Folders/Dirs dirItems=8; } if(audioItems>8){ //Show up to 8 audio Items audioItems=8; } //display the folder items for(x=0;x<dirItems;x++){ getListNameItem(dirList,x,name); lcd.string(15,70+(x*20),319,239,YELLOW,FONT3,UNFILL,name); } //display the audio items for(x=0;x<audioItems;x++){ getListNameItem(playList,x,name); lcd.string(170,70+(x*20),319,239,YELLOW,FONT3,UNFILL,name); } //get true total items audioItems=getListItems(playList); totalAudioItems=audioItems; dirItems=getListItems(dirList); } /************************************************************************************************/ /************************************************************************************************/ //This function search for a song and play it, also displays the song artwork. void searchSong(){ char name[9]={0}; if(songPointer>=totalAudioItems){//if we reached the end of items songPointer=0; } while(1){ getListNameItem(playList,songPointer,name); //get a song file name if(sWav.playTrackName(name)=='O'){ lcd.imageSD(80,25,name); lcd.drawRectangle(10,8,75,22,0x0926,FILL); //erase previous song name lcd.string(10,8,319,239,WHITE,FONT3,FILL,name); //draw song name lcd.string(265,8,319,239,WHITE,FONT2,FILL,"00:00"); //draw the times lcd.drawLine(0,204,319,204,BLACK); //draw progress line lcd.imageSD(146,208,"pause"); minutes=0; seconds=0; progress=0; songPointer++; //increase song pointer break; }else{ songPointer++; //increase song pointer wait_ms(100); } } } /**************************************************/ /****************** MAIN LOOP *********************/ /**************************************************/ /**************************************************/ /***************************************************/ int main() { unsigned int tick=0; //counter to advance seconds //Those two functions must always be called for SMARTGPU support lcd.reset(); //configure the serial and pinout of arduino board for SMARTGPU support lcd.start(); //initialize the SMARTGPU processor //Those two functions must always be called for SMARTWAV support sWav.reset(); //perform an initial reset sWav.init(); //initialize the SMARTWAV processor lcd.baudChange(2000000); //set high baud for advanced applications //load main playlist lcd.imageSD(0,0,"List"); lcd.string(5,5,239,239,GREEN,FONT3,UNFILL,"Library Play List:"); lcd.string(5,40,239,239,GREEN,FONT3,UNFILL,"Folders/Dirs:"); lcd.string(160,40,319,239,GREEN,FONT3,UNFILL,"Songs/Audio Files:"); getData(); //get folders and songs and display them //wait_ms for a touch on screen to start playing songs while(lcd.touchScreen(touch)==0); lcd.imageSD(0,0,"player"); lcd.drawLine(230,222,271,222,YELLOW); lcd.imageSD(266,217,"ball"); lcd.setTextBackground(0x0926); while(1){ // search for a song and play it + show artwork searchSong(); while(1){ //wait_ms for a touch on screen to perform something while(lcd.touchScreen(touch)==0 | touch[YCOORD]<200){ tick++; if(tick > 500){ //if about 1 second have passed- this isn't accurate, the best way to achieve 1 second is by timesr interrupts tick=0; //reset counter seconds++; progress++; if(seconds>59){ minutes++; seconds=0; } times[0]=(minutes/10)+0x30; //get the tens of the minutes and convert them to ascii times[1]=(minutes%10)+0x30; //get the ones of the minutes and convert them to ascii times[2]=':'; times[3]=(seconds/10)+0x30; //get the tens of the seconds and convert them to ascii times[4]=(seconds%10)+0x30; //get the ones of the seconds and convert them to ascii lcd.string(265,8,319,239,WHITE,FONT2,FILL,times); //draw the time lcd.drawLine(0,204,progress,204,YELLOW); //draw progress line if(sWav.getStatus()!=0x01){ //if no song is being played-means end of song wait_ms(500); sWav.stopTrack(); wait_ms(500); searchSong(); //play next songpointer song } } } //decode touch into buttons if(touch[XCOORD]>90 & touch[XCOORD]<117){//touch on STOP button sWav.stopTrack(); lcd.imageSD(146,208,"play"); lcd.string(265,8,319,239,WHITE,FONT2,FILL,"00:00"); //draw the times lcd.drawLine(0,204,319,204,BLACK); //draw progress line wait_ms(1000); //wait_ms for a touch on play button to resume song play-back while(lcd.touchScreen(touch)==0 | !(touch[XCOORD]>144 & touch[XCOORD]<173)); break; }else if(touch[XCOORD]>116 & touch[XCOORD]<145){//touch on REWIND button sWav.rewindTrack(); lcd.string(265,8,319,239,WHITE,FONT2,FILL,"00:00"); //draw the times lcd.drawLine(0,204,319,204,BLACK); //draw progress line minutes=0; seconds=0; progress=0; }else if(touch[XCOORD]>144 & touch[XCOORD]<173){//touch on PAUSE/PLAY button sWav.pausePlay(); lcd.imageSD(146,208,"play"); wait_ms(1000); //wait_ms for a touch on pausePlay button to resume song play-back while(lcd.touchScreen(touch)==0 | !(touch[XCOORD]>144 & touch[XCOORD]<173)); sWav.pausePlay(); lcd.imageSD(146,208,"pause"); }else if(touch[XCOORD]>172 & touch[XCOORD]<202){//touch on NEXT button sWav.stopTrack(); wait_ms(200); break; }else if(touch[XCOORD]>229 & touch[XCOORD]<272){//touch on VOLUME lcd.drawLine(touch[XCOORD],222,271,222,BLACK); lcd.drawLine(230,222,touch[XCOORD],222,YELLOW); lcd.imageSD(touch[XCOORD]-4,217,"ball"); sWav.volume(214+ (touch[XCOORD]-230)); } wait_ms(200); } } }