音乐播放CD的流程步骤 音乐软件是如何播放光盘中的美妙音乐

音乐(deepin-music)是deepin自研的一款音频播放软件,能广泛支持播放本地或外部媒介中的音频文件,其中就包括对CDDA(Compact Disc-Digital Audio)标准的支持 。CDDA标准主要用于光盘存储数字高保真音乐,深受音乐发烧友的喜爱 。

音乐播放CD的流程步骤 音乐软件是如何播放光盘中的美妙音乐

文章插图
本文将站在技术实现的角度,介绍音乐(deepin-music)应用是如何播放CD光盘中的美妙音乐的 。

音乐播放CD的流程步骤 音乐软件是如何播放光盘中的美妙音乐

文章插图
1. 整体流程
简单的说,音乐(deepin-music)播放CD流程整体分为三个部分:
  • 检测CD光盘;
  • 解析CD数据;
  • 播放CD;

音乐播放CD的流程步骤 音乐软件是如何播放光盘中的美妙音乐

文章插图
图一 deepin-music CD光盘处理流程
2. 检测CD光盘
2.1 识别光驱设备
对光驱设备的识别,主要源于对CD光盘状态的检测 。依托于 `libudisks2-qt5-dev` 开源库的DDiskManager 类,即可实现对块设备状态监控,具体使用如下:
DDiskManager diskManager;//获取块设备状态diskManager.setWatchChanges(true);//初始化获取当前所有设备localPathQStringList allDevices = diskManager.blockDevices(QVariantMap());//根据cdrom关键字,找出光驱设备foreach (QString tmpstr, allDevices){if (tmpstr.compare("sr0") == 0) //sr0是cdrom关键字return tmpstr; //localPath}Linux系统中,"sr0" 主要指光驱设备(s= scsi;r= rom ;数字0代表光驱设备编号) 。如需判断当前光驱是否被插拔,则可通过DDiskManager 类以下信号进行监听:
void blockDeviceAdded(const QString &path);
void blockDeviceRemoved(const QString &path);
3. 解析CD数据
3.1 解析CD节点
识别到光驱设备后,接下来就是获取CD光盘的节点数据,这里可引用依赖库`libvlc-dev`和`libvlccore-dev`,具体代码实现如下:
// 将tmpstr 转化为"cdda:///dev/sr0"这种形式
QString strcda = QString("cdda: ///dev/%1").arg(tmpstr.mid(tmpstr.lastIndexOf("/") + 1, tmpstr.size() - tmpstr.lastIndexOf("/"))) ;
// 获取sr0
input_item_t *p_input =
input_item_NewExt(strcda.toUtf8().data(), "access_demux", 0, ITEM_TYPE_DISC, ITEM_LOCAL);
//打开sr0,读取流
libvlc_instance_t *_vlcInstance = vlc_new(0, nullptr); //创建libvlc_instance_t对象
libvlc_media_player_t *_vlcMediaPlayer = vlc_media_player_new(_vlcInstance); // player_t
stream_t * pstream = vlc_stream_NewURL((vlc_object_t *)_vlcMediaPlayer, strcda.toUtf8().data()); //根据sr0,获取流
//创建cda节点
input_item_node_t * p_items = input_item_node_Create(p_input);
//将数据流读到节点中
vlc_stream_ReadDir(pstream, p_items);
//释放数据流、节点
vlc_stream_Delete(pstream); //释放数据流
input_item_Release(p_input); //释放输入设备
最终产生的p_items,就包含有CD节点数据 。
3.2 检索CD歌曲信息
一般而言,获取了CD节点数据已经足以支持音乐的完整播放,但在某些场景下有的用户希望知悉CD歌曲的完整信息(比如:专辑、歌曲名称、歌手),而这部分信息并不在CD光盘里,那么怎么才能获取呢?

音乐播放CD的流程步骤 音乐软件是如何播放光盘中的美妙音乐

文章插图
可以考虑查询远程CD数据库(CDDB),远程CD数据库有gundb、Gracenote和微软CDDB等 。这里只介绍gundb使用方法,在连接数据库时需要依赖`libcddb2-dev`库,代码实现如下:
#include <cddb/cddb.h>
#include <linux/cdrom.h>
//打开/dev/sr0设备文件
int fd=open(“/dev/sr0”, O_RDONLY | O_NONBLOCK);
//获取CD数据
int status = ioctl(fd, CDROM_DISC_STATUS, CDSL_CURRENT);
if ((CDS_AUDIO==status || CDS_MIXED==status) && 0==ioctl(fd, CDROMREADTOCHDR, &th)){


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。