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