Skip to content

Commit 23c9c74

Browse files
committed
Fix tracking of hardware state for dump
At end of AudioFlinger::onFirstRef(), the hardware status was being left in wrong state. It should be AUDIO_HW_IDLE but was AUDIO_HW_INIT. mHardwareStatus was being set to AUDIO_HW_OUTPUT_OPEN too early, and so a return would leave it in the wrong state until next hardware operation. Take the hardware lock for dev->get_parameters, and update mHardwareStatus before and after. Keep hardware lock only for the duration of the dev->set_parameters. Rename two constants in enum hardware_call_state to have the prefix AUDIO_HW so they follow the naming conventions. Add comments. Change-Id: I6c7450b11f9b13adaeef9cec874333e478a58fc0
1 parent be3835c commit 23c9c74

File tree

2 files changed

+37
-29
lines changed

2 files changed

+37
-29
lines changed

services/audioflinger/AudioFlinger.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ void AudioFlinger::onFirstRef()
232232
(NO_ERROR != dev->set_master_volume(dev, initialVolume))) {
233233
mMasterVolumeSupportLvl = MVS_NONE;
234234
}
235-
mHardwareStatus = AUDIO_HW_INIT;
235+
mHardwareStatus = AUDIO_HW_IDLE;
236236
}
237237

238238
// Set the mode for each audio HAL, and try to set the initial volume (if
@@ -254,7 +254,7 @@ void AudioFlinger::onFirstRef()
254254
dev->set_master_volume(dev, initialVolume);
255255
}
256256

257-
mHardwareStatus = AUDIO_HW_INIT;
257+
mHardwareStatus = AUDIO_HW_IDLE;
258258
}
259259
}
260260

@@ -822,8 +822,6 @@ bool AudioFlinger::streamMute(audio_stream_type_t stream) const
822822

823823
status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
824824
{
825-
status_t result;
826-
827825
ALOGV("setParameters(): io %d, keyvalue %s, tid %d, calling pid %d",
828826
ioHandle, keyValuePairs.string(), gettid(), IPCThreadState::self()->getCallingPid());
829827
// check calling permissions
@@ -833,15 +831,17 @@ status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8&
833831

834832
// ioHandle == 0 means the parameters are global to the audio hardware interface
835833
if (ioHandle == 0) {
836-
AutoMutex lock(mHardwareLock);
837-
mHardwareStatus = AUDIO_SET_PARAMETER;
838834
status_t final_result = NO_ERROR;
835+
{
836+
AutoMutex lock(mHardwareLock);
837+
mHardwareStatus = AUDIO_HW_SET_PARAMETER;
839838
for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
840839
audio_hw_device_t *dev = mAudioHwDevs[i];
841-
result = dev->set_parameters(dev, keyValuePairs.string());
840+
status_t result = dev->set_parameters(dev, keyValuePairs.string());
842841
final_result = result ?: final_result;
843842
}
844843
mHardwareStatus = AUDIO_HW_IDLE;
844+
}
845845
// disable AEC and NS if the device is a BT SCO headset supporting those pre processings
846846
AudioParameter param = AudioParameter(keyValuePairs);
847847
String8 value;
@@ -904,8 +904,14 @@ String8 AudioFlinger::getParameters(audio_io_handle_t ioHandle, const String8& k
904904
String8 out_s8;
905905

906906
for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
907+
char *s;
908+
{
909+
AutoMutex lock(mHardwareLock);
910+
mHardwareStatus = AUDIO_HW_GET_PARAMETER;
907911
audio_hw_device_t *dev = mAudioHwDevs[i];
908-
char *s = dev->get_parameters(dev, keys.string());
912+
s = dev->get_parameters(dev, keys.string());
913+
mHardwareStatus = AUDIO_HW_IDLE;
914+
}
909915
out_s8 += String8(s ? s : "");
910916
free(s);
911917
}
@@ -967,7 +973,7 @@ status_t AudioFlinger::setVoiceVolume(float value)
967973
}
968974

969975
AutoMutex lock(mHardwareLock);
970-
mHardwareStatus = AUDIO_SET_VOICE_VOLUME;
976+
mHardwareStatus = AUDIO_HW_SET_VOICE_VOLUME;
971977
ret = mPrimaryHardwareDev->set_voice_volume(mPrimaryHardwareDev, value);
972978
mHardwareStatus = AUDIO_HW_IDLE;
973979

@@ -5429,7 +5435,6 @@ audio_io_handle_t AudioFlinger::openOutput(uint32_t *pDevices,
54295435
{
54305436
status_t status;
54315437
PlaybackThread *thread = NULL;
5432-
mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
54335438
uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
54345439
audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT;
54355440
uint32_t channels = pChannels ? *pChannels : 0;
@@ -5454,16 +5459,17 @@ audio_io_handle_t AudioFlinger::openOutput(uint32_t *pDevices,
54545459
if (outHwDev == NULL)
54555460
return 0;
54565461

5462+
mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
54575463
status = outHwDev->open_output_stream(outHwDev, *pDevices, &format,
54585464
&channels, &samplingRate, &outStream);
5465+
mHardwareStatus = AUDIO_HW_IDLE;
54595466
ALOGV("openOutput() openOutputStream returned output %p, SamplingRate %d, Format %d, Channels %x, status %d",
54605467
outStream,
54615468
samplingRate,
54625469
format,
54635470
channels,
54645471
status);
54655472

5466-
mHardwareStatus = AUDIO_HW_IDLE;
54675473
if (outStream != NULL) {
54685474
AudioStreamOut *output = new AudioStreamOut(outHwDev, outStream);
54695475
audio_io_handle_t id = nextUniqueId();

services/audioflinger/AudioFlinger.h

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,25 +1537,27 @@ mutable Mutex mLock; // mutex for process, commands and handl
15371537
audio_hw_device_t* mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL
15381538
Vector<audio_hw_device_t*> mAudioHwDevs;
15391539

1540+
// for dump, indicates which hardware operation is currently in progress (but not stream ops)
15401541
enum hardware_call_state {
1541-
AUDIO_HW_IDLE = 0,
1542-
AUDIO_HW_INIT,
1543-
AUDIO_HW_OUTPUT_OPEN,
1544-
AUDIO_HW_OUTPUT_CLOSE,
1545-
AUDIO_HW_INPUT_OPEN,
1546-
AUDIO_HW_INPUT_CLOSE,
1547-
AUDIO_HW_STANDBY,
1548-
AUDIO_HW_SET_MASTER_VOLUME,
1549-
AUDIO_HW_GET_ROUTING,
1550-
AUDIO_HW_SET_ROUTING,
1551-
AUDIO_HW_GET_MODE,
1552-
AUDIO_HW_SET_MODE,
1553-
AUDIO_HW_GET_MIC_MUTE,
1554-
AUDIO_HW_SET_MIC_MUTE,
1555-
AUDIO_SET_VOICE_VOLUME,
1556-
AUDIO_SET_PARAMETER,
1557-
AUDIO_HW_GET_INPUT_BUFFER_SIZE,
1558-
AUDIO_HW_GET_MASTER_VOLUME,
1542+
AUDIO_HW_IDLE = 0, // no operation in progress
1543+
AUDIO_HW_INIT, // init_check
1544+
AUDIO_HW_OUTPUT_OPEN, // open_output_stream
1545+
AUDIO_HW_OUTPUT_CLOSE, // unused
1546+
AUDIO_HW_INPUT_OPEN, // unused
1547+
AUDIO_HW_INPUT_CLOSE, // unused
1548+
AUDIO_HW_STANDBY, // unused
1549+
AUDIO_HW_SET_MASTER_VOLUME, // set_master_volume
1550+
AUDIO_HW_GET_ROUTING, // unused
1551+
AUDIO_HW_SET_ROUTING, // unused
1552+
AUDIO_HW_GET_MODE, // unused
1553+
AUDIO_HW_SET_MODE, // set_mode
1554+
AUDIO_HW_GET_MIC_MUTE, // get_mic_mute
1555+
AUDIO_HW_SET_MIC_MUTE, // set_mic_mute
1556+
AUDIO_HW_SET_VOICE_VOLUME, // set_voice_volume
1557+
AUDIO_HW_SET_PARAMETER, // set_parameters
1558+
AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size
1559+
AUDIO_HW_GET_MASTER_VOLUME, // get_master_volume
1560+
AUDIO_HW_GET_PARAMETER, // get_parameters
15591561
};
15601562

15611563
mutable hardware_call_state mHardwareStatus; // for dump only

0 commit comments

Comments
 (0)