AudioParameter.cpp revision ff7455c0c1df0c316a306fb81ee660840d08b6d0
17b7060c61e4182b29186849c5a857ea5f0898e56Rose, James/* 27b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * Copyright (C) 2006-2011 The Android Open Source Project 37b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * 47b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * Licensed under the Apache License, Version 2.0 (the "License"); 57b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * you may not use this file except in compliance with the License. 67b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * You may obtain a copy of the License at 77b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * 87b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * http://www.apache.org/licenses/LICENSE-2.0 97b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * 107b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * Unless required by applicable law or agreed to in writing, software 117b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * distributed under the License is distributed on an "AS IS" BASIS, 127b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * See the License for the specific language governing permissions and 147b7060c61e4182b29186849c5a857ea5f0898e56Rose, James * limitations under the License. 157b7060c61e4182b29186849c5a857ea5f0898e56Rose, James */ 167b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#define LOG_TAG "AudioParameter" 187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James//#define LOG_NDEBUG 0 197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#include <utils/Log.h> 217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#include <hardware/audio.h> 237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#include <media/AudioParameter.h> 247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 257b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesnamespace android { 267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James// static 287b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keyRouting = AUDIO_PARAMETER_STREAM_ROUTING; 297b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keySamplingRate = AUDIO_PARAMETER_STREAM_SAMPLING_RATE; 307b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keyFormat = AUDIO_PARAMETER_STREAM_FORMAT; 317b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keyChannels = AUDIO_PARAMETER_STREAM_CHANNELS; 327b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keyFrameCount = AUDIO_PARAMETER_STREAM_FRAME_COUNT; 337b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keyInputSource = AUDIO_PARAMETER_STREAM_INPUT_SOURCE; 347b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesconst char * const AudioParameter::keyScreenState = AUDIO_PARAMETER_KEY_SCREEN_STATE; 357b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 367b7060c61e4182b29186849c5a857ea5f0898e56Rose, JamesAudioParameter::AudioParameter(const String8& keyValuePairs) 377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James char *str = new char[keyValuePairs.length()+1]; 397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mKeyValuePairs = keyValuePairs; 407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James char *last; 417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James strcpy(str, keyValuePairs.string()); 437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James char *pair = strtok_r(str, ";", &last); 447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James while (pair != NULL) { 457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (strlen(pair) != 0) { 467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James size_t eqIdx = strcspn(pair, "="); 477b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 key = String8(pair, eqIdx); 487b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 value; 497b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (eqIdx == strlen(pair)) { 507b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = String8(""); 517b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 527b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = String8(pair + eqIdx + 1); 537b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 547b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (mParameters.indexOfKey(key) < 0) { 557b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mParameters.add(key, value); 567b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 577b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mParameters.replaceValueFor(key, value); 587b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 597b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 607b7060c61e4182b29186849c5a857ea5f0898e56Rose, James ALOGV("AudioParameter() cstor empty key value pair"); 617b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 627b7060c61e4182b29186849c5a857ea5f0898e56Rose, James pair = strtok_r(NULL, ";", &last); 637b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 647b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 657b7060c61e4182b29186849c5a857ea5f0898e56Rose, James delete[] str; 667b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 677b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 687b7060c61e4182b29186849c5a857ea5f0898e56Rose, JamesAudioParameter::~AudioParameter() 697b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 707b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mParameters.clear(); 717b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 727b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 737b7060c61e4182b29186849c5a857ea5f0898e56Rose, JamesString8 AudioParameter::toString() 747b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 757b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 str = String8(""); 767b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 777b7060c61e4182b29186849c5a857ea5f0898e56Rose, James size_t size = mParameters.size(); 787b7060c61e4182b29186849c5a857ea5f0898e56Rose, James for (size_t i = 0; i < size; i++) { 797b7060c61e4182b29186849c5a857ea5f0898e56Rose, James str += mParameters.keyAt(i); 807b7060c61e4182b29186849c5a857ea5f0898e56Rose, James str += "="; 817b7060c61e4182b29186849c5a857ea5f0898e56Rose, James str += mParameters.valueAt(i); 827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (i < (size - 1)) str += ";"; 837b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return str; 857b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 867b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 877b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::add(const String8& key, const String8& value) 887b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 897b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (mParameters.indexOfKey(key) < 0) { 907b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mParameters.add(key, value); 917b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return NO_ERROR; 927b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 937b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mParameters.replaceValueFor(key, value); 947b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return ALREADY_EXISTS; 957b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 967b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 977b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 987b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::addInt(const String8& key, const int value) 997b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1007b7060c61e4182b29186849c5a857ea5f0898e56Rose, James char str[12]; 1017b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (snprintf(str, 12, "%d", value) > 0) { 1027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 str8 = String8(str); 1037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return add(key, str8); 1047b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1057b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return BAD_VALUE; 1067b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1077b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1087b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1097b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::addFloat(const String8& key, const float value) 1107b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1117b7060c61e4182b29186849c5a857ea5f0898e56Rose, James char str[23]; 1127b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (snprintf(str, 23, "%.10f", value) > 0) { 1137b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 str8 = String8(str); 1147b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return add(key, str8); 1157b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1167b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return BAD_VALUE; 1177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1207b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::remove(const String8& key) 1217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (mParameters.indexOfKey(key) >= 0) { 1237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James mParameters.removeItem(key); 1247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return NO_ERROR; 1257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return BAD_VALUE; 1277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1287b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1297b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1307b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::get(const String8& key, String8& value) 1317b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1327b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (mParameters.indexOfKey(key) >= 0) { 1337b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = mParameters.valueFor(key); 1347b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return NO_ERROR; 1357b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1367b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return BAD_VALUE; 1377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1407b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::getInt(const String8& key, int& value) 1417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 str8; 1437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James status_t result = get(key, str8); 1447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = 0; 1457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (result == NO_ERROR) { 1467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James int val; 1477b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (sscanf(str8.string(), "%d", &val) == 1) { 1487b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = val; 1497b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1507b7060c61e4182b29186849c5a857ea5f0898e56Rose, James result = INVALID_OPERATION; 1517b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1527b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1537b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return result; 1547b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1557b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1567b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::getFloat(const String8& key, float& value) 1577b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1587b7060c61e4182b29186849c5a857ea5f0898e56Rose, James String8 str8; 1597b7060c61e4182b29186849c5a857ea5f0898e56Rose, James status_t result = get(key, str8); 1607b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = 0; 1617b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (result == NO_ERROR) { 1627b7060c61e4182b29186849c5a857ea5f0898e56Rose, James float val; 1637b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (sscanf(str8.string(), "%f", &val) == 1) { 1647b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = val; 1657b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1667b7060c61e4182b29186849c5a857ea5f0898e56Rose, James result = INVALID_OPERATION; 1677b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1687b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1697b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return result; 1707b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1717b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1727b7060c61e4182b29186849c5a857ea5f0898e56Rose, Jamesstatus_t AudioParameter::getAt(size_t index, String8& key, String8& value) 1737b7060c61e4182b29186849c5a857ea5f0898e56Rose, James{ 1747b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (mParameters.size() > index) { 1757b7060c61e4182b29186849c5a857ea5f0898e56Rose, James key = mParameters.keyAt(index); 1767b7060c61e4182b29186849c5a857ea5f0898e56Rose, James value = mParameters.valueAt(index); 1777b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return NO_ERROR; 1787b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } else { 1797b7060c61e4182b29186849c5a857ea5f0898e56Rose, James return BAD_VALUE; 1807b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1817b7060c61e4182b29186849c5a857ea5f0898e56Rose, James} 1827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 1837b7060c61e4182b29186849c5a857ea5f0898e56Rose, James}; // namespace android 1847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James