一种多音频流音量的自动控制方法与流程

文档序号:31717884发布日期:2022-10-04 22:26阅读:90来源:国知局
一种多音频流音量的自动控制方法与流程

1.本发明属于安卓系统开发技术领域,具体涉及一种多音频流音量的自动控制方法。


背景技术:

2.在安卓系统中,当多个安卓应用播放音频时,每个安卓应用都会创建audiotrack,audiotrack通过共享内存和播放线程的track传递数据,每个安卓应用发送的音频数据格式可能各不相同,即audiotrack映射到某一类音频流,安卓系统支持的音频流包括music、alarm、notification和ring等,同时,为了满足用户对不同音频流音量的要求提高用户体验,安卓系统往往提供对不同音频流音量的独立控制,且不同音频流的音量调节范围也各不相同,即使用音量键进行音量控制时不同音频流的增减幅度也不相同。
3.由于桌面操作系统仅提供一个统一的音量控制按钮,因此当用户在桌面系统使用应用程序通常采用的音量调节方式是采用系统提供的音量控制按钮完成对应用程序音量的控制,然而这点与安卓系统所提供的针对不同音频流进行独立控制的音量调节方式不同,由此,当桌面操作系统用户在桌面操作系统中使用安卓应用时往往会因为音量调节方式的不同而导致对安卓应用的操作不便,甚至是无法对某些音频流进行实际的控制,进而影响用户的体验。


技术实现要素:

4.有鉴于此,本发明提供了一种多音频流音量的自动控制方法,能够实现采用桌面系统音量对安卓系统多种音频流音量的按需调节。
5.本发明提供的一种多音频流音量的自动控制方法,包括以下步骤:桌面系统启动时根据桌面系统初始音量计算得到初始化的归一化音量控制值,在安卓兼容环境内统一设定各类音频流的流音量范围后,再采用初始化的音量控制值设置安卓兼容环境内各类音频流的初始音量值;桌面系统启动后当用户调整系统音量时,采用新的系统音量值设置桌面系统音量,确定用户当前控制的目标应用;若目标应用为桌面系统应用,安卓兼容环境则采用新的系统音量值设置所有音频流的音量值,若目标应用为安卓应用,安卓兼容环境则采用新的系统音量值设置该安卓应用的音量值。
6.进一步地,所述桌面系统启动时根据桌面系统初始音量计算得到初始化的归一化音量控制值的方式为:采用系统音量范围对初始音量进行归一化得到初始化的音量控制值。
7.进一步地,所述在安卓兼容环境内统一设定各类音频流的流音量范围的方式为:获取各类音频流的流音量范围,确定所有流音量范围中的最小下限音量值及最大上限音量值,由最小下限音量值及最大上限音量值形成新的流音量范围,将所有音频流的流音量范围设置为新的流音量范围。
8.进一步地,所述采用初始化的音量控制值设置安卓兼容环境内各类音频流的初始音量值的方式为:安卓兼容环境接收到初始化的音量控制值,将所有音频流的初始音量值设置为初始化的音量控制值与新的流音量范围之积与最小下限音量值的求和结果。
9.进一步地,所述安卓兼容环境接收到初始化的音量控制值的方式为:通过读写配置文件的方式获取初始化的音量控制值。
10.进一步地,所述安卓兼容环境接收到初始化的音量控制值的方式为:通过设置属性的方式获取初始化的音量控制值。
11.进一步地,所述确定用户当前控制的目标应用的方式为:获取桌面系统的顶层窗口,根据顶层窗口对应的应用确定目标应用。
12.进一步地,所述若目标应用为桌面系统应用,安卓兼容环境则采用新的系统音量值设置所有音频流的音量值,若目标应用为安卓应用,安卓兼容环境则采用新的系统音量值设置该安卓应用的音量值,包括以下步骤:采用系统音量范围对系统音量值归一化得到音量控制值;采用音量控制值与流音量范围之积与最小下限音量值的求和结果作为新的所有音频流或安卓应用对应的所有track的音量值。
13.进一步地,所述采用音量控制值与流音量范围之积与最小下限音量值的求和结果作为新的所有音频流或安卓应用对应的所有track的音量值的方式为:当音量控制值不为零时,若音量控制值与流音量范围之积与最小下限音量值的求和结果小于1,则将音量值设置为在最小下限音量值的基础上加1的结果;若音量控制值与流音量范围之积与最小下限音量值的求和结果不小于1,则将音量值设置为求和结果;当音量控制值为零时,则将音量值设置为求和结果。
14.进一步地,所述安卓兼容环境在安卓应用播放音频创建track时,为track分配唯一编号,建立安卓应用的任务id与track唯一编号及track类型之间的映射关系;当安卓应用停止播放音频时将映射关系中与任务id相关的所有记录均删除。
15.有益效果:本发明通过分析桌面系统内的顶层窗口,根据顶层窗口所对应应用的不同确定采用桌面系统的系统音量值调节安卓兼容环境内音频流音量的具体方式,由此实现了采用桌面系统音量对安卓系统多种音频流音量的按需调节,改善了用户体验。
附图说明
16.图1为本发明提供的一种多音频流音量的自动控制方法的流程图。
具体实施方式
17.下面结合附图并举实施例,对本发明进行详细描述。
18.本发明提供的一种多音频流音量的自动控制方法,其核心思想是:当感知用户修改桌面操作系统的音量的操作时,采用当前已设定的音量修改桌面操作系统的音量,并确定用户当前控制的目标应用,若目标应用为桌面操作系统应用则采用当前已设定的音量实现对安卓系统内所有音频流的音量控制,若目标应用为安卓应用则采用当前已设定的音量实现对安卓应用的音量控制。
19.本发明提供的一种多音频流音量的自动控制方法,流程如图1所示,包括以下步
骤:步骤1、桌面系统启动时获取桌面系统初始音量及系统音量范围,采用系统音量范围对初始音量进行归一化得到初始化的音量控制值。
20.其中,归一化计算得到的音量控制值的取值范围是0到1之间的数值。系统音量范围是指桌面系统中音量可调节的最大值与最小值之间的差值。
21.步骤2、安卓兼容环境启动时获取各类音频流的流音量范围,确定所有流音量范围中的最小下限音量值及最大上限音量值,由最小下限音量值及最大上限音量值形成新的流音量范围,将所有音频流的流音量范围设置为新的流音量范围,将所有音频流的初始音量值设置为初始化的音量控制值与新的流音量范围之积与最小下限音量值的求和结果,完成桌面系统及安卓兼容环境的初始化。
22.其中,流音量范围是指由下限音量值与上限音量值限定的音频流可设置的音量取值范围。在安卓系统中,音频流的流音量范围指的是音频流音量调节的等级划分,具体来说,音频流的播放音量的大小实际是由具体音频播放硬件决定的,流音量范围是指将播放音量从零调节到最大值所需要的调节次数,例如,若流音量范围的取值为5则说明调节5次或按5次音量增大键即可将播放音量从零调节到最大值。
23.初始化过程中,可通过读写配置文件或设置属性的方式将桌面系统的音量控制值传递至安卓兼容环境。
24.步骤3、当用户在桌面系统中调整系统音量时,获取新的系统音量值;若新的系统音量值与当前保存的系统音量值相同则不作处理,若新的系统音量值与当前保存的系统音量值不同则执行步骤4。
25.步骤4、采用新的系统音量值设置桌面系统音量,并将当前保存的系统音量值更新为新的系统音量值,获取当前桌面系统的顶层窗口,将系统音量值及顶层窗口对应的任务id发送至安卓兼容环境。
26.其中,可通过由桌面系统向安卓兼容环境发送rpc消息的方式传递系统音量值及顶层窗口对应的任务id。
27.步骤5、采用系统音量范围将系统音量值进行归一化得到音量控制值;若顶层窗口为桌面系统应用的窗口,则安卓兼容环境采用音量控制值设置所有音频流的音量值;若顶层窗口为安卓应用的窗口,则根据顶层窗口对应的任务id找到对应的安卓应用,采用音量控制值设置安卓应用对应的所有track的音量值。
28.其中,设置所有音频流或安卓应用对应的所有track的音量值的方式为:采用音量控制值与流音量范围之积与最小下限音量值的求和结果作为新的所有音频流或安卓应用对应的所有track的音量值。
29.进一步地,在采用上述求和结果设置音频流的音量值的过程中,包括采用初始化的音量控制值与新的流音量范围之积与最小下限音量值的求和结果设置所有音频流的初始音量值、采用音量控制值与流音量范围之积与最小下限音量值的求和结果设置音频流的音量值的过程,安卓兼容环境实际设置时会对求和结果进行取整操作,当音量控制值不为零时,上述操作会导致设置的音频流的音量值为零,实际效果为安卓兼容环境内被设置为静音状态,而这可能与实际情况不符,因此,为了进一步提高设置的准确性,本发明在执行步骤2及步骤5的设置过程时增加了以下处理:
当音量控制值不为零时,若音量控制值与流音量范围之积与最小下限音量值的求和结果小于1,则将音量值设置为在最小下限音量值的基础上加1的结果;若音量控制值与流音量范围之积与最小下限音量值的求和结果不小于1,则将音量值设置为求和结果;当音量控制值为零时,则将音量值设置为求和结果。
30.在桌面系统中,当用户停止安卓应用播放音频或由用户切换到其他应用导致安卓应用停止播放音频后,再调整系统音量时仍然会通知安卓兼容环境同步调整安卓兼容环境内的音量,然而,对于已经停止播放的安卓应用来说,由于其对应的track实际已被销毁,此时再对其进行音量调节就会导致系统出错,因此,为了提高系统的可靠性,本发明在安卓兼容环境内增加以下处理过程:当安卓应用播放音频创建track时,为track分配唯一编号,建立安卓应用的任务id与track唯一编号及track类型之间的映射关系;当安卓应用停止播放音频时将映射关系中与任务id相关的所有记录均删除。
31.实施例:本实施例通过对安卓系统进行系统级的修改以linux系统作为桌面系统,实现了本发明提供的一种多音频流音量的自动控制方法,具体过程如下:s1、在linux系统启动时,获取linux系统初始音量及系统音量范围,采用系统音量范围对初始音量进行归一化得到初始化的音量控制值。
32.具体为调用alsa库的api:snd_mixer_selem_get_playback_volume_range,获取系统音量范围的整形值volumemin和volumemax;调用snd_mixer_selem_get_playback_volume获取系统的当前音量volumecurrent;将当前音量volumecurrent采用如下公式进行归一化得到百分比表示的音量控制值linuxvolumecurrent:volumecurrent/(volumemax
ꢀ–ꢀ
volumemin),其中,并音量控制值的取值范围为0-1.0。通过设置属性将linuxvolumecurrent传递给安卓的audioservice。
33.s2、安卓兼容环境启动时获取各类音频流的流音量范围,确定所有流音量范围中的最小下限音量值及最大上限音量值,由最小下限音量值及最大上限音量值形成新的流音量范围,将所有音频流的流音量范围设置为新的流音量范围。
34.在audioservice中,对于每个音频流stream,调用audioservice的getstreamminvolumaxe和getstreammaxvolume,获取该音频流stream的下限音量值及上限音量值进而得到level range;选取所有音频流的最大上限音量值记为maxlevel,选取所有音频流的最小下限音量值记为minlevel,由maxlevel和minlevel形成新的流音量范围,采用新的流音量范围[minlevel,maxlevel]重新初始化min_stream_volume和max_stream_volume。
[0035]
min_stream_volume和max_stream_volume均为整型数组,其中的元素均与stream的volume相对应。
[0036]
s3、将所有音频流的初始音量值volume level设置为初始化的音量控制值与新的流音量范围之积与最小下限音量值的求和结果。
[0037]
针对每个stream,调用audioservice的setstreamvolume采用如下公式设置其volume level:volume level = minlevel + linuxvolumecurrent*(maxlevel-minlevel) 。
[0038]
进一步地,由于音量设置过程中linuxvolumecurrent*(maxlevel

minlevel)会被转换为整形,则可能发生虽然linuxvolumecurrent》0,但是由于linuxvolumecurrent很小而导致linuxvolumecurrent*(maxlevel

minlevel)被转换成0,由此,本发明中增加了如下处理:当linuxvolumecurrent 》 0时,如linuxvolumecurrent*(maxlevel

minlevel)换成整数后为0,则将volume level设置为minlevel+1。
[0039]
s4、在linux系统运行过程中,监视安卓应用当前输出音频时的音频流类型。
[0040]
在安卓框架的audioservice中增加map类型的变量mmaptask2audiotrack,其中,变量mmaptask2audiotrack的key为taskid、value为二元组[trackuuid, trackstreamtype],trackuuid为track的唯一id,trackstreamtype为track所播放的音频流类型。
[0041]
在安卓框架中的audiotrack类中增加成员变量mtaskid和muuid,将其方法 createtrack修改为:获取当前进程的进程id,进而获取任务id(taskid),将taskid作为mtaskid,并为当前track创建uuid,作为muuid;将audiotrack类的play方法修改为:获取当前track的streamtype,将mtaskid与二元组[muuid, streamtype]的映射写入mmaptask2audiostreamtype中,用于记录正在播放的track;将audiotrack类的stop方法修改为:在mmaptask2audiostreamtype中删除key为mtaskid、且value中uuid为muuid对应的项。
[0042]
在安卓框架中audiotrack类属于libaudioclient模块,createtrack方法运行于音频播放应用内。此外,本发明中引入uuid的原因是同一安卓应用可能会同时创建多个相同stream type的audiotrack。
[0043]
s5、在linux系统运行过程中,监视linux系统的音量修改操作。
[0044]
通过在xdroidui端hook alsa库的音量设置函数或者修改alsa库的实现监视音量设置函数的调用过程;xdroidui获取新的linux音量。
[0045]
其中,alsa库的音量设置函数如snd_mixer_selem_set_playback_volume_all或snd_mixer_selem_set_playback_volume等。
[0046]
s6、linux系统判断新的音量控制值,如新的音量控制值不等于之前保存的linuxvolumecurrent,则修改linuxvolumecurrent为新音量控制值;然后判断linux桌面当前最顶部的窗口是否为安卓应用,如果不是,则将currenttaskid设置为-1,如果是,则将最顶层安卓应用的taskid记为currenttaskid;再将linuxvolumecurrent和currenttaskid作为参数通过rpc传递给修改后的安卓的audioservice。
[0047]
s7、audioservice根据linuxvolumecurrent和currenttaskid修改音量,若currenttaskid为-1,则基于linuxvolumecurrent修改所有stream的音量;否则,在mmaptask2audiostreamtype中查找key为currenttaskid的所有value,对于每个value中的不同stream,基于linuxvolumecurrent修改这些stream的音量。
[0048]
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1