当前位置: 首页 > wzjs >正文

旅游网站首页图片免费的个人服务器

旅游网站首页图片,免费的个人服务器,策划推广,网站制作软件培训安卓音频数据的最终音量由三部分组成,分别是master volume(全局音量,对整个系统所有的音频数据生效),stream volume(流音量,只针对特定类型的音频数据生效)和track volume(track音量,只针对某个audiotrack的…

安卓音频数据的最终音量由三部分组成,分别是master volume(全局音量,对整个系统所有的音频数据生效),stream volume(流音量,只针对特定类型的音频数据生效)和track volume(track音量,只针对某个audiotrack的数据生效)。

音频数据音量大小公式:
final_volume= master_volume * stream_volume * track_volume;playbackthread负责这个具体值的计算并设置到audiomixer中生效。
其中master_volume,stream_volume和track_volume都是百分比,1表示音量调到最大;

音量最大分贝是0db,表示没有衰减,也就是音源音量;

stream volume

VolumeStreamState(audioservice用来管理系统音量引入的概念)

android系统定义了11种Stream(从0到10),每个stream都用VolumeStreamState来封装:

VolumeStreamState[] mStreamStates = new int[] {0,1,2,3,4,5,6,7,8,9,10};//0,1,2...这些数字表示stream类型,分别对应default,voice call,ring等;
VolumeStreamState{//用来管理一个流类型所有的音量信息/*stream类型*/int mStreamType;/*volume最小索引,只有0和1*/int mIndexMin;/*volume最大索引,7,15等*/int mIndexMax;//boolean mIsMuted;/*VolumeStreamState的名字,用来对系统setting进行查询和持久化*/String mVolumeIndexSettingName;int mObservedDevices;/*map中的key为device,value为音量值bvolume*/SparseIntArray mIndexMap = new SparseIntArray(8);/*当音量发生改变时,发送广播AudioManager.VOLUME_CHANGED_ACTION*/Intent mVolumeChanged;Intent mStreamDevicesChanged;
}

alias流别名

android系统定义了11种Stream(从0到10),如果用一个数组来表示,它们与mStreamStates数组中的元素一一对应:

int[] STREAM_VOLUME_DEFAULT = new int[] {0,1,2,3,4,5,6,7,8,9,10};//系统默认

android定义了这么多的streamtype,但目前android设备的并不支持这么多的stream,比如点击手机音量键调节某一个Stream音量时,android系统只会出现5个滑动条,也就是手机设备只有5类stream,又比如机顶盒只支持music stream这1类,所以对于不同的平台,需要将这些stream进行分组,把具有相同属性stream分为一类,在Android源码中称之为"别名", 即alias;

下面就是android源码11种stream的分组结果:

int[] STREAM_VOLUME_ALIAS_VOICE      = new int[] {0,2,2,3,4,5,6,2,2,3,3};//手机
int[] STREAM_VOLUME_ALIAS_TELEVISION = new int[] {3,3,3,3,3,3,3,3,3,3,3};//机顶盒
int[] STREAM_VOLUME_ALIAS_DEFAULT    = new int[] {0,2,2,3,4,2,6,2,2,3,3};//默认

以手机为例,手机只支持2,3,4,5,6(0暂时忽略)这5种stream,由于手机的3,9,10归类到了3,也就是别名alias为3,所以当手机调节3,9,10这3种stream时,实际上调节的是3(music stream)。
系统提供的调节stream volume的api有2个,分别是adjustVolume()和 setStreamVolume(),我们看adjustVolume():

adjustVolume()
//java层:
//AudioService.java
adjustSuggestedStreamVolume()//确定streamTypefinal int streamType;if (mUserSelectedVolumeControlStream) {streamType = mVolumeControlStream;}else{......}adjustStreamVolume()int streamTypeAlias = mStreamVolumeAlias[streamType];//将streamType转化为对应平台的streamTypeAliasVolumeStreamState streamState = mStreamStates[streamTypeAlias];final int device = getDeviceForStream(streamTypeAlias);//得到当前的deviceint aliasIndex = streamState.getIndex(device);//得到该device在当前stream上的音量int step;step = rescaleIndex(10, streamType, streamTypeAlias);//音量步进转化/*安全音量相关*/......if(streamState.adjustIndex()){//调节音量,设置新的index值并发送音量改变的广播sendMsg(...,MSG_SET_DEVICE_VOLUME,...);//设置index到底层,并且将index保存到系统settingssetDeviceVolume();streamState.applyDeviceVolume_syncVSS(device);//设置index到底层,一直想不明白VSS是个啥缩写,今天突然明白了是VolumeStreamState的首字母缩写!!!!!!!!!!!!!!!!!!!!!!!1int index;index = ......;//确定index的最终值AudioSystem.setStreamVolumeIndex(mStreamType, index, device);//将index设置到底层for(......){//处理mStreamVolumeAlias相关mStreamStates[streamType].applyDeviceVolume_syncVSS(streamDevice);}sendMsg(...,MSG_SET_DEVICE_VOLUME,...);//将index保存到系统settingspersistVolume();System.putIntForUser(......);//将index保存到系统settings}sendVolumeUpdate(streamType, oldIndex, index, flags);//刷新音量条(UI)//看看streamState.adjustIndex()streamState.adjustIndex()setIndex()//设置新的index值并发送音量改变的广播oldIndex = getIndex(device);//volume改变之前的indexmIndexMap.put(device, index);//保存volume改变之后的indexchanged = oldIndex != index;//如果volume改变前后的index不相同for(...){//处理alias相关VolumeStreamState aliasStreamState = mStreamStates[streamType];aliasStreamState.setIndex(scaledIndex, device, caller);}if(changed){//当音量发生改变时,发送广播AudioManager.VOLUME_CHANGED_ACTIONsendBroadcastToAll(mVolumeChanged);}

//native层

//AudioSystem.java
AudioSystem.setStreamVolumeIndex()
//AudioSystem.cpp
AudioSystem::setStreamVolumeIndex()
//AudioPolicyManager.cpp
AudioPolicyManager::setStreamVolumeIndex()
for (size_t i = 0; i < mOutputs.size(); i++) {
checkAndSetVolume();//设置每个输出设备的音量
float volumeDb = computeVolume(stream, index, device);//计算音量
volumeDB = mVolumeCurves->volIndexToDb(stream, Volume::getDeviceCategory(device), index);
//VolumeCurve.cpp
VolumeCurve::volIndexToDb()//根据音量曲线计算出音量
outputDesc->setVolume(volumeDb, stream, device, delayMs, force);
//AudioOutputDescriptor.cpp
SwAudioOutputDescriptor::setVolume()
bool changed = AudioOutputDescriptor::setVolume(volume, stream, device, delayMs, force);
AudioOutputDescriptor::setVolume()
mCurVolume[stream] = volume;
mClientInterface->setStreamVolume(stream, volume, mIoHandle, delayMs);
//AudioPolicyService.cpp
AudioPolicyService::setStreamVolume()
mAudioCommandThread->volumeCommand()//AudioPolicyService::AudioCommandThread::volumeCommand()
sp command = new AudioCommand();
command->mCommand = SET_VOLUME;
sendCommand(command, delayMs);//AudioPolicyService::AudioCommandThread::sendCommand()
insertCommand_l(command, delayMs);//插入命令,执行AudioPolicyService::AudioCommandThread::threadLoop()
AudioSystem::setStreamVolume();//AudioSystem::setStreamVolume()
//AudioSystem.cpp
af->setStreamVolume(stream, value, output);//AudioFlinger::setStreamVolume()
//AudioFlinger.cpp
VolumeInterface *volumeInterface = getVolumeInterface_l(output);
volumeInterface->setStreamVolume(stream, value);//AudioFlinger::PlaybackThread::setStreamVolume()
//Threads.cpp
mStreamTypes[stream].volume = value;//保存volume值
broadcast_l();//唤醒PlaybackThread线程
AudioFlinger::PlaybackThread::threadLoop()
mMixerStatus = prepareTracks_l(&tracksToRemove);//不同类型的Thread对prepareTracks_l有不同的实现
AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l()//计算每个track数据最终的音量

}

音量曲线:我们从上面的代码中可以看到在audioservice中音量都是整形的index。而用于音量算法处理的是DB。音量曲线的作用就是将index转化为对应的DB 。这个音量曲线是可以通过配置文件修改。配置文件会定义一些点,audiopolicymanager会根据配置文件的点进行拟合,获得一条从最小index到最大index隐射到-∞DB到0DB的曲线。

auditorack音量设置:

//AudioTrack.cpp
AudioTrack::setVolume(float left, float right)/*传入的音量值保存在mVolume数组中*/mVolume[AUDIO_INTERLEAVE_LEFT] = left;mVolume[AUDIO_INTERLEAVE_RIGHT] = right;/*setVolumeLR会把做声道与右声道的值,组装成一个数*/mProxy->setVolumeLR(gain_minifloat_pack(gain_from_float(left), gain_from_float(right)));//AudioTrackShared.h/*mCblk表示共享内存的头部,也就是说这个音量值会保存到共享内存的头部*/mCblk->mVolumeLR = volumeLR;播放声音时需要AudioMixer进行混音,继续分析AudioFlinger::MixerThread::prepareTracks_l():
//Threads.cpp
AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l()/*取出硬件声音*/float masterVolume = mMasterVolume;bool masterMute = mMasterMute;/*把所有活跃的Tracks取出来*/for (size_t i=0 ; i<count ; i++) {......//这就是stream volumefloat typeVolume = mStreamTypes[track->streamType()].volume;float v = masterVolume * typeVolume;/*从proxy中取出取出音量,其就是通过头部保存的音量,其含有左右声道的音量*/gain_minifloat_packed_t vlr = proxy->getVolumeLR();/*提取左右声道的值*/vlf = float_from_gain(gain_minifloat_unpack_left(vlr));vrf = float_from_gain(gain_minifloat_unpack_right(vlr));/*都与之前的V进行相乘*/vlf *= v * vh;vrf *= v * vh;/*把vlf与vrf传入给AudioMixer*/mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, &vlf);mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, &vrf);}
http://www.dtcms.com/wzjs/570130.html

相关文章:

  • 专业企业网站建设公司建筑模板种类
  • 网站模板大小wordpress 元素用处
  • 泉州手机网站建设公司昆山建筑行业网站
  • 网站的不足之处分析网站外链分析工具
  • 做代理的项目在哪个网站微信指数是搜索量吗
  • 满城建设局官方网站wordpress微信插件
  • 网站优化及推广公司网页设计模板网站
  • 马鞍山市建设银行网站如何做网站的页面
  • 怎么看深圳网站页面设计WordPress 主从同步
  • 美丽乡村 村级网站建设梅州企业网站建设公司
  • 做推广网站排名商务网站建设与维护 试题
  • 入驻天猫商城的条件和费用如何将网站的关键词排名优化
  • 什么网站做招聘收录好python做公司网站
  • 建设银行哈尔滨分行网站广东手机网站建设公司
  • 目前做美术的网站以及app深圳 电子商务网站开发
  • 如何把地图放到网站上外贸网站建设工作计划
  • 黄山北京网站建设珠海建设银行官方网站
  • 专门网站建设餐饮品牌设计包括哪些
  • 网站搭建前景直播网站创做
  • 中信云 做网站网站推广方法100种
  • 昆明网站建设建站模板东莞常平邮编是多少
  • 风中有朵雨做的云电影网站适合学生做网页练习的网站
  • 注释网站开发wordpress分享按钮
  • 国内创意网站界面设计做网站js是什么
  • 烟台优化网站公司哪家好做网站那个公司好
  • 个人网站制作步骤口碑做团购网站
  • 厦门网站建设外包公司信息平台怎么赚钱
  • WordPress 云锁seo线上培训多少钱
  • 如何写网站建设报告泰安百度公司代理商
  • 优质专业建设申报网站语种网站建设