blob: 9d070113bd2e22d3e9e0cbd2bb5542496363d807 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "AudioPolicy"
//#define LOG_NDEBUG 0
#include <utils/Log.h>
#include <media/AudioPolicy.h>
namespace android {
//
// AttributeMatchCriterion implementation
//
AttributeMatchCriterion::AttributeMatchCriterion(audio_usage_t usage,
audio_source_t source,
uint32_t rule)
: mRule(rule)
{
if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
mAttr.mUsage = usage;
} else {
mAttr.mSource = source;
}
}
status_t AttributeMatchCriterion::readFromParcel(Parcel *parcel)
{
mRule = parcel->readInt32();
if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
mAttr.mUsage = (audio_usage_t)parcel->readInt32();
} else {
mAttr.mSource = (audio_source_t)parcel->readInt32();
}
return NO_ERROR;
}
status_t AttributeMatchCriterion::writeToParcel(Parcel *parcel) const
{
parcel->writeInt32(mRule);
parcel->writeInt32(mAttr.mUsage);
return NO_ERROR;
}
//
// AudioMix implementation
//
status_t AudioMix::readFromParcel(Parcel *parcel)
{
mMixType = parcel->readInt32();
mFormat.sample_rate = (uint32_t)parcel->readInt32();
mFormat.channel_mask = (audio_channel_mask_t)parcel->readInt32();
mFormat.format = (audio_format_t)parcel->readInt32();
mRouteFlags = parcel->readInt32();
mRegistrationId = parcel->readString8();
mCbFlags = (uint32_t)parcel->readInt32();
size_t size = (size_t)parcel->readInt32();
if (size > MAX_CRITERIA_PER_MIX) {
size = MAX_CRITERIA_PER_MIX;
}
for (size_t i = 0; i < size; i++) {
AttributeMatchCriterion criterion;
if (criterion.readFromParcel(parcel) == NO_ERROR) {
mCriteria.add(criterion);
}
}
return NO_ERROR;
}
status_t AudioMix::writeToParcel(Parcel *parcel) const
{
parcel->writeInt32(mMixType);
parcel->writeInt32(mFormat.sample_rate);
parcel->writeInt32(mFormat.channel_mask);
parcel->writeInt32(mFormat.format);
parcel->writeInt32(mRouteFlags);
parcel->writeString8(mRegistrationId);
parcel->writeInt32(mCbFlags);
size_t size = mCriteria.size();
if (size > MAX_CRITERIA_PER_MIX) {
size = MAX_CRITERIA_PER_MIX;
}
size_t sizePosition = parcel->dataPosition();
parcel->writeInt32(size);
size_t finalSize = size;
for (size_t i = 0; i < size; i++) {
size_t position = parcel->dataPosition();
if (mCriteria[i].writeToParcel(parcel) != NO_ERROR) {
parcel->setDataPosition(position);
finalSize--;
}
}
if (size != finalSize) {
size_t position = parcel->dataPosition();
parcel->setDataPosition(sizePosition);
parcel->writeInt32(finalSize);
parcel->setDataPosition(position);
}
return NO_ERROR;
}
} // namespace android
|