1. 音量随速补偿方案定义
Speed-Sensitive音量调节机能是指随着车速的改变而自动进行音量补正的机能(不影响HFT)
速度的监控是通过Can 信息进行传递的,以1s为一个周期。
支持用户手动设置车速补偿的Off/Low/Mid/Hi状态,默认为Mid。
1.1 注意事项
- 当音量为0或者静音状态时不进行车速补偿。
- 当音量最大值时不进行车速补偿。
- 补偿后的音量不会超过音量最大值。
- Poweroff→on/ACCoff→on时,先设定为正常音量值,再根据车速重新调整。
- 如果当前设定响度On,则在当前VOL STEP上增加/减小dB的同时,响度也要按照当前dB值进行相应调整。
- 如果调整了Bass/Mid/Tre在当前VOL STEP上增加/减小dB的同时,Bass/Mid/Tre也应按照当前dB值进行相应调整。
1.2 速度(km/h)与调节值对应表:
等级 | 状态\速度(km/h) | 1~9 | 10~14 | 15~19 | 20~24 | 25~29 | 30~34 | 35~39 | 40~44 | 45~49 |
低 | 加速 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
减速 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
中 | 加速 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
减速 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 |
高 | 加速 | 0 | 1 | 2 | 2 | 3 | 4 | 4 | 5 | 5 |
减速 | 1 | 2 | 3 | 3 | 4 | 4 | 5 | 5 | 6 |
等级 | 状态\速度(km/h) | 50~54 | 55~59 | 60~64 | 65~69 | 70~74 | 75~79 | 80~84 | 85~89 | 90~94 | 95~99 |
低 | 加速 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 |
减速 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 |
中 | 加速 | 3 | 3 | 3 | 4 | 4 | 4 | 5 | 5 | 5 | 6 |
减速 | 3 | 3 | 4 | 4 | 4 | 5 | 5 | 5 | 6 | 6 |
高 | 加速 | 6 | 6 | 7 | 7 | 8 | 8 | 9 | 9 | 10 | 10 |
减速 | 6 | 7 | 7 | 8 | 8 | 9 | 9 | 10 | 10 | 11 |
等级 | 状态\速度(km/h) | 100~104 | 105~109 | 110~114 | 115~119 | 120~124 | 125~129 | 130~134 | 135~139 | 140~144 | 145~149 |
低 | 加速 | 3 | 3 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | 4 |
减速 | 3 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | 4 | 4 |
中 | 加速 | 6 | 6 | 6 | 7 | 7 | 7 | 7 | 8 | 8 | 8 |
减速 | 6 | 6 | 7 | 7 | 7 | 7 | 8 | 8 | 8 | 8 |
高 | 加速 | 11 | 11 | 12 | 12 | 13 | 13 | 14 | 14 | 15 | 15 |
减速 | 11 | 12 | 12 | 13 | 13 | 14 | 14 | 15 | 15 | 16 |
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;
}