Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13407
  • 博文数量: 5
  • 博客积分: 71
  • 博客等级: 民兵
  • 技术积分: 54
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-20 10:59
文章分类
文章存档

2012年(5)

我的朋友

分类: C/C++

2012-03-29 20:26:28

写了一个音乐播放小程序,调用的mplayer,设置好音乐播放目录,运行后随机播放。
C-c或q下一首
C-\删除当前播放的文件
欢迎大家指出缺点!

  1. #include<stdio.h>
  2. #include<dirent.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<string.h>
  6. #include<sys/stat.h>
  7. #include<sys/types.h>
  8. #include <time.h>
  9. #include<signal.h>
  10. #include<sys/wait.h>
  11. #include<setjmp.h>
  12. #define workhome "/home/zhby1990/MP3"
  13. struct NAME
  14. {
  15.     char s[200];
  16. }*name;
  17. int NUM=0,now;
  18. jmp_buf jmpbuffer;
  19. bool is_mp3(char *name)
  20. {
  21.     int n=strlen(name);
  22.     if(name[n-1]=='3'&&name[n-2]=='p'&&name[n-3]=='m'&&name[n-4=='.'])
  23.         return true;
  24.     return false;
  25. }
  26. void get_list(char *s)
  27. {
  28.     DIR *dp;
  29.     struct dirent *dirp;
  30.     struct stat statbuf;
  31.     if((dp=opendir(s))==NULL)
  32.     {
  33.         printf("Can't open %s",workhome);
  34.         return;
  35.     }
  36.     chdir(s);
  37.     while((dirp=readdir(dp))!=NULL)
  38.     {
  39.         lstat(dirp->d_name,&statbuf);
  40.         if(S_ISDIR(statbuf.st_mode))
  41.         {
  42.             if(strcmp(dirp->d_name,".")==0||strcmp(dirp->d_name,"..")==0)continue;
  43.             get_list(dirp->d_name);
  44.         }
  45.         else if(is_mp3(dirp->d_name))
  46.         {
  47.             NAME *p;NUM++;
  48.             p=(NAME *)realloc(name,NUM*sizeof(NAME));
  49.             if(p==NULL)
  50.             {
  51.                 printf("扩展内存失败!\n");
  52.                 exit;
  53.             }
  54.             name=p;
  55.             getcwd(name[NUM-1].s,sizeof(NAME));
  56.             int i=strlen(name[NUM-1].s),j;
  57.             for(name[NUM-1].s[i++]='/',j=0;dirp->d_name[j];j++,i++)
  58.             {
  59.                 name[NUM-1].s[i]=dirp->d_name[j];
  60.             }
  61.             name[NUM-1].s[i]='\0';
  62.         }
  63.     }
  64.     chdir("..");
  65.     closedir(dp);
  66. }
  67. static void del_mp3(int signo)
  68. {
  69.     unlink(name[now].s);
  70.     bool flag=false;
  71.     int len=strlen(name[now].s)-1;
  72.     for(;name[now].s[len]!='/';len--);
  73.     name[now].s[len]='\0';
  74.     len--;
  75.     for(int i=0;i<NUM;i++)
  76.     {
  77.         if(i==now)continue;
  78.         int k=strlen(name[i].s)-1;
  79.         for(;name[i].s[k]!='/';k--);
  80.         k--;
  81.         if(k!=len)continue;
  82.         for(;name[i].s[k]==name[now].s[k]&&k>=0;k--);
  83.         if(k<0)
  84.         {
  85.             flag=true;break;
  86.         }
  87.     }
  88.     //return;
  89.     if(!flag)
  90.     {
  91.         char sql[50];
  92.         sprintf(sql,"rm -rf '%s'",name[now].s);
  93.         system(sql);
  94.     }
  95.     NUM--;
  96.     for(int i=now;i<NUM;i++)
  97.     {
  98.         name[i]=name[i+1];
  99.     }
  100. }
  101. int main()
  102. {
  103.     
  104.     time_t t;
  105.     pid_t pid;
  106.     int status=0;
  107.     chdir(workhome);
  108.     get_list(".");
  109.     for(int i=0;i<NUM;i++)
  110.     {
  111.         printf("%s\n",name[i].s);
  112.     }
  113.     printf("%d\n",NUM);
  114.     char sql[300];
  115.     srand((unsigned) time(&t));
  116.     signal(SIGQUIT,del_mp3);
  117.     signal(SIGINT,SIG_IGN);
  118.     while(true)
  119.     {
  120.         if(NUM==0)
  121.         {
  122.             printf("没有歌曲了!\n");return 0;
  123.         }
  124.         pid=fork();
  125.         now=rand()%NUM;
  126.         if(pid==0)
  127.         {
  128.             sprintf(sql,"%s",name[now].s);
  129.             execlp("mplayer","mplayer",sql,NULL);
  130.         }
  131.         else
  132.         {
  133.             wait(&status);
  134.         }
  135.     }
  136. }

阅读(517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~