注:在显示音乐播放器的图形界面时,根据的是页面的坐标来显示,故在运行时终端的大小应为Xshell全屏时终端的大小。(否则页面会显示的混乱)
具体运行效果:
原理:
切割歌词,存入数组,通过sleep函数创建虚拟时钟与歌词中的时间相对应。这样,创建一个进程调用mplayer播放歌曲,同时开始计时就可以完成歌词与歌曲之间的同步。主要的目的在于熟悉链表的使用。(所谓音乐播放器,是一个别人已经写好的mplayer+自己的歌词同步功能)
main.c
#include<stdio.h>
#include"my_lrc_play.h"
int main(int argc, char const *argv[])
{
my_lrc_play();
return 0;
}
start_mplayer.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
//启动mplayer播放器
//参数song_path 为歌曲的路径
void mplayer_play(char * song_path)
{
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork");
}
else if(pid==0)
{
close(1);
close(2);
execlp("mplayer","mplayer","-slave","-quiet",song_path,NULL);
exit(0);
}
else
;
}
歌词切割,以及歌词滚动与时间的匹配
#include"my_lrc_play.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include"start_mplayer.h"
#include"console.h"
#include"my_add.h"
//读lrc文件到堆区空间并返回堆区指针,以便链表的使用
char* my_read_lrc_file(char my_lrc_name[])
{
// printf("%s\n",my_lrc_name);
// return my_lrc_name;
//字符数组已成功获取
//打开文件
FILE* fp = fopen(my_lrc_name,"r");
if (NULL == fp)
{
perror("fopen");
exit(-1);
}
//将文件流定位到指针末尾
fseek(fp,0,2);
//获取文件长度
int len = ftell(fp);
//复位文件流指针(此处如果写fclose应该需要重新打开)
rewind(fp);
//使用calloc全体自动置0,接下来仅仅读入len的长度,方便%s访问
char* stack = (char*)calloc(1,len+1);
//此处应该考虑文件大于堆区空间的情况,再议
//
fread(stack,len,1,fp);
fclose(fp);
return stack;
}
int my_strtok_lrc_data(char* stack,char* cut_of_every_row_arr[])
{
int i = 0;
cut_of_every_row_arr[i] = strtok(stack,"\r\n");
//如果还未指向堆区的\0,说明还没切完继续切
while (cut_of_every_row_arr[i] != NULL)
{
i++;
cut_of_every_row_arr[i] = strtok(NULL,"\r\n");
}
return i;
}
// 切好之后,传入切好的堆区头部指针们,进行格式化输出到屏幕
#if 0
//这获取不到是为什么???
void my_analyze_lrc_head(char** cut_of_every_row_arr)
{
int i = 0;
while (cut_of_every_row_arr[i][1]<'0'||cut_of_every_row_arr[i][1]>'9')
{
char msg[128] = "";
sscanf(&(cut_of_every_row_arr[i][1]),"[%*2c:%[^]]]",msg);
//光标定位输出******
printf("%s\n",msg);
printf("hellp\n");
i++;
}
}
#endif
//获取头
void my_analyze_lrc_head(char* cut_of_every_row_arr[])
{
int i =0;
while (cut_of_every_row_arr[i]!=NULL)
{
char* p = cut_of_every_row_arr[i];
if (p[1]>='a'&&p[1]<='z')
{
//char msg[128