Merge changes from topic "system_usages"

* changes:
  Adding system usages to AAudio
  Adding support for new System Usages
gugelfrei
Hayden Gomes 5 years ago committed by Android (Google) Code Review
commit c55cdbafff

@ -227,6 +227,8 @@ enum {
};
typedef int32_t aaudio_performance_mode_t;
#define AAUDIO_SYSTEM_USAGE_OFFSET 1000
/**
* The USAGE attribute expresses "why" you are playing a sound, what is this sound used for.
* This information is used by certain platforms or routing policies
@ -297,7 +299,31 @@ enum {
/**
* Use this for audio responses to user queries, audio instructions or help utterances.
*/
AAUDIO_USAGE_ASSISTANT = 16
AAUDIO_USAGE_ASSISTANT = 16,
/**
* Use this in case of playing sounds in an emergency.
* Privileged MODIFY_AUDIO_ROUTING permission required.
*/
AAUDIO_SYSTEM_USAGE_EMERGENCY = AAUDIO_SYSTEM_USAGE_OFFSET,
/**
* Use this for safety sounds and alerts, for example backup camera obstacle detection.
* Privileged MODIFY_AUDIO_ROUTING permission required.
*/
AAUDIO_SYSTEM_USAGE_SAFETY = AAUDIO_SYSTEM_USAGE_OFFSET + 1,
/**
* Use this for vehicle status alerts and information, for example the check engine light.
* Privileged MODIFY_AUDIO_ROUTING permission required.
*/
AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS = AAUDIO_SYSTEM_USAGE_OFFSET + 2,
/**
* Use this for traffic announcements, etc.
* Privileged MODIFY_AUDIO_ROUTING permission required.
*/
AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT = AAUDIO_SYSTEM_USAGE_OFFSET + 3,
};
typedef int32_t aaudio_usage_t;

@ -133,6 +133,10 @@ aaudio_result_t AAudioStreamParameters::validate() const {
case AAUDIO_USAGE_ASSISTANCE_SONIFICATION:
case AAUDIO_USAGE_GAME:
case AAUDIO_USAGE_ASSISTANT:
case AAUDIO_SYSTEM_USAGE_EMERGENCY:
case AAUDIO_SYSTEM_USAGE_SAFETY:
case AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS:
case AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT:
break; // valid
default:
ALOGD("usage not valid = %d", mUsage);

@ -183,6 +183,10 @@ audio_usage_t AAudioConvert_usageToInternal(aaudio_usage_t usage) {
STATIC_ASSERT(AAUDIO_USAGE_ASSISTANCE_SONIFICATION == AUDIO_USAGE_ASSISTANCE_SONIFICATION);
STATIC_ASSERT(AAUDIO_USAGE_GAME == AUDIO_USAGE_GAME);
STATIC_ASSERT(AAUDIO_USAGE_ASSISTANT == AUDIO_USAGE_ASSISTANT);
STATIC_ASSERT(AAUDIO_SYSTEM_USAGE_EMERGENCY == AUDIO_USAGE_EMERGENCY);
STATIC_ASSERT(AAUDIO_SYSTEM_USAGE_SAFETY == AUDIO_USAGE_SAFETY);
STATIC_ASSERT(AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS == AUDIO_USAGE_VEHICLE_STATUS);
STATIC_ASSERT(AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT == AUDIO_USAGE_ANNOUNCEMENT);
if (usage == AAUDIO_UNSPECIFIED) {
usage = AAUDIO_USAGE_MEDIA;
}

@ -120,7 +120,11 @@ static const aaudio_usage_t sUsages[] = {
AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
AAUDIO_USAGE_ASSISTANCE_SONIFICATION,
AAUDIO_USAGE_GAME,
AAUDIO_USAGE_ASSISTANT
AAUDIO_USAGE_ASSISTANT,
AAUDIO_SYSTEM_USAGE_EMERGENCY,
AAUDIO_SYSTEM_USAGE_SAFETY,
AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS,
AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT
};
static const aaudio_content_type_t sContentypes[] = {

@ -1142,6 +1142,12 @@ void AudioSystem::clearAudioConfigCache()
}
}
status_t AudioSystem::setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == nullptr) return PERMISSION_DENIED;
return aps->setSupportedSystemUsages(systemUsages);
}
status_t AudioSystem::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) {
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == nullptr) return PERMISSION_DENIED;

@ -102,6 +102,7 @@ enum {
GET_STRATEGY_FOR_ATTRIBUTES,
LIST_AUDIO_VOLUME_GROUPS,
GET_VOLUME_GROUP_FOR_ATTRIBUTES,
SET_SUPPORTED_SYSTEM_USAGES,
SET_ALLOWED_CAPTURE_POLICY,
MOVE_EFFECTS_TO_IO,
SET_RTT_ENABLED,
@ -332,6 +333,7 @@ public:
ALOGE("getInputForAttr NULL portId - shouldn't happen");
return BAD_VALUE;
}
data.write(attr, sizeof(audio_attributes_t));
data.writeInt32(*input);
data.writeInt32(riid);
@ -622,6 +624,20 @@ public:
return status;
}
status_t setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
data.writeInt32(systemUsages.size());
for (auto systemUsage : systemUsages) {
data.writeInt32(systemUsage);
}
status_t status = remote()->transact(SET_SUPPORTED_SYSTEM_USAGES, data, &reply);
if (status != NO_ERROR) {
return status;
}
return static_cast <status_t> (reply.readInt32());
}
status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override {
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
@ -1449,6 +1465,7 @@ status_t BnAudioPolicyService::onTransact(
case SET_RTT_ENABLED:
case IS_CALL_SCREEN_MODE_SUPPORTED:
case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
case SET_SUPPORTED_SYSTEM_USAGES:
case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY:
case GET_DEVICES_FOR_ATTRIBUTES: {
@ -2442,16 +2459,46 @@ status_t BnAudioPolicyService::onTransact(
if (status != NO_ERROR) {
return status;
}
volume_group_t group;
status = getVolumeGroupFromAudioAttributes(attributes, group);
reply->writeInt32(status);
if (status != NO_ERROR) {
return NO_ERROR;
}
reply->writeInt32(status);
reply->writeUint32(static_cast<int>(group));
return NO_ERROR;
}
case SET_SUPPORTED_SYSTEM_USAGES: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
std::vector<audio_usage_t> systemUsages;
int32_t size;
status_t status = data.readInt32(&size);
if (status != NO_ERROR) {
return status;
}
if (size > MAX_ITEMS_PER_LIST) {
size = MAX_ITEMS_PER_LIST;
}
for (int32_t i = 0; i < size; i++) {
int32_t systemUsageInt;
status = data.readInt32(&systemUsageInt);
if (status != NO_ERROR) {
return status;
}
audio_usage_t systemUsage = static_cast<audio_usage_t>(systemUsageInt);
systemUsages.push_back(systemUsage);
}
status = setSupportedSystemUsages(systemUsages);
reply->writeInt32(static_cast <int32_t>(status));
return NO_ERROR;
}
case SET_ALLOWED_CAPTURE_POLICY: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
uid_t uid = data.readInt32();

@ -314,6 +314,8 @@ public:
static status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory);
static status_t setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages);
static status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags);
// Check if hw offload is possible for given format, stream type, sample rate,

@ -140,6 +140,7 @@ public:
audio_unique_id_t* id) = 0;
virtual status_t removeSourceDefaultEffect(audio_unique_id_t id) = 0;
virtual status_t removeStreamDefaultEffect(audio_unique_id_t id) = 0;
virtual status_t setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) = 0;
virtual status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) = 0;
// Check if offload is possible for given format, stream type, sample rate,
// bit rate, duration, video and streaming or offload property is enabled

@ -360,6 +360,10 @@ const UsageTypeConverter::Table UsageTypeConverter::mTable[] = {
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_VIRTUAL_SOURCE),
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_ASSISTANT),
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_CALL_ASSISTANT),
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_EMERGENCY),
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_SAFETY),
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_VEHICLE_STATUS),
MAKE_STRING_FROM_ENUM(AUDIO_USAGE_ANNOUNCEMENT),
TERMINATOR
};

@ -6141,6 +6141,10 @@ bool AudioPolicyManager::isValidAttributes(const audio_attributes_t *paa)
case AUDIO_USAGE_VIRTUAL_SOURCE:
case AUDIO_USAGE_ASSISTANT:
case AUDIO_USAGE_CALL_ASSISTANT:
case AUDIO_USAGE_EMERGENCY:
case AUDIO_USAGE_SAFETY:
case AUDIO_USAGE_VEHICLE_STATUS:
case AUDIO_USAGE_ANNOUNCEMENT:
break;
default:
return false;

@ -25,6 +25,44 @@
namespace android {
const std::vector<audio_usage_t>& SYSTEM_USAGES = {
AUDIO_USAGE_CALL_ASSISTANT,
AUDIO_USAGE_EMERGENCY,
AUDIO_USAGE_SAFETY,
AUDIO_USAGE_VEHICLE_STATUS,
AUDIO_USAGE_ANNOUNCEMENT
};
bool isSystemUsage(audio_usage_t usage) {
return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
!= std::end(SYSTEM_USAGES);
}
bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
!= std::end(mSupportedSystemUsages);
}
status_t AudioPolicyService::validateUsage(audio_usage_t usage) {
return validateUsage(usage, IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid());
}
status_t AudioPolicyService::validateUsage(audio_usage_t usage, pid_t pid, uid_t uid) {
if (isSystemUsage(usage)) {
if (isSupportedSystemUsage(usage)) {
if (!modifyAudioRoutingAllowed(pid, uid)) {
ALOGE("permission denied: modify audio routing not allowed for uid %d", uid);
return PERMISSION_DENIED;
}
} else {
return BAD_VALUE;
}
}
return NO_ERROR;
}
// ----------------------------------------------------------------------------
@ -181,6 +219,12 @@ status_t AudioPolicyService::getOutputForAttr(audio_attributes_t *attr,
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
status_t result = validateUsage(attr->usage, pid, uid);
if (result != NO_ERROR) {
return result;
}
ALOGV("%s()", __func__);
Mutex::Autolock _l(mLock);
@ -199,7 +243,7 @@ status_t AudioPolicyService::getOutputForAttr(audio_attributes_t *attr,
}
AutoCallerClear acc;
AudioPolicyInterface::output_type_t outputType;
status_t result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid,
result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid,
config,
&flags, selectedDeviceId, portId,
secondaryOutputs,
@ -363,6 +407,11 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
return NO_INIT;
}
status_t result = validateUsage(attr->usage, pid, uid);
if (result != NO_ERROR) {
return result;
}
audio_source_t inputSource = attr->source;
if (inputSource == AUDIO_SOURCE_DEFAULT) {
inputSource = AUDIO_SOURCE_MIC;
@ -807,7 +856,7 @@ audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stre
}
status_t AudioPolicyService::getDevicesForAttributes(const AudioAttributes &aa,
AudioDeviceTypeAddrVector *devices) const
AudioDeviceTypeAddrVector *devices) const
{
if (mAudioPolicyManager == NULL) {
return NO_INIT;
@ -1002,6 +1051,22 @@ status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id)
return audioPolicyEffects->removeStreamDefaultEffect(id);
}
status_t AudioPolicyService::setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
Mutex::Autolock _l(mLock);
if(!modifyAudioRoutingAllowed()) {
return PERMISSION_DENIED;
}
bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
[](audio_usage_t usage) { return isSystemUsage(usage); });
if (!areAllSystemUsages) {
return BAD_VALUE;
}
mSupportedSystemUsages = systemUsages;
return NO_ERROR;
}
status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
Mutex::Autolock _l(mLock);
if (mAudioPolicyManager == NULL) {
@ -1033,6 +1098,12 @@ bool AudioPolicyService::isDirectOutputSupported(const audio_config_base_t& conf
ALOGV("mAudioPolicyManager == NULL");
return false;
}
status_t result = validateUsage(attributes.usage);
if (result != NO_ERROR) {
return result;
}
Mutex::Autolock _l(mLock);
return mAudioPolicyManager->isDirectOutputSupported(config, attributes);
}
@ -1201,6 +1272,12 @@ status_t AudioPolicyService::startAudioSource(const struct audio_port_config *so
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
status_t result = validateUsage(attributes->usage);
if (result != NO_ERROR) {
return result;
}
// startAudioSource should be created as the calling uid
const uid_t callingUid = IPCThreadState::self()->getCallingUid();
AutoCallerClear acc;

@ -74,6 +74,8 @@ void AudioPolicyService::onFirstRef()
mAudioPolicyClient = new AudioPolicyClient(this);
mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
mSupportedSystemUsages = std::vector<audio_usage_t> {};
}
// load audio processing modules
sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
@ -392,6 +394,14 @@ status_t AudioPolicyService::dumpInternals(int fd)
snprintf(buffer, SIZE, "Command Thread: %p\n", mAudioCommandThread.get());
result.append(buffer);
snprintf(buffer, SIZE, "Supported System Usages:\n");
result.append(buffer);
for (std::vector<audio_usage_t>::iterator it = mSupportedSystemUsages.begin();
it != mSupportedSystemUsages.end(); ++it) {
snprintf(buffer, SIZE, "\t%d\n", *it);
result.append(buffer);
}
write(fd, result.string(), result.size());
return NO_ERROR;
}

@ -187,6 +187,7 @@ public:
audio_io_handle_t output,
int delayMs = 0);
virtual status_t setVoiceVolume(float volume, int delayMs = 0);
status_t setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages);
status_t setAllowedCapturePolicy(uint_t uid, audio_flags_mask_t capturePolicy) override;
virtual bool isOffloadSupported(const audio_offload_info_t &config);
virtual bool isDirectOutputSupported(const audio_config_base_t& config,
@ -344,6 +345,10 @@ private:
app_state_t apmStatFromAmState(int amState);
bool isSupportedSystemUsage(audio_usage_t usage);
status_t validateUsage(audio_usage_t usage);
status_t validateUsage(audio_usage_t usage, pid_t pid, uid_t uid);
void updateUidStates();
void updateUidStates_l();
@ -863,6 +868,7 @@ private:
struct audio_policy *mpAudioPolicy;
AudioPolicyInterface *mAudioPolicyManager;
AudioPolicyClient *mAudioPolicyClient;
std::vector<audio_usage_t> mSupportedSystemUsages;
DefaultKeyedVector< int64_t, sp<NotificationClient> > mNotificationClients;
Mutex mNotificationClientsLock; // protects mNotificationClients

Loading…
Cancel
Save