Merge "AAudio Fix some documentation @link issues"
diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
index 9893c6f..60750d9 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -117,9 +117,14 @@
outHeader->nFlags = OMX_BUFFERFLAG_EOS;
List<BufferInfo *>::iterator it = outQueue.begin();
- while ((*it)->mHeader != outHeader) {
+ while (it != outQueue.end() && (*it)->mHeader != outHeader) {
++it;
}
+ if (it == outQueue.end()) {
+ ALOGE("couldn't find port buffer %d in outQueue: b/109891727", mNumSamplesOutput & 1);
+ android_errorWriteLog(0x534e4554, "109891727");
+ return;
+ }
BufferInfo *outInfo = *it;
outInfo->mOwnedByUs = false;
diff --git a/media/libstagefright/omx/Android.bp b/media/libstagefright/omx/Android.bp
index b8f9aea..b959f6c 100644
--- a/media/libstagefright/omx/Android.bp
+++ b/media/libstagefright/omx/Android.bp
@@ -11,13 +11,6 @@
"OMXNodeInstance.cpp",
"OMXUtils.cpp",
"OmxGraphicBufferSource.cpp",
- //TODO: remove the soft component code here and use
- //libstagefright_omx_soft, once partner build is fixed
- "SimpleSoftOMXComponent.cpp",
- "SoftOMXComponent.cpp",
- "SoftOMXPlugin.cpp",
- "SoftVideoDecoderOMXComponent.cpp",
- "SoftVideoEncoderOMXComponent.cpp",
"1.0/Omx.cpp",
"1.0/OmxStore.cpp",
"1.0/WGraphicBufferSource.cpp",
@@ -58,7 +51,7 @@
"libvndksupport",
"android.hardware.media.omx@1.0",
"android.hardware.graphics.bufferqueue@1.0",
- //"libstagefright_omx_soft",
+ "libstagefright_omx_soft",
],
export_shared_lib_headers: [
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 43260c2..0825cb4 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -466,15 +466,8 @@
bool AudioFlinger::dumpTryLock(Mutex& mutex)
{
- bool locked = false;
- for (int i = 0; i < kDumpLockRetries; ++i) {
- if (mutex.tryLock() == NO_ERROR) {
- locked = true;
- break;
- }
- usleep(kDumpLockSleepUs);
- }
- return locked;
+ status_t err = mutex.timedLock(kDumpLockTimeoutNs);
+ return err == NO_ERROR;
}
status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 8ac3366..5a65ea8 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -431,8 +431,7 @@
static uint32_t mScreenState;
// Internal dump utilities.
- static const int kDumpLockRetries = 50;
- static const int kDumpLockSleepUs = 20000;
+ static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
static bool dumpTryLock(Mutex& mutex);
void dumpPermissionDenial(int fd, const Vector<String16>& args);
void dumpClients(int fd, const Vector<String16>& args);
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index ecaeb52..2b34267 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -2335,13 +2335,10 @@
void AudioFlinger::EffectChain::dump(int fd, const Vector<String16>& args)
{
- const size_t SIZE = 256;
- char buffer[SIZE];
String8 result;
- size_t numEffects = mEffects.size();
- snprintf(buffer, SIZE, " %zu effects for session %d\n", numEffects, mSessionId);
- result.append(buffer);
+ const size_t numEffects = mEffects.size();
+ result.appendFormat(" %zu effects for session %d\n", numEffects, mSessionId);
if (numEffects) {
bool locked = AudioFlinger::dumpTryLock(mLock);
@@ -2369,6 +2366,8 @@
if (locked) {
mLock.unlock();
}
+ } else {
+ write(fd, result.string(), result.size());
}
}
diff --git a/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp
index 91961d0..1a74f48 100644
--- a/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp
@@ -40,7 +40,7 @@
mTagName(tagName), mDeviceType(type), mEncodedFormats(encodedFormats)
{
mCurrentEncodedFormat = AUDIO_FORMAT_DEFAULT;
- if (type == AUDIO_DEVICE_IN_REMOTE_SUBMIX || type == AUDIO_DEVICE_OUT_REMOTE_SUBMIX ) {
+ if (audio_is_remote_submix_device(type)) {
mAddress = String8("0");
}
/* If framework runs against a pre 5.0 Audio HAL, encoded formats are absent from the config.
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index d60fc03..a12bdaa 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -169,8 +169,6 @@
broadcastDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE);
return INVALID_OPERATION;
}
- // Propagate device availability to Engine
- mEngine->setDeviceConnectionState(device, state);
// outputs should never be empty here
ALOG_ASSERT(outputs.size() != 0, "setDeviceConnectionState():"
@@ -200,8 +198,6 @@
// Reset active device codec
device->setEncodedFormat(AUDIO_FORMAT_DEFAULT);
- // Propagate device availability to Engine
- mEngine->setDeviceConnectionState(device, state);
} break;
default:
@@ -209,6 +205,9 @@
return BAD_VALUE;
}
+ // Propagate device availability to Engine
+ setEngineDeviceConnectionState(device, state);
+
// No need to evaluate playback routing when connecting a remote submix
// output device used by a dynamic policy of type recorder as no
// playback use case is affected.
@@ -318,9 +317,6 @@
if (mAvailableInputDevices.add(device) < 0) {
return NO_MEMORY;
}
-
- // Propagate device availability to Engine
- mEngine->setDeviceConnectionState(device, state);
} break;
// handle input device disconnection
@@ -337,9 +333,6 @@
checkInputsForDevice(device, state, inputs);
mAvailableInputDevices.remove(device);
-
- // Propagate device availability to Engine
- mEngine->setDeviceConnectionState(device, state);
} break;
default:
@@ -347,6 +340,9 @@
return BAD_VALUE;
}
+ // Propagate device availability to Engine
+ setEngineDeviceConnectionState(device, state);
+
closeAllInputs();
// As the input device list can impact the output device selection, update
// getDeviceForStrategy() cache
@@ -369,6 +365,17 @@
return BAD_VALUE;
}
+void AudioPolicyManager::setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
+ audio_policy_dev_state_t state) {
+
+ // the Engine does not have to know about remote submix devices used by dynamic audio policies
+ if (audio_is_remote_submix_device(device->type()) && device->address() != "0") {
+ return;
+ }
+ mEngine->setDeviceConnectionState(device, state);
+}
+
+
audio_policy_dev_state_t AudioPolicyManager::getDeviceConnectionState(audio_devices_t device,
const char *device_address)
{
@@ -4399,7 +4406,7 @@
continue;
}
// Device is now validated and can be appended to the available devices of the engine
- mEngine->setDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
+ setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
i++;
}
};
@@ -4413,7 +4420,7 @@
status = NO_INIT;
}
// If microphones address is empty, set it according to device type
- for (size_t i = 0; i < mAvailableInputDevices.size(); i++) {
+ for (size_t i = 0; i < mAvailableInputDevices.size(); i++) {
if (mAvailableInputDevices[i]->address().isEmpty()) {
if (mAvailableInputDevices[i]->type() == AUDIO_DEVICE_IN_BUILTIN_MIC) {
mAvailableInputDevices[i]->setAddress(String8(AUDIO_BOTTOM_MICROPHONE_ADDRESS));
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 41327bc..26208c8 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -847,6 +847,10 @@
const char *device_address,
const char *device_name,
audio_format_t encodedFormat);
+
+ void setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
+ audio_policy_dev_state_t state);
+
void updateMono(audio_io_handle_t output) {
AudioParameter param;
param.addInt(String8(AudioParameter::keyMonoOutput), (int)mMasterMono);
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index e858e8d..f63fa81 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -22,8 +22,9 @@
#define __STDINT_LIMITS
#define __STDC_LIMIT_MACROS
#include <stdint.h>
-
#include <sys/time.h>
+
+#include <audio_utils/clock.h>
#include <binder/IServiceManager.h>
#include <utils/Log.h>
#include <cutils/properties.h>
@@ -48,8 +49,7 @@
static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n";
static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n";
-static const int kDumpLockRetries = 50;
-static const int kDumpLockSleepUs = 20000;
+static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
static const nsecs_t kAudioCommandTimeoutNs = seconds(3); // 3 seconds
@@ -376,17 +376,10 @@
IPCThreadState::self()->getCallingPid());
}
-static bool tryLock(Mutex& mutex)
+static bool dumpTryLock(Mutex& mutex)
{
- bool locked = false;
- for (int i = 0; i < kDumpLockRetries; ++i) {
- if (mutex.tryLock() == NO_ERROR) {
- locked = true;
- break;
- }
- usleep(kDumpLockSleepUs);
- }
- return locked;
+ status_t err = mutex.timedLock(kDumpLockTimeoutNs);
+ return err == NO_ERROR;
}
status_t AudioPolicyService::dumpInternals(int fd)
@@ -627,7 +620,7 @@
if (!dumpAllowed()) {
dumpPermissionDenial(fd);
} else {
- bool locked = tryLock(mLock);
+ bool locked = dumpTryLock(mLock);
if (!locked) {
String8 result(kDeadlockedString);
write(fd, result.string(), result.size());
@@ -1260,7 +1253,7 @@
result.append(buffer);
write(fd, result.string(), result.size());
- bool locked = tryLock(mLock);
+ bool locked = dumpTryLock(mLock);
if (!locked) {
String8 result2(kCmdDeadlockedString);
write(fd, result2.string(), result2.size());
diff --git a/services/soundtrigger/Android.bp b/services/soundtrigger/Android.bp
index 1f2283a..3f02f48 100644
--- a/services/soundtrigger/Android.bp
+++ b/services/soundtrigger/Android.bp
@@ -28,6 +28,7 @@
"libhardware",
"libsoundtrigger",
"libaudioclient",
+ "libaudioutils",
"libmediautils",
"libhwbinder",
diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp
index fe2ccf2..f89683a 100644
--- a/services/soundtrigger/SoundTriggerHwService.cpp
+++ b/services/soundtrigger/SoundTriggerHwService.cpp
@@ -22,6 +22,7 @@
#include <sys/types.h>
#include <pthread.h>
+#include <audio_utils/clock.h>
#include <system/sound_trigger.h>
#include <cutils/atomic.h>
#include <cutils/properties.h>
@@ -146,20 +147,12 @@
}
-static const int kDumpLockRetries = 50;
-static const int kDumpLockSleep = 60000;
+static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
-static bool tryLock(Mutex& mutex)
+static bool dumpTryLock(Mutex& mutex)
{
- bool locked = false;
- for (int i = 0; i < kDumpLockRetries; ++i) {
- if (mutex.tryLock() == NO_ERROR) {
- locked = true;
- break;
- }
- usleep(kDumpLockSleep);
- }
- return locked;
+ status_t err = mutex.timedLock(kDumpLockTimeoutNs);
+ return err == NO_ERROR;
}
status_t SoundTriggerHwService::dump(int fd, const Vector<String16>& args __unused) {
@@ -168,7 +161,7 @@
result.appendFormat("Permission Denial: can't dump SoundTriggerHwService");
write(fd, result.string(), result.size());
} else {
- bool locked = tryLock(mServiceLock);
+ bool locked = dumpTryLock(mServiceLock);
// failed to lock - SoundTriggerHwService is probably deadlocked
if (!locked) {
result.append("SoundTriggerHwService may be deadlocked\n");