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