一种安卓应用输出音量的独立控制方法与流程

文档序号:31349588发布日期:2022-08-31 12:27阅读:384来源:国知局
一种安卓应用输出音量的独立控制方法与流程

1.本发明属于安卓系统开发技术领域,具体涉及一种安卓应用输出音量的独立控制方法。


背景技术:

2.在安卓系统中,当多个安卓应用播放音频时,每个安卓应用都会创建audiotrack,每个audiotrack都会通过共享内存和播放线程的track传递数据,每个安卓应用发送的音频数据格式可能各不相同,而声卡通常仅支持几种固定的格式,因此,大多数情况下需要对音频数据进行重采样和混音,重采样是指将硬件不支持的音频格式转化为硬件支持的音频格式的处理过程。
3.处理过程为audiotrack通过共享内存将数据传递给混音线程,混音线程分析判断音频数据的格式是否为硬件所支持,根据支持与否设置该音频数据的hook函数,再确定总的hook函数,具体来说对于格式不同的音频数据则设置为进行重采样的hook函数;在混音处理时只需要调用总的hook函数即可完成对所有音频数据的处理,包括对音频数据的重采样,然后再对处理后的音频数据进行混音处理,最后将混音处理后的数据发送至硬件。安卓系统中采用上述操作即可提供对不同安卓应用输出音量进行独立控制的支持。
4.在桌面系统上运行安卓应用时,通常采用在桌面系统上安装安卓兼容环境的方式,使安卓应用运行在安卓兼容环境中,用户可在安卓兼容环境中使用安卓应用,例如,现有安卓兼容环境的实现方案有xdroid,它包括xdroidui和xdroidserver,xdroidui为安卓应用显示单元,xdroidserver为安卓应用兼容服务。然而,现有的此类使用方式不支持用户单独控制安卓应用的输出音量,为用户使用带来了不便,影响了用户体验。


技术实现要素:

5.有鉴于此,本发明提供了一种安卓应用输出音量的独立控制方法,能够实现对运行在安卓兼容环境内的安卓应用的输出音量的独立控制。
6.本发明提供的一种安卓应用输出音量的独立控制方法,包括以下步骤:步骤1、用户在桌面系统中打开安卓应用时,将安卓应用的taskid发送至安卓兼容环境;用户使用安卓应用输出音频时,安卓兼容环境确定安卓应用所需采用的audiotrack的实例track的类型,若track的类型为stream_music则将接收到的taskid与track绑定,同时为track增加保存各声道音量值的音量数组后,完成track的创建;若track的类型为非stream_music则完成track的创建;步骤2、当用户调节安卓应用输出音量时,判断当前操作的对象是否为位于桌面最上层的安卓应用,如果是则执行步骤3,否则执行步骤2;步骤3、暂停将调节安卓应用输出音量的事件发送至安卓应用兼容服务,获取调节后的安卓应用输出音量的音量值,所述音量值为取值在0到1之间的浮点值;将音量值及安卓应用的taskid发送至安卓兼容环境内的audioflinger;
步骤4、audioflinger找到绑定了相同taskid的track作为目标track,采用音量值为目标track的音量数组中每个元素赋值;完成对音频数据基于音量值的调整及音频数据的重采样得到新的音频数据,采用目标track输出新的音频数据。
7.进一步地,所述步骤4中的所述完成对音频数据基于音量值的调整及音频数据的重采样得到新的音频数据的方式为:启动安卓系统内置的重采样器对音频数据进行重采样后,采用音量值调整音频数据的每个字节后得到新的音频数据。
8.进一步地,所述采用音量值调整音频数据的每个字节后得到新的音频数据的方式为:令音量值与音频数据的每个字节做乘法运算后得到新的音频数据。
9.进一步地,所述步骤4中的所述完成对音频数据基于音量值的调整及音频数据的重采样得到新的音频数据的方式为:采用音量值调整音频数据的每个字节后得到中间音频数据,启动重采样器完成对中间音频数据的处理得到新的音频数据。
10.进一步地,所述采用音量值调整音频数据的每个字节后得到中间音频数据的方式为:令音量值与音频数据的每个字节做乘法运算后得到中间音频数据。
11.进一步地,所述步骤1中的所述用户在桌面系统中打开安卓应用时,由安卓应用显示单元将安卓应用的taskid发送至安卓兼容环境。
12.进一步地,所述安卓应用显示单元为xdroidui,所述安卓应用兼容服务为xdroidserver。
13.有益效果:本发明通过将安卓应用与audiotrack绑定,采用audiotrack传递调整后的音量值,在安卓系统对音频数据重采样后再采用控制音量值对音频数据进行调整,最后采用对应的audiotrack完成对调整后音频数据的输出,从而实现对安卓应用输出音量的独立控制,改善了用户体验。
附图说明
14.图1为本发明提供的一种安卓应用输出音量的独立控制方法的流程图。
具体实施方式
15.下面结合附图并举实施例,对本发明进行详细描述。
16.本发明提供的一种安卓应用输出音量的独立控制方法,其核心思想是:通过获取安卓应用的输出音频的音量值,采用音量值对输出音频的每个字节进行处理,再将处理后的音频进行输出,已实现针对安卓应用的独立音量控制。
17.本发明提供的一种安卓应用输出音量的独立控制方法,流程如图1所示,包括以下步骤:步骤1、用户在桌面系统中打开安卓应用时,安卓应用显示单元将安卓应用的taskid发送至安卓兼容环境。
18.步骤2、用户使用安卓应用输出音频时,安卓兼容环境确定安卓应用所需采用的audiotrack的实例track的类型,若track的类型为stream_music则将接收到的taskid与track绑定,同时为track增加保存各声道音量值的音量数组后,完成track的创建;若track的类型为非stream_music则完成track的创建。
19.步骤3、当安卓应用显示单元监测到用户控制安卓应用输出音量的操作时,判断当前操作的对象是否为位于桌面最上层的安卓应用,如果是则执行步骤4,否则执行步骤3,继续监测。
20.具体来说,安卓应用显示单元在桌面系统端检测输出音量控制操作的方法包括:检测多媒体键盘音量键的输入、检测通过系统任务栏上的音量控制、检测安卓应用显示单元自定义的音量控制快捷键或检测通过安卓应用显示单元的应用窗口的右键菜单的音量控制等方式。
21.步骤4、安卓应用显示单元拦截控制输出音量的操作,限制将当前操作发送至安卓应用兼容服务;安卓应用显示单元获取当前操作执行后的音量值,记为appvolume,appvolume为取值在0到1之间的浮点值;安卓应用显示单元将音量值及安卓应用的taskid发送至安卓应用兼容服务。
22.步骤5、安卓应用兼容服务将音量值和安卓应用的taskid发送到audioflinger,audioflinger遍历当前所有的track找到绑定了相同taskid的track作为目标track,采用音量值为目标track的音量数组中每个元素赋值;启动安卓系统内置的重采样器对音频数据进行重采样后,采用音量值调整音频数据的每个字节后得到新的音频数据,采用目标track输出新的音频数据。
23.实施例:本实施例通过对安卓系统进行系统级的修改,实现了本发明提供的一种安卓应用输出音量的独立控制方法,具体过程如下:s1、修改安卓系统中的audiotrack类,以实现绑定audiotrack与安卓应用。
24.在audiotrack类中增加一个类型为long的成员变量mtaskid,mtaskid的初始值为-1,其中,
“‑
1”表示不存在与audiotrack相对应的安卓应用,或audiotrack属于安卓系统的系统进程。
25.同时,在audiotrack类中增加一个浮点数组成员变量mvolumes [max_channel_count],用来保存每个声道的音量值,mvolumes的默认值为每个元素都为1,max_channel_count为最大通道数。在现有系统中,max_channel_count一般为2,即现有系统往往只有左右两个声道,安卓应用输出音乐时也使用两个声道。本发明中,mvolumes数组中每个声道的音量值均采用安卓应用显示单元发送的音量值进行设置,采用数组表示音量的目的是便于扩展。
[0026]
修改安卓系统中的audiotrack类的createtrack方法,该类属于libaudioclient模块,createtrack方法运行于音频播放应用内,修改如下:当待创建的track的类型为stream_music时,获取当前进程的进程id,进而获取任务id即taskid,将本audiotrack的mtaskid设置为taskid; 当track的类型为非stream_music时,将本audiotrack的mtaskid设置为-1;最后执行createtrack的安卓标准实现步骤。
[0027]
s2、修改安卓系统内置的音频重采样器(resampler),这种修改方式仅对使用安卓系统内置resampler的音频输出应用有效,修改内置的音频重采样器(resampler)的重采样函数,例如resamplemono16、resamplestereo16等,包括以下步骤:执行标准的重采样流程完成对音频数据的重采样后,采用音量值调整音频数据的
每个字节后得到新的音频数据,例如,采用volume*xxx的方式,将outputbuffer [index] = xxxx改成outputbuffer [index] = volume*xxxx,完成输出缓存outputbuffer的操作。
[0028]
s3、当linux/windows端检测到针对安卓应用的音量控制操作时,xdroidui检测多个安卓应用窗口的活动变化,响应窗口的activate事件,当某个安卓应用窗口收到此事件且位于桌面的最上层,则不将音量调整事件传递到安卓兼容环境内的xdroidserver,否则会影响整个安卓环境的音频输出音量。
[0029]
s4、通过rpc将最上层安卓应用的taskid和改变后的音量值appvolume传递至安卓兼容环境的audioflinger,其中,appvolume为0~1.0的浮点值对应于0%~100%。
[0030]
s5、audioflinger遍历所有的audiotrack,将与当前安卓应用具有相同taskid的audiotrack的mvolumes的所有元素的取值均设置为appvolume。
[0031]
s6、将appvolume传递给修改后的resampler,resampler对音频数据完成重采样及使用appvolume对音频数据的调整,采用audiotrack输出处理后的音频数据。
[0032]
此外,由于安卓系统采用的重采样器包括系统内置的重采样器和音频设备提供的重采样器,为了能进一步提高适用性,本发明还提供了能够适用于上述两类重采样器的采用音量值调整音频数据的每个字节的实现方式。
[0033]
在现有安卓系统中,在resampler的运行中会调用audiobufferprovider接口的getnextbuffer获取音频帧数据,通过修改安卓系统中负责音频输出的audiobufferprovider的子类即可满足使用音频设备提供的resampler及系统内置的resampler均有效,然而由于这一修改方式需要多执行一次内存读写,所以执行效率会有一定程度的下降,但是却提高了适用性。
[0034]
具体来说,通过修改安卓框架中的audiobufferprovider子类的getnextbuffer函数,例如resamplerbufferprovider、passthrubufferprovider、extendedaudiobufferprovider等,修改后的步骤如下:首先执行getnextbuffer的标准步骤,获取音频帧数据inputbuffer;然后获取当前audiobufferprovider对应的audiotrack类的实例track,若track的类型为stream_music,则获取track的mvolumes[0]的值volume;最后对音频帧数据inputbuffer内的每个字节执行最简单的操作,操作方式如下:inputbuffer[i] = volume*inputbuffer[i],由此得到采用音量值调整后的音频数据。
[0035]
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1