Home | History | Annotate | Download | only in libmedia
      1 /*
      2  * Copyright (C) 2006-2007 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 "AudioSystem"
     18 //#define LOG_NDEBUG 0
     19 
     20 #include <utils/Log.h>
     21 #include <binder/IServiceManager.h>
     22 #include <media/AudioSystem.h>
     23 #include <media/IAudioPolicyService.h>
     24 #include <math.h>
     25 
     26 // ----------------------------------------------------------------------------
     27 // the sim build doesn't have gettid
     28 
     29 #ifndef HAVE_GETTID
     30 # define gettid getpid
     31 #endif
     32 
     33 // ----------------------------------------------------------------------------
     34 
     35 namespace android {
     36 
     37 // client singleton for AudioFlinger binder interface
     38 Mutex AudioSystem::gLock;
     39 sp<IAudioFlinger> AudioSystem::gAudioFlinger;
     40 sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient;
     41 audio_error_callback AudioSystem::gAudioErrorCallback = NULL;
     42 // Cached values
     43 DefaultKeyedVector<int, audio_io_handle_t> AudioSystem::gStreamOutputMap(0);
     44 DefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(0);
     45 
     46 // Cached values for recording queries
     47 uint32_t AudioSystem::gPrevInSamplingRate = 16000;
     48 int AudioSystem::gPrevInFormat = AudioSystem::PCM_16_BIT;
     49 int AudioSystem::gPrevInChannelCount = 1;
     50 size_t AudioSystem::gInBuffSize = 0;
     51 
     52 
     53 // establish binder interface to AudioFlinger service
     54 const sp<IAudioFlinger>& AudioSystem::get_audio_flinger()
     55 {
     56     Mutex::Autolock _l(gLock);
     57     if (gAudioFlinger.get() == 0) {
     58         sp<IServiceManager> sm = defaultServiceManager();
     59         sp<IBinder> binder;
     60         do {
     61             binder = sm->getService(String16("media.audio_flinger"));
     62             if (binder != 0)
     63                 break;
     64             LOGW("AudioFlinger not published, waiting...");
     65             usleep(500000); // 0.5 s
     66         } while(true);
     67         if (gAudioFlingerClient == NULL) {
     68             gAudioFlingerClient = new AudioFlingerClient();
     69         } else {
     70             if (gAudioErrorCallback) {
     71                 gAudioErrorCallback(NO_ERROR);
     72             }
     73          }
     74         binder->linkToDeath(gAudioFlingerClient);
     75         gAudioFlinger = interface_cast<IAudioFlinger>(binder);
     76         gAudioFlinger->registerClient(gAudioFlingerClient);
     77     }
     78     LOGE_IF(gAudioFlinger==0, "no AudioFlinger!?");
     79 
     80     return gAudioFlinger;
     81 }
     82 
     83 status_t AudioSystem::muteMicrophone(bool state) {
     84     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
     85     if (af == 0) return PERMISSION_DENIED;
     86     return af->setMicMute(state);
     87 }
     88 
     89 status_t AudioSystem::isMicrophoneMuted(bool* state) {
     90     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
     91     if (af == 0) return PERMISSION_DENIED;
     92     *state = af->getMicMute();
     93     return NO_ERROR;
     94 }
     95 
     96 status_t AudioSystem::setMasterVolume(float value)
     97 {
     98     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
     99     if (af == 0) return PERMISSION_DENIED;
    100     af->setMasterVolume(value);
    101     return NO_ERROR;
    102 }
    103 
    104 status_t AudioSystem::setMasterMute(bool mute)
    105 {
    106     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    107     if (af == 0) return PERMISSION_DENIED;
    108     af->setMasterMute(mute);
    109     return NO_ERROR;
    110 }
    111 
    112 status_t AudioSystem::getMasterVolume(float* volume)
    113 {
    114     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    115     if (af == 0) return PERMISSION_DENIED;
    116     *volume = af->masterVolume();
    117     return NO_ERROR;
    118 }
    119 
    120 status_t AudioSystem::getMasterMute(bool* mute)
    121 {
    122     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    123     if (af == 0) return PERMISSION_DENIED;
    124     *mute = af->masterMute();
    125     return NO_ERROR;
    126 }
    127 
    128 status_t AudioSystem::setStreamVolume(int stream, float value, int output)
    129 {
    130     if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE;
    131     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    132     if (af == 0) return PERMISSION_DENIED;
    133     af->setStreamVolume(stream, value, output);
    134     return NO_ERROR;
    135 }
    136 
    137 status_t AudioSystem::setStreamMute(int stream, bool mute)
    138 {
    139     if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE;
    140     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    141     if (af == 0) return PERMISSION_DENIED;
    142     af->setStreamMute(stream, mute);
    143     return NO_ERROR;
    144 }
    145 
    146 status_t AudioSystem::getStreamVolume(int stream, float* volume, int output)
    147 {
    148     if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE;
    149     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    150     if (af == 0) return PERMISSION_DENIED;
    151     *volume = af->streamVolume(stream, output);
    152     return NO_ERROR;
    153 }
    154 
    155 status_t AudioSystem::getStreamMute(int stream, bool* mute)
    156 {
    157     if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE;
    158     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    159     if (af == 0) return PERMISSION_DENIED;
    160     *mute = af->streamMute(stream);
    161     return NO_ERROR;
    162 }
    163 
    164 status_t AudioSystem::setMode(int mode)
    165 {
    166     if (mode >= NUM_MODES) return BAD_VALUE;
    167     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    168     if (af == 0) return PERMISSION_DENIED;
    169     return af->setMode(mode);
    170 }
    171 
    172 
    173 status_t AudioSystem::isStreamActive(int stream, bool* state) {
    174     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    175     if (af == 0) return PERMISSION_DENIED;
    176     *state = af->isStreamActive(stream);
    177     return NO_ERROR;
    178 }
    179 
    180 
    181 status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) {
    182     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    183     if (af == 0) return PERMISSION_DENIED;
    184     return af->setParameters(ioHandle, keyValuePairs);
    185 }
    186 
    187 String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) {
    188     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    189     String8 result = String8("");
    190     if (af == 0) return result;
    191 
    192     result = af->getParameters(ioHandle, keys);
    193     return result;
    194 }
    195 
    196 // convert volume steps to natural log scale
    197 
    198 // change this value to change volume scaling
    199 static const float dBPerStep = 0.5f;
    200 // shouldn't need to touch these
    201 static const float dBConvert = -dBPerStep * 2.302585093f / 20.0f;
    202 static const float dBConvertInverse = 1.0f / dBConvert;
    203 
    204 float AudioSystem::linearToLog(int volume)
    205 {
    206     // float v = volume ? exp(float(100 - volume) * dBConvert) : 0;
    207     // LOGD("linearToLog(%d)=%f", volume, v);
    208     // return v;
    209     return volume ? exp(float(100 - volume) * dBConvert) : 0;
    210 }
    211 
    212 int AudioSystem::logToLinear(float volume)
    213 {
    214     // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
    215     // LOGD("logTolinear(%d)=%f", v, volume);
    216     // return v;
    217     return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
    218 }
    219 
    220 status_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType)
    221 {
    222     OutputDescriptor *outputDesc;
    223     audio_io_handle_t output;
    224 
    225     if (streamType == DEFAULT) {
    226         streamType = MUSIC;
    227     }
    228 
    229     output = getOutput((stream_type)streamType);
    230     if (output == 0) {
    231         return PERMISSION_DENIED;
    232     }
    233 
    234     gLock.lock();
    235     outputDesc = AudioSystem::gOutputs.valueFor(output);
    236     if (outputDesc == 0) {
    237         LOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output);
    238         gLock.unlock();
    239         const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    240         if (af == 0) return PERMISSION_DENIED;
    241         *samplingRate = af->sampleRate(output);
    242     } else {
    243         LOGV("getOutputSamplingRate() reading from output desc");
    244         *samplingRate = outputDesc->samplingRate;
    245         gLock.unlock();
    246     }
    247 
    248     LOGV("getOutputSamplingRate() streamType %d, output %d, sampling rate %d", streamType, output, *samplingRate);
    249 
    250     return NO_ERROR;
    251 }
    252 
    253 status_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType)
    254 {
    255     OutputDescriptor *outputDesc;
    256     audio_io_handle_t output;
    257 
    258     if (streamType == DEFAULT) {
    259         streamType = MUSIC;
    260     }
    261 
    262     output = getOutput((stream_type)streamType);
    263     if (output == 0) {
    264         return PERMISSION_DENIED;
    265     }
    266 
    267     gLock.lock();
    268     outputDesc = AudioSystem::gOutputs.valueFor(output);
    269     if (outputDesc == 0) {
    270         gLock.unlock();
    271         const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    272         if (af == 0) return PERMISSION_DENIED;
    273         *frameCount = af->frameCount(output);
    274     } else {
    275         *frameCount = outputDesc->frameCount;
    276         gLock.unlock();
    277     }
    278 
    279     LOGV("getOutputFrameCount() streamType %d, output %d, frameCount %d", streamType, output, *frameCount);
    280 
    281     return NO_ERROR;
    282 }
    283 
    284 status_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType)
    285 {
    286     OutputDescriptor *outputDesc;
    287     audio_io_handle_t output;
    288 
    289     if (streamType == DEFAULT) {
    290         streamType = MUSIC;
    291     }
    292 
    293     output = getOutput((stream_type)streamType);
    294     if (output == 0) {
    295         return PERMISSION_DENIED;
    296     }
    297 
    298     gLock.lock();
    299     outputDesc = AudioSystem::gOutputs.valueFor(output);
    300     if (outputDesc == 0) {
    301         gLock.unlock();
    302         const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    303         if (af == 0) return PERMISSION_DENIED;
    304         *latency = af->latency(output);
    305     } else {
    306         *latency = outputDesc->latency;
    307         gLock.unlock();
    308     }
    309 
    310     LOGV("getOutputLatency() streamType %d, output %d, latency %d", streamType, output, *latency);
    311 
    312     return NO_ERROR;
    313 }
    314 
    315 status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, int format, int channelCount,
    316     size_t* buffSize)
    317 {
    318     // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values
    319     if ((gInBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat)
    320         || (channelCount != gPrevInChannelCount)) {
    321         // save the request params
    322         gPrevInSamplingRate = sampleRate;
    323         gPrevInFormat = format;
    324         gPrevInChannelCount = channelCount;
    325 
    326         gInBuffSize = 0;
    327         const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    328         if (af == 0) {
    329             return PERMISSION_DENIED;
    330         }
    331         gInBuffSize = af->getInputBufferSize(sampleRate, format, channelCount);
    332     }
    333     *buffSize = gInBuffSize;
    334 
    335     return NO_ERROR;
    336 }
    337 
    338 status_t AudioSystem::setVoiceVolume(float value)
    339 {
    340     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    341     if (af == 0) return PERMISSION_DENIED;
    342     return af->setVoiceVolume(value);
    343 }
    344 
    345 status_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream)
    346 {
    347     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    348     if (af == 0) return PERMISSION_DENIED;
    349 
    350     if (stream == DEFAULT) {
    351         stream = MUSIC;
    352     }
    353 
    354     return af->getRenderPosition(halFrames, dspFrames, getOutput((stream_type)stream));
    355 }
    356 
    357 unsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) {
    358     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    359     unsigned int result = 0;
    360     if (af == 0) return result;
    361     if (ioHandle == 0) return result;
    362 
    363     result = af->getInputFramesLost(ioHandle);
    364     return result;
    365 }
    366 
    367 // ---------------------------------------------------------------------------
    368 
    369 void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) {
    370     Mutex::Autolock _l(AudioSystem::gLock);
    371 
    372     AudioSystem::gAudioFlinger.clear();
    373     // clear output handles and stream to output map caches
    374     AudioSystem::gStreamOutputMap.clear();
    375     AudioSystem::gOutputs.clear();
    376 
    377     if (gAudioErrorCallback) {
    378         gAudioErrorCallback(DEAD_OBJECT);
    379     }
    380     LOGW("AudioFlinger server died!");
    381 }
    382 
    383 void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, void *param2) {
    384     LOGV("ioConfigChanged() event %d", event);
    385     OutputDescriptor *desc;
    386     uint32_t stream;
    387 
    388     if (ioHandle == 0) return;
    389 
    390     Mutex::Autolock _l(AudioSystem::gLock);
    391 
    392     switch (event) {
    393     case STREAM_CONFIG_CHANGED:
    394         if (param2 == 0) break;
    395         stream = *(uint32_t *)param2;
    396         LOGV("ioConfigChanged() STREAM_CONFIG_CHANGED stream %d, output %d", stream, ioHandle);
    397         if (gStreamOutputMap.indexOfKey(stream) >= 0) {
    398             gStreamOutputMap.replaceValueFor(stream, ioHandle);
    399         }
    400         break;
    401     case OUTPUT_OPENED: {
    402         if (gOutputs.indexOfKey(ioHandle) >= 0) {
    403             LOGV("ioConfigChanged() opening already existing output! %d", ioHandle);
    404             break;
    405         }
    406         if (param2 == 0) break;
    407         desc = (OutputDescriptor *)param2;
    408 
    409         OutputDescriptor *outputDesc =  new OutputDescriptor(*desc);
    410         gOutputs.add(ioHandle, outputDesc);
    411         LOGV("ioConfigChanged() new output samplingRate %d, format %d channels %d frameCount %d latency %d",
    412                 outputDesc->samplingRate, outputDesc->format, outputDesc->channels, outputDesc->frameCount, outputDesc->latency);
    413         } break;
    414     case OUTPUT_CLOSED: {
    415         if (gOutputs.indexOfKey(ioHandle) < 0) {
    416             LOGW("ioConfigChanged() closing unknow output! %d", ioHandle);
    417             break;
    418         }
    419         LOGV("ioConfigChanged() output %d closed", ioHandle);
    420 
    421         gOutputs.removeItem(ioHandle);
    422         for (int i = gStreamOutputMap.size() - 1; i >= 0 ; i--) {
    423             if (gStreamOutputMap.valueAt(i) == ioHandle) {
    424                 gStreamOutputMap.removeItemsAt(i);
    425             }
    426         }
    427         } break;
    428 
    429     case OUTPUT_CONFIG_CHANGED: {
    430         int index = gOutputs.indexOfKey(ioHandle);
    431         if (index < 0) {
    432             LOGW("ioConfigChanged() modifying unknow output! %d", ioHandle);
    433             break;
    434         }
    435         if (param2 == 0) break;
    436         desc = (OutputDescriptor *)param2;
    437 
    438         LOGV("ioConfigChanged() new config for output %d samplingRate %d, format %d channels %d frameCount %d latency %d",
    439                 ioHandle, desc->samplingRate, desc->format,
    440                 desc->channels, desc->frameCount, desc->latency);
    441         OutputDescriptor *outputDesc = gOutputs.valueAt(index);
    442         delete outputDesc;
    443         outputDesc =  new OutputDescriptor(*desc);
    444         gOutputs.replaceValueFor(ioHandle, outputDesc);
    445     } break;
    446     case INPUT_OPENED:
    447     case INPUT_CLOSED:
    448     case INPUT_CONFIG_CHANGED:
    449         break;
    450 
    451     }
    452 }
    453 
    454 void AudioSystem::setErrorCallback(audio_error_callback cb) {
    455     Mutex::Autolock _l(gLock);
    456     gAudioErrorCallback = cb;
    457 }
    458 
    459 bool AudioSystem::routedToA2dpOutput(int streamType) {
    460     switch(streamType) {
    461     case MUSIC:
    462     case VOICE_CALL:
    463     case BLUETOOTH_SCO:
    464     case SYSTEM:
    465         return true;
    466     default:
    467         return false;
    468     }
    469 }
    470 
    471 
    472 // client singleton for AudioPolicyService binder interface
    473 sp<IAudioPolicyService> AudioSystem::gAudioPolicyService;
    474 sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient;
    475 
    476 
    477 // establish binder interface to AudioFlinger service
    478 const sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service()
    479 {
    480     gLock.lock();
    481     if (gAudioPolicyService.get() == 0) {
    482         sp<IServiceManager> sm = defaultServiceManager();
    483         sp<IBinder> binder;
    484         do {
    485             binder = sm->getService(String16("media.audio_policy"));
    486             if (binder != 0)
    487                 break;
    488             LOGW("AudioPolicyService not published, waiting...");
    489             usleep(500000); // 0.5 s
    490         } while(true);
    491         if (gAudioPolicyServiceClient == NULL) {
    492             gAudioPolicyServiceClient = new AudioPolicyServiceClient();
    493         }
    494         binder->linkToDeath(gAudioPolicyServiceClient);
    495         gAudioPolicyService = interface_cast<IAudioPolicyService>(binder);
    496         gLock.unlock();
    497     } else {
    498         gLock.unlock();
    499     }
    500     return gAudioPolicyService;
    501 }
    502 
    503 status_t AudioSystem::setDeviceConnectionState(audio_devices device,
    504                                                   device_connection_state state,
    505                                                   const char *device_address)
    506 {
    507     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    508     if (aps == 0) return PERMISSION_DENIED;
    509 
    510     return aps->setDeviceConnectionState(device, state, device_address);
    511 }
    512 
    513 AudioSystem::device_connection_state AudioSystem::getDeviceConnectionState(audio_devices device,
    514                                                   const char *device_address)
    515 {
    516     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    517     if (aps == 0) return DEVICE_STATE_UNAVAILABLE;
    518 
    519     return aps->getDeviceConnectionState(device, device_address);
    520 }
    521 
    522 status_t AudioSystem::setPhoneState(int state)
    523 {
    524     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    525     if (aps == 0) return PERMISSION_DENIED;
    526 
    527     return aps->setPhoneState(state);
    528 }
    529 
    530 status_t AudioSystem::setRingerMode(uint32_t mode, uint32_t mask)
    531 {
    532     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    533     if (aps == 0) return PERMISSION_DENIED;
    534     return aps->setRingerMode(mode, mask);
    535 }
    536 
    537 status_t AudioSystem::setForceUse(force_use usage, forced_config config)
    538 {
    539     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    540     if (aps == 0) return PERMISSION_DENIED;
    541     return aps->setForceUse(usage, config);
    542 }
    543 
    544 AudioSystem::forced_config AudioSystem::getForceUse(force_use usage)
    545 {
    546     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    547     if (aps == 0) return FORCE_NONE;
    548     return aps->getForceUse(usage);
    549 }
    550 
    551 
    552 audio_io_handle_t AudioSystem::getOutput(stream_type stream,
    553                                     uint32_t samplingRate,
    554                                     uint32_t format,
    555                                     uint32_t channels,
    556                                     output_flags flags)
    557 {
    558     audio_io_handle_t output = 0;
    559     // Do not use stream to output map cache if the direct output
    560     // flag is set or if we are likely to use a direct output
    561     // (e.g voice call stream @ 8kHz could use BT SCO device and be routed to
    562     // a direct output on some platforms).
    563     // TODO: the output cache and stream to output mapping implementation needs to
    564     // be reworked for proper operation with direct outputs. This code is too specific
    565     // to the first use case we want to cover (Voice Recognition and Voice Dialer over
    566     // Bluetooth SCO
    567     if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0 &&
    568         ((stream != AudioSystem::VOICE_CALL && stream != AudioSystem::BLUETOOTH_SCO) ||
    569          channels != AudioSystem::CHANNEL_OUT_MONO ||
    570          (samplingRate != 8000 && samplingRate != 16000))) {
    571         Mutex::Autolock _l(gLock);
    572         output = AudioSystem::gStreamOutputMap.valueFor(stream);
    573         LOGV_IF((output != 0), "getOutput() read %d from cache for stream %d", output, stream);
    574     }
    575     if (output == 0) {
    576         const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    577         if (aps == 0) return 0;
    578         output = aps->getOutput(stream, samplingRate, format, channels, flags);
    579         if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0) {
    580             Mutex::Autolock _l(gLock);
    581             AudioSystem::gStreamOutputMap.add(stream, output);
    582         }
    583     }
    584     return output;
    585 }
    586 
    587 status_t AudioSystem::startOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
    588 {
    589     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    590     if (aps == 0) return PERMISSION_DENIED;
    591     return aps->startOutput(output, stream);
    592 }
    593 
    594 status_t AudioSystem::stopOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
    595 {
    596     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    597     if (aps == 0) return PERMISSION_DENIED;
    598     return aps->stopOutput(output, stream);
    599 }
    600 
    601 void AudioSystem::releaseOutput(audio_io_handle_t output)
    602 {
    603     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    604     if (aps == 0) return;
    605     aps->releaseOutput(output);
    606 }
    607 
    608 audio_io_handle_t AudioSystem::getInput(int inputSource,
    609                                     uint32_t samplingRate,
    610                                     uint32_t format,
    611                                     uint32_t channels,
    612                                     audio_in_acoustics acoustics)
    613 {
    614     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    615     if (aps == 0) return 0;
    616     return aps->getInput(inputSource, samplingRate, format, channels, acoustics);
    617 }
    618 
    619 status_t AudioSystem::startInput(audio_io_handle_t input)
    620 {
    621     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    622     if (aps == 0) return PERMISSION_DENIED;
    623     return aps->startInput(input);
    624 }
    625 
    626 status_t AudioSystem::stopInput(audio_io_handle_t input)
    627 {
    628     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    629     if (aps == 0) return PERMISSION_DENIED;
    630     return aps->stopInput(input);
    631 }
    632 
    633 void AudioSystem::releaseInput(audio_io_handle_t input)
    634 {
    635     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    636     if (aps == 0) return;
    637     aps->releaseInput(input);
    638 }
    639 
    640 status_t AudioSystem::initStreamVolume(stream_type stream,
    641                                     int indexMin,
    642                                     int indexMax)
    643 {
    644     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    645     if (aps == 0) return PERMISSION_DENIED;
    646     return aps->initStreamVolume(stream, indexMin, indexMax);
    647 }
    648 
    649 status_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index)
    650 {
    651     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    652     if (aps == 0) return PERMISSION_DENIED;
    653     return aps->setStreamVolumeIndex(stream, index);
    654 }
    655 
    656 status_t AudioSystem::getStreamVolumeIndex(stream_type stream, int *index)
    657 {
    658     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    659     if (aps == 0) return PERMISSION_DENIED;
    660     return aps->getStreamVolumeIndex(stream, index);
    661 }
    662 
    663 // ---------------------------------------------------------------------------
    664 
    665 void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who) {
    666     Mutex::Autolock _l(AudioSystem::gLock);
    667     AudioSystem::gAudioPolicyService.clear();
    668 
    669     LOGW("AudioPolicyService server died!");
    670 }
    671 
    672 // ---------------------------------------------------------------------------
    673 
    674 
    675 // use emulated popcount optimization
    676 // http://www.df.lth.se/~john_e/gems/gem002d.html
    677 uint32_t AudioSystem::popCount(uint32_t u)
    678 {
    679     u = ((u&0x55555555) + ((u>>1)&0x55555555));
    680     u = ((u&0x33333333) + ((u>>2)&0x33333333));
    681     u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f));
    682     u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff));
    683     u = ( u&0x0000ffff) + (u>>16);
    684     return u;
    685 }
    686 
    687 bool AudioSystem::isOutputDevice(audio_devices device)
    688 {
    689     if ((popCount(device) == 1 ) &&
    690         ((device & ~AudioSystem::DEVICE_OUT_ALL) == 0)) {
    691         return true;
    692     } else {
    693         return false;
    694     }
    695 }
    696 
    697 bool AudioSystem::isInputDevice(audio_devices device)
    698 {
    699     if ((popCount(device) == 1 ) &&
    700         ((device & ~AudioSystem::DEVICE_IN_ALL) == 0)) {
    701         return true;
    702     } else {
    703         return false;
    704     }
    705 }
    706 
    707 bool AudioSystem::isA2dpDevice(audio_devices device)
    708 {
    709     if ((popCount(device) == 1 ) &&
    710         (device & (AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP |
    711                    AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
    712                    AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER))) {
    713         return true;
    714     } else {
    715         return false;
    716     }
    717 }
    718 
    719 bool AudioSystem::isBluetoothScoDevice(audio_devices device)
    720 {
    721     if ((popCount(device) == 1 ) &&
    722         (device & (AudioSystem::DEVICE_OUT_BLUETOOTH_SCO |
    723                    AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET |
    724                    AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT))) {
    725         return true;
    726     } else {
    727         return false;
    728     }
    729 }
    730 
    731 bool AudioSystem::isLowVisibility(stream_type stream)
    732 {
    733     if (stream == AudioSystem::SYSTEM ||
    734         stream == AudioSystem::NOTIFICATION ||
    735         stream == AudioSystem::RING) {
    736         return true;
    737     } else {
    738         return false;
    739     }
    740 }
    741 
    742 bool AudioSystem::isInputChannel(uint32_t channel)
    743 {
    744     if ((channel & ~AudioSystem::CHANNEL_IN_ALL) == 0) {
    745         return true;
    746     } else {
    747         return false;
    748     }
    749 }
    750 
    751 bool AudioSystem::isOutputChannel(uint32_t channel)
    752 {
    753     if ((channel & ~AudioSystem::CHANNEL_OUT_ALL) == 0) {
    754         return true;
    755     } else {
    756         return false;
    757     }
    758 }
    759 
    760 bool AudioSystem::isValidFormat(uint32_t format)
    761 {
    762     switch (format & MAIN_FORMAT_MASK) {
    763     case         PCM:
    764     case         MP3:
    765     case         AMR_NB:
    766     case         AMR_WB:
    767     case         AAC:
    768     case         HE_AAC_V1:
    769     case         HE_AAC_V2:
    770     case         VORBIS:
    771         return true;
    772     default:
    773         return false;
    774     }
    775 }
    776 
    777 bool AudioSystem::isLinearPCM(uint32_t format)
    778 {
    779     switch (format) {
    780     case         PCM_16_BIT:
    781     case         PCM_8_BIT:
    782         return true;
    783     default:
    784         return false;
    785     }
    786 }
    787 
    788 //------------------------- AudioParameter class implementation ---------------
    789 
    790 const char *AudioParameter::keyRouting = "routing";
    791 const char *AudioParameter::keySamplingRate = "sampling_rate";
    792 const char *AudioParameter::keyFormat = "format";
    793 const char *AudioParameter::keyChannels = "channels";
    794 const char *AudioParameter::keyFrameCount = "frame_count";
    795 
    796 AudioParameter::AudioParameter(const String8& keyValuePairs)
    797 {
    798     char *str = new char[keyValuePairs.length()+1];
    799     mKeyValuePairs = keyValuePairs;
    800 
    801     strcpy(str, keyValuePairs.string());
    802     char *pair = strtok(str, ";");
    803     while (pair != NULL) {
    804         if (strlen(pair) != 0) {
    805             size_t eqIdx = strcspn(pair, "=");
    806             String8 key = String8(pair, eqIdx);
    807             String8 value;
    808             if (eqIdx == strlen(pair)) {
    809                 value = String8("");
    810             } else {
    811                 value = String8(pair + eqIdx + 1);
    812             }
    813             if (mParameters.indexOfKey(key) < 0) {
    814                 mParameters.add(key, value);
    815             } else {
    816                 mParameters.replaceValueFor(key, value);
    817             }
    818         } else {
    819             LOGV("AudioParameter() cstor empty key value pair");
    820         }
    821         pair = strtok(NULL, ";");
    822     }
    823 
    824     delete[] str;
    825 }
    826 
    827 AudioParameter::~AudioParameter()
    828 {
    829     mParameters.clear();
    830 }
    831 
    832 String8 AudioParameter::toString()
    833 {
    834     String8 str = String8("");
    835 
    836     size_t size = mParameters.size();
    837     for (size_t i = 0; i < size; i++) {
    838         str += mParameters.keyAt(i);
    839         str += "=";
    840         str += mParameters.valueAt(i);
    841         if (i < (size - 1)) str += ";";
    842     }
    843     return str;
    844 }
    845 
    846 status_t AudioParameter::add(const String8& key, const String8& value)
    847 {
    848     if (mParameters.indexOfKey(key) < 0) {
    849         mParameters.add(key, value);
    850         return NO_ERROR;
    851     } else {
    852         mParameters.replaceValueFor(key, value);
    853         return ALREADY_EXISTS;
    854     }
    855 }
    856 
    857 status_t AudioParameter::addInt(const String8& key, const int value)
    858 {
    859     char str[12];
    860     if (snprintf(str, 12, "%d", value) > 0) {
    861         String8 str8 = String8(str);
    862         return add(key, str8);
    863     } else {
    864         return BAD_VALUE;
    865     }
    866 }
    867 
    868 status_t AudioParameter::addFloat(const String8& key, const float value)
    869 {
    870     char str[23];
    871     if (snprintf(str, 23, "%.10f", value) > 0) {
    872         String8 str8 = String8(str);
    873         return add(key, str8);
    874     } else {
    875         return BAD_VALUE;
    876     }
    877 }
    878 
    879 status_t AudioParameter::remove(const String8& key)
    880 {
    881     if (mParameters.indexOfKey(key) >= 0) {
    882         mParameters.removeItem(key);
    883         return NO_ERROR;
    884     } else {
    885         return BAD_VALUE;
    886     }
    887 }
    888 
    889 status_t AudioParameter::get(const String8& key, String8& value)
    890 {
    891     if (mParameters.indexOfKey(key) >= 0) {
    892         value = mParameters.valueFor(key);
    893         return NO_ERROR;
    894     } else {
    895         return BAD_VALUE;
    896     }
    897 }
    898 
    899 status_t AudioParameter::getInt(const String8& key, int& value)
    900 {
    901     String8 str8;
    902     status_t result = get(key, str8);
    903     value = 0;
    904     if (result == NO_ERROR) {
    905         int val;
    906         if (sscanf(str8.string(), "%d", &val) == 1) {
    907             value = val;
    908         } else {
    909             result = INVALID_OPERATION;
    910         }
    911     }
    912     return result;
    913 }
    914 
    915 status_t AudioParameter::getFloat(const String8& key, float& value)
    916 {
    917     String8 str8;
    918     status_t result = get(key, str8);
    919     value = 0;
    920     if (result == NO_ERROR) {
    921         float val;
    922         if (sscanf(str8.string(), "%f", &val) == 1) {
    923             value = val;
    924         } else {
    925             result = INVALID_OPERATION;
    926         }
    927     }
    928     return result;
    929 }
    930 
    931 status_t AudioParameter::getAt(size_t index, String8& key, String8& value)
    932 {
    933     if (mParameters.size() > index) {
    934         key = mParameters.keyAt(index);
    935         value = mParameters.valueAt(index);
    936         return NO_ERROR;
    937     } else {
    938         return BAD_VALUE;
    939     }
    940 }
    941 }; // namespace android
    942 
    943