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

福州网站seo优化公司中国建设人才平台网站

福州网站seo优化公司,中国建设人才平台网站,哈尔滨建设网证照查询,照片制作动态图片软件前言#xff1a; 在 Android 音频系统中#xff0c;AudioMixer 是音频框架中一个关键的组件#xff0c;用于处理多路音频流的混音操作。它主要存在于音频回放路径中#xff0c;是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候#xff0c;提到了一个函数pr…前言 在 Android 音频系统中AudioMixer 是音频框架中一个关键的组件用于处理多路音频流的混音操作。它主要存在于音频回放路径中是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候提到了一个函数prepareTracks_l在这个函数的最后就调用了 mAudioMixer-create、mAudioMixer-setParameter去设置参数channel、format、volume等等。 AudioMixer继承自 AudioMixerBase当我们去看AudioMixer的构造函数的时候发现并没有做任何操作 那他的初始化代码在哪里呢 走进AudioMixer 我们看prepareTracks_l内关于mAudioMixer的调用流程就可以发现他首先调用了create函数然而Audiomixer内部却没有实现create接口我们追溯到它的父类发现在AudioMixerBase对象种定义了create接口并且实现了。 我们粗略的看下create里主要做了什么,代码多我做了删减。 status_t AudioMixerBase::create(int name, audio_channel_mask_t channelMask, audio_format_t format, int sessionId) {LOG_ALWAYS_FATAL_IF(exists(name), name %d already exists, name);if (!isValidChannelMask(channelMask)) {ALOGE(%s invalid channelMask: %#x, __func__, channelMask);return BAD_VALUE;}if (!isValidFormat(format)) {ALOGE(%s invalid format: %#x, __func__, format);return BAD_VALUE;}auto t preCreateTrack();{t-needs 0;t-volume[0] 0;...t-channelCount audio_channel_count_from_out_mask(channelMask);t-enabled false;t-channelMask channelMask;t-sessionId sessionId;t-hook NULL;...// setBufferProvider(name, AudioBufferProvider *) is required before enable(name)t-sampleRate mSampleRate;t-mMixerFormat AUDIO_FORMAT_PCM_16_BIT;t-mFormat format;t-mMixerChannelCount audio_channel_count_from_out_mask(t-mMixerChannelMask);t-mInputFrameSize audio_bytes_per_frame(t-channelCount, t-mFormat);status_t status postCreateTrack(t.get());if (status ! OK) return status;mTracks[name] t;return OK;} }可以看到除了一开始做了channel和format的判断后面基本上就是对track的初始化像volume、channel、format、sampleRate还有Hook的初始化。 初始化完成后就开始调用AudioMixer内部的接口了我们依次往下看发现还有getUnreleasedFrames、setParameter、setBufferProvider、process等。 我们先看下setParameter,当属性变化的时候就会调用到这里。 void AudioMixer::setParameter(int name, int target, int param, void *value) {LOG_ALWAYS_FATAL_IF(!exists(name), invalid name: %d, name);const std::shared_ptrTrack track getTrack(name);int valueInt static_castint(reinterpret_castuintptr_t(value));int32_t *valueBuf reinterpret_castint32_t*(value);switch (target) {case TRACK:switch (param) {case CHANNEL_MASK: {const audio_channel_mask_t trackChannelMask static_castaudio_channel_mask_t(valueInt);if (setChannelMasks(name, trackChannelMask,static_castaudio_channel_mask_t(track-mMixerChannelMask | track-mMixerHapticChannelMask))) {ALOGV(setParameter(TRACK, CHANNEL_MASK, %x), trackChannelMask);invalidate();}} break;case MAIN_BUFFER:if (track-mainBuffer ! valueBuf) {track-mainBuffer valueBuf;ALOGV(setParameter(TRACK, MAIN_BUFFER, %p), valueBuf);if (track-mKeepContractedChannels) {track-prepareForAdjustChannels(mFrameCount);}invalidate();}break;case AUX_BUFFER:AudioMixerBase::setParameter(name, target, param, value);break;case FORMAT: {audio_format_t format static_castaudio_format_t(valueInt);if (track-mFormat ! format) {ALOG_ASSERT(audio_is_linear_pcm(format), Invalid format %#x, format);track-mFormat format;ALOGV(setParameter(TRACK, FORMAT, %#x), format);track-prepareForReformat();invalidate();}} break;case MIXER_FORMAT: {audio_format_t format static_castaudio_format_t(valueInt);if (track-mMixerFormat ! format) {track-mMixerFormat format;ALOGV(setParameter(TRACK, MIXER_FORMAT, %#x), format);if (track-mKeepContractedChannels) {track-prepareForAdjustChannels(mFrameCount);}}} break;case MIXER_CHANNEL_MASK: {const audio_channel_mask_t mixerChannelMask static_castaudio_channel_mask_t(valueInt);if (setChannelMasks(name, static_castaudio_channel_mask_t(track-channelMask | track-mHapticChannelMask),mixerChannelMask)) {ALOGV(setParameter(TRACK, MIXER_CHANNEL_MASK, %#x), mixerChannelMask);invalidate();}} break; ...default:LOG_ALWAYS_FATAL(setParameter track: bad param %d, param);}break;case RESAMPLE:case RAMP_VOLUME:case VOLUME:AudioMixerBase::setParameter(name, target, param, value);break;case TIMESTRETCH:switch (param) {case PLAYBACK_RATE: {const AudioPlaybackRate *playbackRate reinterpret_castAudioPlaybackRate*(value); ...} break;default:LOG_ALWAYS_FATAL(setParameter timestretch: bad param %d, param);}break;default:LOG_ALWAYS_FATAL(setParameter: bad target %d, target);} }函数的主要结构就是一个switch,首先通过trackId找到对应的track对象然后去设置对应track的parameter参数例如 CHANNEL_MASK、FORMAT、MAIN_BUFFER等。 这只是设置参数那混音在哪里呢我们继续往下看process void process() {preProcess();(this-*mHook)();postProcess(); }这里主要就是调用mHookmHook是一个函数指针他会根据不同的场景分别调用不同的函数。 process__nop初始值process__genericResampling对两路以上的track进行重采样操作process__genericNoResampling对两路以上的track不进行重采样操作process__validate这个函数就是根据当前的不同情况将mHook指向不同的函数process__oneTrack16BitsStereoNoResampling只有一路track16bit立体声的时候不进行重采样 process_hook_t mHook AudioMixerBase::process__nop;mHook初始化的时候指向的是process__nop void invalidate() {mHook AudioMixerBase::process__validate;}process__validate是在invalidate函数里幅值给了mHook 指针。 void AudioMixerBase::process__validate() {// select the processing hooksmHook AudioMixerBase::process__nop;if (mEnabled.size() 0) {if (resampling) {if (mOutputTemp.get() nullptr) {mOutputTemp.reset(new int32_t[MAX_NUM_CHANNELS * mFrameCount]);}if (mResampleTemp.get() nullptr) {mResampleTemp.reset(new int32_t[MAX_NUM_CHANNELS * mFrameCount]);}mHook AudioMixerBase::process__genericResampling;} else {// we keep temp arrays around.mHook AudioMixerBase::process__genericNoResampling;if (all16BitsStereoNoResample !volumeRamp) {if (mEnabled.size() 1) {const std::shared_ptrTrackBase t mTracks[mEnabled[0]];if ((t-needs NEEDS_MUTE) 0) {// The check prevents a muted track from acquiring a process hook.//// This is dangerous if the track is MONO as that requires// special case handling due to implicit channel duplication.// Stereo or Multichannel should actually be fine here.mHook getProcessHook(PROCESSTYPE_NORESAMPLEONETRACK,t-mMixerChannelCount, t-mMixerInFormat, t-mMixerFormat,t-useStereoVolume());}}}}} }这个函数首先使用while循环来遍历每一个track然后通过 NEEDS_RESAMPLE、NEEDS_AUX、NEEDS_CHANNEL_1、NEEDS_MUTE等判断最终得到resampling、all16BitsStereoNoResample、volumeRamp的值然后基于这几个值来决定调用mHook来指向哪一个函数。 至于音频流数据是如何混到一起的我们后面章节再来进一步分析。
http://www.hkea.cn/news/14358983/

相关文章:

  • 合肥做网站 卫来网络wordpress 仿采集
  • wordpress网站速度优化圣耀做单网站
  • 网站功能需求分析文档关键词点击工具
  • 冷饮网站开发背景意义搭建网站是什么专业
  • 邯郸做移动网站多少钱wordpress如何本地安装插件
  • 深圳手机建网站企业做网站的方案
  • 江苏建设造价信息网站平凉网站设计
  • 网站建设-猴王网络给个网站做导航违法吗
  • 网站建设评价指标室内设计学校在哪里
  • asp 网站 源码wordpress 文章加评论
  • 赣州网站建设如何wordpress 评论列表
  • 企业网站导航下拉菜单怎么做网站广告看不到
  • 阿里巴巴1688网站做店铺想开个网站建设的公司
  • 现在从事网站开发如何wordpress 图库插件
  • 怎么做自己的企业网站临沂网站哪家好
  • 上海模板建站哪家好做网站要搭建本地服务器么
  • site 危险网站建设银行短信带网站
  • 怎么做网站流量统计分析网站建设过程中需要注意的通用原则
  • asp网站打开贵阳网站建设报价
  • 英雄联盟网站模版网站制作没有原创图片怎么办
  • 企业门户网站建设方案及报价wordpress页面里放j特效
  • 个人如何建立公司网站农产品信息网站的建设
  • 邢台网站建设03191688夺目视频制作网站
  • 网站引流推广网站的功能规范
  • 建设部监理工程师考试网站摄影网站制作步骤html
  • 企业北京响应式网站制作安徽网新科技
  • 常熟做网站的公司自己做网站怎么上传到网上
  • 建设部执业资格网站中国商标注册申请官网
  • 外贸网站的作用做网站全部乱码怎么办
  • 蕴川路上海网站建设企业网站属于广告吗