summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/audioflinger/AudioFlinger.cpp68
-rw-r--r--libs/audioflinger/AudioFlinger.h3
2 files changed, 47 insertions, 24 deletions
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index b34f214e6170..3276cdf76c6b 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -710,12 +710,14 @@ void AudioFlinger::removeClient(pid_t pid)
AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger)
: Thread(false),
mAudioFlinger(audioFlinger), mSampleRate(0), mFrameCount(0), mChannelCount(0),
- mFormat(0), mFrameSize(1), mNewParameters(String8("")), mStandby(false)
+ mFormat(0), mFrameSize(1), mStandby(false)
{
}
AudioFlinger::ThreadBase::~ThreadBase()
{
+ mParamCond.broadcast();
+ mNewParameters.clear();
}
void AudioFlinger::ThreadBase::exit()
@@ -755,20 +757,28 @@ size_t AudioFlinger::ThreadBase::frameCount() const
status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs)
{
- status_t result;
+ status_t status;
+ LOGV("ThreadBase::setParameters() %s", keyValuePairs.string());
Mutex::Autolock _l(mLock);
- mNewParameters = keyValuePairs;
+ mNewParameters.add(keyValuePairs);
mWaitWorkCV.signal();
mParamCond.wait(mLock);
-
- return mParamStatus;
+ status = mParamStatus;
+ mWaitWorkCV.signal();
+ return status;
}
void AudioFlinger::ThreadBase::sendConfigEvent(int event, int param)
{
Mutex::Autolock _l(mLock);
+ sendConfigEvent_l(event, param);
+}
+
+// sendConfigEvent_l() must be called with ThreadBase::mLock held
+void AudioFlinger::ThreadBase::sendConfigEvent_l(int event, int param)
+{
ConfigEvent *configEvent = new ConfigEvent();
configEvent->mEvent = event;
configEvent->mParam = param;
@@ -1454,10 +1464,14 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l()
{
bool reconfig = false;
- if (mNewParameters != "") {
+ while (!mNewParameters.isEmpty()) {
status_t status = NO_ERROR;
- AudioParameter param = AudioParameter(mNewParameters);
+ String8 keyValuePair = mNewParameters[0];
+ AudioParameter param = AudioParameter(keyValuePair);
int value;
+
+ mNewParameters.removeAt(0);
+
if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
reconfig = true;
}
@@ -1486,12 +1500,12 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l()
}
}
if (status == NO_ERROR) {
- status = mOutput->setParameters(mNewParameters);
+ status = mOutput->setParameters(keyValuePair);
if (!mStandby && status == INVALID_OPERATION) {
mOutput->standby();
mStandby = true;
mBytesWritten = 0;
- status = mOutput->setParameters(mNewParameters);
+ status = mOutput->setParameters(keyValuePair);
}
if (status == NO_ERROR && reconfig) {
delete mAudioMixer;
@@ -1502,12 +1516,12 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l()
if (name < 0) break;
mTracks[i]->mName = name;
}
- sendConfigEvent(AudioSystem::OUTPUT_CONFIG_CHANGED);
+ sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
}
}
mParamStatus = status;
- mNewParameters = "";
mParamCond.signal();
+ mWaitWorkCV.wait(mLock);
}
return reconfig;
}
@@ -1759,10 +1773,14 @@ bool AudioFlinger::DirectOutputThread::checkForNewParameters_l()
{
bool reconfig = false;
- if (mNewParameters != "") {
+ while (!mNewParameters.isEmpty()) {
status_t status = NO_ERROR;
- AudioParameter param = AudioParameter(mNewParameters);
+ String8 keyValuePair = mNewParameters[0];
+ AudioParameter param = AudioParameter(keyValuePair);
int value;
+
+ mNewParameters.removeAt(0);
+
if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
// do not accept frame count changes if tracks are open as the track buffer
// size depends on frame count and correct behavior would not be garantied
@@ -1774,21 +1792,21 @@ bool AudioFlinger::DirectOutputThread::checkForNewParameters_l()
}
}
if (status == NO_ERROR) {
- status = mOutput->setParameters(mNewParameters);
+ status = mOutput->setParameters(keyValuePair);
if (!mStandby && status == INVALID_OPERATION) {
mOutput->standby();
mStandby = true;
mBytesWritten = 0;
- status = mOutput->setParameters(mNewParameters);
+ status = mOutput->setParameters(keyValuePair);
}
if (status == NO_ERROR && reconfig) {
readOutputParameters();
- sendConfigEvent(AudioSystem::OUTPUT_CONFIG_CHANGED);
+ sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
}
}
mParamStatus = status;
- mNewParameters = "";
mParamCond.signal();
+ mWaitWorkCV.wait(mLock);
}
return reconfig;
}
@@ -3100,13 +3118,17 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
{
bool reconfig = false;
- if (mNewParameters != "") {
+ while (!mNewParameters.isEmpty()) {
status_t status = NO_ERROR;
- AudioParameter param = AudioParameter(mNewParameters);
+ String8 keyValuePair = mNewParameters[0];
+ AudioParameter param = AudioParameter(keyValuePair);
int value;
int reqFormat = mFormat;
int reqSamplingRate = mReqSampleRate;
int reqChannelCount = mReqChannelCount;
+
+ mNewParameters.removeAt(0);
+
if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
reqSamplingRate = value;
reconfig = true;
@@ -3130,10 +3152,10 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
}
}
if (status == NO_ERROR) {
- status = mInput->setParameters(mNewParameters);
+ status = mInput->setParameters(keyValuePair);
if (status == INVALID_OPERATION) {
mInput->standby();
- status = mInput->setParameters(mNewParameters);
+ status = mInput->setParameters(keyValuePair);
}
if (reconfig) {
if (status == BAD_VALUE &&
@@ -3144,13 +3166,13 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
}
if (status == NO_ERROR) {
readInputParameters();
- sendConfigEvent(AudioSystem::INPUT_CONFIG_CHANGED);
+ sendConfigEvent_l(AudioSystem::INPUT_CONFIG_CHANGED);
}
}
}
- mNewParameters = "";
mParamStatus = status;
mParamCond.signal();
+ mWaitWorkCV.wait(mLock);
}
return reconfig;
}
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 4a4b82343eb9..c9f344884cd7 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -318,6 +318,7 @@ private:
virtual String8 getParameters(const String8& keys) = 0;
virtual void audioConfigChanged(int event, int param = 0) = 0;
void sendConfigEvent(int event, int param = 0);
+ void sendConfigEvent_l(int event, int param = 0);
void processConfigEvents();
mutable Mutex mLock;
@@ -341,7 +342,7 @@ private:
int mFormat;
uint32_t mFrameSize;
Condition mParamCond;
- String8 mNewParameters;
+ Vector<String8> mNewParameters;
status_t mParamStatus;
Vector<ConfigEvent *> mConfigEvents;
bool mStandby;