音量随速补偿方案以及实现

1. 音量随速补偿方案定义

Speed-Sensitive音量调节机能是指随着车速的改变而自动进行音量补正的机能(不影响HFT)
速度的监控是通过Can 信息进行传递的,以1s为一个周期。
支持用户手动设置车速补偿的Off/Low/Mid/Hi状态,默认为Mid。

1.1 注意事项

  1. 当音量为0或者静音状态时不进行车速补偿。
  2. 当音量最大值时不进行车速补偿。
  3. 补偿后的音量不会超过音量最大值。
  4. Poweroff→on/ACCoff→on时,先设定为正常音量值,再根据车速重新调整。
  5. 如果当前设定响度On,则在当前VOL STEP上增加/减小dB的同时,响度也要按照当前dB值进行相应调整。
  6. 如果调整了Bass/Mid/Tre在当前VOL STEP上增加/减小dB的同时,Bass/Mid/Tre也应按照当前dB值进行相应调整。

1.2 速度(km/h)与调节值对应表:

等级状态\速度(km/h)1~910~1415~1920~2425~2930~3435~3940~4445~49
加速000011111
减速001111111
加速000111222
减速001112223
加速012234455
减速123344556
等级状态\速度(km/h)50~5455~5960~6465~6970~7475~7980~8485~8990~9495~99
加速1222222333
减速2222223333
加速3334445556
减速3344455566
加速667788991010
减速6778899101011
等级状态\速度(km/h)100~104105~109110~114115~119120~124125~129130~134135~139140~144145~149
加速3333344444
减速3333444444
加速6667777888
减速6677778888
加速11111212131314141515
减速11121213131414151516

2. 音量随速补偿代码实现

2.1 通过Can上报的车辆速度信息进行dB值查找关键代码并设置

private int mSpeed = 0;

private int getValueDB(int avcLevel, int speed) {
        int[] LowAcceler = new int[] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4 };
        int[] LowDeceler = new int[] { 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4 };

        int[] MidAcceler = new int[] { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8 };
        int[] MidDeceler = new int[] { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8 };

        int[] HigAcceler = new int[] { 0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15 };
        int[] HigDeceler = new int[] { 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16 };

        if (mSpeed < speed) {
            mSpeed = speed;
            if (avcLevel == CarAudioManager.AVC_LEVEL_LOW) {
                if (mSpeed >= 1 && mSpeed <= 9) {
                    return LowAcceler[0];
                } else {
                    Log.d(TAG, "getValueDB LowAcceler");
                    return getVlumeDBIndex(LowAcceler);
                }
            } else if (avcLevel == CarAudioManager.AVC_LEVEL_MIDDLE) {
                if (mSpeed >= 0 && mSpeed <= 9) {
                    return MidAcceler[0];
                } else {
                    Log.d(TAG, "getValueDB MidAcceler");
                    return getVlumeDBIndex(MidAcceler);
                }
            } else if (avcLevel == CarAudioManager.AVC_LEVEL_HIGH) {
                if (mSpeed >= 0 && mSpeed <= 9) {
                    return HigAcceler[0];
                } else {
                    Log.d(TAG, "getValueDB HigAcceler");
                    return getVlumeDBIndex(HigAcceler);
                }
            } else {
                Log.d(TAG, "getValueDB No Avc...");
            }
        } else {
            mSpeed = speed;
            if (avcLevel == CarAudioManager.AVC_LEVEL_LOW) {
                if (mSpeed >= 1 && mSpeed <= 9) {
                    return LowDeceler[0];
                } else {
                    Log.d(TAG, "getValueDB LowDeceler");
                    return getVlumeDBIndex(LowDeceler);
                }
            } else if (avcLevel == CarAudioManager.AVC_LEVEL_MIDDLE) {
                if (mSpeed >= 0 && mSpeed <= 9) {
                    return MidDeceler[0];
                } else {
                    Log.d(TAG, "getValueDB MidDeceler");
                    return getVlumeDBIndex(MidDeceler);
                }
            } else if (avcLevel == CarAudioManager.AVC_LEVEL_HIGH) {
                if (mSpeed >= 0 && mSpeed <= 9) {
                    return HigDeceler[0];
                } else {
                    Log.d(TAG, "getValueDB HigDeceler");
                    return getVlumeDBIndex(HigDeceler);
                }
            } else {
                Log.d(TAG, "getValueDB No Avc...");
            }
        }
        return 0;
    }

    private int getVlumeDBIndex(int[] arr) {
        int firstSpeed = 10;
        int endSpeed = 0;
        for (int i = 1; i < arr.length; i++) {
            endSpeed = firstSpeed + 4;
            if (mSpeed >= firstSpeed && mSpeed <= endSpeed) {
                Log.d(TAG, "getVlumeDBIndex Index: " + i + ", Speed: "+ mSpeed + ", Section: " + firstSpeed + "~" + endSpeed);
                return arr[i];
            }
            endSpeed++;
            firstSpeed = endSpeed;
        }
        return -1;
    }
	// 调用部分
	int db = getValueDB(getAvcLevel(), (int) vehicleSpeed);
	audioControlHal.setExtraGain(1, db);
#define CONTROL_SET_DB_VOLUME                       15

Return<DspResult> AudioControl::setExtraGain(DspChannel dc, int32_t gain) {
	dc = DspChannel::MAIN_CHANNEL;
	ALOGI("set output stream media db : %d", gain);
	tinymix_set_value(CONTROL_SET_DB_VOLUME, gain);
	return DspResult::OK;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值