您的位置:首页 > 运维架构 > Linux

关于linux播放器madplay对外提供接口与界面整合的总结

2014-10-06 08:57 260 查看
关于linux播放器madplay对外提供接口与界面整合的总结

应用中使用system调用madplay播放音频后,无法直接控制暂停/停止等操作,百度上一搜方法全是是直接对madplay进程进行控制,"killall -19 madplay"使进程挂起以暂停,"killall -18 madplay"使进程恢复运行,"killall -9 madplay"终止进程以停止。

此种方法虽然可以实现最基本的播放/暂停/停止功能,但是都是对进程直接操作,强制进程终止,似乎有那么点点不合理的地方,还有就是发出暂停命令后,须等待大概1s钟的时候声音才能停止。这种方法不可能再增加其他功能,比如,音频文件的总时间/当前时间获取,纯软件上的音量调节等。

对madplay源码进行小修改以对外有可操作的[b]接口[/b]:

1.Madplay播放时使用# define TTY_DEVICE "/dev/tty"此设备进行读取字符串命令受控,因此考虑修改获取命令的来源方式,首先考虑使用一个常规文件,madplay只读,另一个控制程序只写,此种方式具有单向性,不具备交互的功能。

两个进程之间通信感觉最好控制的还是共享内存,定义了一个数据类型:

typedef struct _mp3ctrl
{
unsigned char  tty_fd;//控制命令
int totaltime;		  //音频文件总时间
int curtime;		  //音频文件当前播放时间
}mp3ctrl;
此结构作为与其他进程交互的接口,需要更多功能直接添加。

改写在player.c中setup_tty函数,使获取控制命令的来源更改为共享内存的方式。Readkey函数中使用共享内存返回读取到的命令值,再结合另一个测试程序mp3ctrltest.c此时已可以直接控制运行中的madplay进程,现在暂停已成即时,增减音量也顺势完成。

2.考虑进度条的时间获取

Madplay播放文件时使用struct player数据保存所有属性,所有有关文件的信息都可以在此数据中获取。

Player.c文件中decode_filter函数player->stats.total_time获取音频文件总播放时间,mp3ctrlptr->totaltime = player->stats.total_time.seconds; 此时间赋值给共享内存中的总时间记录。

player->stats.play_timer.seconds中保存当前播放时间,tty_filter函数不断被调用获取命令,在此函数中不断将当前时间赋值给共享内存中curtime,另一个进程定时去读取,即可即时获取当前播放时间。

3.关于播放时拖动进度条加载播放的想法

尝试过对不退出当前播放进程就完成定时播放,但是没有成功,考虑到目前不需要更深入一步的需要,所以不再去实现,但可以通过另一种方式实现。

启动 madplay时可以增加-s的参数加上时间定时播放,而在播放时我们获取了即时播放时间。拖动播放则记录时间后先退出再加定时播放完成此功能,快进功能与此一致,但是没有测试过退出再播放会不会有卡顿及其他影响!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: