基于SiriusXM卫星广播服务的音频播放软件的设计

2019-07-25 09:21方宁生13冯潇翔13
计算机测量与控制 2019年7期
关键词:用户界面应用程序频道

方宁生13冯潇翔13

(1.江苏省物联网应用技术重点建设实验室,无锡 214064; 2.无锡太湖学院 物联网工程学院,无锡 214064;3.东南大学 计算机科学与工程学院,南京 210018)

0 引言

随着全球汽车工业的飞速发展,车载多媒体成为人们开车和娱乐的必要设备。绝大多数汽车的音响系统收音功能部分设有FM和AM频道,但由于它们的信号会受到方向和距离的限制,信号差时对音质音量影响颇大[1]。同时,地面广播系统无法实现全面覆盖,但是在全国范围内建立了单频广播网,所以在汽车行驶过程中无法连续收听同一个节目内容[2-3]。现在北美洲采用SiriusXM(天狼星)的卫星广播系统,它可以打破收音信号在方向和距离上的限制,克服上面所述的信号缺陷,能够为高速行驶中的汽车提供高质量的广播,让用户驾车行驶在任意一条公路上时,都可以随时、无间断地收听自己喜爱的广播频道。与此同时,SiriusXM系统相比于传统收音系统拥有更多的频道和功能。

本文设计并实现与SiriusXM SDK交互的通信协议,通过及时并准确的协议处理,保证数据响应的实时性。在软件的用户界面和逻辑中间件,为用户提供迅速的案件响应和界面数据显示,保证系统消息处理的稳定性和数据格式的规范性。在用户界面和逻辑中间完成的基础之上,实现该软件的功能需求,包括基本音频服务和高级音频服务。最后,利用专业测试软件,完成并通过SiriusXM认证测试。

1 音频播放软件总体架构

基于SiriusXM系统的音频播放软件在功能结构上可划分为基本音频服务、高级音频服务、系统广播信息处理三大部分。如图1所示。

图1 音频播放软件总体架构

(1)基本音频服务,主要包括:基础频道调节、浏览功能,为用户提供快速的频道选择手段;用户界面信息提示功能,及时为用户展现当前应用程序的服务状态。

(2)高级音频服务,主要提供SiriusXM系统服务的特色功能,包括节目的即时重放、搜索,曲目标记,频道混合等,这些功能是本文所设计实现的播放软件的核心功能。

(3)系统广播消息处理,在应用程序正常使用过程中,会经常出现被系统其它应用中断的情况,例如:蓝牙电话接听、倒车模式开启等。当这些事件发生时,系统会广播这个事件消息,应用程序需要及时响应并处理。一般来说,会自动隐藏自身程序界面,展示中断事件发起者的程序界面。

2 软件逻辑设计

这里的软件在整个系统中为软件中间件,就是本系统所设计实现的播放软件的动态链接库(SiriusXM.dll)。中间件在整个软件架构中实现承上启下的核心作用,将用户的操作控制请求传递给下面的SXM SDK,同时将SXM SDK封装好的数据解析并处理,最后交付到用户界面。整个软件的操作时序和流程控制,命令响应回复时间控制,都对中间件的设计提出了高性能的要求。

中间件(SiriusXM.dll)在设计上总共分为三个部分,分别是:提供给用户界面的操作接口类(SiriusXMRunTime.cpp)、命令操作控制类(SiriusXMControl.cpp)以及提供给底层SDK的消息回调类(SiriusXMResp.cpp),如图2所示。

图2 中间件结构

2.1 用户界面的操作接口类

提供给用户界面的操作接口类是一个全局的单例接口,在动态链接库加载时被实例化,可被用户界面直接调用,从而告知中间件当前界面的状态和用户的操作。

2.2 命令操作控制类

命令操作控制类负责所有用户操作和控制命令的解析和处理,是中间件中最核心的部分。在它的初始化过程中,首先需要通知操作系统打开预先设置好的GPIO端口,给SiriusXM芯片上电,并通知SDK进行初始化并打开与SiriusXM系统服务进行通信的串口。随后读取在车机中保存的应用程序LastMemory备份文件,将文件中的数据参数发送到SDK,从而转交给SiriusXM系统服务。在这之后,一直处于监听状态,等待SDK和用户界面的操作指令。

2.3 底层SDK的消息回调类

提供给底层SDK的消息回调类,根据SDK回调函数的注册头文件包说明,在SDK中注册了目前所有中间件需要的消息信息回调函数,以接收SDK随时发送过来的数据。这些函数绝大部分都是传递了SDK转发的系统服务的指示类命令数据,在接收到这些命令数据后,中间件根据解析后的数据进行相对应的操作。每一类指示均是由单独对应的回调函数进行数据转发,回调函数不对数据进行处理和解析,仅仅是将数据原封不动地全部交付给操作控制类。由于SiriusXM系统服务使用的是握手协议,所以在这其中,还有一个消息确认回调函数,由SDK返回系统服务的确认消息帧[12-13]。

3 基本音频服务的实现

本论文主要是在车载设备上实现SiriusXM卫星广播收音功能,根据SiriusXM公司的要求,SiriusXM卫星广播系统在服务内容上可以分为基本音频服务和高级音频服务。其中,基本音频服务与传统地面广播系统类似,支持频道切换,浏览以及一般的界面提示信息,为用户提供了最基本的音频播放功能。

3.1 频道向导功能

软件应用程序为用户提供了2种频道向导功能,频道调节和频道浏览。用户可以根据自己的意愿随意更换当前正在播放的频道。同时,所有可以被用户收听的频道也罗列在用户界面上,用户可以随时查看目前所有可收听的频道和频道类型。

3.1.1 频道调节

频道调节包括直接调频和快速连续调频。用户可以选择特定的频道进行播放,也可以类似扫描功能一样,连续快速地向上或向下切换频道。软件应用程序在这个过程中,需要切换当前正在播放的频道,处理切换后频道的数据信息并显示在用户界面上,同时从扬声器输出该频道的音频。

按照SiriusXM的消息机制,在频道调节时,需要进行两次握手。软件应用程序向SiriusXM系统服务发送频道调节命令(ChanSelectCmd)并等待系统服务的应答(ChanSelectResp)。应用程序接收到应答后,继续等待系统服务的频道调节成功指示(ChanSelectInd),此时说明系统服务已经调频成功,应用程序回复确认(ChanSelectCfm)并更新用户界面显示信息。

图3是频道调节流程图。首先应用程序会对当前选择的频道进行合法性判断,也就是频道号和服务号是否在给定范围之内。接下来向系统服务发送频道调节命令,根据系统服务的消息类型进行显示操作,如果是指示类消息,则说明频道调节成功,如果是显示类消息,则是失败,需要更新用户界面对用户进行相关提示。

在频道调节过程中,因为在接收到系统服务的频道调节应答后,软件仍然处于播放当前频道的状态中,如果此时立即切换到新的频道,可能产生瞬间噪音。为了避免这种情况,应在这个过程中增加了声音的控制处理。当应用程序发送了频道调节命令并接收到了系统服务的应答消息后,应用程序强制关闭扬声器的声音输出,并在接收到调节成功的指示消息后,再打开声音输出,这样可有效地避免瞬间噪声。

图3 频道调节

快速调频功能的实现是在频道调节的基础之上,定时去检查是否有新的请求。接收到新的调频请求时,顺序增加或减少频道服务号并重新进入频道调节流程。如图4所示。

图4 快速调频

3.1.2 频道浏览

用户在进行频道浏览的同时,当前频道继续保持播放状态,在浏览列表中,可显示出每个频道当前正在播放的内容信息。

类似于频道调节流程,软件应用程序向SiriusXM系统服务发送频道浏览命令(ChanBrowseCmd),并等待系统服务的应答消息(ChanBrowseResp)。接收到应答消息后,继续等待指示消息(ChanBrowseInd),指示消息中会包含所有频道的数据信息,成功接收后返回确认(ChanBrowseCfm)。

当前可浏览的所有频道都保存在一个结构体数组SXMChanListInfo[384]中,最多可支持384个频道。每个频道的结构体定义如下:

struct SXMChanInfo{

WORD channel_id; //频道号

WORD service_id; //该频道的唯一服务号

UINT8 channel_attr; //频道属性

UINT8 category_id; //最多可以属于4种类型,category_number[0]是它的主类型

UCHAR channel_name[17]; //该频道的名字

UCHAR category_name[17]; //该频道类型的名字

UCHAR artist [17]; //艺术家名字

UCHAR song [17]; //曲目标题

UCHAR content [37]; //其他内容信息

};

所有的频道信息都由这个结构体数组来维护,当有频道信息更新时,对该结构体数组重新赋值。从结构体中可以看出,当用户在浏览其他频道时,不需要真正播放该频道,就可以查看到这个频道当前正在播放的内容。

每个频道都有一个种类属性,标记频道类别,软件应用程序根据不同的类别对所有频道进行分类。在用户界面,用户可以查看同一类别的不同频道。

3.2 高级音频服务的实现

SiriusXM系统服务不仅仅提供类似地面广播的基本音频服务,同时也提供了很多功能强大的高级音频服务,这也是SiriusXM产品的核心功能,大大增强了用户的驾车体验。高级音频服务有:即时重放、艺术家/曲目搜索、体育赛事、歌曲标记、Tune start和频道混合等。

3.2.1 即时重放

即时重播功能可以让用户随时暂停当前频道或回放频道内容。调谐器会对收藏列表中的所有频道(最大支持18个),以及当前正在播放频道进行数据缓存。通常调谐器会对每个频道缓存30分钟的直播数据。当数据超过30分钟时,自动删除最早的数据,始终保证距离直播点30分钟。

如果当前频道正在直播状态,用户选择暂停频道,此时调谐器将自动缓存频道从暂停点开始的所有直播数据,并在界面上显示当前点距离直播的时间。在用户选择播放后,依然从暂停点开始继续播放。同时,可在缓存范围内进行快进退操作。

这些缓存内容会在整机重启或断开调谐器连接后自动清除。同时,若是非收藏频道,在用户执行切换频道时,该频道的缓存也会被清除。

3.2.2 即时重放功能配置

在软件应用程序初始化成功,并从底层SDK获取到SiriusXM系统服务与车载设备CPU连接成功的消息之后,会主动向系统服务发送服务的配置命令(SxiModuleCfgCmd)。其中就包含了即时重放功能的三个重要参数:IRControl,IRDeleteOnTune,IRMarkNewTrack。见表1所示。

表1 即时重放参数配置

在软件的需求中明确要求了该功能的配置是切换频道后删除缓存并且需要记录节目ID,所以在发送配置命令时,这三个参数的值都等于1。

3.2.3 即时重放界面显示

当应用程序进入即时重放功能后,用户界面需要对当前播放的进度给予用户最直观的展示。这包括当前缓存占用率和当前播放节目的进度。应用程序可以通过IRRecordInfoInd和IRPlaybackInfoInd来获取当前实时数据。其中,IRRecordInfoInd提供了当前该频道已经缓存的内容占用率,IRPlaybackInfoInd提供了当前播放节目的时间和位置信息。

中间件将获取到的实时数据信息保存在播放信息结构体中,其定义如下:

struct SXI_IR_PLAYBACK_INFO_IND_STRUCT

{

UINT8 PlaybackState; //当前播放状态

UINT8 PlaybackPosition; //当前播放位置占已缓存内容的百分比

UINT8 DurationOfTrack; //当前节目的总时长

UINT8 TimeFromStartOfTrack; //当前节目已播放时长

UINT8 TracksRemaining; //当前节目剩余时长

UINT8 TimeRemaining; //缓存剩余时间

UINT8 TimeBefore; //缓存已播时间

……

};

中间件需要将这个结构体的数据通过回调函数实时地传递给用户界面,并通过用户界面的进度条控件清晰的显示出来,如图5所示。SiriusXM系统服务为每个频道所提供的缓存空间为30分钟,它类似一个先进先出的缓存队列,当缓存空间满载后,最老的数据将会自动删除,从而放入新的缓存数据。当前播放时间和缓存剩余时间的总和对整个缓存空间总时长的占比可计算出当前缓存占用率。

如果当前为暂停状态,那么当前播放时间不变,缓存剩余时间会逐秒递增,新的缓存数据会添加到缓存区,当前播放位置占比会逐渐减少,当前播放点也会逐渐向左移动。直到当前播放位置占比减少为0,当前播放点移动到最左端时,说明缓存空间已经满载。

如果当前为播放状态,当前播放时间逐秒增加,缓存剩余时间不变,当前播放位置占比会逐渐增加,当前播放点逐渐向右移动,但始终不会达到最右端。

图5 即时重放界面显示

4 频道搜索的实现

4.1 艺术家、曲目搜索

艺术家、曲目搜索功能可以记录用户喜欢的艺术家或某一首曲目,并在其他频道播放该类节目时,在用户界面提示用户,用户可以随时切换到目标频道进行收听。

该功能的实现步骤分为以下四步:(1)用户在收听到某一艺术家的节目或某一首具体曲目时,可以收藏该艺术家或曲目。应用软件需要在收藏列表文件中保存该艺术家或曲目的唯一标识ID;(2)如果收藏列表文件不为空,那么应用软件将在启动后,对所有在播频道进行检索,查看是否有与列表文件中的ID号匹配的内容正在播放;(3)一旦匹配成功,将抛出提示信息到用户界面;(4)用户根据自己的意愿选择是否切换到目标频道。

SiriusXM系统服务为其产品提供了2种实现该功能的途径:(1)系统服务为应用程序提供功能接口,软件应用程序可以将所有收藏列表文件中的ID通过SeekMonCmd命令发送给系统服务,由系统服务进行匹配查询,一旦匹配成功,使用SeekInd消息返回给软件应用程序;(2)软件应用程序通过获取LAMetadataInd消息返回的当前所有频道正在播放的艺术家或曲目ID,自己进行匹配操作。

相对于软件应用程序自身进行匹配操作,利用系统服务的接口可以更加简单。但是,利用系统服务有个缺点是,最多支持120个ID同时匹配,这并不能满足设计需要。同时,我们的车载设备完全可负荷这个量级的匹配任务,所以,我们的软件选择了自身进行匹配操作。

收藏列表文件包括艺术家列表和曲目列表2种,格式如表2所示。其中,曲目列表中的曲目记录还同时包含了所属的艺术家名。

表2 收藏列表文件格式

4.2 体育赛事搜索

该功能与艺术家、曲目搜索功能类似,用户收藏自己喜欢的体育赛事或者某一个具体的运动队伍,当所有音频频道中有相关体育赛事播放时,会及时提示用户。

同样地,应用程序需要将运动赛事或运动队的唯一标识ID保存与收藏列表文件中,在所有播放的频道中进行ID匹配,一旦匹配成功,通知用户界面。

4.3 歌曲标记

SiriusXM公司与苹果公司合作,同时存在于SiriusXM的音频数据库和iTunes Store中的歌曲,SiriusXM公司都会将该歌曲的iTunes曲目唯一ID号保存于音频数据库中。当SiriusXM正在播放的曲目拥有iTunes唯一ID时,用户可以保存此ID号。在之后如果车载设备有苹果设备接入,会将这个ID号发送给该设备。

当播放新的音频时,软件应用程序需要立即检测该音频的数据信息,查看是否存在iTunes唯一ID号。系统服务默认状态是不会在ChanSelectInd(频道切换指示)或者MetadataInd(当前播放信息)消息中包含iTunes唯一ID号信息的,需要在配置系统服务时发送ExtMetadataMonCmd命令开启歌曲标签功能。

由于SiriusXM系统服务的自身原因,在切换频道或切换曲目后的短暂时间内,系统服务可能获取不到当前曲目的iTunes唯一ID号,这种情况还可能发生在设备刚启动或者短暂的信号丢失后恢复的瞬间。根据SiriusXM公司的设计要求,歌曲是否可以标记的提示可在当前曲目播放后3秒之内在界面显示,所以,软件在设计过程中,预留了3秒的检测时间。

在切换频道或者切换曲目后,并不立即根据接收到的ChanSelectInd或MetadataInd中是否包含了iTunes唯一ID号来判断该曲目是否可以被标记,而是在播放后的3秒内持续检测。若在这之间检测到ID号,会立即在用户界面显示。

一旦用户确认标记后,软件应用程序会将该曲目的信息保存在本地配置文件中。保存数据内容如表3所示。

4.4 Tune Start

所谓的“Tune Start”功能,是指用户在切换到其他收藏的音频频道时,由于收藏频道有自动缓存功能,系统服务不会从该频道曲目的当前位置播放,而是从曲目的开头播放,这样用户可以收听完整的一首歌曲。该功能是由系统服务完成,应用软件需要提供该功能是否开启的配置选项。在设备启动和用户修改配置时,使用ChanSelectCfgCmd命令来配置该功能[14]。

在这个功能实现上,应用软件需要处理的内容是:当用户进入一个收藏的音频频道后,如果该频道有播放缓存,系统服务会自动进入缓存播放。这时,系统服务会发送IRPlaybackInfoInd指示信息,应用软件需要及时将自身状态切换到及时重放功能中,并在用户界面中显示缓存进度。

同时,是否配置该功能也需要根据当前接入的SiriusXM调谐器版本来确定。版本号为SXV100的调谐器不支持该功能,在开机后接收到的ModuleCfgInd中可获取调谐器版本信息。

5 频道混合

每一个收藏列表各自拥有自己的频道缓存内容,应用软件提供将符合一定条件的频道进行混合的功能,用户可以收听混合后的所有内容。

进入频道混合功能,需要配置频道信息。本论文所设计的应用软件一共拥有3个收藏列表,每个列表最多包含6个收藏频道。每次频道混合功能,应用软件设计为最多混合一个收藏列表,即最多6个频道。同时,可以被混合的频道属性必须满足是可获取的、已订阅的、未被锁定的、特定内容形式的音频频道,且至少有2个满足条件的频道[15]。

在软件设计中,混合后的频道视为一个可播频道,其服务号区别于其他频道,定义从4096开始,该软件共支持3个混合频道,即4096、4097、4098。

音频频道的内容形式可以分为6种类型,如表3所示。满足频道混合的音频内容形式必须是以节目ID划分的音乐类频道,该频道信息从Extended Metadata中获取。

表3 音频频道内容形式

首先,应用程序实时检测当前收藏列表的频道,是否满足可混合条件。一旦满足,用户可以选择频道混合功能。然后,通过ChanAttribListCmd命令,配置当前混合频道服务号和混合频道数目以及混合频道各自的服务号。最后,通知系统服务进入频道混合功能。其流程如图6所示。

图6 频道混合流程

6 系统广播消息处理

由于本文所设计的播放软件是运行在车载电子设备中,在车辆运行过程中,经常会有中断当前进程的其他高优先级的应用被启动,从而抢占主界面和音频输入通道,比如:蓝牙电话来去电,倒车影像展示等。用户在正常使用本文所设计的音频软件时,如果突然蓝牙电话接收到某人的来电,或者用户主动拨打电话,那么此时音频软件将自动隐藏自身界面,同时对播放状态进行暂停处理,直到用户通话完毕,重新显示自身界面,然后重新进入播放状态。车辆倒车时,与蓝牙电话处理完全相同。

该功能在实现上,主要依托于车载设备的主系统模块(简称“main”)的广播消息。应用程序在启动时,会主动向main模块注册系统消息回调函数onSystemMessageCallback,任何系统级的消息都会通过该回调通知到应用程序。

当接收到BT_CALL_ON(开始蓝牙通话) 或REVERSE_ON(开始倒车)消息后,应用程序将立即调用pause方法进行暂停,然后调用hideWindow方法隐藏自身界面,同时告知main模块已经完成相关操作,可以唤起蓝牙或倒车画面。通常在这个过程中,为了防止可能突然暂停可能出现的爆破音,会在调用pause方法之前,进行慢静音操作(200 ms内将音量逐渐降为0)。

当接收到BT_CALL_OFF(结束蓝牙通话)或REVERSE_OFF(结束倒车)消息后,整个操作流程与上述流程相反。首先调用showWindow显示应用程序主界面,然后调用play方法开始播放。同样地,为防止音量突然恢复造成爆破音,将在200ms内恢复到音量。

7 结论

本论文详细阐述了所设计的应用软件的主要功能,分别从基本音频服务、高级音频服务、系统广播消息处理三个部分来进行说明,阐述了各个服务的功能实现流程。基本音频服务类似于地面广播所提供的收音功能。高级音频服务是SiriusXM公司产品的核心内容,有着丰富的视听功能。

猜你喜欢
用户界面应用程序频道
微软新专利展示可折叠手机设计
物联网用户界面如何工作
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
计算机软件用户界面设计分析
寒假快乐频道
频道
用Android Fragment技术实现多级选项列表
专家频道
三星电子将开设应用程序下载商店