blob: 3ab38cd259a646ee7bfd30aa62b6948adc80db3b [file] [log] [blame]
Eric Laurent275e8e92014-11-30 15:14:47 -08001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "AudioPolicy"
18//#define LOG_NDEBUG 0
19#include <utils/Log.h>
20#include <media/AudioPolicy.h>
21
22namespace android {
23
24//
Jean-Michel Trivibda70da2018-12-19 07:30:15 -080025// AudioDeviceTypeAddr implementation
26//
27status_t AudioDeviceTypeAddr::readFromParcel(Parcel *parcel) {
28 mType = (audio_devices_t) parcel->readInt32();
29 mAddress = parcel->readString8();
30 return NO_ERROR;
31}
32
33status_t AudioDeviceTypeAddr::writeToParcel(Parcel *parcel) const {
34 parcel->writeInt32((int32_t) mType);
35 parcel->writeString8(mAddress);
36 return NO_ERROR;
37}
38
39
40//
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080041// AudioMixMatchCriterion implementation
Eric Laurent275e8e92014-11-30 15:14:47 -080042//
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080043AudioMixMatchCriterion::AudioMixMatchCriterion(audio_usage_t usage,
Eric Laurent275e8e92014-11-30 15:14:47 -080044 audio_source_t source,
45 uint32_t rule)
46: mRule(rule)
47{
48 if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
49 mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080050 mValue.mUsage = usage;
Eric Laurent275e8e92014-11-30 15:14:47 -080051 } else {
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080052 mValue.mSource = source;
Eric Laurent275e8e92014-11-30 15:14:47 -080053 }
54}
55
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080056status_t AudioMixMatchCriterion::readFromParcel(Parcel *parcel)
Eric Laurent275e8e92014-11-30 15:14:47 -080057{
58 mRule = parcel->readInt32();
Jean-Michel Trivibda70da2018-12-19 07:30:15 -080059 switch (mRule) {
60 case RULE_MATCH_ATTRIBUTE_USAGE:
61 case RULE_EXCLUDE_ATTRIBUTE_USAGE:
62 mValue.mUsage = (audio_usage_t) parcel->readInt32();
63 break;
64 case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
65 case RULE_EXCLUDE_ATTRIBUTE_CAPTURE_PRESET:
66 mValue.mSource = (audio_source_t) parcel->readInt32();
67 break;
68 case RULE_MATCH_UID:
69 case RULE_EXCLUDE_UID:
70 mValue.mUid = (uid_t) parcel->readInt32();
71 break;
72 default:
73 ALOGE("Trying to build AudioMixMatchCriterion from unknown rule %d", mRule);
74 return BAD_VALUE;
Eric Laurent275e8e92014-11-30 15:14:47 -080075 }
76 return NO_ERROR;
77}
78
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080079status_t AudioMixMatchCriterion::writeToParcel(Parcel *parcel) const
Eric Laurent275e8e92014-11-30 15:14:47 -080080{
81 parcel->writeInt32(mRule);
Jean-Michel Trivie8deced2016-02-11 12:50:39 -080082 parcel->writeInt32(mValue.mUsage);
Eric Laurent275e8e92014-11-30 15:14:47 -080083 return NO_ERROR;
84}
85
86//
87// AudioMix implementation
88//
89
90status_t AudioMix::readFromParcel(Parcel *parcel)
91{
92 mMixType = parcel->readInt32();
93 mFormat.sample_rate = (uint32_t)parcel->readInt32();
94 mFormat.channel_mask = (audio_channel_mask_t)parcel->readInt32();
95 mFormat.format = (audio_format_t)parcel->readInt32();
96 mRouteFlags = parcel->readInt32();
Jean-Michel Trivi7638ca22016-03-04 17:42:44 -080097 mDeviceType = (audio_devices_t) parcel->readInt32();
98 mDeviceAddress = parcel->readString8();
Jean-Michel Trivif613d422015-04-23 18:41:29 -070099 mCbFlags = (uint32_t)parcel->readInt32();
Eric Laurent275e8e92014-11-30 15:14:47 -0800100 size_t size = (size_t)parcel->readInt32();
101 if (size > MAX_CRITERIA_PER_MIX) {
102 size = MAX_CRITERIA_PER_MIX;
103 }
104 for (size_t i = 0; i < size; i++) {
Jean-Michel Trivie8deced2016-02-11 12:50:39 -0800105 AudioMixMatchCriterion criterion;
Eric Laurent275e8e92014-11-30 15:14:47 -0800106 if (criterion.readFromParcel(parcel) == NO_ERROR) {
107 mCriteria.add(criterion);
108 }
109 }
110 return NO_ERROR;
111}
112
113status_t AudioMix::writeToParcel(Parcel *parcel) const
114{
115 parcel->writeInt32(mMixType);
116 parcel->writeInt32(mFormat.sample_rate);
117 parcel->writeInt32(mFormat.channel_mask);
118 parcel->writeInt32(mFormat.format);
119 parcel->writeInt32(mRouteFlags);
Jean-Michel Trivi7638ca22016-03-04 17:42:44 -0800120 parcel->writeInt32(mDeviceType);
121 parcel->writeString8(mDeviceAddress);
Jean-Michel Trivif613d422015-04-23 18:41:29 -0700122 parcel->writeInt32(mCbFlags);
Eric Laurent275e8e92014-11-30 15:14:47 -0800123 size_t size = mCriteria.size();
124 if (size > MAX_CRITERIA_PER_MIX) {
125 size = MAX_CRITERIA_PER_MIX;
126 }
127 size_t sizePosition = parcel->dataPosition();
128 parcel->writeInt32(size);
129 size_t finalSize = size;
130 for (size_t i = 0; i < size; i++) {
131 size_t position = parcel->dataPosition();
132 if (mCriteria[i].writeToParcel(parcel) != NO_ERROR) {
133 parcel->setDataPosition(position);
134 finalSize--;
135 }
136 }
137 if (size != finalSize) {
138 size_t position = parcel->dataPosition();
139 parcel->setDataPosition(sizePosition);
140 parcel->writeInt32(finalSize);
141 parcel->setDataPosition(position);
142 }
143 return NO_ERROR;
144}
145
Jean-Michel Trivi17dc1782019-01-10 19:00:05 -0800146void AudioMix::setExcludeUid(uid_t uid) const {
Jean-Michel Trivibda70da2018-12-19 07:30:15 -0800147 AudioMixMatchCriterion crit;
148 crit.mRule = RULE_EXCLUDE_UID;
149 crit.mValue.mUid = uid;
150 mCriteria.add(crit);
151}
152
Jean-Michel Trivi17dc1782019-01-10 19:00:05 -0800153void AudioMix::setMatchUid(uid_t uid) const {
154 AudioMixMatchCriterion crit;
155 crit.mRule = RULE_MATCH_UID;
156 crit.mValue.mUid = uid;
157 mCriteria.add(crit);
158}
159
Glenn Kasten40bc9062015-03-20 09:09:33 -0700160} // namespace android