修改系统音量相关集合

需求如下:加减音量只有6挡;打电话的时候每次默认最大音量,且通话时最小音量为1,不能无声;具体修改如下:

在配置工具中将系统32级音量关掉,系统音量就变成16级,可以使得在苹果手机上面音量加减步进为一格:
在这里插入图片描述
再就是记录系统音量的变量:

sys_cb.vol:记录了系统的音量;
sys_cb.hfp_vol:记录系统通话的用量;

系统内部的音量+/-操作如下:func.c下func_message()中,附系统内部的具体实现:

//音量+:
bsp_set_volume(bsp_volume_inc(sys_cb.vol));
//音量-:
bsp_set_volume(bsp_volume_dec(sys_cb.vol));
//具体实现如下
u8 bsp_volume_inc(u8 vol)
{
    vol++;
    if(vol > VOL_MAX)
        vol = VOL_MAX;
    return vol;
}
u8 bsp_volume_dec(u8 vol)
{
    if(vol > 0)
        vol--;
    return vol;
}
bool bsp_set_volume(u8 vol)
{
	bsp_change_volume(vol);
	return true;
}
void bsp_change_volume(u8 vol)
{
    u16 dig_vol = 0;
    if (vol <= VOL_MAX) {
        dig_vol = dac_dvol_table[vol];
        dac_set_dvol(dig_vol);
    }
}

也就是说bsp_set_volume为实际设置音乐音量的函数,实现6挡音量修改如下:

//音量+:替换系统:bsp_set_volume(bsp_volume_inc(sys_cb.vol));
sys_cb.vol = sys_cb.vol + 3;
if(sys_cb.vol > 14)
	sys_cb.vol = 16;//因为我已经将系统音量设置为最大格16
bsp_set_volume(sys_cb.vol);

//音量-:替换系统:bsp_set_volume(bsp_volume_dec(sys_cb.vol));
if(sys_cb.vol >= 3)
{
	sys_cb.vol = sys_cb.vol - 3;
}
else
	sys_cb.vol = 0;
if(sys_cb.vol >= 13)
	sys_cb.vol = 12;
bsp_set_volume(sys_cb.vol);

注意:当音量最小的时候会错误播报最大提示音:config.h 下修改:

#define WARNING_MIN_VOLUME     0

下面就是通话音量修改为6挡,具体如下:
msg_bt.c下bt_call_volume_change()中:

if ((msg == KU_VOL_UP) && (sys_cb.hfp_vol < 15)) {
	sys_cb.hfp_vol = sys_cb.hfp_vol + 3;
	if(sys_cb.hfp_vol >= 15)
		sys_cb.hfp_vol = 15;
} else if ((msg == KU_VOL_DOWN) && (sys_cb.hfp_vol > 1)) {
	if(sys_cb.hfp_vol >= 3)
	{
		sys_cb.hfp_vol = sys_cb.hfp_vol - 3;
	}
	else 
		sys_cb.hfp_vol = 1;
	if(sys_cb.hfp_vol <= 1)
		sys_cb.hfp_vol = 1;
}

通话音量默认最大修改如下:
sfunc_bt_call.c下sfunc_bt_call()中,位置为while()循环前面:

sys_cb.hfp_vol = 15;
bsp_change_volume(bt_hfp_get_sys_vol(sys_cb.hfp_vol));

修改完发现连接手机之后的第一次会失效,但是后面的都正常。这个是由于系统和手机音量同步机制导致的,当第一次连接打电话的时候,设置最大音量在前,同步机制在后,所以设置之后又被同步回去了,解决办法如下:

func_bt.c中定义:

u8 call_val_max;//用于每次打电话的时候复位为最大音量

func_bt.h中声明为全局变量:

extern u8 call_val_max;//用于每次打电话的时候复位为最大音量

初始化:
func_bt.c中func_bt()下的while循环中:

if(call_val_max != 0)
	call_val_max = 0;

msg_bt.c中sfunc_bt_call_message()下:

case EVT_HFP_SET_VOL:/*这里就是通话时,音量同步的地方*/
	if(call_val_max == 0)
	{//这里只能进来一次,不然手机按键+/-音量会直接将音量变成最大
		call_val_max = 1;
		sys_cb.hfp_vol = 15;
	}
    bsp_change_volume(bt_hfp_get_sys_vol(sys_cb.hfp_vol));
    break;

拓展:播放音乐时候的同步:

case EVT_TWS_SET_VOL:
case EVT_A2DP_SET_VOL:/*这里是播放音乐时,音量同步的地方*/
	if (bt_get_status() != BT_STA_INCALL) {
		printf("a2dp set vol: %d\n", sys_cb.vol);
		bsp_change_volume(sys_cb.vol);
		param_sys_vol_write();
		sys_cb.cm_times = 0;
		sys_cb.cm_vol_change = 1;
	}
break;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值