mp3播放器

无界面播放器

一、首先需要一个存放音乐文件的路径

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <glob.h>
#include <signal.h>int menu(void);
void fun(int sig);
void clean(void);
glob_t song;  //定义结构体变量
pid_t pid;    
int cur = 0;
int num = 0;int main()
{atexit(clean);   //atexit注册退出清理函数 ,当程序退出时,执行clean函数glob("/home/gys/Kugou/*.mp3",0,NULL,&song);  // song.gl_pathc  获取的相应格式的文件个数// song.gl_pathv  打印文件名for(int i=0;i<song.gl_pathc;i++)   {printf("%s\n",song.gl_pathv[i]);   //打印文件名}pid = fork();   //创建进程  pid承接返回值if (pid == 0)   //子进程{ execlp("mpg123","mpg123",song.gl_pathv[cur],NULL);  //在当前进程中运行另外一个进程,当前进程空间会被新进程取代//int execlp(const char *file, const char *arg, ...);//参数 file 是要执行的程序的路径,arg 是一个字符串,表示新程序的名称。接下来的参数是可选的,用于传递给新程序的命令行参数列表,最后一个参数必须为 NULL。}else if (pid > 0)  //父进程{signal(17,fun);   //信号17:子进程只要状态发生变化,父进程就能够接收到17号信号;//设置信号处理程序,即在接收到特定信号时执行指定的处理函数//void (*signal(int signum, void (*handler)(int)))(int);//signum -- 信号   handler-- 对信号的处理方式while(1){num = menu();switch(num){case 1: kill(pid,19); break;   //信号19:暂停进程case 2: kill(pid,18); break;   //信号18:恢复进程case 3: cur++;                 //信号9:杀死进程,下一首kill(pid,9); break;   case 4: cur--;               //上一首kill(pid,9);break;   case 0: signal(17,SIG_IGN); kill(pid,9); return 0;  //SIG_IGN:对信号的忽略}}}return 0;
}int menu(void)
{printf("\t\t1:暂停播发音乐\n");printf("\t\t2:继续继续播放\n");printf("\t\t3:播放下一首音乐\n");printf("\t\t4:播放上一首音乐\n");printf("\t\t0:退出\n");printf("请输入选项: \n");scanf("%d",&num);return num;
}void fun(int sig)  //传入的信号
{int sta;pid_t res = waitpid(-1,&sta,WNOHANG);  //waitpid:等待指定子进程结束//pid_t waitpid(pid_t pid, int *wstatus,int options);//pid:-1(等待任意子进程结束)    wstatus:进程退出时的状态  //options:填写0,表示阻塞等待//填写:WNOHANG,表示不阻塞。子进程退出,为其收尸,不退出,直接就运行下一行代码,不阻塞当前进程if(res == pid)  //排除暂停恢复导致17信号的干扰{if(WIFEXITED(sta))  //返回值为真,子程序是正常退出,cur++//WIFEXITED 宏接受一个整型参数 status,通常是 waitpid 或 wait 系列函数返回的子进程状态信息。//如果子进程正常退出,WIFEXITED 宏将返回一个非零值,否则返回 0。{cur++;  }if(cur == song.gl_pathc)   //下一首,cur++,直到最后一首歌曲cur = 0;                    //cur设置为初始值if(cur < 0)             //上一首,cur--,如果cur小于0,cur初始值设置为文件数量cur = song.gl_pathc-1;pid = fork();   //歌曲播放完,子进程结束,重新创建子进程if(pid == 0){execlp("mpg123","mpg123",song.gl_pathv[cur],NULL);   //播放音乐}}
}void clean(void)
{system("stty echo");   //system:在当前进程中,并发运行另外一个进程//使用 stty echo 命令时,它会打开终端的回显功能,即用户输入的字符会立即显示在终端上。printf("\033[?25h");  //[?25h 会显示终端窗口中的光标,使光标可见。
}

有界面播放器

GUI的使用

1)创建工程

修改软件语言环境:

想要使用什么控件,从组件中使用鼠标直接拖拽到界面区域

2)图片按钮 按下之后更换图片

播放和暂停使用的是图片按钮,这里可以添加4张照片,但是要两两一致,第一张和最后一张保持一致,第二张那个和第三张保持一致。

添加播放和暂停的照片。

按键到这里就完成了。

创建工程生成的文件

在lvgl-simulator文件下Make生成可执行程序

运行生成的可执行程序

在生成工程的主函数里添加功能

main.c**/
#define _DEFAULT_SOURCE /* needed for usleep() */
#include <stdlib.h>
#include <unistd.h>
#define SDL_MAIN_HANDLED        /*To fix SDL's "undefined reference to WinMain" issue*/
#include <SDL2/SDL.h>
#include "lvgl/lvgl.h"
#include "lv_drivers/display/monitor.h"
#include "lv_drivers/indev/mouse.h"
#include "lv_drivers/indev/mousewheel.h"
#include "lv_drivers/indev/keyboard.h"
#include "gui_guider.h"
#include "events_init.h"
#include "custom.h"#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <glob.h>
#include <signal.h>/**********************      DEFINES*********************//*On OSX SDL needs different handling*/
#if defined(__APPLE__) && defined(TARGET_OS_MAC)
# if __APPLE__ && TARGET_OS_MAC
#define SDL_APPLE
# endif
#endif/***********************      TYPEDEFS**********************//***********************  STATIC PROTOTYPES**********************/
static void hal_init(void);
static int tick_thread(void * data);/***********************  STATIC VARIABLES**********************//***********************      MACROS**********************//***********************   GLOBAL FUNCTIONS**********************/
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"lv_ui guider_ui;void clean(void);
void fun(int sig);
glob_t song;  //定义结构体变量
pid_t pid;    
int cur = 0;int main(int argc, char ** argv)
{atexit(clean);   //atexit注册退出清理函数 ,当程序退出时,执行clean函数glob("/home/gys/Kugou/*.mp3",0,NULL,&song);     //打印歌单// song.gl_pathc  获取的相应格式的文件个数// song.gl_pathv  打印文件名for(int i=0;i<song.gl_pathc;i++)   {printf("%s\n",song.gl_pathv[i]);   //打印文件名}pid = fork();   //创建进程  pid承接返回值if (pid == 0)   //子进程{ execlp("mpg123","mpg123",song.gl_pathv[cur],NULL);  //在当前进程中运行另外一个进程,当前进程空间会被新进程取代//int execlp(const char *file, const char *arg, ...);//参数 file 是要执行的程序的路径,arg 是一个字符串,表示新程序的名称。接下来的参数是可选的,用于传递给新程序的命令行参数列表,最后一个参数必须为 NULL。}else if (pid > 0)  //父进程{signal(17,fun);   //信号17:子进程只要状态发生变化,父进程就能够接收到17号信号;//设置信号处理程序,即在接收到特定信号时执行指定的处理函数//void (*signal(int signum, void (*handler)(int)))(int);//signum -- 信号   handler-- 对信号的处理方式}(void) argc;    /*Unused*/(void) argv;    /*Unused*//*Initialize LittlevGL*/lv_init();/*Initialize the HAL (display, input devices, tick) for LittlevGL*/hal_init();/*Create a GUI-Guider app */setup_ui(&guider_ui);events_init(&guider_ui);custom_init(&guider_ui);while(1) {/* Periodically call the lv_task handler.* It could be done in a timer interrupt or an OS task too.*/lv_task_handler();usleep(5 * 1000);#ifdef SDL_APPLESDL_Event event;while(SDL_PollEvent(&event)) {
#if USE_MOUSE != 0mouse_handler(&event);
#endif#if USE_KEYBOARDkeyboard_handler(&event);
#endif#if USE_MOUSEWHEEL != 0mousewheel_handler(&event);
#endif}
#endif}return 0;
}/***********************   STATIC FUNCTIONS**********************//*** Initialize the Hardware Abstraction Layer (HAL) for the Littlev graphics library*/
static void hal_init(void)
{/* Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/monitor_init();/*Create a display buffer*/static lv_disp_buf_t disp_buf1;static lv_color_t buf1_1[480*10];lv_disp_buf_init(&disp_buf1, buf1_1, NULL, 480*10);/*Create a display*/lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);            /*Basic initialization*/disp_drv.buffer = &disp_buf1;disp_drv.flush_cb = monitor_flush;    /*Used when `LV_VDB_SIZE != 0` in lv_conf.h (buffered drawing)*/lv_disp_drv_register(&disp_drv);/* Add the mouse as input device* Use the 'mouse' driver which reads the PC's mouse*/mouse_init();lv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv);          /*Basic initialization*/indev_drv.type = LV_INDEV_TYPE_POINTER;indev_drv.read_cb = mouse_read;         /*This function will be called periodically (by the library) to get the mouse position and state*/lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv);/* Tick init.* You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about how much time were elapsed* Create an SDL thread to do this*/SDL_CreateThread(tick_thread, "tick", NULL);
}/*** A task to measure the elapsed time for LittlevGL* @param data unused* @return never return*/
static int tick_thread(void * data)
{(void)data;while(1) {SDL_Delay(5);   /*Sleep for 5 millisecond*/lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/}return 0;
}void clean(void)
{signal(17,SIG_IGN); kill(pid,9);system("stty echo");   //system:在当前进程中,并发运行另外一个进程//使用 stty echo 命令时,它会打开终端的回显功能,即用户输入的字符会立即显示在终端上。printf("\033[?25h");  //[?25h 会显示终端窗口中的光标,使光标可见。
}void fun(int sig)  //传入的信号
{int sta;pid_t res = waitpid(-1,&sta,WNOHANG);  //waitpid:等待指定子进程结束//pid_t waitpid(pid_t pid, int *wstatus,int options);//pid:-1(等待任意子进程结束)    wstatus:进程退出时的状态  //options:填写0,表示阻塞等待//填写:WNOHANG,表示不阻塞。子进程退出,为其收尸,不退出,直接就运行下一行代码,不阻塞当前进程if(res == pid)  //排除暂停恢复导致17信号的干扰{if(WIFEXITED(sta))  //返回值为真,子程序是正常退出,cur++//WIFEXITED 宏接受一个整型参数 status,通常是 waitpid 或 wait 系列函数返回的子进程状态信息。//如果子进程正常退出,WIFEXITED 宏将返回一个非零值,否则返回 0。{cur++;  }if(cur == song.gl_pathc)   //下一首,cur++,直到最后一首歌曲cur = 0;                    //cur设置为初始值if(cur < 0)             //上一首,cur--,如果cur小于0,cur初始值设置为文件数量cur = song.gl_pathc-1;pid = fork();   //歌曲播放完,子进程结束,重新创建子进程if(pid == 0){execlp("mpg123","mpg123",song.gl_pathv[cur],NULL);   //播放音乐}}
}

void events_init(lv_ui *ui)
{
}static void screen_img_2event_handler(lv_obj_t * obj, lv_event_t event)
{switch (event){case LV_EVENT_PRESSED:{printf("播放上一首\n");cur--;kill(pid,9);}break;default:break;}
}static void screen_img_3event_handler(lv_obj_t * obj, lv_event_t event)
{switch (event){case LV_EVENT_PRESSED:{printf("播放下一首\n");cur++;kill(pid,9);}break;default:break;}
}static void screen_imgbtn_1event_handler(lv_obj_t * obj, lv_event_t event)
{switch (event){case LV_EVENT_PRESSED:{printf("中间按钮被按下\n");butt++;if(butt % 2 == 0){kill(pid,18);}else if(butt %2 != 0)kill(pid,19);break;default:break;}}
}void events_init_screen(lv_ui *ui)
{lv_obj_set_event_cb(ui->screen_img_2, screen_img_2event_handler);lv_obj_set_event_cb(ui->screen_img_3, screen_img_3event_handler);lv_obj_set_event_cb(ui->screen_imgbtn_1, screen_imgbtn_1event_handler);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24-k8s的附件组件-Metrics-server组件与hpa资源pod水平伸缩

一、概述 Metrics-Server组件目的&#xff1a;获取集群中pod、节点等负载信息&#xff1b; hpa资源目的&#xff1a;通过metrics-server获取的pod负载信息&#xff0c;自动伸缩创建pod&#xff1b; 参考链接&#xff1a; 资源指标管道 | Kubernetes https://github.com/kuberne…

静态时序分析:SDC约束命令set_input_delay详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 本章将讨论使用set_input_delay命令对输入端口的约束。首先需要说明的是&#xff0c;在进行静态时序分析时&#xff0c;任何一条时序路径都需要有约束&#xff0…

如何使用安卓平板远程Ubuntu服务器通过VS Code远程开发

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;…

【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定 文章目录 【.NET Core】常见C#代码约定一、概述二、代码预定的目标三、代码约束工具和分析器四、C#语言准则五、字符串约定5.1 使用字符串内插来连接短字符串5.2 插入大文本时&#xff0c;使用System.Text.StringBuilder对象 六、数组约定七、委托…

php数组运算符 比较 isset、is_null、empty的用法和区别

php数组运算符 1. 数组运算符2. 判断两个数组是否相等3. isset、is_null、empty的用法和区别 1. 数组运算符 注意&#xff1a;只会保留第一个数组中的键值对&#xff0c;而忽略后面数组中相同键名的元素&#xff0c;如果想要合并两个数组并覆盖相同键名的元素&#xff0c;可以…

C与C++的性能差距来源于哪里?

C与C的性能差距来源于哪里&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xf…

SpringBoot图书管理系统

介绍 图书管理系统助力于图书馆中图书的管理&#xff0c;功能包含图书管理、借阅、归还&#xff0c;三块业务的解决方案&#xff0c;可对图书进行查询、查询图书剩余数量及借阅记录和状态、监控数量不足的图书。 使用技术 SpringBootMyBatisThymeleafMySQL 项目结构 业务流…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…

体验一下UE5.3的Skeletal Editor

UE5.3中增加了蒙皮网格骨架编辑工具&#xff0c;用户无需导出Fbx就可以直接编辑蒙皮网格&#xff0c;支持修改绑定姿势的骨骼位置、修改蒙皮权重、对已蒙皮多边形进行编辑以及对蒙皮网格减免等操作&#xff0c;就来体验一下。 1.加载插件 要使用Skeletal Editor功能&#xff…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

PostgreSQL里实现计算多个数字的排列组合

在进行排列组合的时候&#xff0c;每一次需要知道是否有重复的值&#xff0c;并过滤出已经排列过的值。这个可以创建支持可变参数的函数来实现。下边的函数用到了聚合判断&#xff0c;并且可变参数使用variadic标记的数组。 postgres<16.1>(ConnAs[postgres]:PID[188277…

基于shp数据制作3DTiles建筑白膜

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网、建筑三维模型&#xff0c;输出标准3DTiles服务、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎下载试用&#xff1a;http://www.magic3d.…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

Java项目,营销抽奖系统设计实现

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 项目&#xff1a;https://gaga.plus 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主&#xff0c;小傅哥。 经过这个假期的嘎嘎卷&#x1f9e8;…

软件实际应用实例分享,门诊电子处方模板制作教程,中西医诊所病历开单系统教程

软件实际应用实例分享&#xff0c;门诊电子处方模板制作教程&#xff0c;中西医诊所病历开单系统教程 一、前言 以下软件教程以 佳易王诊所电子处方软件V17.3为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在开电子处方的时候&#xff0c…

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

阿里云幻兽帕鲁Windows 服务器怎么下载存档?

阿里云幻兽帕鲁Windows 服务器怎么下载存档&#xff1f;通过远程连接window服务器桌面的方式。 远程连接到阿里云的 Windows 服务器后&#xff0c;可以将压缩后的存档文件&#xff0c;拖动到 workbench\Download 目录后&#xff0c;就会触发浏览器的文件下载&#xff0c;然后将…

[职场] 预算员简历模板 #媒体#微信#笔记

预算员简历模板 个人简历 基本资料 姓名&#xff1a;蓝小小 性别&#xff1a;男 年龄&#xff1a;28岁 籍贯&#xff1a;重庆 现居地址&#xff1a;重庆渝中区 政治面貌&#xff1a;中共党员 婚姻状况&#xff1a;已婚 求职意向 意向岗位&#xff1a;预算员 期望薪…

notepad++的下载与使用

1.进入官网下载 https://notepad-plus-plus.org/ 点击下载即可 2.选择中文简体 3.建议安装在D盘 其余步骤按照指示就行 4.安装后这几个是必选的 设置完成后就可以写中文了 以此为例 结果为

mysql mgr集群部署

一、前言 mysql mgr集群是为了实现mysql高可用&#xff0c;分为单主集群和多主集群&#xff0c;单主集群只有一个主节点可写&#xff0c;节点发生故障时&#xff0c;自动进行主从的故障切换&#xff0c;多主集群所有节点都可写&#xff0c;当节点发生故障时&#xff0c;将故障节…