AudioParameter.cpp revision db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903
1db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin/* 2db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * Copyright (C) 2006-2011 The Android Open Source Project 3db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * 4db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 5db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * you may not use this file except in compliance with the License. 6db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * You may obtain a copy of the License at 7db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * 8db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * http://www.apache.org/licenses/LICENSE-2.0 9db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * 10db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * Unless required by applicable law or agreed to in writing, software 11db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS, 12db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * See the License for the specific language governing permissions and 14db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin * limitations under the License. 15db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin */ 16db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 17db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin#define LOG_TAG "AudioParameter" 18db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin//#define LOG_NDEBUG 0 19db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 20db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin#include <utils/Log.h> 21db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 22db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin#include <media/AudioParameter.h> 23db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 24db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinnamespace android { 25db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 26db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinconst char *AudioParameter::keyRouting = "routing"; 27db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinconst char *AudioParameter::keySamplingRate = "sampling_rate"; 28db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinconst char *AudioParameter::keyFormat = "format"; 29db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinconst char *AudioParameter::keyChannels = "channels"; 30db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinconst char *AudioParameter::keyFrameCount = "frame_count"; 31db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinconst char *AudioParameter::keyInputSource = "input_source"; 32db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 33db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima ZavinAudioParameter::AudioParameter(const String8& keyValuePairs) 34db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 35db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char *str = new char[keyValuePairs.length()+1]; 36db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mKeyValuePairs = keyValuePairs; 37db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 38db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin strcpy(str, keyValuePairs.string()); 39db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char *pair = strtok(str, ";"); 40db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin while (pair != NULL) { 41db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (strlen(pair) != 0) { 42db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin size_t eqIdx = strcspn(pair, "="); 43db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 key = String8(pair, eqIdx); 44db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 value; 45db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (eqIdx == strlen(pair)) { 46db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = String8(""); 47db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 48db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = String8(pair + eqIdx + 1); 49db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 50db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) < 0) { 51db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.add(key, value); 52db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 53db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.replaceValueFor(key, value); 54db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 55db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 56db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin LOGV("AudioParameter() cstor empty key value pair"); 57db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 58db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin pair = strtok(NULL, ";"); 59db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 60db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 61db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin delete[] str; 62db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 63db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 64db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima ZavinAudioParameter::~AudioParameter() 65db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 66db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.clear(); 67db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 68db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 69db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima ZavinString8 AudioParameter::toString() 70db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 71db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str = String8(""); 72db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 73db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin size_t size = mParameters.size(); 74db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin for (size_t i = 0; i < size; i++) { 75db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin str += mParameters.keyAt(i); 76db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin str += "="; 77db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin str += mParameters.valueAt(i); 78db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (i < (size - 1)) str += ";"; 79db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 80db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return str; 81db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 82db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 83db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::add(const String8& key, const String8& value) 84db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 85db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) < 0) { 86db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.add(key, value); 87db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 88db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 89db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.replaceValueFor(key, value); 90db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return ALREADY_EXISTS; 91db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 92db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 93db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 94db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::addInt(const String8& key, const int value) 95db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 96db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char str[12]; 97db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (snprintf(str, 12, "%d", value) > 0) { 98db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8 = String8(str); 99db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return add(key, str8); 100db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 101db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 102db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 103db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 104db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 105db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::addFloat(const String8& key, const float value) 106db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 107db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char str[23]; 108db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (snprintf(str, 23, "%.10f", value) > 0) { 109db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8 = String8(str); 110db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return add(key, str8); 111db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 112db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 113db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 114db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 115db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 116db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::remove(const String8& key) 117db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 118db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) >= 0) { 119db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.removeItem(key); 120db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 121db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 122db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 123db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 124db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 125db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 126db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::get(const String8& key, String8& value) 127db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 128db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) >= 0) { 129db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = mParameters.valueFor(key); 130db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 131db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 132db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 133db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 134db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 135db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 136db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::getInt(const String8& key, int& value) 137db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 138db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8; 139db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin status_t result = get(key, str8); 140db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = 0; 141db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (result == NO_ERROR) { 142db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin int val; 143db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (sscanf(str8.string(), "%d", &val) == 1) { 144db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = val; 145db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 146db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin result = INVALID_OPERATION; 147db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 148db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 149db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return result; 150db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 151db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 152db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::getFloat(const String8& key, float& value) 153db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 154db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8; 155db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin status_t result = get(key, str8); 156db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = 0; 157db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (result == NO_ERROR) { 158db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin float val; 159db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (sscanf(str8.string(), "%f", &val) == 1) { 160db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = val; 161db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 162db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin result = INVALID_OPERATION; 163db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 164db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 165db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return result; 166db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 167db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 168db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::getAt(size_t index, String8& key, String8& value) 169db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 170db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.size() > index) { 171db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin key = mParameters.keyAt(index); 172db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = mParameters.valueAt(index); 173db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 174db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 175db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 176db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 177db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 178db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 179db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin}; // namespace android 180