赞
踩
- static int android_media_AudioTrack_native_setup(....)
- {
- sp<AudioTrack> lpTrack = new AudioTrack();//初始化track对象
- switch (memoryMode) {
- case MODE_STREAM:
- lpTrack->set( //给track设置好参数
- atStreamType,// stream type
- sampleRateInHertz,
- format,// word length, PCM
- nativeChannelMask,
- frameCount,
- AUDIO_OUTPUT_FLAG_NONE,
- audioCallback, &(lpJniStorage->mCallbackData),//callback, callback data (user)
- 0,// notificationFrames == 0 since not using EVENT_MORE_DATA to feed the AudioTrack
- 0,// shared mem //stream模式不用共享内存
- true,// thread can call Java
- sessionId);// audio session ID
- break;
- case MODE_STATIC:
- // AudioTrack is using shared memory
- lpTrack->set(
- atStreamType,// stream type
- sampleRateInHertz,
- format,// word length, PCM
- nativeChannelMask,
- frameCount,
- AUDIO_OUTPUT_FLAG_NONE,
- audioCallback, &(lpJniStorage->mCallbackData),//callback, callback data (user));
- 0,// notificationFrames == 0 since not using EVENT_MORE_DATA to feed the AudioTrack
- lpJniStorage->mMemBase,// shared mem //static模式使用共享内存
- true,// thread can call Java
- sessionId);// audio session ID
- break;
- }

- static int android_media_AudioTrack_native_setup(....)
- {
- sp<AudioTrack> lpTrack = new AudioTrack();//初始化track对象
- switch (memoryMode) {
- case MODE_STREAM:
- lpTrack->set( //给track设置好参数
- atStreamType,// stream type
- sampleRateInHertz,
- format,// word length, PCM
- nativeChannelMask,
- frameCount,
- AUDIO_OUTPUT_FLAG_NONE,
- audioCallback, &(lpJniStorage->mCallbackData),//callback, callback data (user)
- 0,// notificationFrames == 0 since not using EVENT_MORE_DATA to feed the AudioTrack
- 0,// shared mem //stream模式不用共享内存
- true,// thread can call Java
- sessionId);// audio session ID
- break;
- case MODE_STATIC:
- // AudioTrack is using shared memory
- lpTrack->set(
- atStreamType,// stream type
- sampleRateInHertz,
- format,// word length, PCM
- nativeChannelMask,
- frameCount,
- AUDIO_OUTPUT_FLAG_NONE,
- audioCallback, &(lpJniStorage->mCallbackData),//callback, callback data (user));
- 0,// notificationFrames == 0 since not using EVENT_MORE_DATA to feed the AudioTrack
- lpJniStorage->mMemBase,// shared mem //static模式使用共享内存
- true,// thread can call Java
- sessionId);// audio session ID
- break;
- }

- status_t AudioTrack::set(.... )
- {
- ....参数检查
- audio_io_handle_t output = AudioSystem::getOutput( //根据参数,为这个AT寻找恰当的output输出
- streamType,
- sampleRate, format, channelMask,
- flags,
- offloadInfo);
- if (cbf != NULL) {
- mAudioTrackThread = new AudioTrackThread(*this, threadCanCallJava);
- mAudioTrackThread->run("AudioTrack", ANDROID_PRIORITY_AUDIO, 0 /*stack*/);
- }//启动一个AT线程,该线程负责处理callback事件,最主要的就是处理EVENT_MORE_DATA 事件,以便通过pull机制存储数据。
- // create the IAudioTrack
- status_t status = createTrack_l(streamType,
- sampleRate,
- format,
- frameCount,
- flags,
- sharedBuffer,
- output,
- 0 /*epoch*/);
- //为AT在AF中创建一个Track实例,Track实例是AF和AT交互的桥梁。其handle是IAudioTrack形式的,存储在成员变量mAudioTrack中
- }

- status_t AudioTrack::createTrack_l()
- {
- status_t status;
- const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger(); //获得AF service
- sp<IAudioTrack> track = audioFlinger->createTrack(streamType, //调用AF接口来在AF里面创建Track实例
- sampleRate,
- format == AUDIO_FORMAT_PCM_8_BIT ?
- AUDIO_FORMAT_PCM_16_BIT : format,
- mChannelMask,
- frameCount,
- &trackFlags,
- sharedBuffer,
- output,
- tid,
- &mSessionId,
- mName,
- mClientUid,
- &status);
- sp<IMemory> iMem = track->getCblk();
- mAudioTrack = track;
- mCblkMemory = iMem;
- audio_track_cblk_t* cblk = static_cast<audio_track_cblk_t*>(iMem->pointer());
- mCblk = cblk; //获得Audio data的FIFO地址
- size_t temp = cblk->frameCount_;
- frameCount = temp;
- mAwaitBoost = false;
- return NO_ERROR;
- }

- sp<IAudioTrack> AudioFlinger::createTrack(...)
- {
- Mutex::Autolock _l(mLock);
- PlaybackThread *thread = checkPlaybackThread_l(output);//通过前面讲过的获得的output,来获得playbackThread
-
- track = thread->createTrack_l(client, streamType, sampleRate, format,
- channelMask, frameCount, sharedBuffer, lSessionId, flags, tid, clientUid, &lStatus); //在这个playbackThread里面创建Track
- trackHandle = new TrackHandle(track); //提供给AT的handle,是IAudioTrack形式的
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。