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