Android系统关于音量相关的控制-初识

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());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值