am ad8d175b: mAudioHwDevs and related cleanup

* commit 'ad8d175b405373b9614ad4278f274eae706df588':
  mAudioHwDevs and related cleanup
This commit is contained in:
Glenn Kasten
2012-02-10 15:39:17 -08:00
committed by Android Git Automerger
2 changed files with 27 additions and 23 deletions

View File

@@ -188,29 +188,32 @@ void AudioFlinger::onFirstRef()
mod->name, mod->id);
mAudioHwDevs.push(dev);
if (!mPrimaryHardwareDev) {
if (mPrimaryHardwareDev == NULL) {
mPrimaryHardwareDev = dev;
ALOGI("Using '%s' (%s.%s) as the primary audio interface",
mod->name, mod->id, audio_interfaces[i]);
}
}
mHardwareStatus = AUDIO_HW_INIT;
if (!mPrimaryHardwareDev || mAudioHwDevs.size() == 0) {
if (mPrimaryHardwareDev == NULL) {
ALOGE("Primary audio interface not found");
return;
// proceed, all later accesses to mPrimaryHardwareDev verify it's safe with initCheck()
}
// Currently (mPrimaryHardwareDev == NULL) == (mAudioHwDevs.size() == 0), but the way the
// primary HW dev is selected can change so these conditions might not always be equivalent.
// When that happens, re-visit all the code that assumes this.
AutoMutex lock(mHardwareLock);
for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
audio_hw_device_t *dev = mAudioHwDevs[i];
mHardwareStatus = AUDIO_HW_INIT;
rc = dev->init_check(dev);
mHardwareStatus = AUDIO_HW_IDLE;
if (rc == 0) {
AutoMutex lock(mHardwareLock);
mMode = AUDIO_MODE_NORMAL;
mMode = AUDIO_MODE_NORMAL; // assigned multiple times with same value
mHardwareStatus = AUDIO_HW_SET_MODE;
dev->set_mode(dev, mMode);
mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
@@ -220,17 +223,8 @@ void AudioFlinger::onFirstRef()
}
}
status_t AudioFlinger::initCheck() const
{
Mutex::Autolock _l(mLock);
if (mPrimaryHardwareDev == NULL || mAudioHwDevs.size() == 0)
return NO_INIT;
return NO_ERROR;
}
AudioFlinger::~AudioFlinger()
{
int num_devs = mAudioHwDevs.size();
while (!mRecordThreads.isEmpty()) {
// closeInput() will remove first entry from mRecordThreads
@@ -241,9 +235,9 @@ AudioFlinger::~AudioFlinger()
closeOutput(mPlaybackThreads.keyAt(0));
}
for (int i = 0; i < num_devs; i++) {
audio_hw_device_t *dev = mAudioHwDevs[i];
audio_hw_device_close(dev);
for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
// no mHardwareLock needed, as there are no other references to this
audio_hw_device_close(mAudioHwDevs[i]);
}
}
@@ -625,6 +619,7 @@ bool AudioFlinger::getMicMute() const
}
bool state = AUDIO_MODE_INVALID;
AutoMutex lock(mHardwareLock);
mHardwareStatus = AUDIO_HW_GET_MIC_MUTE;
mPrimaryHardwareDev->get_mic_mute(mPrimaryHardwareDev, &state);
mHardwareStatus = AUDIO_HW_IDLE;
@@ -856,7 +851,11 @@ size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, audio_format_t form
return 0;
}
return mPrimaryHardwareDev->get_input_buffer_size(mPrimaryHardwareDev, sampleRate, format, channelCount);
AutoMutex lock(mHardwareLock);
mHardwareStatus = AUDIO_HW_GET_INPUT_BUFFER_SIZE;
size_t size = mPrimaryHardwareDev->get_input_buffer_size(mPrimaryHardwareDev, sampleRate, format, channelCount);
mHardwareStatus = AUDIO_HW_IDLE;
return size;
}
unsigned int AudioFlinger::getInputFramesLost(audio_io_handle_t ioHandle) const

View File

@@ -199,7 +199,9 @@ private:
AudioFlinger();
virtual ~AudioFlinger();
status_t initCheck() const;
// call in any IAudioFlinger method that accesses mPrimaryHardwareDev
status_t initCheck() const { return mPrimaryHardwareDev == NULL ? NO_INIT : NO_ERROR; }
virtual void onFirstRef();
audio_hw_device_t* findSuitableHwDev_l(uint32_t devices);
void purgeStaleEffects_l();
@@ -1391,7 +1393,9 @@ mutable Mutex mLock; // mutex for process, commands and handl
DefaultKeyedVector< pid_t, wp<Client> > mClients; // see ~Client()
mutable Mutex mHardwareLock;
audio_hw_device_t* mPrimaryHardwareDev;
// These two fields are immutable after onFirstRef(), so no lock needed to access
audio_hw_device_t* mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL
Vector<audio_hw_device_t*> mAudioHwDevs;
enum hardware_call_state {
@@ -1411,6 +1415,7 @@ mutable Mutex mLock; // mutex for process, commands and handl
AUDIO_HW_SET_MIC_MUTE,
AUDIO_SET_VOICE_VOLUME,
AUDIO_SET_PARAMETER,
AUDIO_HW_GET_INPUT_BUFFER_SIZE,
};
mutable hardware_call_state mHardwareStatus; // for dump only