AudioPolicyClientImplLegacy.cpp revision b2379ba0a32638bae2ea0460644f68cf5a0967ce
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{ 114a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten return open_output(AUDIO_MODULE_HANDLE_NONE, 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) 193b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent && !captureAudioOutputAllowed(IPCThreadState::self()->getCallingPid(), 194b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent IPCThreadState::self()->getCallingUid())) { 19597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi ALOGE("open_input() permission denied: capture not allowed"); 19697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi return AUDIO_IO_HANDLE_NONE; 19797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 19897bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 199cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t config = AUDIO_CONFIG_INITIALIZER;; 200cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent config.sample_rate = *pSamplingRate; 201cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent config.format = *pFormat; 202cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent config.channel_mask = *pChannelMask; 203cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = AUDIO_IO_HANDLE_NONE; 204cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = af->openInput(module, &input, &config, pDevices, 205cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8(""), AUDIO_SOURCE_MIC, AUDIO_INPUT_FLAG_FAST /*FIXME*/); 206cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 207cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *pSamplingRate = config.sample_rate; 208cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *pFormat = config.format; 209cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *pChannelMask = config.channel_mask; 210cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 211cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return input; 212cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent} 213cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent 214cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent 215dce54a1492c410ad0d93253b341fb33305337505Eric Laurent// deprecated: replaced by aps_open_input_on_module(), and acoustics parameter is ignored 216dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_input(void *service __unused, 217dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t *pDevices, 218dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t *pSamplingRate, 219dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_format_t *pFormat, 220dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_channel_mask_t *pChannelMask, 221dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_in_acoustics_t acoustics __unused) 222dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 223a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten return open_input(AUDIO_MODULE_HANDLE_NONE, pDevices, pSamplingRate, pFormat, pChannelMask); 224dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 225dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 226dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t aps_open_input_on_module(void *service __unused, 227dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_module_handle_t module, 228dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t *pDevices, 229dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t *pSamplingRate, 230dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_format_t *pFormat, 231dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_channel_mask_t *pChannelMask) 232dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 233cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return open_input(module, pDevices, pSamplingRate, pFormat, pChannelMask); 234dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 235dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 236dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_close_input(void *service __unused, audio_io_handle_t input) 237dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 238dce54a1492c410ad0d93253b341fb33305337505Eric Laurent sp<IAudioFlinger> af = AudioSystem::get_audio_flinger(); 239dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (af == 0) { 240dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 241dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 242dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 243dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return af->closeInput(input); 244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 245dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 246dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_invalidate_stream(void *service __unused, audio_stream_type_t stream) 247dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 248dce54a1492c410ad0d93253b341fb33305337505Eric Laurent sp<IAudioFlinger> af = AudioSystem::get_audio_flinger(); 249dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (af == 0) { 250dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 251dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 252dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 253dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return af->invalidateStream(stream); 254dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 255dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 256d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenint aps_move_effects(void *service __unused, audio_session_t session, 257dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_io_handle_t src_output, 258dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_io_handle_t dst_output) 259dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 260dce54a1492c410ad0d93253b341fb33305337505Eric Laurent sp<IAudioFlinger> af = AudioSystem::get_audio_flinger(); 261dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (af == 0) { 262dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 264dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 265dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return af->moveEffects(session, src_output, dst_output); 266dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 267dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 268dce54a1492c410ad0d93253b341fb33305337505Eric Laurentchar * aps_get_parameters(void *service __unused, audio_io_handle_t io_handle, 269dce54a1492c410ad0d93253b341fb33305337505Eric Laurent const char *keys) 270dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 271dce54a1492c410ad0d93253b341fb33305337505Eric Laurent String8 result = AudioSystem::getParameters(io_handle, String8(keys)); 272dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return strdup(result.string()); 273dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 274dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 275dce54a1492c410ad0d93253b341fb33305337505Eric Laurentvoid aps_set_parameters(void *service, audio_io_handle_t io_handle, 276dce54a1492c410ad0d93253b341fb33305337505Eric Laurent const char *kv_pairs, int delay_ms) 277dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 278dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyService *audioPolicyService = (AudioPolicyService *)service; 279dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 280dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audioPolicyService->setParameters(io_handle, kv_pairs, delay_ms); 281dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 282dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 283dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_set_stream_volume(void *service, audio_stream_type_t stream, 284dce54a1492c410ad0d93253b341fb33305337505Eric Laurent float volume, audio_io_handle_t output, 285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int delay_ms) 286dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 287dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyService *audioPolicyService = (AudioPolicyService *)service; 288dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return audioPolicyService->setStreamVolume(stream, volume, output, 290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent delay_ms); 291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 292dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 293dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_start_tone(void *service, audio_policy_tone_t tone, 294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_stream_type_t stream) 295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyService *audioPolicyService = (AudioPolicyService *)service; 297dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 298dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return audioPolicyService->startTone(tone, stream); 299dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 300dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 301dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_stop_tone(void *service) 302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyService *audioPolicyService = (AudioPolicyService *)service; 304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 305dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return audioPolicyService->stopTone(); 306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 307dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 308dce54a1492c410ad0d93253b341fb33305337505Eric Laurentint aps_set_voice_volume(void *service, float volume, int delay_ms) 309dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 310dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioPolicyService *audioPolicyService = (AudioPolicyService *)service; 311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return audioPolicyService->setVoiceVolume(volume, delay_ms); 313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 315dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // extern "C" 316dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 317dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android 318