下面来看看音量设置相关的接口。


*****************************************源码*************************************************
    //Test case 1: setStereoVolume() with max volume returns SUCCESS    @LargeTest    public void testSetStereoVolumeMax() throws Exception {        // constants for test        final String TEST_NAME = "testSetStereoVolumeMax";        final int TEST_SR = 22050;        final int TEST_CONF = AudioFormat.CHANNEL_OUT_STEREO;        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT;        final int TEST_MODE = AudioTrack.MODE_STREAM;        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;                //-------- initialization --------------        int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);        AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,                 minBuffSize, TEST_MODE);        byte data[] = new byte[minBuffSize/2];        //--------    test        --------------        track.write(data, 0, data.length);        track.write(data, 0, data.length);        track.play();        float maxVol = AudioTrack.getMaxVolume();        assertTrue(TEST_NAME, track.setStereoVolume(maxVol, maxVol) == AudioTrack.SUCCESS);        //-------- tear down      --------------        track.release();    }

**********************************************************************************************
源码路径:
frameworks\base\media\tests\mediaframeworktest\src\com\android\mediaframeworktest\functional\MediaAudioTrackTest.java


#######################说明################################
    //Test case 1: setStereoVolume() with max volume returns SUCCESS    @LargeTest    public void testSetStereoVolumeMax() throws Exception {        // constants for test        final String TEST_NAME = "testSetStereoVolumeMax";        final int TEST_SR = 22050;        final int TEST_CONF = AudioFormat.CHANNEL_OUT_STEREO;        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT;        final int TEST_MODE = AudioTrack.MODE_STREAM;        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;                //-------- initialization --------------        int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);        AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,                 minBuffSize, TEST_MODE);        byte data[] = new byte[minBuffSize/2];        //--------    test        --------------        track.write(data, 0, data.length);        track.write(data, 0, data.length);        track.play();        float maxVol = AudioTrack.getMaxVolume();// ++++++++++++++++++++++++++++++getMaxVolume++++++++++++++++++++++++++++++++++    /**     * Returns the maximum valid volume value. Volume values set above this one will     * be clamped at this value.     * @return the maximum volume expressed as a linear attenuation.     */    static public float getMaxVolume() {        return AudioTrack.VOLUME_MAX;    }// ------------------------------getMaxVolume----------------------------------        assertTrue(TEST_NAME, track.setStereoVolume(maxVol, maxVol) == AudioTrack.SUCCESS);// ++++++++++++++++++++++++++++++setStereoVolume++++++++++++++++++++++++++++++++++     /**     * Sets the specified left/right output volume values on the AudioTrack. Values are clamped     * to the ({@link #getMinVolume()}, {@link #getMaxVolume()}) interval if outside this range.     * @param leftVolume output attenuation for the left channel. A value of 0.0f is silence,     *      a value of 1.0f is no attenuation.     * @param rightVolume output attenuation for the right channel     * @return error code or success, see {@link #SUCCESS},     *    {@link #ERROR_INVALID_OPERATION}     */    public int setStereoVolume(float leftVolume, float rightVolume) {        if (mState != STATE_INITIALIZED) {            return ERROR_INVALID_OPERATION;        }// 确保音量在[min, max]范围之内。        // clamp the volumes        if (leftVolume < getMinVolume()) {            leftVolume = getMinVolume();        }        if (leftVolume > getMaxVolume()) {            leftVolume = getMaxVolume();        }        if (rightVolume < getMinVolume()) {            rightVolume = getMinVolume();        }        if (rightVolume > getMaxVolume()) {            rightVolume = getMaxVolume();        }        native_setVolume(leftVolume, rightVolume);// ++++++++++++++++++++++++++++android_media_AudioTrack_set_volume++++++++++++++++++++++++++++++++++++static voidandroid_media_AudioTrack_set_volume(JNIEnv *env, jobject thiz, jfloat leftVol, jfloat rightVol ){    AudioTrack *lpTrack = (AudioTrack *)env->GetIntField(        thiz, javaAudioTrackFields.nativeTrackInJavaObj);    if (lpTrack == NULL ) {        jniThrowException(env, "java/lang/IllegalStateException",            "Unable to retrieve AudioTrack pointer for setVolume()");        return;    }    lpTrack->setVolume(leftVol, rightVol);// +++++++++++++++++++++++++++++AudioTrack::setVolume++++++++++++++++++++++++++++++++++status_t AudioTrack::setVolume(float left, float right){// 范围检查    if (left > 1.0f || right > 1.0f) {        return BAD_VALUE;    }// 将音量保存到成员变量中// 函数AudioTrack::set中会将这两个音量初始化为1.0f// 函数AudioTrack::getVolume会取出这两个音量值// 函数AudioTrack::createTrack中会将这两个值赋值给mCblk->volumeLR    mVolume[LEFT] = left;    mVolume[RIGHT] = right;    // write must be atomic// 从audio_track_cblk_t的定义可知,volume的信息其实是一个union,这儿是作为volumeLR存入的,// 用的时候其实是作为uint16_t    volume[2]数组来使用的。// +++++++++++++++++++++++++++++union+++++++++++++++++++++++++++++++++++    volatile    union {                    uint16_t    volume[2];                    uint32_t    volumeLR;                };// -----------------------------union-----------------------------------// 类AudioMixer中,将数据从audio_track_cblk_t copy 到main buffer时,会根据音量对数据进行处理。// 如以前我们看过的process__OneTrack16BitsStereoNoResampling函数。    mCblk->volumeLR = (uint32_t(uint16_t(right * 0x1000)) << 16) | uint16_t(left * 0x1000);    return NO_ERROR;}// -----------------------------AudioTrack::setVolume----------------------------------}// ----------------------------android_media_AudioTrack_set_volume------------------------------------        return SUCCESS;    }// ------------------------------setStereoVolume----------------------------------        //-------- tear down      --------------        track.release();    }

###########################################################


&&&&&&&&&&&&&&&&&&&&&&&总结&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
函数setStereoVolume最终设置的是软音量。
类AudioMixer中将数据从audio_track_cblk_t copy 到main buffer时,会使用音量对数据进行处理。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

更多相关文章

  1. android 数据库初体验
  2. android 获取未安装apk的icon、name等信息
  3. Android(安卓)之 GrideView网格视图
  4. android 参数 加密,解密 参数提交,数据返回
  5. Android(安卓)Webview 获取网页form 提交的数据
  6. Android中向SD卡读写数据,读SD卡和手机内存
  7. mybatisplus的坑 insert标签insert into select无参数问题的解决
  8. 箭头函数的基础使用
  9. python起点网月票榜字体反爬案例

随机推荐

  1. Jollen 的 Android(安卓)教學,#17: 樣式
  2. Android(安卓)SDK 2.3与Eclipse最新版开
  3. 单板机上Android通过Modbus RTU操控外设
  4. Android权限安全(5)组件的android:export
  5. [转]Jollen 的 Android(安卓)教學,#4: 使
  6. android-gradle-plugin3.0.1源码分析
  7. Android(安卓)中Ninja 简介
  8. android中SharedPreferences用法详解
  9. android中scaleType详解
  10. Android深入浅出之Zygote