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