简易mp3播放器(SDL)

本文是根据http://blog.csdn.net/pennyshe/article/details/6553888修改的,在此声明!

写一个简单的mp3播放器,去掉了界面。有个问题就是不能自动播放下一曲。

 注:需要安装SDL2-2.0.3、SDL2_mixer-2.0.0http://www.libsdl.org/projects/SDL_mixer和smpeghttp://download.csdn.net/detail/zdf511391565/8025611(播放mp3用的)

具体安装方法详见:http://blog.csdn.net/gameboy12615/article/details/5723836

mp3编码器(LAME):http://sourceforge.net/projects/lame/files/lame

  gcc -o mp3SDLplay mp3SDLplay.c -L/usr/lib -lSDL2 -lSDL2_mixer

  ./mp3SDLplay /home/armmlinux/Music/huomiao.mp3 or

./mp3SDLplay /home/armmlinux/Music/*.mp3

 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <signal.h>  
  5. #include "SDL2/SDL.h"  
  6. #include "SDL2/SDL_mixer.h"  
  7. char songlist[50][50];  
  8. Mix_Music *music = NULL;  
  9. int sum ,playing;  
  10. int quit;  
  11. int Sdl_init()  
  12. {  
  13.     if( SDL_Init(SDL_INIT_AUDIO)<0){  
  14.         fprintf(stderr,"Couldn't Initialize SDL: %s/n",SDL_GetError());  
  15.             return 0;  
  16.     }  
  17.       
  18. //  int audio_rate = 22050;  
  19.     int audio_rate = 44100;  
  20.     Uint16 audio_format = AUDIO_S16SYS;  
  21. //  Uint16 audio_format = AUDIO_S16;  
  22.     int audio_channels = 2;  
  23.     int audio_buffers = 4096;  
  24. //  int audio_buffers = 1024;  
  25.     int audio_volume = MIX_MAX_VOLUME;  
  26.     char channeltype[][10] = {"","mono","stereo","surround"};  
  27.     if(Mix_OpenAudio(audio_rate, audio_format, audio_channels,audio_buffers)<0){  
  28.         fprintf(stderr,"Couldn't Open Audio: %s/n",SDL_GetError());  
  29.         return 0;  
  30.     }  
  31.     Mix_QuerySpec(&audio_rate,&audio_format,&audio_channels);  
  32.     Mix_VolumeMusic(audio_volume);  
  33.     Mix_SetMusicCMD(getenv("MUSIC_CMD"));  
  34.     fprintf(stdout,"Open Audio at %d Hz,%d bit,%s (%s),%d bytes buffer/n",audio_rate,audio_format& 0xFF ,channeltype[audio_channels],(audio_format&0x1000)?"BE":"LE",audio_buffers);      
  35.     return 1;  
  36. }  
  37. void PlayMusic(int track)  
  38. {  
  39.     if(track<0 || track >=sum){  
  40.         fprintf(stderr,"Input Error/n");  
  41.         return ;  
  42.     }  
  43.     if(Mix_PlayingMusic()){  
  44.         Mix_FadeOutMusic(1000);  
  45.         SDL_Delay(1000);  
  46.     }  
  47.     if(music != NULL)  
  48.         Mix_FreeMusic(music);  
  49.       
  50.     music = NULL;  
  51.     music = Mix_LoadMUS(songlist[track]);  
  52.     if(music == NULL){  
  53.         fprintf(stderr,"Couldn't load %s: %s",songlist[track],SDL_GetError());  
  54.         return ;  
  55.     }  
  56.     if(Mix_FadeInMusic(music,-1,2000) == -1){  
  57.         fprintf(stderr,"Couldn't Play %s: %s",songlist[track],SDL_GetError());  
  58.         return ;  
  59.     }  
  60.     fprintf(stdout,"Now Playing ♪♫♫♪ %s/n",songlist[track]);  
  61.     playing = track;  
  62. }  
  63. void PlayNext()  
  64. {  
  65.     PlayMusic((playing+1)%sum);  
  66. }  
  67. void PlayPrevious()  
  68. {  
  69.     PlayMusic((playing-1+sum)%sum);  
  70. }  
  71. void SetVolume(int vol)  
  72. {     
  73.     if(vol < 0 || vol > MIX_MAX_VOLUME){  
  74.         fprintf(stderr,"Volume Value Error.(0 - %d)/n", MIX_MAX_VOLUME); return ;  
  75.     }  
  76.     Mix_VolumeMusic(vol);  
  77. }  
  78. void PauseMusic()  
  79. {  
  80.     if(Mix_PlayingMusic())  
  81.         Mix_PauseMusic();  
  82. }  
  83. void ResumeMusic()  
  84. {  
  85.     if(Mix_PausedMusic())  
  86.         Mix_ResumeMusic();  
  87.     else if(!Mix_PlayingMusic())  
  88.         PlayMusic(playing);  
  89. }  
  90. void StopMusic()  
  91. {  
  92.     if(Mix_PlayingMusic())  
  93.         Mix_HaltMusic();  
  94. }  
  95. void ListMusic()  
  96. {  
  97.     int i;  
  98.     fprintf(stdout,"***********SONGLIST*************/n");  
  99.     for(i=0;i<sum;i++)  
  100.         fprintf(stdout,"%d: %s/n",i+1,songlist[i]);  
  101.     fprintf(stdout,"********************************/n");  
  102. }  
  103. void PrintCliInfo()  
  104. {  
  105.         fprintf(stdout,"*************HELP***************\n");  
        fprintf(stdout,"      p(pause) c(continue)\n");  
        fprintf(stdout,"      f(previous) n(next)\n");  
        fprintf(stdout,"      l(list) t#(play#)\n");  
        fprintf(stdout,"      s(stop)     v#(volume:0~%d)\n",MIX_MAX_VOLUME);  
        fprintf(stdout,"      h(help) d#(delete#))\n");  
        fprintf(stdout,"      q(quit)\n");  
        fprintf(stdout,"********************************\n");  
  106. }  
  107. void PrintHelpInfo()  
  108. {  
  109.         fprintf(stdout,"Uage:easymp3 [option]... [file]...\n");  
        fprintf(stdout,"[option]\n");  
        fprintf(stdout,"--help\tprintf help and quit!\n"); 
  110. }  
  111. void Control()  
  112. {  
  113.     PlayMusic(playing);  
  114.     char cmd[20];  
  115.     int i;  
  116.     while(!quit){  
  117.         fprintf(stdout,"Enter :");  
  118.         fscanf(stdin,"%s",cmd);  
  119.         switch(*cmd){  
  120.             case 'q':  
  121.                 Mix_HaltMusic();  
  122.                 quit = 1;  
  123.                 break;  
  124.             case 'n':  
  125.                 PlayNext();  
  126.                 break;  
  127.             case 'p':  
  128.                 PauseMusic();  
  129.                 break;  
  130.             case 'c':  
  131.                 ResumeMusic();  
  132.                 break;  
  133.             case 's':  
  134.                 StopMusic();  
  135.                 break;  
  136.             case 'f':  
  137.                 PlayPrevious();  
  138.                 break;  
  139.             case 'h':  
  140.                 PrintCliInfo();  
  141.                 break;  
  142.             case 'd':  
  143.                 for(i=atoi(cmd+1);i<sum;i++)  
  144.                     strcpy(songlist[i-1],songlist[i]);  
  145.                 sum--;  
  146.                 break;  
  147.             case 't':  
  148.                 PlayMusic(atoi(cmd+1)-1);  
  149.                 break;  
  150.             case 'l':  
  151.                 ListMusic();  
  152.                 break;  
  153.             case 'v':  
  154.                 Mix_VolumeMusic(atoi(cmd+1));  
  155.                 break;    
  156.             default:  
  157.                 break;  
  158.         }  
  159.     }  
  160. }  
  161. void FreeSDL()  
  162. {  
  163.     if(Mix_PlayingMusic())  
  164.         Mix_HaltMusic();      
  165.     if( music != NULL){  
  166.         Mix_FreeMusic(music);  
  167.         music = NULL;  
  168.     }  
  169.     Mix_CloseAudio();  
  170.     SDL_Quit();  
  171. }  
  172. int main(int argc, char *argv[])  
  173. {  
  174.     quit = 0;  
  175.     int i;  
  176.     for(i=1; i<argc &&  *argv[i] == '-'; i++ ){  
  177.         if(!strcmp(argv[i],"--help")){  
  178.             PrintHelpInfo();      
  179.             return 0;  
  180.         }  
  181.     }  
  182.     if(i>=argc){  
  183.         PrintHelpInfo();  
  184.         return 0;  
  185.     }  
  186.     if(!Sdl_init()){  
  187.         return 0;  
  188.     }  
  189.     for(sum=0;i<argc;i++,sum++)  
  190.         strcpy(songlist[sum],argv[i]);  
  191.     playing = 0;  
  192.     PrintCliInfo();  
  193.     Control();  
  194.     FreeSDL();  
  195.     return 0;  
  196. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武溪嵌人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值