1dce54a1492c410ad0d93253b341fb33305337505Eric Laurent/*
2dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Copyright (C) 2009 The Android Open Source Project
3dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
4dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * you may not use this file except in compliance with the License.
6dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * You may obtain a copy of the License at
7dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
8dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
10dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Unless required by applicable law or agreed to in writing, software
11dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * See the License for the specific language governing permissions and
14dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * limitations under the License.
15dce54a1492c410ad0d93253b341fb33305337505Eric Laurent */
16dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
17dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#define LOG_TAG "AudioPolicyService"
18dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//#define LOG_NDEBUG 0
19dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
20dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "Configuration.h"
21dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#undef __STRICT_ANSI__
22dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#define __STDINT_LIMITS
23dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#define __STDC_LIMIT_MACROS
24dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <stdint.h>
25dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
26dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <sys/time.h>
27dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <binder/IServiceManager.h>
28dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <utils/Log.h>
29dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <cutils/properties.h>
30dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <binder/IPCThreadState.h>
31dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <utils/String16.h>
32dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <utils/threads.h>
33dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "AudioPolicyService.h"
34dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "ServiceUtilities.h"
35dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <hardware_legacy/power.h>
36dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <media/AudioEffect.h>
37dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <media/EffectsFactoryApi.h>
38dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//#include <media/IAudioFlinger.h>
39dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
40dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <hardware/hardware.h>
41dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <system/audio.h>
42dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <system/audio_policy.h>
43dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <hardware/audio_policy.h>
44dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <audio_effects/audio_effects_conf.h>
45dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <media/AudioParameter.h>
46dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
47dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
48dce54a1492c410ad0d93253b341fb33305337505Eric Laurentnamespace android {
49dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
50dce54a1492c410ad0d93253b341fb33305337505Eric Laurent/* implementation of the interface to the policy manager */
51dce54a1492c410ad0d93253b341fb33305337505Eric Laurentextern "C" {
52dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
53dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_module_handle_t aps_load_hw_module(void *service __unused,
54dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                             const char *name)
55dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
56dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
57dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
58dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGW("%s: could not get AudioFlinger", __func__);
59dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
60dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
61dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
62dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->loadHwModule(name);
63dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
64dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
65cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurentstatic audio_io_handle_t open_output(audio_module_handle_t module,
66cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_devices_t *pDevices,
67cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    uint32_t *pSamplingRate,
68cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_format_t *pFormat,
69cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_channel_mask_t *pChannelMask,
70cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    uint32_t *pLatencyMs,
71cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_output_flags_t flags,
72cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    const audio_offload_info_t *offloadInfo)
73cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent{
74cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
75cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (af == 0) {
76cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGW("%s: could not get AudioFlinger", __func__);
77cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return AUDIO_IO_HANDLE_NONE;
78cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
79cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent
80cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (pSamplingRate == NULL || pFormat == NULL || pChannelMask == NULL ||
81cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            pDevices == NULL || pLatencyMs == NULL) {
82cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return AUDIO_IO_HANDLE_NONE;
83cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
84cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    audio_config_t config = AUDIO_CONFIG_INITIALIZER;
85cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    config.sample_rate = *pSamplingRate;
86cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    config.format = *pFormat;
87cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    config.channel_mask = *pChannelMask;
88cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (offloadInfo != NULL) {
89cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        config.offload_info = *offloadInfo;
90cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
91cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
92cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    status_t status = af->openOutput(module, &output, &config, pDevices,
93cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                     String8(""), pLatencyMs, flags);
94cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (status == NO_ERROR) {
95cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *pSamplingRate = config.sample_rate;
96cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *pFormat = config.format;
97cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *pChannelMask = config.channel_mask;
98cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (offloadInfo != NULL) {
99f380677f21240ffb78bcdf7c804fe0a7807fb08dEric Laurent            *((audio_offload_info_t *)offloadInfo) = config.offload_info;
100cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
101cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
102cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    return output;
103cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent}
104cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent
105dce54a1492c410ad0d93253b341fb33305337505Eric Laurent// deprecated: replaced by aps_open_output_on_module()
106dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_output(void *service __unused,
107dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_devices_t *pDevices,
108dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         uint32_t *pSamplingRate,
109dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_format_t *pFormat,
110dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_channel_mask_t *pChannelMask,
111dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         uint32_t *pLatencyMs,
112dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_output_flags_t flags)
113dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
114cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    return open_output((audio_module_handle_t)0, pDevices, pSamplingRate, pFormat, pChannelMask,
115cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                          pLatencyMs, flags, NULL);
116dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
117dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
118dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_output_on_module(void *service __unused,
119dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   audio_module_handle_t module,
120dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   audio_devices_t *pDevices,
121dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   uint32_t *pSamplingRate,
122dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   audio_format_t *pFormat,
123dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   audio_channel_mask_t *pChannelMask,
124dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   uint32_t *pLatencyMs,
125dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   audio_output_flags_t flags,
126dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   const audio_offload_info_t *offloadInfo)
127dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
128cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    return open_output(module, pDevices, pSamplingRate, pFormat, pChannelMask,
129dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                          pLatencyMs, flags, offloadInfo);
130dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
131dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
132dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_dup_output(void *service __unused,
133dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                 audio_io_handle_t output1,
134dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                 audio_io_handle_t output2)
135dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
136dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
137dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
138dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGW("%s: could not get AudioFlinger", __func__);
139dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
140dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
141dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->openDuplicateOutput(output1, output2);
142dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
143dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
144dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_close_output(void *service __unused, audio_io_handle_t output)
145dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
146dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
147dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
148dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
149dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
150dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
151dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->closeOutput(output);
152dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
153dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
154dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_suspend_output(void *service __unused, audio_io_handle_t output)
155dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
156dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
157dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
158dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGW("%s: could not get AudioFlinger", __func__);
159dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
160dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
161dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
162dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->suspendOutput(output);
163dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
164dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
165dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_restore_output(void *service __unused, audio_io_handle_t output)
166dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
167dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
168dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
169dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGW("%s: could not get AudioFlinger", __func__);
170dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
171dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
172dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
173dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->restoreOutput(output);
174dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
175dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
176cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurentstatic audio_io_handle_t open_input(audio_module_handle_t module,
177cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_devices_t *pDevices,
178cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    uint32_t *pSamplingRate,
179cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_format_t *pFormat,
180cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    audio_channel_mask_t *pChannelMask)
181cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent{
182cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
183cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (af == 0) {
184cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGW("%s: could not get AudioFlinger", __func__);
185cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return AUDIO_IO_HANDLE_NONE;
186cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
187cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent
188cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (pSamplingRate == NULL || pFormat == NULL || pChannelMask == NULL || pDevices == NULL) {
189cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return AUDIO_IO_HANDLE_NONE;
190cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
19197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi
19297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi    if (((*pDevices & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX)
19397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi            && !captureAudioOutputAllowed()) {
19497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi        ALOGE("open_input() permission denied: capture not allowed");
19597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi        return AUDIO_IO_HANDLE_NONE;
19697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi    }
19797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi
198cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    audio_config_t config = AUDIO_CONFIG_INITIALIZER;;
199cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    config.sample_rate = *pSamplingRate;
200cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    config.format = *pFormat;
201cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    config.channel_mask = *pChannelMask;
202cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
203cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    status_t status = af->openInput(module, &input, &config, pDevices,
204cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                    String8(""), AUDIO_SOURCE_MIC, AUDIO_INPUT_FLAG_FAST /*FIXME*/);
205cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    if (status == NO_ERROR) {
206cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *pSamplingRate = config.sample_rate;
207cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *pFormat = config.format;
208cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *pChannelMask = config.channel_mask;
209cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    }
210cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    return input;
211cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent}
212cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent
213cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent
214dce54a1492c410ad0d93253b341fb33305337505Eric Laurent// deprecated: replaced by aps_open_input_on_module(), and acoustics parameter is ignored
215dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_input(void *service __unused,
216dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        audio_devices_t *pDevices,
217dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        uint32_t *pSamplingRate,
218dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        audio_format_t *pFormat,
219dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        audio_channel_mask_t *pChannelMask,
220dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        audio_in_acoustics_t acoustics __unused)
221dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
222cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    return  open_input((audio_module_handle_t)0, pDevices, pSamplingRate, pFormat, pChannelMask);
223dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
224dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
225dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_input_on_module(void *service __unused,
226dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_module_handle_t module,
227dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t *pDevices,
228dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  uint32_t *pSamplingRate,
229dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_format_t *pFormat,
230dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_channel_mask_t *pChannelMask)
231dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
232cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    return  open_input(module, pDevices, pSamplingRate, pFormat, pChannelMask);
233dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
234dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
235dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_close_input(void *service __unused, audio_io_handle_t input)
236dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
237dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
238dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
239dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
240dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
241dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
242dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->closeInput(input);
243dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
245dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_invalidate_stream(void *service __unused, audio_stream_type_t stream)
246dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
247dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
248dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
249dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
250dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
251dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
252dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->invalidateStream(stream);
253dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
254dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
255dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_move_effects(void *service __unused, int session,
256dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                audio_io_handle_t src_output,
257dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                audio_io_handle_t dst_output)
258dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
259dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
260dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (af == 0) {
261dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
262dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
264dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return af->moveEffects(session, src_output, dst_output);
265dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
266dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
267dce54a1492c410ad0d93253b341fb33305337505Eric Laurentchar * aps_get_parameters(void *service __unused, audio_io_handle_t io_handle,
268dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                     const char *keys)
269dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
270dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    String8 result = AudioSystem::getParameters(io_handle, String8(keys));
271dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return strdup(result.string());
272dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
273dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
274dce54a1492c410ad0d93253b341fb33305337505Eric Laurentvoid aps_set_parameters(void *service, audio_io_handle_t io_handle,
275dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                   const char *kv_pairs, int delay_ms)
276dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
277dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioPolicyService *audioPolicyService = (AudioPolicyService *)service;
278dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
279dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    audioPolicyService->setParameters(io_handle, kv_pairs, delay_ms);
280dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
281dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
282dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_set_stream_volume(void *service, audio_stream_type_t stream,
283dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                     float volume, audio_io_handle_t output,
284dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                     int delay_ms)
285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
286dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioPolicyService *audioPolicyService = (AudioPolicyService *)service;
287dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
288dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return audioPolicyService->setStreamVolume(stream, volume, output,
289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                               delay_ms);
290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
292dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_start_tone(void *service, audio_policy_tone_t tone,
293dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                              audio_stream_type_t stream)
294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioPolicyService *audioPolicyService = (AudioPolicyService *)service;
296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
297dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return audioPolicyService->startTone(tone, stream);
298dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
299dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
300dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_stop_tone(void *service)
301dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioPolicyService *audioPolicyService = (AudioPolicyService *)service;
303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return audioPolicyService->stopTone();
305dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
307dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_set_voice_volume(void *service, float volume, int delay_ms)
308dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
309dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioPolicyService *audioPolicyService = (AudioPolicyService *)service;
310dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return audioPolicyService->setVoiceVolume(volume, delay_ms);
312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // extern "C"
315dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
316dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android
317