AudioSystem.cpp revision d2d089fc86c62843992e7d5b371ee9227189a1e6
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/IAudioFlinger.h>
24#include <media/IAudioPolicyService.h>
25#include <math.h>
26
27#include <system/audio.h>
28
29// ----------------------------------------------------------------------------
30
31namespace android {
32
33// client singleton for AudioFlinger binder interface
34Mutex AudioSystem::gLock;
35Mutex AudioSystem::gLockAPS;
36Mutex AudioSystem::gLockAPC;
37sp<IAudioFlinger> AudioSystem::gAudioFlinger;
38sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient;
39audio_error_callback AudioSystem::gAudioErrorCallback = NULL;
40
41// Cached values for output handles
42DefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(NULL);
43
44// Cached values for recording queries, all protected by gLock
45uint32_t AudioSystem::gPrevInSamplingRate;
46audio_format_t AudioSystem::gPrevInFormat;
47audio_channel_mask_t AudioSystem::gPrevInChannelMask;
48size_t AudioSystem::gInBuffSize = 0;    // zero indicates cache is invalid
49
50sp<AudioSystem::AudioPortCallback> AudioSystem::gAudioPortCallback;
51
52// establish binder interface to AudioFlinger service
53const sp<IAudioFlinger>& AudioSystem::get_audio_flinger()
54{
55    Mutex::Autolock _l(gLock);
56    if (gAudioFlinger == 0) {
57        sp<IServiceManager> sm = defaultServiceManager();
58        sp<IBinder> binder;
59        do {
60            binder = sm->getService(String16("media.audio_flinger"));
61            if (binder != 0)
62                break;
63            ALOGW("AudioFlinger not published, waiting...");
64            usleep(500000); // 0.5 s
65        } while (true);
66        if (gAudioFlingerClient == NULL) {
67            gAudioFlingerClient = new AudioFlingerClient();
68        } else {
69            if (gAudioErrorCallback) {
70                gAudioErrorCallback(NO_ERROR);
71            }
72        }
73        binder->linkToDeath(gAudioFlingerClient);
74        gAudioFlinger = interface_cast<IAudioFlinger>(binder);
75        LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0);
76        gAudioFlinger->registerClient(gAudioFlingerClient);
77    }
78
79    return gAudioFlinger;
80}
81
82/* static */ status_t AudioSystem::checkAudioFlinger()
83{
84    if (defaultServiceManager()->checkService(String16("media.audio_flinger")) != 0) {
85        return NO_ERROR;
86    }
87    return DEAD_OBJECT;
88}
89
90status_t AudioSystem::muteMicrophone(bool state)
91{
92    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
93    if (af == 0) return PERMISSION_DENIED;
94    return af->setMicMute(state);
95}
96
97status_t AudioSystem::isMicrophoneMuted(bool* state)
98{
99    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
100    if (af == 0) return PERMISSION_DENIED;
101    *state = af->getMicMute();
102    return NO_ERROR;
103}
104
105status_t AudioSystem::setMasterVolume(float value)
106{
107    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
108    if (af == 0) return PERMISSION_DENIED;
109    af->setMasterVolume(value);
110    return NO_ERROR;
111}
112
113status_t AudioSystem::setMasterMute(bool mute)
114{
115    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
116    if (af == 0) return PERMISSION_DENIED;
117    af->setMasterMute(mute);
118    return NO_ERROR;
119}
120
121status_t AudioSystem::getMasterVolume(float* volume)
122{
123    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
124    if (af == 0) return PERMISSION_DENIED;
125    *volume = af->masterVolume();
126    return NO_ERROR;
127}
128
129status_t AudioSystem::getMasterMute(bool* mute)
130{
131    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
132    if (af == 0) return PERMISSION_DENIED;
133    *mute = af->masterMute();
134    return NO_ERROR;
135}
136
137status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value,
138        audio_io_handle_t output)
139{
140    if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
141    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
142    if (af == 0) return PERMISSION_DENIED;
143    af->setStreamVolume(stream, value, output);
144    return NO_ERROR;
145}
146
147status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute)
148{
149    if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
150    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
151    if (af == 0) return PERMISSION_DENIED;
152    af->setStreamMute(stream, mute);
153    return NO_ERROR;
154}
155
156status_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume,
157        audio_io_handle_t output)
158{
159    if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
160    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
161    if (af == 0) return PERMISSION_DENIED;
162    *volume = af->streamVolume(stream, output);
163    return NO_ERROR;
164}
165
166status_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute)
167{
168    if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
169    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
170    if (af == 0) return PERMISSION_DENIED;
171    *mute = af->streamMute(stream);
172    return NO_ERROR;
173}
174
175status_t AudioSystem::setMode(audio_mode_t mode)
176{
177    if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE;
178    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
179    if (af == 0) return PERMISSION_DENIED;
180    return af->setMode(mode);
181}
182
183status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
184{
185    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
186    if (af == 0) return PERMISSION_DENIED;
187    return af->setParameters(ioHandle, keyValuePairs);
188}
189
190String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys)
191{
192    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
193    String8 result = String8("");
194    if (af == 0) return result;
195
196    result = af->getParameters(ioHandle, keys);
197    return result;
198}
199
200status_t AudioSystem::setParameters(const String8& keyValuePairs)
201{
202    return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs);
203}
204
205String8 AudioSystem::getParameters(const String8& keys)
206{
207    return getParameters(AUDIO_IO_HANDLE_NONE, keys);
208}
209
210// convert volume steps to natural log scale
211
212// change this value to change volume scaling
213static const float dBPerStep = 0.5f;
214// shouldn't need to touch these
215static const float dBConvert = -dBPerStep * 2.302585093f / 20.0f;
216static const float dBConvertInverse = 1.0f / dBConvert;
217
218float AudioSystem::linearToLog(int volume)
219{
220    // float v = volume ? exp(float(100 - volume) * dBConvert) : 0;
221    // ALOGD("linearToLog(%d)=%f", volume, v);
222    // return v;
223    return volume ? exp(float(100 - volume) * dBConvert) : 0;
224}
225
226int AudioSystem::logToLinear(float volume)
227{
228    // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
229    // ALOGD("logTolinear(%d)=%f", v, volume);
230    // return v;
231    return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0;
232}
233
234status_t AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType)
235{
236    audio_io_handle_t output;
237
238    if (streamType == AUDIO_STREAM_DEFAULT) {
239        streamType = AUDIO_STREAM_MUSIC;
240    }
241
242    output = getOutput(streamType);
243    if (output == 0) {
244        return PERMISSION_DENIED;
245    }
246
247    return getSamplingRate(output, samplingRate);
248}
249
250status_t AudioSystem::getOutputSamplingRateForAttr(uint32_t* samplingRate,
251        const audio_attributes_t *attr)
252{
253    if (attr == NULL) {
254        return BAD_VALUE;
255    }
256    audio_io_handle_t output = getOutputForAttr(attr);
257    if (output == 0) {
258        return PERMISSION_DENIED;
259    }
260    return getSamplingRate(output, samplingRate);
261}
262
263status_t AudioSystem::getSamplingRate(audio_io_handle_t output,
264                                      uint32_t* samplingRate)
265{
266    OutputDescriptor *outputDesc;
267
268    gLock.lock();
269    outputDesc = AudioSystem::gOutputs.valueFor(output);
270    if (outputDesc == NULL) {
271        ALOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output);
272        gLock.unlock();
273        const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
274        if (af == 0) return PERMISSION_DENIED;
275        *samplingRate = af->sampleRate(output);
276    } else {
277        ALOGV("getOutputSamplingRate() reading from output desc");
278        *samplingRate = outputDesc->samplingRate;
279        gLock.unlock();
280    }
281    if (*samplingRate == 0) {
282        ALOGE("AudioSystem::getSamplingRate failed for output %d", output);
283        return BAD_VALUE;
284    }
285
286    ALOGV("getSamplingRate() output %d, sampling rate %u", output, *samplingRate);
287
288    return NO_ERROR;
289}
290
291status_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType)
292{
293    audio_io_handle_t output;
294
295    if (streamType == AUDIO_STREAM_DEFAULT) {
296        streamType = AUDIO_STREAM_MUSIC;
297    }
298
299    output = getOutput(streamType);
300    if (output == AUDIO_IO_HANDLE_NONE) {
301        return PERMISSION_DENIED;
302    }
303
304    return getFrameCount(output, frameCount);
305}
306
307status_t AudioSystem::getFrameCount(audio_io_handle_t output,
308                                    size_t* frameCount)
309{
310    OutputDescriptor *outputDesc;
311
312    gLock.lock();
313    outputDesc = AudioSystem::gOutputs.valueFor(output);
314    if (outputDesc == NULL) {
315        gLock.unlock();
316        const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
317        if (af == 0) return PERMISSION_DENIED;
318        *frameCount = af->frameCount(output);
319    } else {
320        *frameCount = outputDesc->frameCount;
321        gLock.unlock();
322    }
323    if (*frameCount == 0) {
324        ALOGE("AudioSystem::getFrameCount failed for output %d", output);
325        return BAD_VALUE;
326    }
327
328    ALOGV("getFrameCount() output %d, frameCount %zu", output, *frameCount);
329
330    return NO_ERROR;
331}
332
333status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType)
334{
335    audio_io_handle_t output;
336
337    if (streamType == AUDIO_STREAM_DEFAULT) {
338        streamType = AUDIO_STREAM_MUSIC;
339    }
340
341    output = getOutput(streamType);
342    if (output == AUDIO_IO_HANDLE_NONE) {
343        return PERMISSION_DENIED;
344    }
345
346    return getLatency(output, latency);
347}
348
349status_t AudioSystem::getLatency(audio_io_handle_t output,
350                                 uint32_t* latency)
351{
352    OutputDescriptor *outputDesc;
353
354    gLock.lock();
355    outputDesc = AudioSystem::gOutputs.valueFor(output);
356    if (outputDesc == NULL) {
357        gLock.unlock();
358        const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
359        if (af == 0) return PERMISSION_DENIED;
360        *latency = af->latency(output);
361    } else {
362        *latency = outputDesc->latency;
363        gLock.unlock();
364    }
365
366    ALOGV("getLatency() output %d, latency %d", output, *latency);
367
368    return NO_ERROR;
369}
370
371status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
372        audio_channel_mask_t channelMask, size_t* buffSize)
373{
374    gLock.lock();
375    // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values
376    size_t inBuffSize = gInBuffSize;
377    if ((inBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat)
378        || (channelMask != gPrevInChannelMask)) {
379        gLock.unlock();
380        const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
381        if (af == 0) {
382            return PERMISSION_DENIED;
383        }
384        inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask);
385        if (inBuffSize == 0) {
386            ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %x",
387                    sampleRate, format, channelMask);
388            return BAD_VALUE;
389        }
390        // A benign race is possible here: we could overwrite a fresher cache entry
391        gLock.lock();
392        // save the request params
393        gPrevInSamplingRate = sampleRate;
394        gPrevInFormat = format;
395        gPrevInChannelMask = channelMask;
396
397        gInBuffSize = inBuffSize;
398    }
399    gLock.unlock();
400    *buffSize = inBuffSize;
401
402    return NO_ERROR;
403}
404
405status_t AudioSystem::setVoiceVolume(float value)
406{
407    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
408    if (af == 0) return PERMISSION_DENIED;
409    return af->setVoiceVolume(value);
410}
411
412status_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t *halFrames,
413                                        uint32_t *dspFrames)
414{
415    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
416    if (af == 0) return PERMISSION_DENIED;
417
418    return af->getRenderPosition(halFrames, dspFrames, output);
419}
420
421uint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle)
422{
423    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
424    uint32_t result = 0;
425    if (af == 0) return result;
426    if (ioHandle == AUDIO_IO_HANDLE_NONE) return result;
427
428    result = af->getInputFramesLost(ioHandle);
429    return result;
430}
431
432audio_unique_id_t AudioSystem::newAudioUniqueId()
433{
434    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
435    if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE;
436    return af->newAudioUniqueId();
437}
438
439void AudioSystem::acquireAudioSessionId(int audioSession, pid_t pid)
440{
441    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
442    if (af != 0) {
443        af->acquireAudioSessionId(audioSession, pid);
444    }
445}
446
447void AudioSystem::releaseAudioSessionId(int audioSession, pid_t pid)
448{
449    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
450    if (af != 0) {
451        af->releaseAudioSessionId(audioSession, pid);
452    }
453}
454
455audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId)
456{
457    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
458    if (af == 0) return AUDIO_HW_SYNC_INVALID;
459    return af->getAudioHwSyncForSession(sessionId);
460}
461
462// ---------------------------------------------------------------------------
463
464void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused)
465{
466    Mutex::Autolock _l(AudioSystem::gLock);
467
468    AudioSystem::gAudioFlinger.clear();
469    // clear output handles and stream to output map caches
470    AudioSystem::gOutputs.clear();
471
472    if (gAudioErrorCallback) {
473        gAudioErrorCallback(DEAD_OBJECT);
474    }
475    ALOGW("AudioFlinger server died!");
476}
477
478void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, audio_io_handle_t ioHandle,
479        const void *param2) {
480    ALOGV("ioConfigChanged() event %d", event);
481    const OutputDescriptor *desc;
482    audio_stream_type_t stream;
483
484    if (ioHandle == AUDIO_IO_HANDLE_NONE) return;
485
486    Mutex::Autolock _l(AudioSystem::gLock);
487
488    switch (event) {
489    case STREAM_CONFIG_CHANGED:
490        break;
491    case OUTPUT_OPENED: {
492        if (gOutputs.indexOfKey(ioHandle) >= 0) {
493            ALOGV("ioConfigChanged() opening already existing output! %d", ioHandle);
494            break;
495        }
496        if (param2 == NULL) break;
497        desc = (const OutputDescriptor *)param2;
498
499        OutputDescriptor *outputDesc =  new OutputDescriptor(*desc);
500        gOutputs.add(ioHandle, outputDesc);
501        ALOGV("ioConfigChanged() new output samplingRate %u, format %#x channel mask %#x frameCount %zu "
502                "latency %d",
503                outputDesc->samplingRate, outputDesc->format, outputDesc->channelMask,
504                outputDesc->frameCount, outputDesc->latency);
505        } break;
506    case OUTPUT_CLOSED: {
507        if (gOutputs.indexOfKey(ioHandle) < 0) {
508            ALOGW("ioConfigChanged() closing unknown output! %d", ioHandle);
509            break;
510        }
511        ALOGV("ioConfigChanged() output %d closed", ioHandle);
512
513        gOutputs.removeItem(ioHandle);
514        } break;
515
516    case OUTPUT_CONFIG_CHANGED: {
517        int index = gOutputs.indexOfKey(ioHandle);
518        if (index < 0) {
519            ALOGW("ioConfigChanged() modifying unknown output! %d", ioHandle);
520            break;
521        }
522        if (param2 == NULL) break;
523        desc = (const OutputDescriptor *)param2;
524
525        ALOGV("ioConfigChanged() new config for output %d samplingRate %u, format %#x channel mask %#x "
526                "frameCount %zu latency %d",
527                ioHandle, desc->samplingRate, desc->format,
528                desc->channelMask, desc->frameCount, desc->latency);
529        OutputDescriptor *outputDesc = gOutputs.valueAt(index);
530        delete outputDesc;
531        outputDesc =  new OutputDescriptor(*desc);
532        gOutputs.replaceValueFor(ioHandle, outputDesc);
533    } break;
534    case INPUT_OPENED:
535    case INPUT_CLOSED:
536    case INPUT_CONFIG_CHANGED:
537        break;
538
539    }
540}
541
542void AudioSystem::setErrorCallback(audio_error_callback cb)
543{
544    Mutex::Autolock _l(gLock);
545    gAudioErrorCallback = cb;
546}
547
548
549bool AudioSystem::routedToA2dpOutput(audio_stream_type_t streamType)
550{
551    switch (streamType) {
552    case AUDIO_STREAM_MUSIC:
553    case AUDIO_STREAM_VOICE_CALL:
554    case AUDIO_STREAM_BLUETOOTH_SCO:
555    case AUDIO_STREAM_SYSTEM:
556        return true;
557    default:
558        return false;
559    }
560}
561
562
563// client singleton for AudioPolicyService binder interface
564// protected by gLockAPS
565sp<IAudioPolicyService> AudioSystem::gAudioPolicyService;
566sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient;
567
568
569// establish binder interface to AudioPolicy service
570const sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service()
571{
572    Mutex::Autolock _l(gLockAPS);
573    if (gAudioPolicyService == 0) {
574        sp<IServiceManager> sm = defaultServiceManager();
575        sp<IBinder> binder;
576        do {
577            binder = sm->getService(String16("media.audio_policy"));
578            if (binder != 0)
579                break;
580            ALOGW("AudioPolicyService not published, waiting...");
581            usleep(500000); // 0.5 s
582        } while (true);
583        if (gAudioPolicyServiceClient == NULL) {
584            gAudioPolicyServiceClient = new AudioPolicyServiceClient();
585        }
586        binder->linkToDeath(gAudioPolicyServiceClient);
587        gAudioPolicyService = interface_cast<IAudioPolicyService>(binder);
588        LOG_ALWAYS_FATAL_IF(gAudioPolicyService == 0);
589        gAudioPolicyService->registerClient(gAudioPolicyServiceClient);
590    }
591
592    return gAudioPolicyService;
593}
594
595// ---------------------------------------------------------------------------
596
597status_t AudioSystem::setDeviceConnectionState(audio_devices_t device,
598                                               audio_policy_dev_state_t state,
599                                               const char *device_address)
600{
601    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
602    const char *address = "";
603
604    if (aps == 0) return PERMISSION_DENIED;
605
606    if (device_address != NULL) {
607        address = device_address;
608    }
609
610    return aps->setDeviceConnectionState(device, state, address);
611}
612
613audio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device,
614                                                  const char *device_address)
615{
616    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
617    if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
618
619    return aps->getDeviceConnectionState(device, device_address);
620}
621
622status_t AudioSystem::setPhoneState(audio_mode_t state)
623{
624    if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE;
625    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
626    if (aps == 0) return PERMISSION_DENIED;
627
628    return aps->setPhoneState(state);
629}
630
631status_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
632{
633    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
634    if (aps == 0) return PERMISSION_DENIED;
635    return aps->setForceUse(usage, config);
636}
637
638audio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage)
639{
640    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
641    if (aps == 0) return AUDIO_POLICY_FORCE_NONE;
642    return aps->getForceUse(usage);
643}
644
645
646audio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream,
647                                    uint32_t samplingRate,
648                                    audio_format_t format,
649                                    audio_channel_mask_t channelMask,
650                                    audio_output_flags_t flags,
651                                    const audio_offload_info_t *offloadInfo)
652{
653    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
654    if (aps == 0) return 0;
655    return aps->getOutput(stream, samplingRate, format, channelMask, flags, offloadInfo);
656}
657
658audio_io_handle_t AudioSystem::getOutputForAttr(const audio_attributes_t *attr,
659                                    uint32_t samplingRate,
660                                    audio_format_t format,
661                                    audio_channel_mask_t channelMask,
662                                    audio_output_flags_t flags,
663                                    const audio_offload_info_t *offloadInfo)
664{
665    if (attr == NULL) return 0;
666    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
667    if (aps == 0) return 0;
668    return aps->getOutputForAttr(attr, samplingRate, format, channelMask, flags, offloadInfo);
669}
670
671status_t AudioSystem::startOutput(audio_io_handle_t output,
672                                  audio_stream_type_t stream,
673                                  int session)
674{
675    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
676    if (aps == 0) return PERMISSION_DENIED;
677    return aps->startOutput(output, stream, session);
678}
679
680status_t AudioSystem::stopOutput(audio_io_handle_t output,
681                                 audio_stream_type_t stream,
682                                 int session)
683{
684    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
685    if (aps == 0) return PERMISSION_DENIED;
686    return aps->stopOutput(output, stream, session);
687}
688
689void AudioSystem::releaseOutput(audio_io_handle_t output)
690{
691    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
692    if (aps == 0) return;
693    aps->releaseOutput(output);
694}
695
696audio_io_handle_t AudioSystem::getInput(audio_source_t inputSource,
697                                    uint32_t samplingRate,
698                                    audio_format_t format,
699                                    audio_channel_mask_t channelMask,
700                                    int sessionId,
701                                    audio_input_flags_t flags)
702{
703    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
704    if (aps == 0) return 0;
705    return aps->getInput(inputSource, samplingRate, format, channelMask, sessionId, flags);
706}
707
708status_t AudioSystem::startInput(audio_io_handle_t input,
709                                 audio_session_t session)
710{
711    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
712    if (aps == 0) return PERMISSION_DENIED;
713    return aps->startInput(input, session);
714}
715
716status_t AudioSystem::stopInput(audio_io_handle_t input,
717                                audio_session_t session)
718{
719    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
720    if (aps == 0) return PERMISSION_DENIED;
721    return aps->stopInput(input, session);
722}
723
724void AudioSystem::releaseInput(audio_io_handle_t input,
725                               audio_session_t session)
726{
727    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
728    if (aps == 0) return;
729    aps->releaseInput(input, session);
730}
731
732status_t AudioSystem::initStreamVolume(audio_stream_type_t stream,
733                                    int indexMin,
734                                    int indexMax)
735{
736    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
737    if (aps == 0) return PERMISSION_DENIED;
738    return aps->initStreamVolume(stream, indexMin, indexMax);
739}
740
741status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream,
742                                           int index,
743                                           audio_devices_t device)
744{
745    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
746    if (aps == 0) return PERMISSION_DENIED;
747    return aps->setStreamVolumeIndex(stream, index, device);
748}
749
750status_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream,
751                                           int *index,
752                                           audio_devices_t device)
753{
754    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
755    if (aps == 0) return PERMISSION_DENIED;
756    return aps->getStreamVolumeIndex(stream, index, device);
757}
758
759uint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream)
760{
761    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
762    if (aps == 0) return 0;
763    return aps->getStrategyForStream(stream);
764}
765
766audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream)
767{
768    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
769    if (aps == 0) return AUDIO_DEVICE_NONE;
770    return aps->getDevicesForStream(stream);
771}
772
773audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc)
774{
775    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
776    // FIXME change return type to status_t, and return PERMISSION_DENIED here
777    if (aps == 0) return AUDIO_IO_HANDLE_NONE;
778    return aps->getOutputForEffect(desc);
779}
780
781status_t AudioSystem::registerEffect(const effect_descriptor_t *desc,
782                                audio_io_handle_t io,
783                                uint32_t strategy,
784                                int session,
785                                int id)
786{
787    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
788    if (aps == 0) return PERMISSION_DENIED;
789    return aps->registerEffect(desc, io, strategy, session, id);
790}
791
792status_t AudioSystem::unregisterEffect(int id)
793{
794    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
795    if (aps == 0) return PERMISSION_DENIED;
796    return aps->unregisterEffect(id);
797}
798
799status_t AudioSystem::setEffectEnabled(int id, bool enabled)
800{
801    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
802    if (aps == 0) return PERMISSION_DENIED;
803    return aps->setEffectEnabled(id, enabled);
804}
805
806status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs)
807{
808    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
809    if (aps == 0) return PERMISSION_DENIED;
810    if (state == NULL) return BAD_VALUE;
811    *state = aps->isStreamActive(stream, inPastMs);
812    return NO_ERROR;
813}
814
815status_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state,
816        uint32_t inPastMs)
817{
818    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
819    if (aps == 0) return PERMISSION_DENIED;
820    if (state == NULL) return BAD_VALUE;
821    *state = aps->isStreamActiveRemotely(stream, inPastMs);
822    return NO_ERROR;
823}
824
825status_t AudioSystem::isSourceActive(audio_source_t stream, bool* state)
826{
827    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
828    if (aps == 0) return PERMISSION_DENIED;
829    if (state == NULL) return BAD_VALUE;
830    *state = aps->isSourceActive(stream);
831    return NO_ERROR;
832}
833
834uint32_t AudioSystem::getPrimaryOutputSamplingRate()
835{
836    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
837    if (af == 0) return 0;
838    return af->getPrimaryOutputSamplingRate();
839}
840
841size_t AudioSystem::getPrimaryOutputFrameCount()
842{
843    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
844    if (af == 0) return 0;
845    return af->getPrimaryOutputFrameCount();
846}
847
848status_t AudioSystem::setLowRamDevice(bool isLowRamDevice)
849{
850    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
851    if (af == 0) return PERMISSION_DENIED;
852    return af->setLowRamDevice(isLowRamDevice);
853}
854
855void AudioSystem::clearAudioConfigCache()
856{
857    // called by restoreTrack_l(), which needs new IAudioFlinger and IAudioPolicyService instances
858    ALOGV("clearAudioConfigCache()");
859    {
860        Mutex::Autolock _l(gLock);
861        gOutputs.clear();
862        gAudioFlinger.clear();
863    }
864    {
865        Mutex::Autolock _l(gLockAPS);
866        gAudioPolicyService.clear();
867    }
868    // Do not clear gAudioPortCallback
869}
870
871bool AudioSystem::isOffloadSupported(const audio_offload_info_t& info)
872{
873    ALOGV("isOffloadSupported()");
874    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
875    if (aps == 0) return false;
876    return aps->isOffloadSupported(info);
877}
878
879status_t AudioSystem::listAudioPorts(audio_port_role_t role,
880                                     audio_port_type_t type,
881                                     unsigned int *num_ports,
882                                     struct audio_port *ports,
883                                     unsigned int *generation)
884{
885    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
886    if (aps == 0) return PERMISSION_DENIED;
887    return aps->listAudioPorts(role, type, num_ports, ports, generation);
888}
889
890status_t AudioSystem::getAudioPort(struct audio_port *port)
891{
892    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
893    if (aps == 0) return PERMISSION_DENIED;
894    return aps->getAudioPort(port);
895}
896
897status_t AudioSystem::createAudioPatch(const struct audio_patch *patch,
898                                   audio_patch_handle_t *handle)
899{
900    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
901    if (aps == 0) return PERMISSION_DENIED;
902    return aps->createAudioPatch(patch, handle);
903}
904
905status_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle)
906{
907    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
908    if (aps == 0) return PERMISSION_DENIED;
909    return aps->releaseAudioPatch(handle);
910}
911
912status_t AudioSystem::listAudioPatches(unsigned int *num_patches,
913                                  struct audio_patch *patches,
914                                  unsigned int *generation)
915{
916    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
917    if (aps == 0) return PERMISSION_DENIED;
918    return aps->listAudioPatches(num_patches, patches, generation);
919}
920
921status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config)
922{
923    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
924    if (aps == 0) return PERMISSION_DENIED;
925    return aps->setAudioPortConfig(config);
926}
927
928void AudioSystem::setAudioPortCallback(sp<AudioPortCallback> callBack)
929{
930    Mutex::Autolock _l(gLockAPC);
931    gAudioPortCallback = callBack;
932}
933
934status_t AudioSystem::acquireSoundTriggerSession(audio_session_t *session,
935                                       audio_io_handle_t *ioHandle,
936                                       audio_devices_t *device)
937{
938    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
939    if (aps == 0) return PERMISSION_DENIED;
940    return aps->acquireSoundTriggerSession(session, ioHandle, device);
941}
942
943status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session)
944{
945    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
946    if (aps == 0) return PERMISSION_DENIED;
947    return aps->releaseSoundTriggerSession(session);
948}
949
950audio_mode_t AudioSystem::getPhoneState()
951{
952    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
953    if (aps == 0) return AUDIO_MODE_INVALID;
954    return aps->getPhoneState();
955}
956
957
958// ---------------------------------------------------------------------------
959
960void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused)
961{
962    {
963        Mutex::Autolock _l(gLockAPC);
964        if (gAudioPortCallback != 0) {
965            gAudioPortCallback->onServiceDied();
966        }
967    }
968    {
969        Mutex::Autolock _l(gLockAPS);
970        AudioSystem::gAudioPolicyService.clear();
971    }
972
973    ALOGW("AudioPolicyService server died!");
974}
975
976void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate()
977{
978    Mutex::Autolock _l(gLockAPC);
979    if (gAudioPortCallback != 0) {
980        gAudioPortCallback->onAudioPortListUpdate();
981    }
982}
983
984void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate()
985{
986    Mutex::Autolock _l(gLockAPC);
987    if (gAudioPortCallback != 0) {
988        gAudioPortCallback->onAudioPatchListUpdate();
989    }
990}
991
992}; // namespace android
993