}
}
-void AudioFlinger::audioConfigChanged(int event, const sp<ThreadBase>& thread, void *param2) {
- Mutex::Autolock _l(mLock);
+// audioConfigChanged_l() must be called with AudioFlinger::mLock held
+void AudioFlinger::audioConfigChanged_l(int event, const sp<ThreadBase>& thread, void *param2) {
int ioHandle = 0;
for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
size_t size = mNotificationClients.size();
for (size_t i = 0; i < size; i++) {
sp<IBinder> binder = mNotificationClients.itemAt(i);
- LOGV("audioConfigChanged() Notifying change to client %p", binder.get());
+ LOGV("audioConfigChanged_l() Notifying change to client %p", binder.get());
sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient> (binder);
client->ioConfigChanged(event, ioHandle, param2);
}
LOGV("processConfigEvents() remaining events %d", mConfigEvents.size());
ConfigEvent *configEvent = mConfigEvents[0];
mConfigEvents.removeAt(0);
- // release mLock because audioConfigChanged() will call
- // Audioflinger::audioConfigChanged() which locks AudioFlinger mLock thus creating
+ // release mLock because audioConfigChanged() will lock AudioFlinger mLock
+ // before calling Audioflinger::audioConfigChanged_l() thus creating
// potential cross deadlock between AudioFlinger::mLock and mLock
mLock.unlock();
audioConfigChanged(configEvent->mEvent, configEvent->mParam);
default:
break;
}
- mAudioFlinger->audioConfigChanged(event, this, param2);
+ Mutex::Autolock _l(mAudioFlinger->mLock);
+ mAudioFlinger->audioConfigChanged_l(event, this, param2);
}
void AudioFlinger::PlaybackThread::readOutputParameters()
if (!mStandby) {
mOutput->standby();
}
- sendConfigEvent(AudioSystem::OUTPUT_CLOSED);
- processConfigEvents();
LOGV("MixerThread %p exiting", this);
return false;
if (!mStandby) {
mOutput->standby();
}
- sendConfigEvent(AudioSystem::OUTPUT_CLOSED);
- processConfigEvents();
LOGV("DirectOutputThread %p exiting", this);
return false;
}
}
- sendConfigEvent(AudioSystem::OUTPUT_CLOSED);
- processConfigEvents();
-
return false;
}
}
mActiveTrack.clear();
- sendConfigEvent(AudioSystem::INPUT_CLOSED);
- processConfigEvents();
-
LOGV("RecordThread %p exiting", this);
return false;
}
default:
break;
}
- mAudioFlinger->audioConfigChanged(event, this, param2);
+ Mutex::Autolock _l(mAudioFlinger->mLock);
+ mAudioFlinger->audioConfigChanged_l(event, this, param2);
}
void AudioFlinger::RecordThread::readInputParameters()
}
}
}
+ void *param2 = 0;
+ audioConfigChanged_l(AudioSystem::OUTPUT_CLOSED, thread, param2);
mPlaybackThreads.removeItem(output);
}
thread->exit();
}
LOGV("closeInput() %d", input);
+ void *param2 = 0;
+ audioConfigChanged_l(AudioSystem::INPUT_CLOSED, thread, param2);
mRecordThreads.removeItem(input);
}
thread->exit();