自学嵌入式day36,mplayer+fifo+exec

媒体播放器程序核心功能解析

1. 数据结构与宏定义
  • 播放模式枚举 MODE

    • MODE_CYCLE:循环播放
    • MODE_RANDOM:随机播放
    • MODE_SINGAL:单次播放(注意:代码中拼写为SINGAL,应为SINGLE
  • 播放列表结构体 LIST

    c 复制代码
    typedef struct {
        char name[10][512]; // 存储最多10个媒体文件路径
        int total;          // 媒体文件总数
        int current;        // 当前播放索引
        MODE mode;          // 播放模式
    } LIST;
  • 媒体路径宏

    c 复制代码
    #define MEDIA_PATH "/home/linux/vm/09mp"
2. 初始化函数 do_init()
  • 功能:扫描媒体目录,构建播放列表并创建控制管道
  • 关键流程
    1. 使用 opendir 打开媒体目录
    2. 遍历目录项,筛选扩展名为 .mp4, .mp3, .flv 的文件
    3. 构建完整文件路径存入 list.name
    4. 初始化播放索引 list.current = 0 和播放模式 list.mode = MODE_CYCLE
    5. 使用 mkfifo 创建命名管道 /home/linux/vm/09mp/fifo(忽略已存在错误)
3. 播放控制函数
  • do_play(char* name)

    c 复制代码
    pid_t pid = fork();
    if (0 == pid) {
        execlp("mplayer", "mplayer", "-slave", "-input", 
               "file=/home/linux/vm/09mp/fifo", name, "-quiet", NULL);
        exit(1);
    }
    • 通过 fork + execlp 调用 mplayer
    • 使用 -slave 模式和 -input file=... 指定控制管道
  • do_pause()

    c 复制代码
    int fd = open("/home/linux/vm/09mp/fifo", O_RDWR);
    write(fd, "pause\n", 6);
    close(fd);
  • do_stop()

    • 包含完整的错误处理逻辑:
      • 检查管道打开状态
      • 验证写入字节数
      • 确保资源关闭
4. 播放列表管理
  • do_list()
    1. 打印播放列表索引和路径
    2. 通过 fgets 获取用户输入
    3. 根据输入索引调用 do_play()
5. 播放导航
  • do_prev()

    • MODE_CYCLE 模式下实现循环上一曲
    c 复制代码
    num = list.current;
    num--;
    if(num == -1) num = list.total - 1; // 修正边界: num = 2 -> list.total-1
  • do_next()

    • MODE_CYCLE 模式下实现循环下一曲
    c 复制代码
    num = list.current;
    num = (num + 1) % list.total; // 取模实现循环
6. 高级控制
  • do_seek()

    c 复制代码
    sprintf(buf,"seek %d 1\n",num); // 百分比跳转
    write(fd, buf, strlen(buf));
  • do_speed()

    • 未完整实现(函数体不完整)

技术要点总结

  1. 目录遍历 :使用 dirent.h 实现文件系统扫描
  2. 进程控制fork() + execlp() 调用外部播放器
  3. 进程间通信 :通过命名管道(FIFO)向 mplayer 发送控制命令
  4. 模式管理:枚举类型实现播放模式状态机
  5. 边界处理:播放索引的循环计算
相关推荐
M--Y2 小时前
Docker数据持久化与网络架构
网络·docker·架构
寺中人2 小时前
MySQL 8.0 Windows 完整安装教程:环境配置、密码重置与常见报错排查
数据库·windows·mysql·环境搭建·mysql 安装
en.en..2 小时前
Linux exec函数族
windows
myy-learn3 小时前
30-HTTP协议
网络·网络协议·http
开开心心就好3 小时前
免费刷题软件推荐,支持导入题库自动判题
网络·网络协议·tcp/ip·jupyter·智能手机·电脑·idea
键盘会跳舞3 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
YUJIANYUE5 小时前
免费安卓手机版网络工具箱ping traceroute mtr等10+功能
网络
那年窗外下的雪.6 小时前
AIDC 学习日志|第 21 天|EVPN 多归属故障演练与中断窗口定位
网络·git·学习
啊阿狸不会拉杆6 小时前
《计算机网络-自顶向下方法》5.1 概述 读书笔记
网络·计算机网络·智能路由器