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


*****************************************源码*************************************************
//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 void
android_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 Camera模块分析
  2. Android控件开发之四----ListView(3)
  3. Android(安卓)Jetpack组件学习 Room
  4. android Json数据构建于解析
  5. Android读取服务端TXT(JSON格式数据)返回汉字乱码的问题
  6. Android(安卓)SQLite数据库解析并使用两种方法实现增删改查
  7. mybatisplus的坑 insert标签insert into select无参数问题的解决
  8. 箭头函数的基础使用
  9. python起点网月票榜字体反爬案例

随机推荐

  1. Process 'command 'C:\Users\Win\AppD
  2. Android(安卓)JSON原生解析(JSONObject)
  3. Android中Canvas绘图之PorterDuffXfermod
  4. Google称Android新漏洞对用户影响不大
  5. 将写好的软件安装到Android手机
  6. Android中单击空白区域隐藏键盘
  7. iOS,Android,.NET通用AES加密算法
  8. WebView加载图片闪与Android的硬件加速
  9. Android(安卓)操作系统的内存回收机制
  10. android系统构架