1275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent/*
2275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * Copyright (C) 2014 The Android Open Source Project
3275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent *
4275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * you may not use this file except in compliance with the License.
6275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * You may obtain a copy of the License at
7275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent *
8275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent *
10275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * Unless required by applicable law or agreed to in writing, software
11275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * See the License for the specific language governing permissions and
14275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent * limitations under the License.
15275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent */
16275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
17275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent#define LOG_TAG "AudioPolicy"
18275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//#define LOG_NDEBUG 0
19275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent#include <utils/Log.h>
20275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent#include <media/AudioPolicy.h>
21275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
22275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurentnamespace android {
23275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
24275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//
25275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//  AttributeMatchCriterion implementation
26275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//
27275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric LaurentAttributeMatchCriterion::AttributeMatchCriterion(audio_usage_t usage,
28275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent                                                 audio_source_t source,
29275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent                                                 uint32_t rule)
30275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent: mRule(rule)
31275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
32275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
33275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
34275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        mAttr.mUsage = usage;
35275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    } else {
36275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        mAttr.mSource = source;
37275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
38275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
39275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
40275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurentstatus_t AttributeMatchCriterion::readFromParcel(Parcel *parcel)
41275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
42275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mRule = parcel->readInt32();
43275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
44275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
45275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        mAttr.mUsage = (audio_usage_t)parcel->readInt32();
46275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    } else {
47275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        mAttr.mSource = (audio_source_t)parcel->readInt32();
48275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
49275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
50275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
51275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
52275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurentstatus_t AttributeMatchCriterion::writeToParcel(Parcel *parcel) const
53275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
54275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mRule);
55275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mAttr.mUsage);
56275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
57275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
58275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
59275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//
60275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//  AudioMix implementation
61275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//
62275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
63275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurentstatus_t AudioMix::readFromParcel(Parcel *parcel)
64275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
65275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mMixType = parcel->readInt32();
66275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mFormat.sample_rate = (uint32_t)parcel->readInt32();
67275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mFormat.channel_mask = (audio_channel_mask_t)parcel->readInt32();
68275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mFormat.format = (audio_format_t)parcel->readInt32();
69275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mRouteFlags = parcel->readInt32();
70275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    mRegistrationId = parcel->readString8();
71f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi    mCbFlags = (uint32_t)parcel->readInt32();
72275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t size = (size_t)parcel->readInt32();
73275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (size > MAX_CRITERIA_PER_MIX) {
74275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size = MAX_CRITERIA_PER_MIX;
75275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
76275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    for (size_t i = 0; i < size; i++) {
77275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        AttributeMatchCriterion criterion;
78275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        if (criterion.readFromParcel(parcel) == NO_ERROR) {
79275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            mCriteria.add(criterion);
80275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        }
81275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
82275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
83275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
84275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
85275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurentstatus_t AudioMix::writeToParcel(Parcel *parcel) const
86275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
87275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mMixType);
88275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mFormat.sample_rate);
89275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mFormat.channel_mask);
90275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mFormat.format);
91275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mRouteFlags);
92275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeString8(mRegistrationId);
93f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi    parcel->writeInt32(mCbFlags);
94275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t size = mCriteria.size();
95275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (size > MAX_CRITERIA_PER_MIX) {
96275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size = MAX_CRITERIA_PER_MIX;
97275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
98275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t sizePosition = parcel->dataPosition();
99275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(size);
100275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t finalSize = size;
101275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    for (size_t i = 0; i < size; i++) {
102275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size_t position = parcel->dataPosition();
103275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        if (mCriteria[i].writeToParcel(parcel) != NO_ERROR) {
104275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            parcel->setDataPosition(position);
105275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            finalSize--;
106275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        }
107275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
108275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (size != finalSize) {
109275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size_t position = parcel->dataPosition();
110275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        parcel->setDataPosition(sizePosition);
111275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        parcel->writeInt32(finalSize);
112275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        parcel->setDataPosition(position);
113275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
114275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
115275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
116275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
11740bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
118