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