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//
25e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi//  AudioMixMatchCriterion implementation
26275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent//
27e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel TriviAudioMixMatchCriterion::AudioMixMatchCriterion(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) {
34e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi        mValue.mUsage = usage;
35275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    } else {
36e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi        mValue.mSource = source;
37275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
38275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
39275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
40e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivistatus_t AudioMixMatchCriterion::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) {
45e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi        mValue.mUsage = (audio_usage_t)parcel->readInt32();
46275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    } else {
47e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi        mValue.mSource = (audio_source_t)parcel->readInt32();
48275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
49275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
50275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
51275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
52e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivistatus_t AudioMixMatchCriterion::writeToParcel(Parcel *parcel) const
53275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
54275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mRule);
55e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi    parcel->writeInt32(mValue.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();
707638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi    mDeviceType = (audio_devices_t) parcel->readInt32();
717638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi    mDeviceAddress = parcel->readString8();
72f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi    mCbFlags = (uint32_t)parcel->readInt32();
73275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t size = (size_t)parcel->readInt32();
74275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (size > MAX_CRITERIA_PER_MIX) {
75275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size = MAX_CRITERIA_PER_MIX;
76275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
77275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    for (size_t i = 0; i < size; i++) {
78e8decedb429ed76dfa84cdb3e80ab3b969e77298Jean-Michel Trivi        AudioMixMatchCriterion criterion;
79275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        if (criterion.readFromParcel(parcel) == NO_ERROR) {
80275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            mCriteria.add(criterion);
81275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        }
82275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
83275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
84275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
85275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
86275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurentstatus_t AudioMix::writeToParcel(Parcel *parcel) const
87275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent{
88275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mMixType);
89275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mFormat.sample_rate);
90275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mFormat.channel_mask);
91275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mFormat.format);
92275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(mRouteFlags);
937638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi    parcel->writeInt32(mDeviceType);
947638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi    parcel->writeString8(mDeviceAddress);
95f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi    parcel->writeInt32(mCbFlags);
96275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t size = mCriteria.size();
97275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (size > MAX_CRITERIA_PER_MIX) {
98275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size = MAX_CRITERIA_PER_MIX;
99275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
100275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t sizePosition = parcel->dataPosition();
101275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    parcel->writeInt32(size);
102275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    size_t finalSize = size;
103275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    for (size_t i = 0; i < size; i++) {
104275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size_t position = parcel->dataPosition();
105275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        if (mCriteria[i].writeToParcel(parcel) != NO_ERROR) {
106275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            parcel->setDataPosition(position);
107275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent            finalSize--;
108275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        }
109275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
110275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    if (size != finalSize) {
111275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        size_t position = parcel->dataPosition();
112275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        parcel->setDataPosition(sizePosition);
113275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        parcel->writeInt32(finalSize);
114275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent        parcel->setDataPosition(position);
115275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    }
116275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    return NO_ERROR;
117275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent}
118275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent
11940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
120