前言
通过普通AudioTrack的流程追踪数据流。分析一下声音模块的具体流程。这里比较复杂的是binder以及共享内存。这里不做详细介绍。只介绍原理
正文
java层的AudioTrack主要是通过jni调用到cpp层的AudioTrack。我们只介绍cpp层相关。
初始化
初始化只核心是通过set函数实现的。主要包括三步。
1. 客户端准备数据,
status_t AudioTrack::set(
audio_stream_type_t streamType,
uint32_t sampleRate,
audio_format_t format,
audio_channel_mask_t channelMask,
size_t frameCount,
audio_output_flags_t flags,
callback_t cbf,
void* user,
int32_t notificationFrames,
const sp<IMemory>& sharedBuffer,
bool threadCanCallJava,
audio_session_t sessionId,
transfer_type transferType,
const audio_offload_info_t *offloadInfo,
uid_t uid,
pid_t pid,
const audio_attributes_t* pAttributes,
bool doNotReconnect,
float maxRequiredSpeed,
audio_port_handle_t selectedDeviceId)
{
//如果构造audioTrack时时传入AudioTrack.MODE_STREAM。则sharedBuffer为空
mSharedBuffer = sharedBuffer;
if (cbf != NULL) {
mAudioTrackThread = new AudioTrackThread(*this);
mAudioTrackThread->run("AudioTrack", ANDROID_PRIORITY_AUDIO, 0 /*stack*/);
// thread begins in paused state, and will not reference us until start()
}
// create the IAudioTrack
{
AutoMutex lock(mLock);
//这是核心,通过audiofligure 创建服务端数据,以及拿到共享内存。
status = createTrack_l();
}
mVolumeHandler = new media::VolumeHandler();
}
status_t AudioTrack::createTrack_l()
{
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger()
IAudioFlinger::CreateTrackInput inpu
IAudioFlinger::CreateTrackOutput output;
//关键部分
sp<IAudioTrack> track = audioFlinger->createTrack(input,output,&status);
sp<IMemory> iMem = track->getCblk

文章介绍了Android中AudioTrack在cpp层的初始化过程,包括通过JNI调用到AudioTrack,重点讲解了初始化时的set函数,创建Track,以及通过IAudioTrack接口实现数据的写入和传输。核心在于共享内存的使用和AudioFlinger服务的角色,音频数据通过AudioTrack写入,经AudioFlinger处理后传递到硬件层。
最低0.47元/天 解锁文章
2400

被折叠的 条评论
为什么被折叠?



