r()方法模拟该Track对象的数据读取过程,截取该Track对象的cblk缓冲中的音频数据,将截取的音频数据写入所述共享内存SharedBuf fer I,并执行步骤S204和步骤S205 ;
[0043]步骤S204,音频数据接收:所述子线程ProcessThreadl从共享内存SharedBuf fer I中读取音频数据,并将读取的音频数据写入环形内存Mas terBuf f er ;
[0044]步骤S205,音频数据重放:所述子线程ProcessThread2从环形内存MasterBuf fer中读取音频数据,并将读取的音频数据写入共享内存SharedBufferf;同时在所述子线程ProcessThread2中新建Native Aud1Track对象,并通过该所述Native Aud1Track对象将所述共享内存SharedBuf f er2中的音频数据写回所述Andro i d音频系统,进行正常流程的混音及播放。
[0045]经过上述两种实施方式的初始化、数据截取、数据接收和数据重放过程,所述子线程ProcessThread1、子线程ProcessThread2和Android音频系统线程共同读写共享内存SharedBufferl、共享内存SharedBuf fer2和环形内存MasterBuffer中的音频数据,形成“截取-处理-输出”闭环,其交互示意图如图3所示。
[0046]图4显示了本发明提供的一种面向第三方音频播放器的数据截取方法流程图,该方法基于Andro id系统,上层应用通过JNI机制创建ProcessMas ter主控类对象,并通过该ProcessMaster主控类对象控制整个数据截取过程,具体的执行步骤如下:
[0047]S401,用户打开上层应用程序,应用程序通过JNI,创建主控类对象ProcessMaster,并调用初始化接口进行数据截取初始化;
[0048]S402,用户在应用程序中打开数据截取功能,应用程序利用JNI机制将Android音频系统中添加的标志位startf lag的值设置为true,此后Andro id音频系统将音频数据转向写入共享内存SharedBufferl ;
[0049]S403,子线程ProcessThreadl从共享内存SharedBuff erl中获取音频数据并将音频数据写入环形内存MasterBuf fer ;子线程ProcessThread2读取环形内存MasterBuf fer中的音频数据,将读取的音频数据写入共享内存SharedBuf fer 2,并将共享内存SharedBuf fer2中的音频数据写回到Andro id放音流程进行放音;
[0050]本发明提供的一种面向第三方音频播放器的数据截取方法,还包括对第三方音频播放器暂停或停止播放、音频播放进入数据不继、Android音频系统播放线程意外退出以及自身软件退出的处理方法,具体为:
[0051]所述对第三方音频播放器暂停或停止播放以及对音频播放进入数据不继的处理方法,当第三方音频播放器暂停或停止播放时,Android音频系统播放线程调用standby函数,进入standby流程。本方案对Android音频系统的standby函数进行修改,具体处理过程如下:
[°°52] 步骤al,在Android音频系统中添加播放暂停标志位standbyf lag;
[0053]步骤a2,当Android音频系统处理第三方音频播放器暂停或停止以及音频播放进入数据不继,调用standby函数时,若所述标志位startf lag的值为true,则将该所述标志位standbyf lag 的值设置为 true ;
[0054]步骤a3,在所述子线程ProcessThreadl与子线程ProcessThread2的线程循环中查询所述标志位standbyf lag的值,若所述标志位standbyf lag的值为true,贝Ij立即停止数据截取过程并清空所述共享内存SharedBuffer 1、共享内存SharedBuf f er2和环形内存MasterBuf f er中的音频数据,等待下次播放或数据恢复正常。
[0055]所述对Android音频系统播放线程意外退出的处理方法,当Android音频系统播放线程意外退出时,调用861:_。3瓜1116丨6^函数,通过参量61;[1:;[呢=1指示411(11'01(1音频系统播放线程意外退出。本方案对Android音频系统的set_parameters函数进行修改,具体处理过程如下:
[0056]步骤b I,在Andrο id音频系统中添加退出标志位exi tf Iag;
[0057]步骤h2,当Android音频系统处理播放线程意外退出,调用set_parameters函数时,检测出现意外退出时的参量,若检测到参量为exiting= I,则将所述标志位exitf lag的值设置为true ;
[0058]步骤b3,在所述子线程ProcessThreadl和子线程ProcessThread2的线程循环中查询所述标志位exitf lag的值,若所述标志位exitf lag的值为true,则立即停止数据截取过程并清空所述共享内存SharedBuf fer 1、共享内存SharedBuf fer2和环形内存MasterBuf fer中的音频数据,并执行软件退出流程。
[0059]所述对自身软件退出的处理方法,具体处理体过程如下:
[0060]步骤Cl,当上层应用主动关闭数据截取功能时,由Java层利用JNI调用所述主控类对象ProcessMaster的退出接口 ;
[0061 ] 步骤c2,通过所述主控类对象ProcessMaster的退出接口,关闭所述子线程ProcessThread I和子线程ProcessThread2,重置所述标志位startflag、标志位standbyf lag和标志位exitf lag的值,释放所述共享内存SharedBuffer 1、共享内存SharedBuf fer2和环形内存Mas terBuf fer,此后,音频数据截取过程关闭。
【主权项】
1.一种面向第三方音频播放器的数据截取方法,所述方法基于Android音频系统,面向第三方音频播放器,进行数据截取,其特征在于,具体过程如下: 步骤I,创建用于集中控制数据截取过程的主控类对象ProcessMaster; 步骤2,通过所述主控类对象ProcessMaster,执行Nati ve层的数据截取初始化,具体包括如下步骤: 步骤2-1,通过所述主控类ProcessMaster对象,在Native层开辟两块跨进程共享内存,分别为共享内存SharedBuffer I和共享内存SharedBuffer 2,其中SharedBuff erl为环形共享内存,SharedBuf fer2为普通共享内存; 步骤2-2,在所述主控类对象ProcessMaster中开辟一块环形内存MasterBuffer; 步骤2-3,通过所述主控类对象ProcessMas ter创建一对协同工作子线程,分别为子线程卩1'006 8 81'11代&(11和子线程?1'006 8 81'11作&(12,并启动子线程ProcessThreadl和子线程ProcessThread2; 步骤3,在所述Android音频系统中添加音频截取标志位startf lag,根据所述标志位startf lag的值控制音频数据的流向,当标志位startf lag的值为true时,将音频数据写入所述共享内存SharedBufferl,进行音频数据截取,并执行步骤4 ; 步骤4,所述子线程ProcessThread I从所述共享内存SharedBuff erl中读取音频数据,将读取的音频数据写入所述环形内存MasterBuffer;所述子线程ProcessThread2从所述环形内存MasterBuf f er中读取音频数据,将所述音频数据写入所述共享内存SharedBuf f er2,并将所述共享内存SharedBuf f er 2中的音频数据写回到所述Andro id音频系统。2.根据权利要求1所述的一种面向第三方音频播放器的数据截取方法,其特征在于,包括对第三方音频播放器暂停或停止播放、音频播放进入数据不继、Android音频系统播放线程意外退出以及自身软件退出的处理方法,具体为: 所述对第三方音频播放器暂停或停止播放以及对音频播放进入数据不继的处理方法,具体过程为: 步骤al,在所述Android音频系统中添加播放暂停标志位standbyflag; 步骤a2,当所述Android音频系统处理第三方音频播放器暂停或停止播放以及数据不继,调用standby函数时,若所述标志位startflag的值为true,则将该所述标志位standbyf lag 的值设置为 true ; 步骤a3,在所述子线程ProcessThreadl和子线程ProcessThread2的线程循环中查询所述标志位standbyf lag的值,若所述标志位standbyf lag的值为true,贝Ij立即停止数据截取过程,并清空所述共享内存SharedBufferl、共享内存SharedBuffer2和环形内存MasterBuff er中的数据,等待下次播放或数据恢复正常; 所述对Android音频系统播放线程意外退出的处理方法,具体过程为: 步骤bl,在所述Android音频系统中添加退出标志位exitf lag; 步骤b2,当Android音频系统处理底层播放线程意外退出,调用set_parameters函数时,检测出现意外退出时的参量,若检测到参量为exiting= I,则将所述标志位exitf lag的值设置为true ; 步骤b3,在所述子线程ProcessThreadl和子线程ProcessThread2的线程循环中查询所述标志位exitf lag的值,若所述标志位exitf lag的值为true,贝Ij立即停止数据截取过程并清空所述共享内存SharedBuff erl、共享内存SharedBuf fer2和环形内存MasterBuffer中的数据,并执行软件退出流程; 所述对自身软件退出的处理方法,具体过程为: 步骤Cl,当用户通过上层应用主动关闭数据截取功能时,由所述上层应用利用JNI,调用所述主控类对象ProcessMaster的退出接口 ; 步骤c2,通过所述主控类对象ProcessMaster的退出接口,关闭所述子线程ProcessThreadl和子线程ProcessThread2,重置所述标志位startflag、标志位standbyflag和标志位exitflag的值,释放共享内存SharedBufferl、共享内存SharedBuffer2和环形内存MasterBuffer,此后,数据截取过程关闭。
【专利摘要】本发明提出了一种面向第三方音频播放器的数据截取方法,从Android系统Native层的音频核心AudioFlinger入手,通过新创建的协同工作子线程与标准Android音频系统线程交互合作形成完备的数据截取闭环,在准确截取任意第三方音频播放器音频数据的同时又能保持对第三方音频播放器透明。本发明提出的一种面向第三方音频播放器的数据截取方法,通过软件方法加以实现,具有良好的可移植性与向后兼容性。
【IPC分类】G06F9/44
【公开号】CN105468360
【申请号】CN201510791453
【发明人】张晖, 刘宝
【申请人】南京邮电大学
【公开日】2016年4月6日
【申请日】2015年11月17日