AudioParameter.cpp revision edf47a8cba2d1d8985b64bf4a4fac661ba34f35a
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 22edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kasten#include <hardware/audio.h> 23db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin#include <media/AudioParameter.h> 24db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 25db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinnamespace android { 26db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 27edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kasten// static 28edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kastenconst char * const AudioParameter::keyRouting = AUDIO_PARAMETER_STREAM_ROUTING; 29edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kastenconst char * const AudioParameter::keySamplingRate = AUDIO_PARAMETER_STREAM_SAMPLING_RATE; 30edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kastenconst char * const AudioParameter::keyFormat = AUDIO_PARAMETER_STREAM_FORMAT; 31edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kastenconst char * const AudioParameter::keyChannels = AUDIO_PARAMETER_STREAM_CHANNELS; 32edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kastenconst char * const AudioParameter::keyFrameCount = AUDIO_PARAMETER_STREAM_FRAME_COUNT; 33edf47a8cba2d1d8985b64bf4a4fac661ba34f35aGlenn Kastenconst char * const AudioParameter::keyInputSource = AUDIO_PARAMETER_STREAM_INPUT_SOURCE; 34db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 35db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima ZavinAudioParameter::AudioParameter(const String8& keyValuePairs) 36db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 37db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char *str = new char[keyValuePairs.length()+1]; 38db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mKeyValuePairs = keyValuePairs; 39db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 40db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin strcpy(str, keyValuePairs.string()); 41db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char *pair = strtok(str, ";"); 42db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin while (pair != NULL) { 43db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (strlen(pair) != 0) { 44db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin size_t eqIdx = strcspn(pair, "="); 45db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 key = String8(pair, eqIdx); 46db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 value; 47db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (eqIdx == strlen(pair)) { 48db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = String8(""); 49db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 50db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = String8(pair + eqIdx + 1); 51db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 52db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) < 0) { 53db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.add(key, value); 54db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 55db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.replaceValueFor(key, value); 56db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 57db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AudioParameter() cstor empty key value pair"); 59db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 60db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin pair = strtok(NULL, ";"); 61db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 62db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 63db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin delete[] str; 64db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 65db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 66db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima ZavinAudioParameter::~AudioParameter() 67db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 68db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.clear(); 69db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 70db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 71db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima ZavinString8 AudioParameter::toString() 72db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 73db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str = String8(""); 74db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 75db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin size_t size = mParameters.size(); 76db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin for (size_t i = 0; i < size; i++) { 77db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin str += mParameters.keyAt(i); 78db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin str += "="; 79db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin str += mParameters.valueAt(i); 80db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (i < (size - 1)) str += ";"; 81db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 82db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return str; 83db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 84db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 85db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::add(const String8& key, const String8& value) 86db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 87db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) < 0) { 88db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.add(key, value); 89db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 90db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 91db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.replaceValueFor(key, value); 92db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return ALREADY_EXISTS; 93db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 94db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 95db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 96db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::addInt(const String8& key, const int value) 97db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 98db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char str[12]; 99db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (snprintf(str, 12, "%d", value) > 0) { 100db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8 = String8(str); 101db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return add(key, str8); 102db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 103db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 104db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 105db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 106db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 107db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::addFloat(const String8& key, const float value) 108db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 109db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin char str[23]; 110db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (snprintf(str, 23, "%.10f", value) > 0) { 111db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8 = String8(str); 112db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return add(key, str8); 113db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 114db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 115db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 116db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 117db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 118db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::remove(const String8& key) 119db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 120db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) >= 0) { 121db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin mParameters.removeItem(key); 122db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 123db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 124db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 125db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 126db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 127db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 128db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::get(const String8& key, String8& value) 129db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 130db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.indexOfKey(key) >= 0) { 131db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = mParameters.valueFor(key); 132db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 133db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 134db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 135db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 136db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 137db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 138db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::getInt(const String8& key, int& value) 139db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 140db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8; 141db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin status_t result = get(key, str8); 142db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = 0; 143db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (result == NO_ERROR) { 144db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin int val; 145db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (sscanf(str8.string(), "%d", &val) == 1) { 146db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = val; 147db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 148db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin result = INVALID_OPERATION; 149db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 150db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 151db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return result; 152db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 153db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 154db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::getFloat(const String8& key, float& value) 155db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 156db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin String8 str8; 157db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin status_t result = get(key, str8); 158db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = 0; 159db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (result == NO_ERROR) { 160db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin float val; 161db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (sscanf(str8.string(), "%f", &val) == 1) { 162db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = val; 163db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 164db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin result = INVALID_OPERATION; 165db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 166db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 167db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return result; 168db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 169db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 170db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavinstatus_t AudioParameter::getAt(size_t index, String8& key, String8& value) 171db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin{ 172db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin if (mParameters.size() > index) { 173db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin key = mParameters.keyAt(index); 174db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin value = mParameters.valueAt(index); 175db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return NO_ERROR; 176db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } else { 177db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin return BAD_VALUE; 178db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin } 179db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin} 180db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin 181db5cb14318bb24cd6ea14ff7ceea0d5e1f83d903Dima Zavin}; // namespace android 182