当前位置:   article > 正文

C语言 音乐播放器项目(综合)_c语言音乐

c语言音乐

1.main.c文件

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include <unistd.h>//休眠所需的头文件
  5. #include "./pos/console.h"//光标使用所需的头文件
  6. #include "lrc.h"
  7. #include "./mplayer/start_mplayer.h"//播放歌曲的头文件
  8. int main(int argc, char const *argv[])
  9. {
  10. ontime time = {0,0,0};
  11. char *text = get_data();
  12. char *list[50];
  13. int num = cut_text(text,list);
  14. showsong(list);
  15. jay *head = songword(num,list);
  16. free(text);
  17. showtime(time);
  18. showsongtxt(head,NULL);
  19. mplayer_play("./music/简单爱.mp3");
  20. jay *pd = head;
  21. int t = 0;
  22. while(1)
  23. {
  24. int m = t / 60;
  25. int s = t % 60;
  26. time.m = m;
  27. time.s = s;
  28. showtime(time);
  29. pd = findspot(head,t);
  30. if (pd != NULL)
  31. {
  32. showsong(list);
  33. showtime(time);
  34. jay *h = findstartspot(pd);
  35. showsongtxt(h,pd);
  36. if (pd -> n == NULL)
  37. {
  38. break;
  39. }
  40. }
  41. sleep(1);
  42. //时间+1
  43. t++;
  44. }
  45. free_link(head);//释放链表
  46. cusor_show();//显示光标
  47. return 0;
  48. }

2.lrc.c文件

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "./pos/console.h"
  5. #include "lrc.h"
  6. char *get_data()
  7. {
  8. FILE *f = fopen("./text/简单爱.lrc", "r");
  9. if (f == NULL)
  10. {
  11. printf("文件打开失败\n");
  12. return NULL;
  13. }
  14. fseek(f, 0, SEEK_END);
  15. long len = ftell(f);
  16. rewind(f);
  17. char *lrc = malloc(len + 1);
  18. fread(lrc, len, 1, f);
  19. fclose(f);
  20. return lrc;
  21. }
  22. int cut_text(char *str, char *list[])
  23. {
  24. int i = 0;
  25. list[i] = strtok(str, "\r\n");
  26. // printf("%s\n",list[i]);
  27. while (1)
  28. {
  29. list[++i] = strtok(NULL, "\r\n");
  30. if (list[i] == NULL)
  31. {
  32. break;
  33. }
  34. }
  35. return i;
  36. }
  37. void showsong(char *list[])
  38. {
  39. clear_screen();
  40. cusor_hide();
  41. char buf[4][50];
  42. for (int i = 0; i < 4; i++)
  43. {
  44. cusor_moveto(40, i + 1); // 光标移到 第0行,第40列
  45. set_fg_color(COLOR_RED);
  46. sscanf(list[i], "%*4c%[^]]", buf[i]);
  47. // printf("%s\n",buf[i]);
  48. }
  49. }
  50. jay *songword(int num, char *list[])
  51. {
  52. jay *head = NULL, *newhead = NULL;
  53. int m, s, ms;
  54. int timespot[10];
  55. int timenums = 0;
  56. char *str;
  57. for (int i = 4; i < num; i++)
  58. {
  59. str = list[i];
  60. timenums = 0;
  61. while (*str == '[')
  62. {
  63. sscanf(str, "[%2d:%2d.%2d", &m, &s, &ms);
  64. timespot[timenums] = m * 60 + s;
  65. timenums++;
  66. str = str + 10;
  67. }
  68. for (int j = 0; j < timenums; j++)
  69. {
  70. newhead = malloc(sizeof(jay));
  71. newhead->time = timespot[j];
  72. strcpy(newhead->buf_num, str);
  73. newhead->n = NULL;
  74. if (head == NULL)
  75. {
  76. head = newhead;
  77. head->l = NULL;
  78. head->n = NULL;
  79. }
  80. else
  81. {
  82. jay *myh = head;
  83. while (newhead->time >= myh->time && myh->n != NULL)
  84. {
  85. myh = myh->n;
  86. }
  87. if (myh->time > newhead->time)
  88. {
  89. if (myh == head) // 当前myh为new的下一个节点或者是最后一个节点
  90. {
  91. newhead->l = NULL;
  92. newhead->n = head;
  93. head->l = newhead;
  94. head = newhead;
  95. }
  96. else // 当前myh为中间节点
  97. {
  98. // myh->l = head;
  99. // head->n = newhead;
  100. // myh = newhead;
  101. // newhead->n = newhead;
  102. // myh->n = NULL;
  103. jay *l = myh->l;
  104. l->n = newhead;
  105. newhead->l = l;
  106. newhead->n = myh;
  107. myh->l = newhead;
  108. }
  109. }
  110. else // 当前myh为第一个节点
  111. {
  112. newhead->l = myh;
  113. myh->n = newhead;
  114. }
  115. }
  116. }
  117. }
  118. // jay * mmm = head;
  119. // while(mmm->n != NULL){
  120. // printf("%d,%s\n",mmm->time,mmm->buf_num);
  121. // mmm = mmm->n;
  122. // }
  123. return head;
  124. }
  125. void showtime(ontime time) // 展示时间
  126. {
  127. char time_num[30];
  128. sprintf(time_num, "%2d:%2d.%2d", time.m, time.s, time.ms);
  129. color_pos_printf(time_num, 39, 5, COLOR_GREEN);
  130. }
  131. void showsongtxt(jay *start, jay *pd) // pd为记录的当前节点,start记录的是开始节点--获取歌词
  132. {
  133. char time_txt[30];
  134. for (int i = 0; i < 5; i++)
  135. {
  136. if (start == pd)
  137. {
  138. color_pos_printf(start->buf_num, 30, 6 + i, COLOR_MAGENTA);
  139. }
  140. else
  141. {
  142. color_pos_printf(start->buf_num, 30, 6 + i, COLOR_YELLOW);
  143. }
  144. start = start->n;
  145. }
  146. }
  147. jay *findspot(jay *lrc, int time) // lrc为头节点,time为时间 --获取节点
  148. {
  149. while (lrc != NULL)
  150. {
  151. if (lrc->time == time)
  152. {
  153. return lrc;
  154. }
  155. else
  156. {
  157. lrc = lrc->n;
  158. }
  159. }
  160. return NULL;
  161. }
  162. jay *findstartspot(jay *lrc) // 寻找开始节点,lrc记录当前节点
  163. {
  164. // if(lrc->l == NULL)
  165. // {
  166. // return lrc;
  167. // }
  168. // else if(lrc->l->l == NULL)
  169. // {
  170. // return lrc->l;
  171. // }
  172. // else if(lrc->l->l->l == NULL)
  173. // {
  174. // return lrc->l->l;
  175. // }
  176. // else if(lrc->l->l->l->l == NULL)
  177. // {
  178. // return lrc->l->l->l;
  179. // }
  180. // else if(lrc->l->l->l->l->l == NULL)
  181. // {
  182. // return lrc->l->l->l->l;
  183. // }
  184. if (lrc->l == NULL)
  185. {
  186. return lrc;
  187. }
  188. // 如果当前节点为第二个节点,那么第一个节点就是开始节点
  189. else if (lrc->l->l == NULL)
  190. {
  191. return lrc->l;
  192. }
  193. // 如果当前节点是最后一个节点,那么其上级的上级的上级的上级为开始节点
  194. else if (lrc->n == NULL)
  195. {
  196. return lrc->l->l->l->l;
  197. }
  198. // 如果当前节点为倒数第二个节点,那么其上级的上级的上级为开始节点
  199. else if (lrc->n->n == NULL)
  200. {
  201. return lrc->l->l->l;
  202. }
  203. // 如果当前节点为3~倒数第三个节点中的某个节点,返回当前节点的上级的上级为开
  204. else
  205. {
  206. return lrc->l->l;
  207. }
  208. }
  209. void color_pos_printf(char *str, int x, int y, int color)
  210. {
  211. cusor_moveto(x, y);
  212. set_fg_color(color);
  213. printf("%s\n", str);
  214. }
  215. void free_link(jay *head)
  216. {
  217. while (head != NULL)
  218. {
  219. if (head->n != NULL)
  220. {
  221. jay *myh = head->n;
  222. free(head);
  223. head = myh;
  224. }
  225. else
  226. {
  227. free(head);
  228. head = NULL;
  229. }
  230. }
  231. }

3.lrc.h文件

  1. #ifndef MY_LRC
  2. #define MY_LRC
  3. typedef struct time
  4. {
  5. int m;
  6. int s;
  7. int ms;
  8. }ontime;
  9. typedef struct jaychou
  10. {
  11. int time;
  12. char buf_num[50];
  13. struct jaychou *l;
  14. struct jaychou *n;
  15. }jay;
  16. extern char *get_data();
  17. extern int cut_text(char *str,char *list[]);
  18. extern void showsong(char *list[]) ;
  19. extern jay *songword(int num,char *list[]);
  20. extern void color_pos_printf(char *str,int x,int y ,int color);
  21. extern void showtime(ontime time);
  22. extern void showsongtxt(jay *start,jay *pd);
  23. extern jay* findspot(jay *lrc,int time);
  24. extern jay *findstartspot(jay *lrc);
  25. #endif

4.makefile文件

  1. EXEC = main;
  2. OBJ = main.o lrc.o ./pos/console.o ./mplayer/start_mplayer.o;
  3. FLAGS = -wall -g;
  4. CC = gcc;
  5. $(EXEC) :(OBJ)
  6. $(CC) $(OBJ) -o $(EXEC) $(FLAGS);
  7. %.o:%.c %.h
  8. $(CC) -c $< -o $@
  9. clear:
  10. rm $(EXEC) *.o

提示;其他要用的的文件放在资源里面了

示例图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/1006923
推荐阅读
相关标签
  

闽ICP备14008679号