需求如下:加减音量只有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;