您的位置:首页 > 移动开发 > Android开发

Android Audio 客制化问题(二)

2017-11-09 10:13 197 查看

情景模式中调节ring volume播放的音乐时长

android_o/packages/apps/Settings/src/com/android/settings/notification/SoundSettings.java


关键字: SAMPLE_CUTOFF

private static final int SAMPLE_CUTOFF = 2000;  // manually cap sample playback at 2 seconds
......
// === Volumes ===
final class VolumePreferenceCallback implements VolumeSeekBarPreference.Callback {
private SeekBarVolumizer mCurrent;
@Override
public void onSampleStarting(SeekBarVolumizer sbv) {
if (mCurrent != null && mCurrent != sbv) {
mCurrent.stopSample();
}
mCurrent = sbv;
if (mCurrent != null) {
mHandler.removeMessages(H.STOP_SAMPLE);
mHandler.sendEmptyMessageDelayed(H.STOP_SAMPLE, SAMPLE_CUTOFF);
}
}


mHandler.sendEmptyMessageDelayed会在SAMPLE_CUTOFF设置的时间后来停止播放sample。如果要调节播放的时间,就需要调节SAMPLE_CUTOFF的值。

DSD即Direct Stream Digital

即将原始数据给到外置Codec进行解码

如何取消安全音量警示框?

当插入有线耳机调节音量时,有一个音量保护,当超过某一个值时会弹出安全音量警示框,如何使之默认不显示?

alps\frameworks\base\core\res\res\config.xml 里的 config-safe_media_volume_enabled 设为 false

/android_o/frameworks/base/services/core/java/com/android/server/audio/AudioService.java

private void onConfigureSafeVolume(boolean force, String caller) {
synchronized (mSafeMediaVolumeState) {
int mcc = mContext.getResources().getConfiguration().mcc;
if ((mMcc != mcc) || ((mMcc == 0) && force)) {
mSafeMediaVolumeIndex = mContext.getResources().getInteger(
com.android.internal.R.integer.config_safe_media_volume_index) * 10;
boolean safeMediaVolumeEnabled =
SystemProperties.getBoolean("audio.safemedia.force", false)
|| mContext.getResources().getBoolean(
com.android.internal.R.bool.config_safe_media_volume_enabled);


播放任何采样率的音乐都让其输出44.1k

[Keyword] 采样率

修改: audio_policy.conf

outputs { primary { sampling_rates 44100|48000 改为: outputs { primary { sampling_rates 44100

需要关注理解的Audio相关的文件目录

Settings/src/com/.../AudioSettings.java
frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
android_o/packages/apps/Calendar/src/com/android/calendar/alerts/AlertService.java
android_o/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
android_o/frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java


插入耳机时也能将音乐调成最大

在插入耳机的情况下,为保护用户的听力, 以防受损,故在检测到音量调整到警界值时, 会出现上述警告框而这个警界值, 是可以调整的, 默认是 12, 音量值最大是 15所以当将音量调整到 12 以上时, 就会有上述警告框出现 , 如果不想使用此功能, 可以将frameworks\base\core\res\res\values\config.xml

中下面这行

<integer name="config_safe_media_volume_index">12</integer>


改为:

<integer name="config_safe_media_volume_index">15</integer>


如果想调低警界值, 也是改上述配置, 将其值调小.

静音模式下来电能震动

希望情景模式为静音模式时,来电可以震动

首先修改Silent这个模式下,震动的默认值,即在AudioProfileManager.java 的getDefaultState()中将DEFAULT_VIBRATION_SILENT设为true; 然后在AudioService.java的shouldVibrate()中 如下case AudioManager.VIBRATE_SETTING_ON的地方改成true:

public boolean shouldVibrate(int vibrateType) {
if (!mHasVibrator) return false;
switch (getVibrateSetting(vibrateType)) {
case AudioManager.VIBRATE_SETTING_ON:
//  return getRingerMode() != AudioManager.RINGER_MODE_SILENT;
return true; //Modify this line
case AudioManager.VIBRATE_SETTING_ONLY_SILENT:
return getRingerMode() == AudioManager.RINGER_MODE_VIBRATE;
case AudioManager.VIBRATE_SETTING_OFF:
// return false, even for incoming calls
return false;
default:
return false;
}
}


播放开关机铃声的代码流程

播放开关机铃声的代码在\alps\frameworks\base\cmds\bootanimation文件夹下面。
bootanimation是一个可执行程序,在开机时init.rc会去执行该程序。该程序的main函数在Bootanimation_main.cpp中,在main()函数中会new一个BootAnimation()类的实例,并且传递sePlay的值,sePlay可以决定是否播放开关机铃声。然后在BootAnimation::threadLoop()方法中,只要以下路径有以下名字音频文件存在并且前面的sePlay为true,就会去new一个mediaplayer,然后播放音频
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: