msm8953平台tinymix命令行控制SPK通道的静音开关的问题

MSM8953静音时产生pop音,发现使用tinymix命令的方式不产生pop音,方法如下:
1、查找当前播放的音源

adb root
adb remount
adb shell
tinymix | grep SPK

显示SPK的PID号是100
音乐播放器在播放音乐,下发:
#tinymix 100 ZERO 关声音
#tinymix 100 Switch 打开声音
2、修改ap\hardware\qcom\audio\configs\msm8953\mixer_paths_mtp.xml文件解决音乐暂停时的pop音
第一种方法:
1)默认SPK通道关闭,如下:

    <ctl name="EAR_S" value="ZERO" />
    <ctl name="HPHL" value="ZERO" />
    <ctl name="HPHR" value="ZERO" />
    <ctl name="SPK" value="ZERO" />

即SPK、EAR、PHP默认处于关闭状态。
2)修改SPK通道配置

    <path name="speaker">
        <ctl name="RX3 MIX1 INP1" value="RX1" />
        <ctl name="SPK" value="Switch" />
		<ctl name="RX1 MIX1 INP1" value="RX1" />
        <ctl name="RDAC2 MUX" value="RX1" />
        <ctl name="RX1 Digital Volume" value="84" />
        <ctl name="EAR PA Gain" value="POS_6_DB" />
        <ctl name="EAR_S" value="Switch" />
	<ctl name="SPK PA" value="ENABLE" />
    </path>

修改成:
在这里插入图片描述
在这里插入图片描述
这样修改的原因:因为EAR通道和SPK通道共用一个开关,同一时间上层声音open的情况下声音会从EAR和SPK同时输出。所以需要将SPK值是Switch和AER_S的值是Switch注释掉,同时注释掉SPK PA的值ENABLE(这个同时管着AER和SPEAK通道)。上层静音时由tinymix发命令去控制,这样修改之后,音乐播放器在播放的时候点击暂停和播放按钮就不能够打开和关闭声音了,必须走tinymix发命令去控制,如第一节的方法去控制。同时静音时pop音也就没有了。
第二种方法:
修改:hardware\qcom\audio\configs\msm8953\mixer_paths_mtp.xml文件
1)默认SPK通道关闭,如下:

    <ctl name="EAR_S" value="ZERO" />
    <ctl name="HPHL" value="ZERO" />
    <ctl name="HPHR" value="ZERO" />
    <ctl name="SPK" value="ZERO" />

即SPK、EAR、PHP默认处于关闭状态。
2)修改SPK通道配置

    <path name="speaker">
        <ctl name="RX3 MIX1 INP1" value="RX1" />
        <ctl name="SPK" value="Switch" />
		<ctl name="RX1 MIX1 INP1" value="RX1" />
        <ctl name="RDAC2 MUX" value="RX1" />
        <ctl name="RX1 Digital Volume" value="84" />
        <ctl name="EAR PA Gain" value="POS_6_DB" />
        <ctl name="EAR_S" value="Switch" />
	<ctl name="SPK PA" value="ENABLE" />
    </path>

修改成:
在这里插入图片描述
在这里插入图片描述
按照以上修改之后,音乐播放打开和关闭直接走正常的android流程,没有pop音,而静音和不静音必须走tinymix发命令去控制,如第一节的方法去控制,具体实现请看第三节。
第三种方法:
不修改hardware\qcom\audio\configs\msm8953\mixer_paths_mtp.xml文件的SPK模块,如下:

    <path name="speaker">
        <ctl name="RX3 MIX1 INP1" value="RX1" />
        <ctl name="SPK" value="Switch" />
		<ctl name="RX1 MIX1 INP1" value="RX1" />
        <ctl name="RDAC2 MUX" value="RX1" />
        <ctl name="RX1 Digital Volume" value="84" />
        <ctl name="EAR PA Gain" value="POS_6_DB" />
        <ctl name="EAR_S" value="Switch" />
		<ctl name="SPK PA" value="ENABLE" />
    </path>

因为不修改mixer_paths_mtp.xml文件,在切通道的时候会有pop音,所以需要结合
#tinymix 100 ZERO 关声音
#tinymix 100 Switch 打开声音
方法来使用,在从SPK通道切换到PHP通道之前先下发tinymix 100 ZERO指令关闭SPK通道,然后再切到PHP通道。从PHP通道切换到SPK通道之后,再使用tinymix 100 Switch打开SPK通道的声音。设置中静音按钮调用
#tinymix 100 ZERO 关声音
#tinymix 100 Switch 打开声音
来达到打开和关闭声音的目的。具体看第三节的内容。
3、添加frameworks\neoservice\jni\android_sourceservice_MuxThread.cpp对源部分的修改,如下:

static void NeoSetMute(JNIEnv *env, jobject clazz, jint cmd)
{
	ALOGE("NeoSetMute-cmd:%d", cmd);
	switch(cmd)
	{
		case 0:
			ALOGE("NeoSetMute true");
			system("tinymix 100  ZERO");
			break;
		case 1:
			ALOGE("NeoSetMute true");
			system("tinymix 100  Switch");
			break;
		default:
			break;
	}
}

上层调用这个JNI接口即可达到静音和音乐打开和播放时去掉pop音的效果

3、APP层设置声音通道的切换
因为我们硬件设计时GPIO63管脚链接到耳机检测管脚上,使用时发现APP控制GPIO63管脚低电平表示耳机插入来切换到PHP(耳机)通道,使用这种情况会发现驱动在检测耳机插入之后,去检测耳机的MIC类行,时间将很长,所以会发现通过耳机检测管脚切换到耳机通道的时间会比较长。而我们系统应该是声音是直接从耳机通道输出到后级MCU(不连接即插即用的耳机),不需要耳机检测管脚来切换声音的,所以直接在音源管理服务中直接设置到耳机通道和SPK通道上,这样就不会出现切换到耳机通道时时间很长的问题,而不需要去控制耳机检测管脚了。直接将耳机检测管脚悬空或者驱动中默认设置成1输出即可。如下方法:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
/**
     * 切换到外放
     */
    public void changeToSpeaker(){
        //注意此处,蓝牙未断开时使用MODE_IN_COMMUNICATION而不是MODE_NORMAL
//        audioManager.setMode(bluetoothIsConnected ? AudioManager.MODE_IN_COMMUNICATION : AudioManager.MODE_NORMAL);
        audioManager.setMode(AudioManager.MODE_NORMAL);
        audioManager.stopBluetoothSco();
        audioManager.setBluetoothScoOn(false);
        audioManager.setSpeakerphoneOn(true);
    }
    /**
     * 切换到蓝牙音箱
     */
    public void changeToHeadset(){
        audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        audioManager.startBluetoothSco();
        audioManager.setBluetoothScoOn(true);
        audioManager.setSpeakerphoneOn(false);
    }
    /**
     * 切换到耳机模式
     */
    public void changeToHeadset2(){
        audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        audioManager.stopBluetoothSco();
        audioManager.setBluetoothScoOn(false);
        audioManager.setSpeakerphoneOn(false);
    }
    /**
     * 切换到听筒
     */
    public void changeToReceiver(){
        audioManager.setSpeakerphoneOn(false);
        audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
    }
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值