Merge "Add audio attributes info when starting aaudio tracks on MMAP mix." into rvc-dev
diff --git a/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp b/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp
index 546eb3e..8b7f57d 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp
@@ -356,6 +356,11 @@
Status status = Status::OK;
bool isOfflineLicense = responseString.find(kOfflineLicense) != std::string::npos;
+ if (scopeId.size() < kKeySetIdPrefix.size()) {
+ android_errorWriteLog(0x534e4554, "144507096");
+ _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, hidl_vec<uint8_t>());
+ return Void();
+ }
bool isRelease = (memcmp(scopeId.data(), kKeySetIdPrefix.data(), kKeySetIdPrefix.size()) == 0);
if (isRelease) {
keySetId.assign(scopeId.begin(), scopeId.end());
diff --git a/media/audioserver/main_audioserver.cpp b/media/audioserver/main_audioserver.cpp
index 70ea60d..f9f4f31 100644
--- a/media/audioserver/main_audioserver.cpp
+++ b/media/audioserver/main_audioserver.cpp
@@ -26,7 +26,7 @@
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <hidl/HidlTransportSupport.h>
-#include <media/MediaUtils.h>
+#include <mediautils/LimitProcessMemory.h>
#include <utils/Log.h>
// from LOCAL_C_INCLUDES
diff --git a/media/codec2/sfplugin/CCodecBuffers.cpp b/media/codec2/sfplugin/CCodecBuffers.cpp
index 265eeb7..668f892 100644
--- a/media/codec2/sfplugin/CCodecBuffers.cpp
+++ b/media/codec2/sfplugin/CCodecBuffers.cpp
@@ -127,20 +127,26 @@
mDelay = delay;
mPadding = padding;
mSampleRate = sampleRate;
- setSkipCutBuffer(delay, padding, channelCount);
+ mChannelCount = channelCount;
+ setSkipCutBuffer(delay, padding);
}
void OutputBuffers::updateSkipCutBuffer(int32_t sampleRate, int32_t channelCount) {
if (mSkipCutBuffer == nullptr) {
return;
}
+ if (mSampleRate == sampleRate && mChannelCount == channelCount) {
+ return;
+ }
int32_t delay = mDelay;
int32_t padding = mPadding;
if (sampleRate != mSampleRate) {
delay = ((int64_t)delay * sampleRate) / mSampleRate;
padding = ((int64_t)padding * sampleRate) / mSampleRate;
}
- setSkipCutBuffer(delay, padding, channelCount);
+ mSampleRate = sampleRate;
+ mChannelCount = channelCount;
+ setSkipCutBuffer(delay, padding);
}
void OutputBuffers::submit(const sp<MediaCodecBuffer> &buffer) {
@@ -153,14 +159,14 @@
mSkipCutBuffer = scb;
}
-void OutputBuffers::setSkipCutBuffer(int32_t skip, int32_t cut, int32_t channelCount) {
+void OutputBuffers::setSkipCutBuffer(int32_t skip, int32_t cut) {
if (mSkipCutBuffer != nullptr) {
size_t prevSize = mSkipCutBuffer->size();
if (prevSize != 0u) {
ALOGD("[%s] Replacing SkipCutBuffer holding %zu bytes", mName, prevSize);
}
}
- mSkipCutBuffer = new SkipCutBuffer(skip, cut, channelCount);
+ mSkipCutBuffer = new SkipCutBuffer(skip, cut, mChannelCount);
}
// LocalBufferPool
diff --git a/media/codec2/sfplugin/CCodecBuffers.h b/media/codec2/sfplugin/CCodecBuffers.h
index bae08e0..85ca5d5 100644
--- a/media/codec2/sfplugin/CCodecBuffers.h
+++ b/media/codec2/sfplugin/CCodecBuffers.h
@@ -228,8 +228,9 @@
int32_t mDelay;
int32_t mPadding;
int32_t mSampleRate;
+ int32_t mChannelCount;
- void setSkipCutBuffer(int32_t skip, int32_t cut, int32_t channelCount);
+ void setSkipCutBuffer(int32_t skip, int32_t cut);
DISALLOW_EVIL_CONSTRUCTORS(OutputBuffers);
};
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 3aba3cd..b72a8cc 100755
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -1075,6 +1075,8 @@
// drop it now to reduce our footprint
free(mLastTrack->mTx3gBuffer);
mLastTrack->mTx3gBuffer = NULL;
+ mLastTrack->mTx3gFilled = 0;
+ mLastTrack->mTx3gSize = 0;
}
const char *mime;
@@ -1259,7 +1261,7 @@
*/
mLastTrack->elst_initial_empty_edit_ticks = segment_duration;
} else if (media_time >= 0 && i == 0) {
- ALOGV("first edit list entry");
+ ALOGV("first edit list entry - from gapless playback files");
mLastTrack->elst_media_time = media_time;
mLastTrack->elst_segment_duration = segment_duration;
ALOGV("segment_duration: %" PRIu64 " media_time: %" PRId64,
@@ -1269,10 +1271,6 @@
} else if (empty_edit_present && i == 1) {
// Process second entry only when the first entry was an empty edit entry.
ALOGV("second edit list entry");
- mLastTrack->elst_media_time = media_time;
- mLastTrack->elst_segment_duration = segment_duration;
- ALOGV("segment_duration: %" PRIu64 " media_time: %" PRId64,
- segment_duration, media_time);
mLastTrack->elst_shift_start_ticks = media_time;
} else {
ALOGW("for now, unsupported entry in edit list %" PRIu32, entry_count);
@@ -2787,6 +2785,10 @@
// if those apps are compensating for it, we'd break them with such a change
//
+ if (mLastTrack->mTx3gBuffer == NULL) {
+ mLastTrack->mTx3gSize = 0;
+ mLastTrack->mTx3gFilled = 0;
+ }
if (mLastTrack->mTx3gSize - mLastTrack->mTx3gFilled < chunk_size) {
size_t growth = kTx3gGrowth;
if (growth < chunk_size) {
@@ -5842,7 +5844,7 @@
ReadOptions::SeekMode mode;
if (options && options->getSeekTo(&seekTimeUs, &mode)) {
-
+ ALOGV("seekTimeUs:%" PRId64, seekTimeUs);
if (mIsHeif) {
CHECK(mSampleTable == NULL);
CHECK(mItemTable != NULL);
@@ -5946,7 +5948,11 @@
sampleTime += mElstInitialEmptyEditTicks;
}
if (mElstShiftStartTicks > 0){
- sampleTime -= mElstShiftStartTicks;
+ if (sampleTime > mElstShiftStartTicks) {
+ sampleTime -= mElstShiftStartTicks;
+ } else {
+ sampleTime = 0;
+ }
}
targetSampleTimeUs = (sampleTime * 1000000ll) / mTimescale;
}
@@ -6275,6 +6281,7 @@
int64_t seekTimeUs;
ReadOptions::SeekMode mode;
if (options && options->getSeekTo(&seekTimeUs, &mode)) {
+ ALOGV("seekTimeUs:%" PRId64, seekTimeUs);
int64_t elstInitialEmptyEditUs = 0, elstShiftStartUs = 0;
if (mElstInitialEmptyEditTicks > 0) {
elstInitialEmptyEditUs = ((long double)mElstInitialEmptyEditTicks * 1000000) /
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index b961209..ff2608c 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -1479,6 +1479,14 @@
return aps->setA11yServicesUids(uids);
}
+status_t AudioSystem::setCurrentImeUid(uid_t uid)
+{
+ const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ return aps->setCurrentImeUid(uid);
+}
+
bool AudioSystem::isHapticPlaybackSupported()
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index 4d2e369..1fd17fd 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -114,6 +114,7 @@
GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY,
GET_DEVICES_FOR_ATTRIBUTES,
AUDIO_MODULES_UPDATED, // oneway
+ SET_CURRENT_IME_UID,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -1145,6 +1146,18 @@
return static_cast <status_t> (reply.readInt32());
}
+ virtual status_t setCurrentImeUid(uid_t uid)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(uid);
+ status_t status = remote()->transact(SET_CURRENT_IME_UID, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return static_cast <status_t> (reply.readInt32());
+ }
+
virtual bool isHapticPlaybackSupported()
{
Parcel data, reply;
@@ -1529,7 +1542,8 @@
case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
case GET_DEVICES_FOR_ATTRIBUTES:
case SET_ALLOWED_CAPTURE_POLICY:
- case AUDIO_MODULES_UPDATED: {
+ case AUDIO_MODULES_UPDATED:
+ case SET_CURRENT_IME_UID: {
if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
__func__, code, IPCThreadState::self()->getCallingPid(),
@@ -2680,6 +2694,18 @@
return NO_ERROR;
} break;
+ case SET_CURRENT_IME_UID: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ int32_t uid;
+ status_t status = data.readInt32(&uid);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ status = setCurrentImeUid(uid);
+ reply->writeInt32(static_cast <int32_t>(status));
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index 6e395e0..575c910 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -399,6 +399,7 @@
static status_t setAssistantUid(uid_t uid);
static status_t setA11yServicesUids(const std::vector<uid_t>& uids);
+ static status_t setCurrentImeUid(uid_t uid);
static bool isHapticPlaybackSupported();
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index 0ceca85..62066bf 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -221,6 +221,7 @@
virtual status_t setAssistantUid(uid_t uid) = 0;
virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids) = 0;
+ virtual status_t setCurrentImeUid(uid_t uid) = 0;
virtual bool isHapticPlaybackSupported() = 0;
virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies) = 0;
diff --git a/media/libmedia/Android.bp b/media/libmedia/Android.bp
index 867187d..1df7c88 100644
--- a/media/libmedia/Android.bp
+++ b/media/libmedia/Android.bp
@@ -272,7 +272,6 @@
"IRemoteDisplay.cpp",
"IRemoteDisplayClient.cpp",
"IStreamSource.cpp",
- "MediaUtils.cpp",
"Metadata.cpp",
"mediarecorder.cpp",
"IMediaMetadataRetriever.cpp",
@@ -295,7 +294,6 @@
},
header_libs: [
- "bionic_libc_platform_headers",
"libstagefright_headers",
"media_ndk_headers",
],
@@ -334,7 +332,6 @@
],
static_libs: [
- "libc_malloc_debug_backtrace", // for memory heap analysis
"resourcemanager_aidl_interface-ndk_platform",
],
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index 7fec072..1395c27 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -221,6 +221,7 @@
void MediaCodecSource::Puller::resume() {
Mutexed<Queue>::Locked queue(mQueue);
+ queue->flush();
queue->mPaused = false;
}
diff --git a/media/libstagefright/bqhelper/GraphicBufferSource.cpp b/media/libstagefright/bqhelper/GraphicBufferSource.cpp
index 986c9ac..cff14ac 100644
--- a/media/libstagefright/bqhelper/GraphicBufferSource.cpp
+++ b/media/libstagefright/bqhelper/GraphicBufferSource.cpp
@@ -1423,7 +1423,7 @@
// stall since no future events are expected.
mEndOfStream = true;
- if (mExecuting && !haveAvailableBuffers_l()) {
+ if (mStopTimeUs == -1 && mExecuting && !haveAvailableBuffers_l()) {
submitEndOfInputStream_l();
}
diff --git a/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp b/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp
index 1e434cb..9df3508 100644
--- a/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp
+++ b/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp
@@ -338,6 +338,12 @@
ABitReader bits(buffer->data() + offset, buffer->size() - offset);
unsigned auxSize = bits.getBits(mAuxiliaryDataSizeLength);
+ if (buffer->size() < auxSize) {
+ ALOGE("b/123940919 auxSize %u", auxSize);
+ android_errorWriteLog(0x534e4554, "123940919");
+ queue->erase(queue->begin());
+ return MALFORMED_PACKET;
+ }
offset += (mAuxiliaryDataSizeLength + auxSize + 7) / 8;
}
@@ -346,6 +352,12 @@
it != headers.end(); ++it) {
const AUHeader &header = *it;
+ if (buffer->size() < header.mSize) {
+ ALOGE("b/123940919 AU_size %u", header.mSize);
+ android_errorWriteLog(0x534e4554, "123940919");
+ queue->erase(queue->begin());
+ return MALFORMED_PACKET;
+ }
if (buffer->size() < offset + header.mSize) {
return MALFORMED_PACKET;
}
diff --git a/media/utils/Android.bp b/media/utils/Android.bp
index b7037e9..e3f1e44 100644
--- a/media/utils/Android.bp
+++ b/media/utils/Android.bp
@@ -19,6 +19,7 @@
"AImageReaderUtils.cpp",
"BatteryNotifier.cpp",
"ISchedulingPolicyService.cpp",
+ "LimitProcessMemory.cpp",
"MemoryLeakTrackUtil.cpp",
"ProcessInfo.cpp",
"SchedulingPolicyService.cpp",
diff --git a/media/libmedia/MediaUtils.cpp b/media/utils/LimitProcessMemory.cpp
similarity index 97%
rename from media/libmedia/MediaUtils.cpp
rename to media/utils/LimitProcessMemory.cpp
index 5f339a5..623138f 100644
--- a/media/libmedia/MediaUtils.cpp
+++ b/media/utils/LimitProcessMemory.cpp
@@ -23,7 +23,7 @@
#include <unistd.h>
#include <bionic/malloc.h>
-#include <media/MediaUtils.h>
+#include <mediautils/LimitProcessMemory.h>
extern "C" void __scudo_set_rss_limit(size_t, int) __attribute__((weak));
diff --git a/media/utils/TimeCheck.cpp b/media/utils/TimeCheck.cpp
index 4a3e470..59d74de 100644
--- a/media/utils/TimeCheck.cpp
+++ b/media/utils/TimeCheck.cpp
@@ -100,7 +100,6 @@
bool TimeCheck::TimeCheckThread::threadLoop()
{
status_t status = TIMED_OUT;
- const char *tag;
{
AutoMutex _l(mMutex);
@@ -109,6 +108,7 @@
}
nsecs_t endTimeNs = INT64_MAX;
+ const char *tag = "<unspecified>";
// KeyedVector mMonitorRequests is ordered so take first entry as next timeout
if (mMonitorRequests.size() != 0) {
endTimeNs = mMonitorRequests.keyAt(0);
diff --git a/media/libmedia/include/media/MediaUtils.h b/media/utils/include/mediautils/LimitProcessMemory.h
similarity index 86%
rename from media/libmedia/include/media/MediaUtils.h
rename to media/utils/include/mediautils/LimitProcessMemory.h
index f80dd30..7f48b4f 100644
--- a/media/libmedia/include/media/MediaUtils.h
+++ b/media/utils/include/mediautils/LimitProcessMemory.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef _MEDIA_UTILS_H
-#define _MEDIA_UTILS_H
+#ifndef ANDROID_MEDIAUTILS_LIMIT_PROCESS_MEMORY_H
+#define ANDROID_MEDIAUTILS_LIMIT_PROCESS_MEMORY_H
namespace android {
@@ -32,4 +32,4 @@
} // namespace android
-#endif // _MEDIA_UTILS_H
+#endif // ANDROID_MEDIAUTILS_LIMIT_PROCESS_MEMORY_H
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index 8a65122..81815f8 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -212,7 +212,7 @@
bool registered = false;
bool doEnable = false;
bool enabled = false;
- audio_io_handle_t io;
+ audio_io_handle_t io = AUDIO_IO_HANDLE_NONE;
uint32_t strategy;
{
diff --git a/services/audiopolicy/engine/common/src/ProductStrategy.cpp b/services/audiopolicy/engine/common/src/ProductStrategy.cpp
index fe15ff6..151c7bb 100644
--- a/services/audiopolicy/engine/common/src/ProductStrategy.cpp
+++ b/services/audiopolicy/engine/common/src/ProductStrategy.cpp
@@ -73,10 +73,18 @@
audio_stream_type_t ProductStrategy::getStreamTypeForAttributes(
const audio_attributes_t &attr) const
{
- const auto iter = std::find_if(begin(mAttributesVector), end(mAttributesVector),
+ const auto &iter = std::find_if(begin(mAttributesVector), end(mAttributesVector),
[&attr](const auto &supportedAttr) {
return AudioProductStrategy::attributesMatches(supportedAttr.mAttributes, attr); });
- return iter != end(mAttributesVector) ? iter->mStream : AUDIO_STREAM_DEFAULT;
+ if (iter == end(mAttributesVector)) {
+ return AUDIO_STREAM_DEFAULT;
+ }
+ audio_stream_type_t streamType = iter->mStream;
+ ALOGW_IF(streamType == AUDIO_STREAM_DEFAULT,
+ "%s: Strategy %s supporting attributes %s has not stream type associated"
+ "fallback on MUSIC. Do not use stream volume API", __func__, mName.c_str(),
+ toString(attr).c_str());
+ return streamType != AUDIO_STREAM_DEFAULT ? streamType : AUDIO_STREAM_MUSIC;
}
audio_attributes_t ProductStrategy::getAttributesForStreamType(audio_stream_type_t streamType) const
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index ffc3a0f..bdd2427 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -133,12 +133,14 @@
sp<DeviceDescriptor> device =
mHwModules.getDeviceDescriptor(deviceType, device_address, device_name, encodedFormat,
state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
- if (device == 0) {
- return INVALID_OPERATION;
- }
+ return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION;
+}
+status_t AudioPolicyManager::setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device,
+ audio_policy_dev_state_t state)
+{
// handle output devices
- if (audio_is_output_device(deviceType)) {
+ if (audio_is_output_device(device->type())) {
SortedVector <audio_io_handle_t> outputs;
ssize_t index = mAvailableOutputDevices.indexOf(device);
@@ -155,7 +157,7 @@
return INVALID_OPERATION;
}
ALOGV("%s() connecting device %s format %x",
- __func__, device->toString().c_str(), encodedFormat);
+ __func__, device->toString().c_str(), device->getEncodedFormat());
// register new device as available
if (mAvailableOutputDevices.add(device) < 0) {
@@ -217,16 +219,13 @@
// output device used by a dynamic policy of type recorder as no
// playback use case is affected.
bool doCheckForDeviceAndOutputChanges = true;
- if (device->type() == AUDIO_DEVICE_OUT_REMOTE_SUBMIX
- && strncmp(device_address, "0", AUDIO_DEVICE_MAX_ADDRESS_LEN) != 0) {
+ if (device->type() == AUDIO_DEVICE_OUT_REMOTE_SUBMIX && device->address() != "0") {
for (audio_io_handle_t output : outputs) {
sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(output);
sp<AudioPolicyMix> policyMix = desc->mPolicyMix.promote();
if (policyMix != nullptr
&& policyMix->mMixType == MIX_TYPE_RECORDERS
- && strncmp(device_address,
- policyMix->mDeviceAddress.string(),
- AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) {
+ && device->address() == policyMix->mDeviceAddress.string()) {
doCheckForDeviceAndOutputChanges = false;
break;
}
@@ -272,7 +271,7 @@
// a valid device selection on those outputs.
bool force = (msdOutDevices.isEmpty() || msdOutDevices != desc->devices())
&& !desc->isDuplicated()
- && (!device_distinguishes_on_address(deviceType)
+ && (!device_distinguishes_on_address(device->type())
// always force when disconnecting (a non-duplicated device)
|| (state == AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
setOutputDevices(desc, newDevices, force, 0);
@@ -288,7 +287,7 @@
} // end if is output device
// handle input devices
- if (audio_is_input_device(deviceType)) {
+ if (audio_is_input_device(device->type())) {
ssize_t index = mAvailableInputDevices.indexOf(device);
switch (state)
{
@@ -2457,6 +2456,10 @@
audio_devices_t device)
{
auto attributes = mEngine->getAttributesForStreamType(stream);
+ if (attributes == AUDIO_ATTRIBUTES_INITIALIZER) {
+ ALOGW("%s: no group for stream %s, bailing out", __func__, toString(stream).c_str());
+ return NO_ERROR;
+ }
ALOGV("%s: stream %s attributes=%s", __func__,
toString(stream).c_str(), toString(attributes).c_str());
return setVolumeIndexForAttributes(attributes, index, device);
@@ -4444,7 +4447,7 @@
// after parsing the config, mOutputDevicesAll and mInputDevicesAll contain all known devices;
// open all output streams needed to access attached devices
- onNewAudioModulesAvailable();
+ onNewAudioModulesAvailableInt(nullptr /*newDevices*/);
// make sure default device is reachable
if (mDefaultOutputDevice == 0 || !mAvailableOutputDevices.contains(mDefaultOutputDevice)) {
@@ -4501,6 +4504,16 @@
void AudioPolicyManager::onNewAudioModulesAvailable()
{
+ DeviceVector newDevices;
+ onNewAudioModulesAvailableInt(&newDevices);
+ if (!newDevices.empty()) {
+ nextAudioPortGeneration();
+ mpClientInterface->onAudioPortListUpdate();
+ }
+}
+
+void AudioPolicyManager::onNewAudioModulesAvailableInt(DeviceVector *newDevices)
+{
for (const auto& hwModule : mHwModulesAll) {
if (std::find(mHwModules.begin(), mHwModules.end(), hwModule) != mHwModules.end()) {
continue;
@@ -4564,6 +4577,7 @@
if (!device->isAttached()) {
device->attach(hwModule);
mAvailableOutputDevices.add(device);
+ if (newDevices) newDevices->add(device);
setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
}
}
@@ -4619,6 +4633,7 @@
device->attach(hwModule);
device->importAudioPortAndPickAudioProfile(inProfile, true);
mAvailableInputDevices.add(device);
+ if (newDevices) newDevices->add(device);
setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
}
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 8121f86..c142880 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -788,6 +788,8 @@
std::unordered_map<uid_t, audio_flags_mask_t> mAllowedCapturePolicies;
private:
+ void onNewAudioModulesAvailableInt(DeviceVector *newDevices);
+
// Add or remove AC3 DTS encodings based on user preferences.
void modifySurroundFormats(const sp<DeviceDescriptor>& devDesc, FormatVector *formatsPtr);
void modifySurroundChannelMasks(ChannelMaskSet *channelMasksPtr);
@@ -878,6 +880,8 @@
const char *device_address,
const char *device_name,
audio_format_t encodedFormat);
+ status_t setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device,
+ audio_policy_dev_state_t state);
void setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
audio_policy_dev_state_t state);
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 57b23b7..6d79c94 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -1420,6 +1420,13 @@
return NO_ERROR;
}
+status_t AudioPolicyService::setCurrentImeUid(uid_t uid)
+{
+ Mutex::Autolock _l(mLock);
+ mUidPolicy->setCurrentImeUid(uid);
+ return NO_ERROR;
+}
+
bool AudioPolicyService::isHapticPlaybackSupported()
{
if (mAudioPolicyManager == NULL) {
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 59fb481..cbe6eb9 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -437,6 +437,8 @@
// OR all active clients are using HOTWORD source
// AND no call is active
// OR client has CAPTURE_AUDIO_OUTPUT privileged permission
+// OR the client is the current InputMethodService
+// AND a RTT call is active AND the source is VOICE_RECOGNITION
// OR Any client
// AND The assistant is not on TOP
// AND is on TOP or latest started
@@ -627,6 +629,12 @@
&& canCaptureIfInCallOrCommunication(current)) {
allowCapture = true;
}
+ } else if (mUidPolicy->isCurrentImeUid(current->uid)) {
+ // For current InputMethodService allow capture if:
+ // A RTT call is active AND the source is VOICE_RECOGNITION
+ if (rttCallActive && source == AUDIO_SOURCE_VOICE_RECOGNITION) {
+ allowCapture = true;
+ }
}
setAppState_l(current->portId,
allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(current->uid)) :
@@ -945,7 +953,7 @@
}
}
ActivityManager am;
- bool active = am.isUidActive(uid, String16("audioserver"));
+ bool active = am.isUidActiveOrForeground(uid, String16("audioserver"));
{
Mutex::Autolock _l(mLock);
mCachedUids.insert(std::pair<uid_t,
@@ -990,7 +998,7 @@
}
}
ActivityManager am;
- bool active = am.isUidActive(uid, String16("audioserver"));
+ bool active = am.isUidActiveOrForeground(uid, String16("audioserver"));
int state = ActivityManager::PROCESS_STATE_UNKNOWN;
if (active) {
state = am.getUidProcessState(uid, String16("audioserver"));
@@ -1876,7 +1884,7 @@
void AudioPolicyService::onNewAudioModulesAvailable()
{
- mAudioCommandThread->audioModulesUpdateCommand();
+ mOutputCommandThread->audioModulesUpdateCommand();
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 9a619dd..3f24276 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -261,6 +261,7 @@
virtual status_t setAssistantUid(uid_t uid);
virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids);
+ virtual status_t setCurrentImeUid(uid_t uid);
virtual bool isHapticPlaybackSupported();
@@ -371,7 +372,7 @@
public:
explicit UidPolicy(wp<AudioPolicyService> service)
: mService(service), mObserverRegistered(false),
- mAssistantUid(0), mRttEnabled(false) {}
+ mAssistantUid(0), mCurrentImeUid(0), mRttEnabled(false) {}
void registerSelf();
void unregisterSelf();
@@ -386,6 +387,8 @@
void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
bool isA11yUid(uid_t uid);
bool isA11yOnTop();
+ void setCurrentImeUid(uid_t uid) { mCurrentImeUid = uid; }
+ bool isCurrentImeUid(uid_t uid) { return uid == mCurrentImeUid; }
void setRttEnabled(bool enabled) { mRttEnabled = enabled; }
bool isRttEnabled() { return mRttEnabled; }
@@ -417,6 +420,7 @@
std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
uid_t mAssistantUid;
std::vector<uid_t> mA11yUids;
+ uid_t mCurrentImeUid;
bool mRttEnabled;
};
diff --git a/services/audiopolicy/tests/AudioPolicyManagerTestClient.h b/services/audiopolicy/tests/AudioPolicyManagerTestClient.h
index af69466..e1721ea 100644
--- a/services/audiopolicy/tests/AudioPolicyManagerTestClient.h
+++ b/services/audiopolicy/tests/AudioPolicyManagerTestClient.h
@@ -94,6 +94,10 @@
return NO_ERROR;
}
+ void onAudioPortListUpdate() override {
+ ++mAudioPortListUpdateCount;
+ }
+
// Helper methods for tests
size_t getActivePatchesCount() const { return mActivePatches.size(); }
@@ -111,12 +115,15 @@
mAllowedModuleNames.swap(names);
}
+ size_t getAudioPortListUpdateCount() const { return mAudioPortListUpdateCount; }
+
private:
audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1;
audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1;
audio_patch_handle_t mNextPatchHandle = AUDIO_PATCH_HANDLE_NONE + 1;
std::map<audio_patch_handle_t, struct audio_patch> mActivePatches;
std::set<std::string> mAllowedModuleNames;
+ size_t mAudioPortListUpdateCount = 0;
};
} // namespace android
diff --git a/services/audiopolicy/tests/AudioPolicyTestManager.h b/services/audiopolicy/tests/AudioPolicyTestManager.h
index 922a538..8bab020 100644
--- a/services/audiopolicy/tests/AudioPolicyTestManager.h
+++ b/services/audiopolicy/tests/AudioPolicyTestManager.h
@@ -29,6 +29,7 @@
using AudioPolicyManager::getOutputs;
using AudioPolicyManager::getAvailableOutputDevices;
using AudioPolicyManager::getAvailableInputDevices;
+ uint32_t getAudioPortGeneration() const { return mAudioPortGeneration; }
};
} // namespace android
diff --git a/services/audiopolicy/tests/audiopolicymanager_tests.cpp b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
index 7d92f34..a0074bc 100644
--- a/services/audiopolicy/tests/audiopolicymanager_tests.cpp
+++ b/services/audiopolicy/tests/audiopolicymanager_tests.cpp
@@ -104,8 +104,10 @@
audio_port_handle_t *portId = nullptr);
PatchCountCheck snapshotPatchCount() { return PatchCountCheck(mClient.get()); }
- void findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
- const std::string &address, audio_port &foundPort);
+ // Tries to find a device port. If 'foundPort' isn't nullptr,
+ // will generate a failure if the port hasn't been found.
+ bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
+ const std::string &address, audio_port *foundPort);
static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch);
std::unique_ptr<AudioPolicyManagerTestClient> mClient;
@@ -211,30 +213,36 @@
ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
}
-void AudioPolicyManagerTest::findDevicePort(audio_port_role_t role,
- audio_devices_t deviceType, const std::string &address, audio_port &foundPort) {
+bool AudioPolicyManagerTest::findDevicePort(audio_port_role_t role,
+ audio_devices_t deviceType, const std::string &address, audio_port *foundPort) {
uint32_t numPorts = 0;
uint32_t generation1;
status_t ret;
ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
- ASSERT_EQ(NO_ERROR, ret);
+ EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
+ if (HasFailure()) return false;
uint32_t generation2;
struct audio_port ports[numPorts];
ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation2);
- ASSERT_EQ(NO_ERROR, ret);
- ASSERT_EQ(generation1, generation2);
+ EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
+ EXPECT_EQ(generation1, generation2) << "Generations changed during ports retrieval";
+ if (HasFailure()) return false;
for (const auto &port : ports) {
if (port.role == role && port.ext.device.type == deviceType &&
(strncmp(port.ext.device.address, address.c_str(),
AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0)) {
- foundPort = port;
- return;
+ if (foundPort) *foundPort = port;
+ return true;
}
}
- GTEST_FAIL() << "Device port with role " << role << " and address " << address << "not found";
+ if (foundPort) {
+ ADD_FAILURE() << "Device port with role " << role << " and address "
+ << address << " not found";
+ }
+ return false;
}
audio_port_handle_t AudioPolicyManagerTest::getDeviceIdFromPatch(
@@ -694,8 +702,8 @@
ASSERT_EQ(NO_ERROR, ret);
struct audio_port extractionPort;
- findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
- mMixAddress, extractionPort);
+ ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
+ mMixAddress, &extractionPort));
audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
audio_source_t source = AUDIO_SOURCE_REMOTE_SUBMIX;
@@ -707,8 +715,8 @@
ASSERT_EQ(NO_ERROR, mManager->startInput(mPortId));
ASSERT_EQ(extractionPort.id, selectedDeviceId);
- findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
- mMixAddress, mInjectionPort);
+ ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
+ mMixAddress, &mInjectionPort));
}
void AudioPolicyManagerTestDPPlaybackReRouting::TearDown() {
@@ -879,8 +887,8 @@
ASSERT_EQ(NO_ERROR, ret);
struct audio_port injectionPort;
- findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
- mMixAddress, injectionPort);
+ ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
+ mMixAddress, &injectionPort));
audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
audio_usage_t usage = AUDIO_USAGE_VIRTUAL_SOURCE;
@@ -892,8 +900,8 @@
ASSERT_EQ(NO_ERROR, mManager->startOutput(mPortId));
ASSERT_EQ(injectionPort.id, getDeviceIdFromPatch(mClient->getLastAddedPatch()));
- findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
- mMixAddress, mExtractionPort);
+ ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
+ mMixAddress, &mExtractionPort));
}
void AudioPolicyManagerTestDPMixRecordInjection::TearDown() {
@@ -1028,7 +1036,7 @@
audio_port devicePort;
const audio_port_role_t role = audio_is_output_device(type)
? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
- findDevicePort(role, type, address, devicePort);
+ ASSERT_TRUE(findDevicePort(role, type, address, &devicePort));
audio_port_handle_t routedPortId = devicePort.id;
// Try start input or output according to the device type
@@ -1162,3 +1170,21 @@
ASSERT_EQ(AUDIO_POLICY_DEVICE_STATE_AVAILABLE, mManager->getDeviceConnectionState(
AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0"));
}
+
+TEST_F(AudioPolicyManagerDynamicHwModulesTest, ListAddedAudioPorts) {
+ ASSERT_FALSE(
+ findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", nullptr));
+ mClient->swapAllowedModuleNames({"primary", "r_submix"});
+ mManager->onNewAudioModulesAvailable();
+ struct audio_port port;
+ ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", &port));
+}
+
+TEST_F(AudioPolicyManagerDynamicHwModulesTest, ClientIsUpdated) {
+ const size_t prevAudioPortListUpdateCount = mClient->getAudioPortListUpdateCount();
+ const uint32_t prevAudioPortGeneration = mManager->getAudioPortGeneration();
+ mClient->swapAllowedModuleNames({"primary", "r_submix"});
+ mManager->onNewAudioModulesAvailable();
+ EXPECT_GT(mClient->getAudioPortListUpdateCount(), prevAudioPortListUpdateCount);
+ EXPECT_GT(mManager->getAudioPortGeneration(), prevAudioPortGeneration);
+}
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 9bc79e0..9af1c36 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -3188,7 +3188,9 @@
// some polling which should happen pretty rarely anyway as the race is hard
// to hit.
active = mActiveUids.find(uid) != mActiveUids.end();
- if (!active) active = am.isUidActive(uid, callingPackage);
+ if (!active) {
+ active = am.isUidActiveOrForeground(uid, callingPackage);
+ }
if (active) {
break;
}
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 87bdef6..2d46122 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1722,6 +1722,13 @@
return res;
}
+ // Fill in JPEG_QUALITY if not available
+ if (!mRequestTemplateCache[templateId].exists(ANDROID_JPEG_QUALITY)) {
+ static const uint8_t kDefaultJpegQuality = 95;
+ mRequestTemplateCache[templateId].update(ANDROID_JPEG_QUALITY,
+ &kDefaultJpegQuality, 1);
+ }
+
*request = mRequestTemplateCache[templateId];
mLastTemplateId = templateId;
}
diff --git a/services/mediaextractor/Android.bp b/services/mediaextractor/Android.bp
index b909ea4..0b25d62 100644
--- a/services/mediaextractor/Android.bp
+++ b/services/mediaextractor/Android.bp
@@ -29,6 +29,7 @@
shared_libs: [
"libmedia",
"libmediaextractorservice",
+ "libmediautils",
"libbinder",
"libutils",
"liblog",
diff --git a/services/mediaextractor/main_extractorservice.cpp b/services/mediaextractor/main_extractorservice.cpp
index b116b14..f21574f 100644
--- a/services/mediaextractor/main_extractorservice.cpp
+++ b/services/mediaextractor/main_extractorservice.cpp
@@ -21,7 +21,7 @@
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
-#include <media/MediaUtils.h>
+#include <mediautils/LimitProcessMemory.h>
#include <string>
#include <android-base/logging.h>
diff --git a/services/mediametrics/Android.bp b/services/mediametrics/Android.bp
index 30ec5b7..ec59ec1 100644
--- a/services/mediametrics/Android.bp
+++ b/services/mediametrics/Android.bp
@@ -11,7 +11,6 @@
shared_libs: [
"libbinder",
"liblog",
- "libmedia", // limitProcessMemory
"libmediametricsservice",
"libmediautils",
"libutils",
diff --git a/services/mediametrics/main_mediametrics.cpp b/services/mediametrics/main_mediametrics.cpp
index 3c71e42..6992c32 100644
--- a/services/mediametrics/main_mediametrics.cpp
+++ b/services/mediametrics/main_mediametrics.cpp
@@ -23,7 +23,7 @@
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
-#include <media/MediaUtils.h>
+#include <mediautils/LimitProcessMemory.h>
int main(int argc __unused, char **argv __unused)
{