Android Audio代码分析11 - AudioStreamOutALSA::write函数

在看音频数据是怎么写的时候,在MixerThread的threadloop函数中,有以下代码完成了往硬件写数据:
int bytesWritten = (int)mOutput->write(mMixBuffer, mixBufferSize);


mOutput来历:
函数AudioFlinger::openOutput中创建了一个MixerThread对象,并将前面调用mAudioHardware->openOutputStream得到的output作为参数传入。
MixerThread继承自PlaybackThread,在PlaybackThread的构造函数中将传入的output赋值给了mOutput。


函数AudioFlinger::openOutput以前已经打过交道。mAudioHardware其实是一个AudioHardwareALSA对象。
调用mAudioHardware->openOutputStream得到的其实是一个AudioStreamOutALSA对象。


所以,mOutput->write,其实就是函数AudioStreamOutALSA::write。


*****************************************源码*************************************************


**********************************************************************************************
源码路径:
hardware\alsa_sound\AudioStreamOutALSA.cpp


#######################说明################################


###########################################################


&&&&&&&&&&&&&&&&&&&&&&&总结&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
在open output stream的时候,会创建一个snd_pcm_t的结构体。
write数据的时候,有两中方式:
1、mmap方式,其实是往结构体的stopped_areas或者running_areas成员中copy数据。
    写完后,通过commit函数通知底层:
pcm->fast_ops->mmap_commit
2、否则,直接调用结构体的writei函数写数据:
    pcm->fast_ops->writei
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

posted @ 2011-10-13 22:18  andriod2012  阅读(881)  评论(0编辑  收藏  举报