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