Merge "MPEG4Writer: Fix unsigned integer overflow" into main
diff --git a/media/audioaidlconversion/AidlConversionNdk.cpp b/media/audioaidlconversion/AidlConversionNdk.cpp
index 7ab616a..5f7260d 100644
--- a/media/audioaidlconversion/AidlConversionNdk.cpp
+++ b/media/audioaidlconversion/AidlConversionNdk.cpp
@@ -197,7 +197,8 @@
// static
ConversionResult<SourceMetadata>
-legacy2aidl_SourceMetadata(const std::vector<playback_track_metadata_v7_t>& legacy) {
+legacy2aidl_playback_track_metadata_v7_SourceMetadata(
+ const std::vector<playback_track_metadata_v7_t>& legacy) {
SourceMetadata aidl;
aidl.tracks = VALUE_OR_RETURN(
convertContainer<std::vector<PlaybackTrackMetadata>>(
diff --git a/media/audioaidlconversion/include/media/AidlConversionNdk.h b/media/audioaidlconversion/include/media/AidlConversionNdk.h
index b5888b3..b8a3110 100644
--- a/media/audioaidlconversion/include/media/AidlConversionNdk.h
+++ b/media/audioaidlconversion/include/media/AidlConversionNdk.h
@@ -58,7 +58,8 @@
legacy2aidl_record_track_metadata_v7_RecordTrackMetadata(const record_track_metadata_v7& legacy);
ConversionResult<hardware::audio::common::SourceMetadata>
-legacy2aidl_SourceMetadata(const std::vector<playback_track_metadata_v7_t>& legacy);
+legacy2aidl_playback_track_metadata_v7_SourceMetadata(
+ const std::vector<playback_track_metadata_v7_t>& legacy);
} // namespace android
} // namespace aidl
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index 373f86e..68f1dda 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -96,11 +96,14 @@
public:
static sp<CCodecWatchdog> getInstance() {
- static sp<CCodecWatchdog> instance(new CCodecWatchdog);
- static std::once_flag flag;
- // Call Init() only once.
- std::call_once(flag, Init, instance);
- return instance;
+ static sp<CCodecWatchdog> sInstance = [] {
+ sp<CCodecWatchdog> instance = new CCodecWatchdog;
+ // the instance should never get destructed
+ instance->incStrong((void *)CCodecWatchdog::getInstance);
+ instance->init();
+ return instance;
+ }();
+ return sInstance;
}
~CCodecWatchdog() = default;
@@ -146,11 +149,11 @@
private:
CCodecWatchdog() : mLooper(new ALooper) {}
- static void Init(const sp<CCodecWatchdog> &thiz) {
- ALOGV("Init");
- thiz->mLooper->setName("CCodecWatchdog");
- thiz->mLooper->registerHandler(thiz);
- thiz->mLooper->start();
+ void init() {
+ ALOGV("init");
+ mLooper->setName("CCodecWatchdog");
+ mLooper->registerHandler(this);
+ mLooper->start();
}
sp<ALooper> mLooper;
diff --git a/media/libaudiohal/impl/AidlUtils.h b/media/libaudiohal/impl/AidlUtils.h
index fcd7a01..97a5bba 100644
--- a/media/libaudiohal/impl/AidlUtils.h
+++ b/media/libaudiohal/impl/AidlUtils.h
@@ -25,32 +25,6 @@
namespace android {
-/*
- * Helper macro to add instance name, function name in logs
- * classes should provide getInstanceName and getClassName API to use these macros.
- * print function names along with instance name.
- *
- * Usage:
- * AUGMENT_LOG(I, "hello!");
- * AUGMENT_LOG(W, "value: %d", value);
- *
- * AUGMENT_LOG_IF(D, value < 0, "negative");
- * AUGMENT_LOG_IF(E, value < 0, "bad value: %d", value);
- */
-
-#define AUGMENT_LOG(level, ...) \
- ALOG##level("[%s] %s: " __android_second(0, __VA_ARGS__, ""), getInstanceName().c_str(), \
- __func__ __android_rest(__VA_ARGS__))
-
-#define AUGMENT_LOG_IF(level, cond, ...) \
- ALOG##level##_IF(cond, "[%s] %s: " __android_second(0, __VA_ARGS__, ""), \
- getInstanceName().c_str(), __func__ __android_rest(__VA_ARGS__))
-// Used to register an entry into the function
-#define LOG_ENTRY() ALOGD("[%s] %s", getInstanceName().c_str(), __func__)
-
-// entry logging as verbose level
-#define LOG_ENTRY_V() ALOGV("[%s] %s", getInstanceName().c_str(), __func__)
-
class HalDeathHandler {
public:
static HalDeathHandler& getInstance();
diff --git a/media/libaudiohal/impl/ConversionHelperAidl.h b/media/libaudiohal/impl/ConversionHelperAidl.h
index 2d19bee..fe00fb2 100644
--- a/media/libaudiohal/impl/ConversionHelperAidl.h
+++ b/media/libaudiohal/impl/ConversionHelperAidl.h
@@ -32,6 +32,28 @@
namespace android {
+/*
+ * Helper macro to add instance name, function name in logs
+ * classes should provide getInstanceName API to use these macros.
+ * print function names along with instance name.
+ *
+ * Usage:
+ * AUGMENT_LOG(D);
+ * AUGMENT_LOG(I, "hello!");
+ * AUGMENT_LOG(W, "value: %d", value);
+ *
+ * AUGMENT_LOG_IF(D, value < 0, "negative");
+ * AUGMENT_LOG_IF(E, value < 0, "bad value: %d", value);
+ */
+
+#define AUGMENT_LOG(level, ...) \
+ ALOG##level("[%s] %s" __VA_OPT__(": " __android_second(0, __VA_ARGS__, "")), \
+ getInstanceName().c_str(), __func__ __VA_OPT__(__android_rest(__VA_ARGS__)))
+
+#define AUGMENT_LOG_IF(level, cond, ...) \
+ ALOG##level##_IF(cond, "[%s] %s" __VA_OPT__(": " __android_second(0, __VA_ARGS__, "")), \
+ getInstanceName().c_str(), __func__ __VA_OPT__(__android_rest(__VA_ARGS__)))
+
class Args {
public:
explicit Args(const Vector<String16>& args)
diff --git a/media/libaudiohal/impl/DeviceHalAidl.cpp b/media/libaudiohal/impl/DeviceHalAidl.cpp
index f301a77..36f4f70 100644
--- a/media/libaudiohal/impl/DeviceHalAidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalAidl.cpp
@@ -140,7 +140,7 @@
}
status_t DeviceHalAidl::getSupportedModes(std::vector<media::audio::common::AudioMode> *modes) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
RETURN_IF_TELEPHONY_NOT_INIT(INVALID_OPERATION);
@@ -164,7 +164,7 @@
}
status_t DeviceHalAidl::initCheck() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
std::lock_guard l(mLock);
@@ -196,7 +196,7 @@
}
status_t DeviceHalAidl::getMasterVolume(float *volume) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (volume == nullptr) {
@@ -227,7 +227,7 @@
}
status_t DeviceHalAidl::getMicMute(bool *state) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -247,7 +247,7 @@
}
status_t DeviceHalAidl::getMasterMute(bool *state) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -306,7 +306,7 @@
}
status_t DeviceHalAidl::getInputBufferSize(struct audio_config* config, size_t* size) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -462,6 +462,7 @@
sp<StreamOutHalInterface>* outStream,
const std::vector<playback_track_metadata_v7_t>& sourceMetadata) {
AUGMENT_LOG(D, "handle: %d devices %0x flags %0x", handle, devices, flags);
+
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (outStream == nullptr || config == nullptr) {
@@ -478,7 +479,7 @@
int32_t aidlOutputFlags = VALUE_OR_RETURN_STATUS(
::aidl::android::legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
SourceMetadata aidlMetadata = VALUE_OR_RETURN_STATUS(
- ::aidl::android::legacy2aidl_SourceMetadata(sourceMetadata));
+ ::aidl::android::legacy2aidl_playback_track_metadata_v7_SourceMetadata(sourceMetadata));
AudioIoFlags aidlFlags = AudioIoFlags::make<AudioIoFlags::Tag::output>(aidlOutputFlags);
AudioPortConfig mixPortConfig;
AudioPatch aidlPatch;
@@ -611,7 +612,7 @@
}
status_t DeviceHalAidl::supportsAudioPatches(bool* supportsPatches) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (supportsPatches == nullptr) {
AUGMENT_LOG(E, "uninitialized supportsPatches");
@@ -727,7 +728,7 @@
}
status_t DeviceHalAidl::getAudioPort(struct audio_port* port) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (port == nullptr) {
AUGMENT_LOG(E, "port not initialized");
@@ -740,7 +741,7 @@
}
status_t DeviceHalAidl::getAudioPort(struct audio_port_v7 *port) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -772,7 +773,7 @@
status_t DeviceHalAidl::getAudioMixPort(const struct audio_port_v7 *devicePort,
struct audio_port_v7 *mixPort) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -796,7 +797,7 @@
}
status_t DeviceHalAidl::setAudioPortConfig(const struct audio_port_config* config) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -815,7 +816,7 @@
}
MicrophoneInfoProvider::Info const* DeviceHalAidl::getMicrophoneInfo() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT({});
@@ -842,7 +843,7 @@
status_t DeviceHalAidl::getMicrophones(
std::vector<audio_microphone_characteristic_t>* microphones) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -866,7 +867,7 @@
status_t DeviceHalAidl::addDeviceEffect(
const struct audio_port_config *device, sp<EffectHalInterface> effect) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -899,7 +900,7 @@
}
status_t DeviceHalAidl::removeDeviceEffect(
const struct audio_port_config *device, sp<EffectHalInterface> effect) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (device == nullptr || effect == nullptr) {
@@ -931,7 +932,7 @@
status_t DeviceHalAidl::getMmapPolicyInfos(
media::audio::common::AudioMMapPolicyType policyType,
std::vector<media::audio::common::AudioMMapPolicyInfo>* policyInfos) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -953,7 +954,7 @@
}
int32_t DeviceHalAidl::getAAudioMixerBurstCount() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -965,7 +966,7 @@
}
int32_t DeviceHalAidl::getAAudioHardwareBurstMinUsec() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -977,7 +978,7 @@
}
error::Result<audio_hw_sync_t> DeviceHalAidl::getHwAvSync() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -994,7 +995,7 @@
}
status_t DeviceHalAidl::supportsBluetoothVariableLatency(bool* supports) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
@@ -1006,7 +1007,7 @@
status_t DeviceHalAidl::getSoundDoseInterface([[maybe_unused]] const std::string& module,
::ndk::SpAIBinder* soundDoseBinder) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (soundDoseBinder == nullptr) {
@@ -1028,7 +1029,7 @@
}
status_t DeviceHalAidl::prepareToDisconnectExternalDevice(const struct audio_port_v7* port) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (port == nullptr) {
@@ -1067,7 +1068,7 @@
}
status_t DeviceHalAidl::setConnectedState(const struct audio_port_v7 *port, bool connected) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
if (port == nullptr) {
@@ -1099,7 +1100,7 @@
}
status_t DeviceHalAidl::setSimulateDeviceConnections(bool enabled) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
{
diff --git a/media/libaudiohal/impl/DeviceHalHidl.cpp b/media/libaudiohal/impl/DeviceHalHidl.cpp
index b48c7ed..0a262e4 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalHidl.cpp
@@ -280,11 +280,9 @@
::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::SourceMetadata hidlMetadata;
#endif
- if (status_t status = CoreUtils::sourceMetadataFromHalV7(
- sourceMetadata, true /*ignoreNonVendorTags*/, &hidlMetadata);
- status != OK) {
- return status;
- }
+ RETURN_STATUS_IF_ERROR(CoreUtils::sourceMetadataFromHalV7(
+ sourceMetadata, true /*ignoreNonVendorTags*/, &hidlMetadata
+ ));
#if !(MAJOR_VERSION == 7 && MINOR_VERSION == 1)
//TODO: b/193496180 use spatializer flag at audio HAL when available
diff --git a/media/libaudiohal/impl/StreamHalAidl.cpp b/media/libaudiohal/impl/StreamHalAidl.cpp
index 8a15e7a..01ebe1b 100644
--- a/media/libaudiohal/impl/StreamHalAidl.cpp
+++ b/media/libaudiohal/impl/StreamHalAidl.cpp
@@ -89,7 +89,7 @@
mContext.getBufferDurationMs(mConfig.sample_rate))
* NANOS_PER_MILLISECOND)
{
- LOG_ENTRY();
+ AUGMENT_LOG(D);
{
std::lock_guard l(mLock);
mLastReply.latencyMs = nominalLatency;
@@ -104,7 +104,7 @@
}
StreamHalAidl::~StreamHalAidl() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
if (mStream != nullptr) {
ndk::ScopedAStatus status = mStream->close();
AUGMENT_LOG_IF(E, !status.isOk(), "status %s", status.getDescription().c_str());
@@ -112,7 +112,7 @@
}
status_t StreamHalAidl::getBufferSize(size_t *size) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
if (size == nullptr) {
return BAD_VALUE;
}
@@ -126,7 +126,7 @@
}
status_t StreamHalAidl::getAudioProperties(audio_config_base_t *configBase) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
if (configBase == nullptr) {
return BAD_VALUE;
}
@@ -136,7 +136,7 @@
}
status_t StreamHalAidl::setParameters(const String8& kvPairs) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
TIME_CHECK();
if (!mStream) return NO_INIT;
AudioParameter parameters(kvPairs);
@@ -151,7 +151,7 @@
}
status_t StreamHalAidl::getParameters(const String8& keys __unused, String8 *values) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (values == nullptr) {
@@ -163,7 +163,7 @@
}
status_t StreamHalAidl::getFrameSize(size_t *size) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
if (size == nullptr) {
return BAD_VALUE;
}
@@ -175,7 +175,7 @@
}
status_t StreamHalAidl::addEffect(sp<EffectHalInterface> effect) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (effect == nullptr) {
@@ -186,7 +186,7 @@
}
status_t StreamHalAidl::removeEffect(sp<EffectHalInterface> effect) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (effect == nullptr) {
@@ -197,7 +197,7 @@
}
status_t StreamHalAidl::standby() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
const auto state = getState();
@@ -245,7 +245,7 @@
}
status_t StreamHalAidl::dump(int fd, const Vector<String16>& args) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
status_t status = mStream->dump(fd, Args(args).args(), args.size());
@@ -254,7 +254,7 @@
}
status_t StreamHalAidl::start() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (!mContext.isMmapped()) {
@@ -300,7 +300,7 @@
}
status_t StreamHalAidl::stop() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (!mContext.isMmapped()) {
@@ -325,7 +325,7 @@
}
status_t StreamHalAidl::getLatency(uint32_t *latency) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
if (!mStream) return NO_INIT;
StreamDescriptor::Reply reply;
RETURN_STATUS_IF_ERROR(updateCountersIfNeeded(&reply));
@@ -338,7 +338,7 @@
status_t StreamHalAidl::getObservablePosition(int64_t* frames, int64_t* timestamp,
StatePositions* statePositions) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
if (!mStream) return NO_INIT;
StreamDescriptor::Reply reply;
RETURN_STATUS_IF_ERROR(updateCountersIfNeeded(&reply, statePositions));
@@ -348,7 +348,7 @@
}
status_t StreamHalAidl::getHardwarePosition(int64_t *frames, int64_t *timestamp) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
if (!mStream) return NO_INIT;
StreamDescriptor::Reply reply;
RETURN_STATUS_IF_ERROR(updateCountersIfNeeded(&reply));
@@ -358,7 +358,7 @@
}
status_t StreamHalAidl::getXruns(int32_t *frames) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
if (!mStream) return NO_INIT;
StreamDescriptor::Reply reply;
RETURN_STATUS_IF_ERROR(updateCountersIfNeeded(&reply));
@@ -367,7 +367,7 @@
}
status_t StreamHalAidl::transfer(void *buffer, size_t bytes, size_t *transferred) {
- LOG_ENTRY_V();
+ AUGMENT_LOG(V);
// TIME_CHECK(); // TODO(b/243839867) reenable only when optimized.
if (!mStream || mContext.getDataMQ() == nullptr) return NO_INIT;
mWorkerTid.store(gettid(), std::memory_order_release);
@@ -418,7 +418,7 @@
}
status_t StreamHalAidl::pause(StreamDescriptor::Reply* reply) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
@@ -434,7 +434,7 @@
}
status_t StreamHalAidl::resume(StreamDescriptor::Reply* reply) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (mIsInput) {
@@ -471,7 +471,7 @@
}
status_t StreamHalAidl::drain(bool earlyNotify, StreamDescriptor::Reply* reply) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
return sendCommand(makeHalCommand<HalCommand::Tag::drain>(
@@ -482,7 +482,7 @@
}
status_t StreamHalAidl::flush(StreamDescriptor::Reply* reply) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
@@ -501,7 +501,7 @@
}
status_t StreamHalAidl::exit() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
return statusTFromBinderStatus(mStream->prepareToClose());
@@ -541,7 +541,7 @@
status_t StreamHalAidl::createMmapBuffer(int32_t minSizeFrames __unused,
struct audio_mmap_buffer_info *info) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (!mContext.isMmapped()) {
@@ -779,7 +779,7 @@
}
status_t StreamOutHalAidl::setCallback(wp<StreamOutHalInterfaceCallback> callback) {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
TIME_CHECK();
if (!mStream) return NO_INIT;
if (!mContext.isAsynchronous()) {
@@ -855,7 +855,7 @@
}
status_t StreamOutHalAidl::presentationComplete() {
- LOG_ENTRY();
+ AUGMENT_LOG(D);
return OK;
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 5907aac..5a51a91 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -7115,29 +7115,35 @@
std::vector<sp<SwAudioOutputDescriptor>> invalidatedOutputs;
// take into account dynamic audio policies related changes: if a client is now associated
// to a different policy mix than at creation time, invalidate corresponding stream
+ // invalidate clients on outputs that do not support all the newly selected devices for the
+ // strategy
for (size_t i = 0; i < mPreviousOutputs.size(); i++) {
const sp<SwAudioOutputDescriptor>& desc = mPreviousOutputs.valueAt(i);
- if (desc->isDuplicated()) {
+ if (desc->isDuplicated() || desc->getClientCount() == 0) {
continue;
}
+
for (const sp<TrackClientDescriptor>& client : desc->getClientIterable()) {
if (mEngine->getProductStrategyForAttributes(client->attributes()) != psId) {
continue;
}
+ if (!desc->supportsAllDevices(newDevices)) {
+ invalidatedOutputs.push_back(desc);
+ break;
+ }
sp<AudioPolicyMix> primaryMix;
status_t status = mPolicyMixes.getOutputForAttr(client->attributes(), client->config(),
client->uid(), client->session(), client->flags(), mAvailableOutputDevices,
nullptr /* requestedDevice */, primaryMix, nullptr /* secondaryMixes */,
unneededUsePrimaryOutputFromPolicyMixes);
- if (status != OK) {
- continue;
- }
- if ((client->getPrimaryMix() && client->getPrimaryMix() != primaryMix)
- || client->hasLostPrimaryMix()) {
- if (desc->isStrategyActive(psId) && maxLatency < desc->latency()) {
- maxLatency = desc->latency();
+ if (status == OK) {
+ if (client->getPrimaryMix() != primaryMix || client->hasLostPrimaryMix()) {
+ if (desc->isStrategyActive(psId) && maxLatency < desc->latency()) {
+ maxLatency = desc->latency();
+ }
+ invalidatedOutputs.push_back(desc);
+ break;
}
- invalidatedOutputs.push_back(desc);
}
}
}
diff --git a/services/audiopolicy/tests/Android.bp b/services/audiopolicy/tests/Android.bp
index df0c3a1..b5d3188 100644
--- a/services/audiopolicy/tests/Android.bp
+++ b/services/audiopolicy/tests/Android.bp
@@ -106,6 +106,6 @@
"-Werror",
],
- test_suites: ["device-tests"],
+ test_suites: ["general-tests"],
}