blob: a0cff31c71169a6f8df12a0ad2c7af073a8309e8 [file] [log] [blame]
/*
* Copyright (C) 2017 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.
*/
package com.android.cts.verifier.audio.peripheralprofile;
import android.media.AudioDeviceInfo;
import android.support.annotation.NonNull;
import com.android.cts.verifier.audio.peripheralprofile.ListsHelper;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class PeripheralProfile extends DefaultHandler {
private String mProfileName;
private String mProfileDescription;
private String mProductName = ""; // From AudioDeviceInfo
public class ProfileAttributes {
public int[] mChannelCounts;
public int[] mChannelIndexMasks;
public int[] mChannelPositionMasks;
public int[] mEncodings;
public int[] mSampleRates;
}
ProfileAttributes mOutputAttributes;
ProfileAttributes mInputAttributes;
ProfileButtonAttributes mButtonAttributes;
//
// Accessors
//
public String getName() { return mProfileName; }
public String getDescription() { return mProfileDescription; }
public String getProductName() { return mProductName; }
public ProfileAttributes getOutputAttributes() {
return mOutputAttributes;
}
public ProfileAttributes getInputAttributes() {
return mInputAttributes;
}
public ProfileButtonAttributes getButtonAttributes() {
return mButtonAttributes;
}
@Override
public String toString() { return mProfileName; }
public PeripheralProfile(String profileName, String profileDescription,
AudioDeviceInfo outDeviceInfo,
AudioDeviceInfo inDeviceInfo,
ProfileButtonAttributes buttonAttributes) {
mProfileName = profileName;
mProfileDescription = profileDescription;
if (outDeviceInfo != null) {
mProductName = outDeviceInfo.getProductName().toString();
mOutputAttributes = new ProfileAttributes();
mOutputAttributes.mChannelCounts =
outDeviceInfo.getChannelCounts();
mOutputAttributes.mChannelIndexMasks =
outDeviceInfo.getChannelIndexMasks();
mOutputAttributes.mChannelPositionMasks =
outDeviceInfo.getChannelMasks();
mOutputAttributes.mEncodings = outDeviceInfo.getEncodings();
mOutputAttributes.mSampleRates = outDeviceInfo.getSampleRates();
} else {
mOutputAttributes = null;
}
if (inDeviceInfo != null) {
mProductName = outDeviceInfo.getProductName().toString();
mInputAttributes = new ProfileAttributes();
mInputAttributes.mChannelCounts = inDeviceInfo.getChannelCounts();
mInputAttributes.mChannelIndexMasks = inDeviceInfo.getChannelIndexMasks();
mInputAttributes.mChannelPositionMasks = inDeviceInfo.getChannelMasks();
mInputAttributes.mEncodings = inDeviceInfo.getEncodings();
mInputAttributes.mSampleRates = inDeviceInfo.getSampleRates();
} else {
mInputAttributes = null;
}
mButtonAttributes = buttonAttributes;
}
public static boolean matches(ProfileAttributes attribs, AudioDeviceInfo deviceInfo) {
boolean match =
ListsHelper.isMatch(deviceInfo.getChannelCounts(), attribs.mChannelCounts) &&
ListsHelper.isMatch(deviceInfo.getChannelIndexMasks(), attribs.mChannelIndexMasks) &&
ListsHelper.isMatch(deviceInfo.getChannelMasks(), attribs.mChannelPositionMasks) &&
ListsHelper.isMatch(deviceInfo.getEncodings(), attribs.mEncodings) &&
ListsHelper.isMatch(deviceInfo.getSampleRates(), attribs.mSampleRates);
return match;
}
//
// Peripheral (XML) Loading
//
private static int[] parseIntList(String intList) {
String[] strings = intList.split(",");
int[] ints = new int[strings.length];
for (int index = 0; index < strings.length; index++) {
ints[index] = Integer.parseInt(strings[index]);
}
return ints;
}
// XML Tags
public static final String kTag_Profile = "PeripheralProfile";
public static final String kTag_OutputDevInfo = "OutputDevInfo";
public static final String kTag_InputDevInfo = "InputDevInfo";
public static final String kTag_ButtonInfo = "ButtonInfo";
// XML Attributes
// - Attributes for Profile Tag
private static final String kAttr_ProfileName = "ProfileName";
private static final String kAttr_ProfileDescription = "ProfileDescription";
private static final String kAttr_Product = "ProductName";
// - Attributes for DevInfo tags
private static final String kAttr_ChanCounts = "ChanCounts";
private static final String kAttr_ChanPosMasks = "ChanPosMasks";
private static final String kAttr_ChanIndexMasks = "ChanIndexMasks";
private static final String kAttr_Encodings = "Encodings";
private static final String kAttr_SampleRates = "SampleRates";
private static final String kAttr_HasBtnA = "HasBtnA";
private static final String kAttr_HasBtnB = "HasBtnB";
private static final String kAttr_HasBtnC = "HasBtnC";
private void parseProfileAttributes(ProfileAttributes attribs, String elementName,
Attributes xmlAtts) {
attribs.mChannelCounts = parseIntList(xmlAtts.getValue(kAttr_ChanCounts));
attribs.mChannelPositionMasks = parseIntList(xmlAtts.getValue(kAttr_ChanPosMasks));
attribs.mChannelIndexMasks = parseIntList(xmlAtts.getValue(kAttr_ChanIndexMasks));
attribs.mEncodings = parseIntList(xmlAtts.getValue(kAttr_Encodings));
attribs.mSampleRates = parseIntList(xmlAtts.getValue(kAttr_SampleRates));
}
private void parseProfileButtons(ProfileButtonAttributes buttonAttributes, String elementName,
Attributes xmlAtts) {
buttonAttributes.mHasBtnA = Integer.parseInt(xmlAtts.getValue(kAttr_HasBtnA)) == 1;
buttonAttributes.mHasBtnB = Integer.parseInt(xmlAtts.getValue(kAttr_HasBtnB)) == 1;
buttonAttributes.mHasBtnC = Integer.parseInt(xmlAtts.getValue(kAttr_HasBtnC)) == 1;
}
//
// org.xml.sax.helpers.DefaultHandler overrides
//
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (qName.equals(kTag_Profile)) {
mProfileName = atts.getValue(kAttr_ProfileName);
mProfileDescription = atts.getValue(kAttr_ProfileDescription);
mProductName = atts.getValue(kAttr_Product);
} else if (qName.equals(kTag_OutputDevInfo)) {
mOutputAttributes = new ProfileAttributes();
parseProfileAttributes(mOutputAttributes, localName, atts);
} else if (qName.equals(kTag_InputDevInfo)) {
mInputAttributes = new ProfileAttributes();
parseProfileAttributes(mInputAttributes, localName, atts);
} else if (qName.equals(kTag_ButtonInfo)) {
mButtonAttributes = new ProfileButtonAttributes();
parseProfileButtons(mButtonAttributes, localName, atts);
}
}
@Override
public void endElement(String uri, String localName, String qName) {
}
}