0.背景
人体对声音的识别确实存在不敏感,导致现在Android系统应用层的调节停留在音量大小为主,查看系统的工程模式发现存在很多更细节的参数,如果作为一款专业的调节参数应用是不是会很好呢。有些领域的群体对音质和音效很敏感。随便看看的源码,没深入,只为脑海有个印象
1.拨号盘输入 ##3646633##
2.工程模式-代码追踪
1. String.xml
<string name="audio_volume_title">Volume</string>
2.AndroidMainfest.xml
<activity
android:name=".audio.AudioVolume"
android:label="@string/audio_volume_title"
android:screenOrientation="portrait" >
</activity>
3.AudioVolume.java
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
switch (position) {
case 0 : {
Intent intent = new Intent(this, AudioVolumeVoice.class);
startActivity(intent);
return;
}
case 1 : {
Intent intent = new Intent(this, AudioVolumeVoIP.class);
startActivity(intent);
return;
}
case 2 : {
Intent intent = new Intent(this, AudioVolumePlayback.class);
startActivity(intent);
return;
}
case 3 : {
Intent intent = new Intent(this, AudioVolumeRecord.class);
startActivity(intent);
return;
}
default:
break;
}
}
4.AudioVolumeVoice.java
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.audio_volume_item);
mAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
initComponents();
}
5.布局文件 audio_volume_item.xml
<Button
android:id="@+id/btn_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/audio_volume_set"/>
这里关注 btn_set 按钮
6.AudioVolumeVoice.java
mBtnSet = (Button) findViewById(R.id.btn_set);
@SuppressWarnings("deprecation")
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.equals(mBtnSet)) {
if (!FeatureSupport.isEngLoad()) {
String check = mAudioMgr.getParameters(CUST_XML_PARAM);
if ((check != null) && (RESULT_SUPPORT.equals(check))) {
Elog.d(TAG, "get CUST_XML_PARAM = 1");
} else {
Elog.d(TAG, "set CUST_XML_PARAM = 1");
mAudioMgr.setParameters(CUST_XML_SET_SUPPORT_PARAM);
AudioTuningJni.CustXmlEnableChanged(1);
}
}
mStrErrorInfo = new String();
setDlGain();
setUlGain();
setStfGain();
if (!AudioTuningJni.saveToWork(CATEGORY_SPEECHVOL)) {
mStrErrorInfo += getString(R.string.audio_volume_error_save_xml);
}
removeDialog(DIALOG_RESULT);
showDialog(DIALOG_RESULT);
}
}
private void setDlGain() {
.....
if (!AudioTuningJni.setParams(CATEGORY_SPEECHVOL, getParam2(), DL_GAIN, strValueDlGain)) {
mStrErrorInfo += getString(R.string.audio_volume_error_set_dl_gain);
}
....
}
private void setUlGain() {
...
if (!AudioTuningJni.setParams(CATEGORY_SPEECHVOL, getParam2(), UL_GAIN, strValue)) {
mStrErrorInfo += getString(R.string.audio_volume_error_set_ul_gain);
}
...
}
private void setStfGain() {
....
if (!AudioTuningJni.setParams(CATEGORY_SPEECHVOL, getParam2(), STF_GAIN, strValue)) {
mStrErrorInfo += getString(R.string.audio_volume_error_set_stf_gain);
}
.....
}
7.查看 Jni 调用 AudioTuningJni.java
/**
* Java JNI interface for Audio.
*
*/
public class AudioTuningJni {
static {
System.loadLibrary("em_audio_jni");
}
/**
* @param param1 category
* @param param2 configuration
* @param param3 tag for detail information
* @param param4 value to set
* @return true for success, false for fail
*/
public static native boolean setParams(String param1, String param2,
String param3, String param4);
8.com_mediatek_engineermode_audio.cpp
static jboolean audio_setParams(JNIEnv *env, jclass, jstring param1, jstring param2, jstring param3,
jstring param4) {
ALOGD("Enter setParams\n");
const char *param1Jni = env->GetStringUTFChars(param1, NULL);
const char *param2Jni = env->GetStringUTFChars(param2, NULL);
const char *param3Jni = env->GetStringUTFChars(param3, NULL);
const char *param4Jni = env->GetStringUTFChars(param4, NULL);
ALOGD("Param is %s, %s, %s, %s\n", param1Jni, param2Jni, param3Jni, param4Jni);
APP_STATUS result = appOpsGetInstance()->utilNativeSetParam(param1Jni, param2Jni, param3Jni, param4Jni);
if (result == APP_NO_ERROR) {
ALOGD("set success\n");
return JNI_TRUE;
} else {
ALOGD("set fail\n");
return JNI_FALSE;
}
}
3.设置中的音效改善
1.String.xml
<!-- Sound enhancement Settings start -->
<string name="sound_enhancement_title">音效改善</string>
<string name="music_plus_summary">针对耳机的音效改善</string>
<string name="audio_profile_bes_surround_title">BesSurround</string>
<string name="audio_profile_bes_surround_summary">音效环绕</string>
<string name="audio_profile_bes_surround_mode_movie">电影模式</string>
<string name="audio_profile_bes_surround_mode_music">音乐模式</string>
<string name="anc_switch_title">噪音消除</string>
<string name="audio_profile_bes_loudness_summary">喇叭音量助推器</string>
<!-- Sound enhancement Settings end -->
2.调用处 audioprofile_sound_enhancement.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:orderingFromXml="true"
android:persistent="false" >
<SwitchPreference
android:key="music_plus"
android:persistent="false"
android:summary="@string/music_plus_summary" 针对耳机的音效改善
android:title="@string/music_plus_title" />
<SwitchPreference
android:key="bes_loudness"
android:persistent="false"
android:summary="@string/audio_profile_bes_loudness_summary" 喇叭音量助推器
android:title="@string/audio_profile_bes_loudness_title" />
<Preference
android:key="bes_surround"
android:title="@string/audio_profile_bes_surround_title"
android:summary="@string/audio_profile_bes_surround_summary"音效环绕
android:persistent="false" />
<SwitchPreference
android:key="anc_switch"
android:persistent="false"
android:title="@string/anc_switch_title" />
</PreferenceScreen>
3.SoundEnhancement.java 调用
加载布局
addPreferencesFromResource(R.xml.audioprofile_sound_enhancement);
4.喇叭音量助推器 开关
private static final String KEY_BESLOUDNESS = "bes_loudness";
mBesLoudnessPref = (SwitchPreference) findPreference(KEY_BESLOUDNESS);
if (!FeatureOption.MTK_BESLOUDNESS_SUPPORT) {
Log.d("@M_" + TAG, "feature option is off, remove BesLoudness preference");
getPreferenceScreen().removePreference(mBesLoudnessPref);
}
private static final String SET_BESLOUDNESS_ENABLED = "SetBesLoudnessStatus=1";
private static final String SET_BESLOUDNESS_DISABLED = "SetBesLoudnessStatus=0";
if (FeatureOption.MTK_BESLOUDNESS_SUPPORT) {
if (mBesLoudnessPref == preference) {
boolean enabled = ((SwitchPreference) preference).isChecked();
String cmdStr = enabled ? SET_BESLOUDNESS_ENABLED : SET_BESLOUDNESS_DISABLED;
Log.d("@M_" + TAG, " set command about besloudness: " + cmdStr);
mAudioManager.setParameters(cmdStr);
}
}
4.API的常见使用
设置音量大小,是否开启音效加强器
private Context mContext;
private AudioManager mAudioManager;
public AudioUtil(Context mContext) {
this.mContext = mContext;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
}
public boolean isBesLoudnessEnable() {
if (MTK_BESLOUDNESS_SUPPORT) {
return GET_BESLOUDNESS_STATUS_ENABLED.equals(mAudioManager.getParameters(GET_BESLOUDNESS_STATUS));
}
return false;
}
public void startAudioPowerSave() {
if (MTK_BESLOUDNESS_SUPPORT) {
mAudioManager.setParameters(SET_BESLOUDNESS_DISABLED);
}
}
public void stopAudioPowerSave() {
if (MTK_BESLOUDNESS_SUPPORT) {
mAudioManager.setParameters(SET_BESLOUDNESS_ENABLED);
}
}
public int getMaxMediaVolume() {
return mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
}
public int getMediaVolume() {
return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
}
public void setMediaVolume(int volume) {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_PLAY_SOUND);
}
public void plus(View view) {
AudioManager am =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
Log.d("suhuazhi", "getMediaVolume = " + getMediaVolume());
}
public void sub(View view) {
AudioManager am =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER , 0);
Log.d("suhuazhi", "getMediaVolume = " + getMediaVolume());
}