- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android音频数据传输
MediaPlayer那边就不看了,从AudioTrack开始研究。1、AudioTrack::write函数调用函数obtainBuffer获取到一块buffer,然后把传入的数据copy到获取的buffer中。2、AudioTrack::obtainBuffer函数该函数的主要功能就是对传入的audioBuffer进行赋值。看看audioBuffer的类型:class Buffer { public: enum { MUTE ? ?= 0}; uint32_t ? ?flags; int ? ? ? ? channelCount; int ? ? ? ? format; size_t ? ? ?frameCount; size_t ? ? ?size; union { void* ? ? ? raw; short* ? ? ?i16; int8_t* ? ? i8; }; };其中存放数据的是下面这个东东:union { void* ? ? ? raw; short* ? ? ?i16; int8_t* ? ? i8; };对这块东东赋值的代码如下:audioBuffer-raw = (int8_t *)cblk-buffer(u);先看其中cblk的来历:audio_track_cblk_t* cblk = mCblk;mCblk的赋值在函数AudioTrack::createTrack中:mCblk = static_castaudio_track_cblk_t*(cblk-pointer());cblk的由来:spIMemory cblk = track-getCblk();track的由来: spIAudioTrack track = audioFlinger-createTrack(getpid(), streamType, sampleRate, format, channelCount, frameCount, ((uint16_t)flags) 16, sharedBuffer, output, mSessionId, status);?函数AudioFlinger::createTrack返回的是一个TrackHandle对象:trackHandle = new TrackHandle(track);return trackHandle;track的由来: track = thread-createTrack_l(client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer, lSessionId, lStatus);函数AudioFlinger::PlaybackThread::createTrack_l返回的是一个Track对象: track = new Track(this, client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer, sessionId); return track;看看函数TrackHandle::getCblk() :return mTrack-getCblk();mTrack就是作为构造函数传入的track对象。函数AudioFlinger::ThreadBase::TrackBase::getCblk() 的实现:return mCblkMemory;mCblkMemory的赋值在构造函数AudioFlinger::ThreadBase::TrackBase::TrackBase中:mCblkMemory = client-heap()-allocate(size);mCblk = static_castaudio_track_cblk_t *(mCblkMemory-pointer()); // 这个成员变量也很重要client是构造函数参数:const spClient client函数AudioFlinger::Client::heap:return mMemoryDealer;mMemoryDealer的赋值在函数AudioFlinger::Client::Client中:mMemoryDealer(new MemoryDealer(1024*1024, AudioFlinger::Client))看看函数MemoryDealer::allocate:spIMemory MemoryDealer::allocate(size_t size){ spIMemory memory;// allocator()直接返回mAllocator// mAlloca
文档评论(0)