main@main_mediaServer.cpp
int main(int argc, char** argv)
{
......
AudioFlinger::instantiate();
......
AudioPolicyService::instantiate();
......
}
AudioFlinger
void AudioFlinger::instantiate() {
defaultServiceManager()->addService(
String16("media.audio_flinger"), new AudioFlinger());
}
AudioFlinger::AudioFlinger()
: BnAudioFlinger(),
mAudioHardware(0), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1), mFmOn(false)
{
mHardwareStatus = AUDIO_HW_IDLE;
mLPAOutput = NULL;
mLPAHandle = -1;
mLPAStreamIsActive = false;
mLPASessionId = -2; // -2 is invalid session ID
mIsEffectConfigChanged = false;
mLPAEffectChain = NULL;
mAudioHardware = AudioHardwareInterface::create();
mHardwareStatus = AUDIO_HW_INIT;
if (mAudioHardware->initCheck() == NO_ERROR) {
// open 16-bit output stream for s/w mixer
mMode = AudioSystem::MODE_NORMAL;
setMode(mMode);
setMasterVolume(1.0f);
setMasterMute(false);
} else {
LOGE("Couldn't even initialize the stubbed audio hardware!");
}
}
AudioHardwareInterface::create()AudioHardwareInterface* AudioHardwareInterface::create()
{
/*
* FIXME: This code needs to instantiate the correct audio device
* interface. For now - we use compile-time switches.
*/
AudioHardwareInterface* hw = 0;
char value[PROPERTY_VALUE_MAX];
// if running in emulation - use the emulator driver
property_get("ro.kernel.qemu", value, 0);
if(strcmp(value, "1") == 0) {
LOGD("Running in emulation - using generic audio driver");
hw = new AudioHardwareGeneric();
}
else {
LOGV("Creating Vendor Specific AudioHardware");
hw = createAudioHardware();
}
if (hw->initCheck() != NO_ERROR) {
LOGW("Using stubbed audio hardware. No sound will be produced.");
delete hw;
hw = new AudioHardwareStub();
}
#ifdef WITH_A2DP
hw = new A2dpAudioInterface(hw);
#endif
return hw;
}
createAudioHardware()@AudioHardware.cppextern "C" AudioHardwareInterface* createAudioHardware(void) {
return new AudioHardware();
}
AudioHardwareAudioHardware::AudioHardware() :
mInit(false), mMicMute(true), mBluetoothNrec(true), mBluetoothId(0),
mOutput(0),
mRealCall(false), /*MIN@Tecace - 20110722*/
mFactoryTest(false),
mTtyMode(TTY_OFF), mDualMicEnabled(false), mFmFd(-1),
mCurRX(INVALID_DEVICE), mCurTX(INVALID_DEVICE)
{
head = (Routing_table* ) malloc(sizeof(Routing_table));
head->next = NULL;
LOGE("msm_mixer_open: Opening the device");
control = msm_mixer_open("/dev/snd/controlC0", 0);
if(control< 0)
LOGE("ERROR opening the device");
mixer_cnt = msm_mixer_count();
LOGE("msm_mixer_count:mixer_cnt =%d",mixer_cnt);
dev_cnt = msm_get_device_count();
LOGE("got device_count %d",dev_cnt);
if (dev_cnt <= 0) {
LOGE("NO devices registered\n");
return;
}
name = msm_get_device_list();
device_list = (Device_table* )malloc(sizeof(Device_table)*120);
......
else if(strcmp((char* )name[i], "headset_fmradio_tx") == 0)
index = DEVICE_HEADSET_FMRADIO_TX;
else if(strcmp((char* )name[i], "speaker_fmradio_rx") == 0)
index = DEVICE_SPEAKER_FMRADIO_RX;
else if(strcmp((char* )name[i], "speaker_headset_fmradio_rx") == 0)
index = DEVICE_SPEAKER_HEADSET_FMRADIO_RX;
else if(strcmp((char* )name[i], "speaker_voice_dialer_tx") == 0)
index = DEVICE_SPEAKER_VOICE_DIALER_TX;
else if(strcmp((char* )name[i], "headset_voice_dialer_tx") == 0)
index = DEVICE_HEADSET_VOICE_DIALER_TX;
else if(strcmp((char* )name[i], "bt_sco_voice_dialer_tx") == 0)
index = DEVICE_BT_SCO_VOICE_DIALER_TX;
........
}
mInit = true; //mInit为static类型参数
}
AudioPolicyService init
void AudioPolicyService::instantiate() {
defaultServiceManager()->addService(
String16("media.audio_policy"), new AudioPolicyService());
}
AudioPolicyService::AudioPolicyService()
: BnAudioPolicyService() , mpPolicyManager(NULL)
{
char value[PROPERTY_VALUE_MAX];
// start tone playback thread
mTonePlaybackThread = new AudioCommandThread(String8(""));
// start audio commands thread
mAudioCommandThread = new AudioCommandThread(String8("ApmCommandThread"));
......
mpPolicyManager = createAudioPolicyManager(this);
......
mpPolicyManager->setSystemProperty("ro.camera.sound.forced", value);
}
createAudioPolicyManager(this)extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
{
return new AudioPolicyManager(clientInterface);
}
AudioPolicyManagerAudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
: AudioPolicyManagerBase(clientInterface)
{
......
}
AudioPolicyManagerBase(clientInterface)AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface)
:
#ifdef AUDIO_POLICY_TEST
Thread(false),
#endif //AUDIO_POLICY_TEST
mPhoneState(AudioSystem::MODE_NORMAL), mRingerMode(0),
mMusicStopTime(0), mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),
mTotalEffectsCpuLoad(0), mTotalEffectsMemory(0),
mA2dpSuspended(false)
{
mpClientInterface = clientInterface;
for (int i = 0; i < AudioSystem::NUM_FORCE_USE; i++) {
mForceUse[i] = AudioSystem::FORCE_NONE;
}
// devices available by default are speaker, ear piece and microphone
mAvailableOutputDevices = AudioSystem::DEVICE_OUT_EARPIECE | AudioSystem::DEVICE_OUT_SPEAKER;
mAvailableInputDevices = AudioSystem::DEVICE_IN_BUILTIN_MIC;
#ifdef WITH_A2DP
mA2dpOutput = 0;
mDuplicatedOutput = 0;
mA2dpDeviceAddress = String8("");
#endif
mScoDeviceAddress = String8("");
// open hardware output
AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor();
outputDesc->mDevice = (uint32_t)AudioSystem::DEVICE_OUT_SPEAKER;
mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
&outputDesc->mSamplingRate,
&outputDesc->mFormat,
&outputDesc->mChannels,
&outputDesc->mLatency,
outputDesc->mFlags);
......
addOutput(mHardwareOutput, outputDesc); //mHardwareOutput是输出线程的索引值,outputDesc是输出设备描述符,两者所谓K-V组对 setOutputDevice(mHardwareOutput, (uint32_t)AudioSystem::DEVICE_OUT_SPEAKER, true);
......
updateDeviceForStrategy();
}
mpClientInterface->openOutput()---->AudioPolicyService::openOutput()---->AudioFlinger::openOutput()int AudioFlinger::openOutput(uint32_t *pDevices,
uint32_t *pSamplingRate,
uint32_t *pFormat,
uint32_t *pChannels,
uint32_t *pLatencyMs,
uint32_t flags)
{
status_t status;
PlaybackThread *thread = NULL;
mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
Mutex::Autolock _l(mLock);
AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices,
(int *)&format,
&channels,
&samplingRate,
&status);
mHardwareStatus = AUDIO_HW_IDLE;
if (output != 0) {
int id = nextUniqueId();
thread = new MixerThread(this, output, id, *pDevices);
LOGV("openOutput() created mixer output: ID %d thread %p", id, thread);
mPlaybackThreads.add(id, thread);
// if the device is a A2DP, then this is an A2DP Output
if ( true == AudioSystem::isA2dpDevice((AudioSystem::audio_devices) *pDevices) )
{
mA2DPHandle = id;
LOGV("A2DP device activated. The handle is set to %d", mA2DPHandle);
}
// notify client processes of the new output creation
thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
return id; //返回创建的thread的索引值,即mHardwareOutput@AudioPolicyManagerBase.h }
return 0;
}
AudioHardward->openOutputStream()
AudioStreamOut* AudioHardware::openOutputStream(
uint32_t devices, int *format, uint32_t *channels, uint32_t *sampleRate, status_t *status)
{
LOGV("openOutputStream()");
{ // scope for the lock
Mutex::Autolock lock(mLock);
......
// create new output stream
AudioStreamOutMSM72xx* out = new AudioStreamOutMSM72xx();
status_t lStatus = out->set(this, devices, format, channels, sampleRate);
if (status) {
*status = lStatus;
}
if (lStatus == NO_ERROR) {
mOutput = out;
} else {
delete out;
}
}
return mOutput;
}
AudioStreamOutMSM72xx()AudioHardware::AudioStreamOutMSM72xx::AudioStreamOutMSM72xx() :
mHardware(0), mFd(-1), mStartCount(0), mRetryCount(0), mStandby(true), mDevices(0)
{}
status_t AudioHardware::AudioStreamOutMSM72xx::set(
AudioHardware* hw, uint32_t devices, int *pFormat, uint32_t *pChannels, uint32_t *pRate)
{
......
LOGV("set mDevices %d", devices);
mHardware = hw;
......
mDevices = devices;
return NO_ERROR;
}
nextUniqueIdint AudioFlinger::nextUniqueId()
{
return android_atomic_inc(&mNextUniqueId);
}
MixerThreadAudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device)
: PlaybackThread(audioFlinger, output, id, device),
mAudioMixer(0)
{
mType = PlaybackThread::MIXER;
mAudioMixer = new AudioMixer(mFrameCount, mSampleRate);
// FIXME - Current mixer implementation only supports stereo output
if (mChannelCount == 1) {
LOGE("Invalid audio hardware channel count");
}
}
PlaybackThreadAudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device)
: ThreadBase(audioFlinger, id),
mMixBuffer(0), mSuspended(0), mBytesWritten(0), mOutput(output),
mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
mDevice(device)
{
readOutputParameters();
mMasterVolume = mAudioFlinger->masterVolume();
mMasterMute = mAudioFlinger->masterMute();
for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream);
mStreamTypes[stream].mute = mAudioFlinger->streamMute(stream);
}
}
ThreadBaseAudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, int id)
: Thread(false),
mAudioFlinger(audioFlinger), mSampleRate(0), mFrameCount(0), mChannelCount(0),
mFrameSize(1), mFormat(0), mStandby(false), mId(id), mExiting(false)
{
}
AudioMixerAudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate)
: mActiveTrack(0), mTrackNames(0), mSampleRate(sampleRate)
{
mState.enabledTracks= 0;
mState.needsChanged = 0;
mState.frameCount = frameCount;
mState.outputTemp = 0;
mState.resampleTemp = 0;
mState.hook = process__nop;
track_t* t = mState.tracks;
for (int i=0 ; i<32 ; i++) {
t->needs = 0;
t->volume[0] = UNITY_GAIN;
t->volume[1] = UNITY_GAIN;
t->volumeInc[0] = 0;
t->volumeInc[1] = 0;
t->auxLevel = 0;
t->auxInc = 0;
t->channelCount = 2;
t->enabled = 0;
t->format = 16;
t->buffer.raw = 0;
t->bufferProvider = 0;
t->hook = 0;
t->resampler = 0;
t->sampleRate = mSampleRate;
t->in = 0;
t->mainBuffer = NULL;
t->auxBuffer = NULL;
t++;
}
}
struct state_t@AudioMixer.h
struct state_t {
uint32_t enabledTracks;
uint32_t needsChanged;
size_t frameCount;
mix_t hook;
int32_t *outputTemp;
int32_t *resampleTemp;
int32_t reserved[2];
track_t tracks[32]; __attribute__((aligned(32)));
};
state_t mState __attribute__((aligned(32)));
读这些代码,总是有种被踢皮球的感觉,或者说类似西班牙Tiki-Taka的感觉。
系统首先初始化了Audio系统的核心模块AudioFlinger,然后初始化了AudioPolicyService以及AudioPolicyManagerBase。
AudioFlinger的构造函数初始化了BnAudioFlinger,并创建了HAL层对象mAudioHardward。
AudioPolicyServie通过openOutput函数(最终调用AudioFlinger里的openOutput函数)创建了MixerThread进行系统混音处理。
AudioPolicyManager负责HAL层device的选取,设备strage,output,descriptor等的记录(map组对)