1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2006-2007 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "AudioSystem"
18*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker
22*ec779b8eSAndroid Build Coastguard Worker #include <android/media/IAudioPolicyService.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <android/media/AudioMixUpdate.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <android/media/BnCaptureStateListener.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <android_media_audiopolicy.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <cutils/properties.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversion.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioResamplerPublic.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioSystem.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <media/IAudioFlinger.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <media/PolicyAidlConversion.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <media/TypeConverter.h>
36*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ServiceSingleton.h>
37*ec779b8eSAndroid Build Coastguard Worker #include <math.h>
38*ec779b8eSAndroid Build Coastguard Worker #include <private/android_filesystem_config.h>
39*ec779b8eSAndroid Build Coastguard Worker
40*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
41*ec779b8eSAndroid Build Coastguard Worker #include <android/media/GetInputForAttrResponse.h>
42*ec779b8eSAndroid Build Coastguard Worker #include <android/media/AudioMixerAttributesInternal.h>
43*ec779b8eSAndroid Build Coastguard Worker
44*ec779b8eSAndroid Build Coastguard Worker #define VALUE_OR_RETURN_BINDER_STATUS(x) \
45*ec779b8eSAndroid Build Coastguard Worker ({ auto _tmp = (x); \
46*ec779b8eSAndroid Build Coastguard Worker if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
47*ec779b8eSAndroid Build Coastguard Worker std::move(_tmp.value()); })
48*ec779b8eSAndroid Build Coastguard Worker
49*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
50*ec779b8eSAndroid Build Coastguard Worker
51*ec779b8eSAndroid Build Coastguard Worker namespace audio_flags = android::media::audiopolicy;
52*ec779b8eSAndroid Build Coastguard Worker
53*ec779b8eSAndroid Build Coastguard Worker namespace android {
54*ec779b8eSAndroid Build Coastguard Worker using aidl_utils::statusTFromBinderStatus;
55*ec779b8eSAndroid Build Coastguard Worker using binder::Status;
56*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState;
57*ec779b8eSAndroid Build Coastguard Worker using media::IAudioPolicyService;
58*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfig;
59*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfigBase;
60*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDevice;
61*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceDescription;
62*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFormatDescription;
63*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMMapPolicyInfo;
64*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMMapPolicyType;
65*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioOffloadInfo;
66*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioSource;
67*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioStreamType;
68*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUsage;
69*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::Int;
70*ec779b8eSAndroid Build Coastguard Worker
71*ec779b8eSAndroid Build Coastguard Worker std::mutex AudioSystem::gMutex;
72*ec779b8eSAndroid Build Coastguard Worker dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL;
73*ec779b8eSAndroid Build Coastguard Worker record_config_callback AudioSystem::gRecordConfigCallback = NULL;
74*ec779b8eSAndroid Build Coastguard Worker routing_callback AudioSystem::gRoutingCallback = NULL;
75*ec779b8eSAndroid Build Coastguard Worker vol_range_init_req_callback AudioSystem::gVolRangeInitReqCallback = NULL;
76*ec779b8eSAndroid Build Coastguard Worker
77*ec779b8eSAndroid Build Coastguard Worker std::mutex AudioSystem::gApsCallbackMutex;
78*ec779b8eSAndroid Build Coastguard Worker std::mutex AudioSystem::gErrorCallbacksMutex;
79*ec779b8eSAndroid Build Coastguard Worker std::set<audio_error_callback> AudioSystem::gAudioErrorCallbacks;
80*ec779b8eSAndroid Build Coastguard Worker
81*ec779b8eSAndroid Build Coastguard Worker std::mutex AudioSystem::gSoundTriggerMutex;
82*ec779b8eSAndroid Build Coastguard Worker sp<CaptureStateListenerImpl> AudioSystem::gSoundTriggerCaptureStateListener;
83*ec779b8eSAndroid Build Coastguard Worker
84*ec779b8eSAndroid Build Coastguard Worker // ----------------------------
85*ec779b8eSAndroid Build Coastguard Worker
86*ec779b8eSAndroid Build Coastguard Worker // AudioSystem is the client side interface to AudioFlinger (AF) and AudioPolicy (AP).
87*ec779b8eSAndroid Build Coastguard Worker //
88*ec779b8eSAndroid Build Coastguard Worker // For clients:
89*ec779b8eSAndroid Build Coastguard Worker // We use the ServiceSingleton class in mediautils to fetch the AF/AP service.
90*ec779b8eSAndroid Build Coastguard Worker // The ServiceSingleton offers service prefetch, automatic
91*ec779b8eSAndroid Build Coastguard Worker // new service notification, automatic binder death notification.
92*ec779b8eSAndroid Build Coastguard Worker //
93*ec779b8eSAndroid Build Coastguard Worker // AudioFlingerServiceTraits and AudioPolicyServiceTraits are passed into
94*ec779b8eSAndroid Build Coastguard Worker // ServiceSingleton to provide interaction with the service notifications and
95*ec779b8eSAndroid Build Coastguard Worker // binder death notifications.
96*ec779b8eSAndroid Build Coastguard Worker //
97*ec779b8eSAndroid Build Coastguard Worker // If the AF/AP service is unavailable for kServiceClientWaitMs from ServiceManager,
98*ec779b8eSAndroid Build Coastguard Worker // ServiceSingleton will return a nullptr service handle resulting in the same dead object error
99*ec779b8eSAndroid Build Coastguard Worker // as if the service died (which it did, otherwise we'd be returning the cached handle).
100*ec779b8eSAndroid Build Coastguard Worker //
101*ec779b8eSAndroid Build Coastguard Worker // Potential deadlock sequence:
102*ec779b8eSAndroid Build Coastguard Worker // 1) audioserver reboots.
103*ec779b8eSAndroid Build Coastguard Worker // 2) App clients call into AudioService (system server) obtaining binder threads,
104*ec779b8eSAndroid Build Coastguard Worker // these calls blocking for audioserver reboot completion (or waiting for a mutex
105*ec779b8eSAndroid Build Coastguard Worker // held by those blocked threads).
106*ec779b8eSAndroid Build Coastguard Worker // 3) AudioFlinger and AudioPolicyManager services need to call into system server
107*ec779b8eSAndroid Build Coastguard Worker // during initialization. It can't because app clients hold all the binder threads
108*ec779b8eSAndroid Build Coastguard Worker // in the threadpool.
109*ec779b8eSAndroid Build Coastguard Worker // 4) We have a resource deadlock between (2) and (3) potentially causing an ANR and
110*ec779b8eSAndroid Build Coastguard Worker // further reinitialization.
111*ec779b8eSAndroid Build Coastguard Worker // 5) However, after the service wait timeout kServiceWaitNs, the calls for (2) will
112*ec779b8eSAndroid Build Coastguard Worker // return an error and resolve itself, breaking the resource deadlock in (4).
113*ec779b8eSAndroid Build Coastguard Worker //
114*ec779b8eSAndroid Build Coastguard Worker // At this time, it is a matter of experimentation whether the service timeout is
115*ec779b8eSAndroid Build Coastguard Worker // applied only for system server, and we let other clients block indefinitely.
116*ec779b8eSAndroid Build Coastguard Worker //
117*ec779b8eSAndroid Build Coastguard Worker // For audio services:
118*ec779b8eSAndroid Build Coastguard Worker // AudioFlinger and AudioPolicy may call back into AudioSystem. When doing
119*ec779b8eSAndroid Build Coastguard Worker // so it should not hold any mutexes. There is no service wait as AudioFlinger
120*ec779b8eSAndroid Build Coastguard Worker // and AudioPolicy are in-process with each other, and the call proceeds without
121*ec779b8eSAndroid Build Coastguard Worker // binder. The setLocalService() method is used to set the service interfaces
122*ec779b8eSAndroid Build Coastguard Worker // within audioserver to bypass the ServiceManager lookup.
123*ec779b8eSAndroid Build Coastguard Worker //
124*ec779b8eSAndroid Build Coastguard Worker
125*ec779b8eSAndroid Build Coastguard Worker // Wait timeout for AudioFlinger or AudioPolicy service before returning with null.
126*ec779b8eSAndroid Build Coastguard Worker // Such an audioserver failure is considered benign as the ground truth is stored in
127*ec779b8eSAndroid Build Coastguard Worker // the Java AudioService and can be restored once audioserver has finished initialization.
128*ec779b8eSAndroid Build Coastguard Worker //
129*ec779b8eSAndroid Build Coastguard Worker // TODO(b/375691003) We use 5s as a conservative timeout value, and will tune closer to 3s.
130*ec779b8eSAndroid Build Coastguard Worker // Too small a value (i.e. less than 1s would churn repeated calls to get the service).
131*ec779b8eSAndroid Build Coastguard Worker // The value can be tuned by the property audio.service.client_wait_ms.
132*ec779b8eSAndroid Build Coastguard Worker static constexpr int32_t kServiceClientWaitMs = 5'000;
133*ec779b8eSAndroid Build Coastguard Worker
134*ec779b8eSAndroid Build Coastguard Worker static constexpr const char kServiceWaitProperty[] = "audio.service.client_wait_ms";
135*ec779b8eSAndroid Build Coastguard Worker
136*ec779b8eSAndroid Build Coastguard Worker // AudioFlingerServiceTraits is a collection of methods that parameterize the
137*ec779b8eSAndroid Build Coastguard Worker // ServiceSingleton handler for IAudioFlinger
138*ec779b8eSAndroid Build Coastguard Worker
139*ec779b8eSAndroid Build Coastguard Worker class AudioFlingerServiceTraits {
140*ec779b8eSAndroid Build Coastguard Worker public:
141*ec779b8eSAndroid Build Coastguard Worker // ------- required by ServiceSingleton
142*ec779b8eSAndroid Build Coastguard Worker
getServiceName()143*ec779b8eSAndroid Build Coastguard Worker static constexpr const char* getServiceName() { return "media.audio_flinger"; }
144*ec779b8eSAndroid Build Coastguard Worker
onNewService(const sp<media::IAudioFlingerService> & afs)145*ec779b8eSAndroid Build Coastguard Worker static void onNewService(const sp<media::IAudioFlingerService>& afs) {
146*ec779b8eSAndroid Build Coastguard Worker onNewServiceWithAdapter(createServiceAdapter(afs));
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker
onServiceDied(const sp<media::IAudioFlingerService> & service)149*ec779b8eSAndroid Build Coastguard Worker static void onServiceDied(const sp<media::IAudioFlingerService>& service) {
150*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: %s service died %p", __func__, getServiceName(), service.get());
151*ec779b8eSAndroid Build Coastguard Worker {
152*ec779b8eSAndroid Build Coastguard Worker std::lock_guard l(mMutex);
153*ec779b8eSAndroid Build Coastguard Worker if (!mValid) {
154*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: %s service already invalidated, ignoring", __func__, getServiceName());
155*ec779b8eSAndroid Build Coastguard Worker return;
156*ec779b8eSAndroid Build Coastguard Worker }
157*ec779b8eSAndroid Build Coastguard Worker if (!mService || mService->getDelegate() != service) {
158*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: %s unmatched service death pointers, ignoring",
159*ec779b8eSAndroid Build Coastguard Worker __func__, getServiceName());
160*ec779b8eSAndroid Build Coastguard Worker return;
161*ec779b8eSAndroid Build Coastguard Worker }
162*ec779b8eSAndroid Build Coastguard Worker mValid = false;
163*ec779b8eSAndroid Build Coastguard Worker if (mClient) {
164*ec779b8eSAndroid Build Coastguard Worker mClient->clearIoCache();
165*ec779b8eSAndroid Build Coastguard Worker } else {
166*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: null client", __func__);
167*ec779b8eSAndroid Build Coastguard Worker }
168*ec779b8eSAndroid Build Coastguard Worker }
169*ec779b8eSAndroid Build Coastguard Worker AudioSystem::reportError(DEAD_OBJECT);
170*ec779b8eSAndroid Build Coastguard Worker }
171*ec779b8eSAndroid Build Coastguard Worker
options()172*ec779b8eSAndroid Build Coastguard Worker static constexpr mediautils::ServiceOptions options() {
173*ec779b8eSAndroid Build Coastguard Worker return mediautils::ServiceOptions::kNone;
174*ec779b8eSAndroid Build Coastguard Worker }
175*ec779b8eSAndroid Build Coastguard Worker
176*ec779b8eSAndroid Build Coastguard Worker // ------- required by AudioSystem
177*ec779b8eSAndroid Build Coastguard Worker
getService(std::chrono::milliseconds waitMs=std::chrono::milliseconds{-1})178*ec779b8eSAndroid Build Coastguard Worker static sp<IAudioFlinger> getService(
179*ec779b8eSAndroid Build Coastguard Worker std::chrono::milliseconds waitMs = std::chrono::milliseconds{-1}) {
180*ec779b8eSAndroid Build Coastguard Worker static bool init = false;
181*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
182*ec779b8eSAndroid Build Coastguard Worker if (!init) {
183*ec779b8eSAndroid Build Coastguard Worker if (!mDisableThreadPoolStart) {
184*ec779b8eSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
185*ec779b8eSAndroid Build Coastguard Worker }
186*ec779b8eSAndroid Build Coastguard Worker if (multiuser_get_app_id(getuid()) == AID_AUDIOSERVER) {
187*ec779b8eSAndroid Build Coastguard Worker mediautils::skipService<media::IAudioFlingerService>(mediautils::SkipMode::kWait);
188*ec779b8eSAndroid Build Coastguard Worker mWaitMs = std::chrono::milliseconds(INT32_MAX);
189*ec779b8eSAndroid Build Coastguard Worker } else {
190*ec779b8eSAndroid Build Coastguard Worker mediautils::initService<media::IAudioFlingerService, AudioFlingerServiceTraits>();
191*ec779b8eSAndroid Build Coastguard Worker mWaitMs = std::chrono::milliseconds(
192*ec779b8eSAndroid Build Coastguard Worker property_get_int32(kServiceWaitProperty, kServiceClientWaitMs));
193*ec779b8eSAndroid Build Coastguard Worker }
194*ec779b8eSAndroid Build Coastguard Worker init = true;
195*ec779b8eSAndroid Build Coastguard Worker }
196*ec779b8eSAndroid Build Coastguard Worker if (mValid) return mService;
197*ec779b8eSAndroid Build Coastguard Worker if (waitMs.count() < 0) waitMs = mWaitMs;
198*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
199*ec779b8eSAndroid Build Coastguard Worker
200*ec779b8eSAndroid Build Coastguard Worker // mediautils::getService() installs a persistent new service notification.
201*ec779b8eSAndroid Build Coastguard Worker auto service = mediautils::getService<
202*ec779b8eSAndroid Build Coastguard Worker media::IAudioFlingerService>(waitMs);
203*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: checking for service %s: %p", __func__, getServiceName(), service.get());
204*ec779b8eSAndroid Build Coastguard Worker
205*ec779b8eSAndroid Build Coastguard Worker ul.lock();
206*ec779b8eSAndroid Build Coastguard Worker // return the IAudioFlinger interface which is adapted
207*ec779b8eSAndroid Build Coastguard Worker // from the media::IAudioFlingerService.
208*ec779b8eSAndroid Build Coastguard Worker return mService;
209*ec779b8eSAndroid Build Coastguard Worker }
210*ec779b8eSAndroid Build Coastguard Worker
getClient()211*ec779b8eSAndroid Build Coastguard Worker static sp<AudioSystem::AudioFlingerClient> getClient() {
212*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
213*ec779b8eSAndroid Build Coastguard Worker if (mValid) return mClient;
214*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
215*ec779b8eSAndroid Build Coastguard Worker
216*ec779b8eSAndroid Build Coastguard Worker auto service = getService();
217*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: checking for service: %p", __func__, service.get());
218*ec779b8eSAndroid Build Coastguard Worker
219*ec779b8eSAndroid Build Coastguard Worker ul.lock();
220*ec779b8eSAndroid Build Coastguard Worker return mClient;
221*ec779b8eSAndroid Build Coastguard Worker }
222*ec779b8eSAndroid Build Coastguard Worker
setBinder(const sp<IBinder> & binder)223*ec779b8eSAndroid Build Coastguard Worker static void setBinder(const sp<IBinder>& binder) {
224*ec779b8eSAndroid Build Coastguard Worker setLocalService(createServiceAdapter(
225*ec779b8eSAndroid Build Coastguard Worker mediautils::interfaceFromBinder<media::IAudioFlingerService>(binder)));
226*ec779b8eSAndroid Build Coastguard Worker }
227*ec779b8eSAndroid Build Coastguard Worker
setLocalService(const sp<IAudioFlinger> & af)228*ec779b8eSAndroid Build Coastguard Worker static status_t setLocalService(const sp<IAudioFlinger>& af) {
229*ec779b8eSAndroid Build Coastguard Worker mediautils::skipService<media::IAudioFlingerService>();
230*ec779b8eSAndroid Build Coastguard Worker sp<IAudioFlinger> old;
231*ec779b8eSAndroid Build Coastguard Worker
232*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
233*ec779b8eSAndroid Build Coastguard Worker old = mService;
234*ec779b8eSAndroid Build Coastguard Worker if (old) {
235*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
236*ec779b8eSAndroid Build Coastguard Worker onServiceDied(old->getDelegate());
237*ec779b8eSAndroid Build Coastguard Worker ul.lock();
238*ec779b8eSAndroid Build Coastguard Worker ALOGW_IF(old != mService,
239*ec779b8eSAndroid Build Coastguard Worker "%s: service changed during callback, continuing.", __func__);
240*ec779b8eSAndroid Build Coastguard Worker }
241*ec779b8eSAndroid Build Coastguard Worker mService = af;
242*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
243*ec779b8eSAndroid Build Coastguard Worker if (af) onNewServiceWithAdapter(af);
244*ec779b8eSAndroid Build Coastguard Worker return OK;
245*ec779b8eSAndroid Build Coastguard Worker }
246*ec779b8eSAndroid Build Coastguard Worker
disableThreadPoolStart()247*ec779b8eSAndroid Build Coastguard Worker static void disableThreadPoolStart() {
248*ec779b8eSAndroid Build Coastguard Worker mDisableThreadPoolStart = true;
249*ec779b8eSAndroid Build Coastguard Worker }
250*ec779b8eSAndroid Build Coastguard Worker
isValid()251*ec779b8eSAndroid Build Coastguard Worker static bool isValid() {
252*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
253*ec779b8eSAndroid Build Coastguard Worker if (mValid) return true;
254*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
255*ec779b8eSAndroid Build Coastguard Worker (void)getService({});
256*ec779b8eSAndroid Build Coastguard Worker ul.lock();
257*ec779b8eSAndroid Build Coastguard Worker return mValid;
258*ec779b8eSAndroid Build Coastguard Worker }
259*ec779b8eSAndroid Build Coastguard Worker
260*ec779b8eSAndroid Build Coastguard Worker // called to determine error on nullptr service return.
getError()261*ec779b8eSAndroid Build Coastguard Worker static constexpr status_t getError() {
262*ec779b8eSAndroid Build Coastguard Worker return DEAD_OBJECT;
263*ec779b8eSAndroid Build Coastguard Worker }
264*ec779b8eSAndroid Build Coastguard Worker
265*ec779b8eSAndroid Build Coastguard Worker private:
266*ec779b8eSAndroid Build Coastguard Worker
onNewServiceWithAdapter(const sp<IAudioFlinger> & service)267*ec779b8eSAndroid Build Coastguard Worker static void onNewServiceWithAdapter(const sp<IAudioFlinger>& service) {
268*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: %s service obtained %p", __func__, getServiceName(), service.get());
269*ec779b8eSAndroid Build Coastguard Worker sp<AudioSystem::AudioFlingerClient> client;
270*ec779b8eSAndroid Build Coastguard Worker bool reportNoError = false;
271*ec779b8eSAndroid Build Coastguard Worker {
272*ec779b8eSAndroid Build Coastguard Worker std::lock_guard l(mMutex);
273*ec779b8eSAndroid Build Coastguard Worker ALOGW_IF(mValid, "%s: %s service already valid, continuing with initialization",
274*ec779b8eSAndroid Build Coastguard Worker __func__, getServiceName());
275*ec779b8eSAndroid Build Coastguard Worker if (mClient == nullptr) {
276*ec779b8eSAndroid Build Coastguard Worker mClient = sp<AudioSystem::AudioFlingerClient>::make();
277*ec779b8eSAndroid Build Coastguard Worker } else {
278*ec779b8eSAndroid Build Coastguard Worker mClient->clearIoCache();
279*ec779b8eSAndroid Build Coastguard Worker reportNoError = true;
280*ec779b8eSAndroid Build Coastguard Worker }
281*ec779b8eSAndroid Build Coastguard Worker mService = service;
282*ec779b8eSAndroid Build Coastguard Worker client = mClient;
283*ec779b8eSAndroid Build Coastguard Worker mValid = true;
284*ec779b8eSAndroid Build Coastguard Worker }
285*ec779b8eSAndroid Build Coastguard Worker // TODO(b/375280520) consider registerClient() within mMutex lock.
286*ec779b8eSAndroid Build Coastguard Worker const int64_t token = IPCThreadState::self()->clearCallingIdentity();
287*ec779b8eSAndroid Build Coastguard Worker service->registerClient(client);
288*ec779b8eSAndroid Build Coastguard Worker IPCThreadState::self()->restoreCallingIdentity(token);
289*ec779b8eSAndroid Build Coastguard Worker
290*ec779b8eSAndroid Build Coastguard Worker if (reportNoError) AudioSystem::reportError(NO_ERROR);
291*ec779b8eSAndroid Build Coastguard Worker }
292*ec779b8eSAndroid Build Coastguard Worker
createServiceAdapter(const sp<media::IAudioFlingerService> & af)293*ec779b8eSAndroid Build Coastguard Worker static sp<IAudioFlinger> createServiceAdapter(
294*ec779b8eSAndroid Build Coastguard Worker const sp<media::IAudioFlingerService>& af) {
295*ec779b8eSAndroid Build Coastguard Worker return sp<AudioFlingerClientAdapter>::make(af);
296*ec779b8eSAndroid Build Coastguard Worker }
297*ec779b8eSAndroid Build Coastguard Worker
298*ec779b8eSAndroid Build Coastguard Worker static inline constinit std::mutex mMutex;
299*ec779b8eSAndroid Build Coastguard Worker static inline constinit sp<AudioSystem::AudioFlingerClient> mClient GUARDED_BY(mMutex);
300*ec779b8eSAndroid Build Coastguard Worker static inline constinit sp<IAudioFlinger> mService GUARDED_BY(mMutex);
301*ec779b8eSAndroid Build Coastguard Worker static inline constinit std::chrono::milliseconds mWaitMs
GUARDED_BY(mMutex)302*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mMutex) {kServiceClientWaitMs};
303*ec779b8eSAndroid Build Coastguard Worker static inline constinit bool mValid GUARDED_BY(mMutex) = false;
304*ec779b8eSAndroid Build Coastguard Worker static inline constinit std::atomic_bool mDisableThreadPoolStart = false;
305*ec779b8eSAndroid Build Coastguard Worker };
306*ec779b8eSAndroid Build Coastguard Worker
get_audio_flinger()307*ec779b8eSAndroid Build Coastguard Worker sp<IAudioFlinger> AudioSystem::get_audio_flinger() {
308*ec779b8eSAndroid Build Coastguard Worker return AudioFlingerServiceTraits::getService();
309*ec779b8eSAndroid Build Coastguard Worker }
310*ec779b8eSAndroid Build Coastguard Worker
getAudioFlingerClient()311*ec779b8eSAndroid Build Coastguard Worker sp<AudioSystem::AudioFlingerClient> AudioSystem::getAudioFlingerClient() {
312*ec779b8eSAndroid Build Coastguard Worker return AudioFlingerServiceTraits::getClient();
313*ec779b8eSAndroid Build Coastguard Worker }
314*ec779b8eSAndroid Build Coastguard Worker
setAudioFlingerBinder(const sp<IBinder> & audioFlinger)315*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::setAudioFlingerBinder(const sp<IBinder>& audioFlinger) {
316*ec779b8eSAndroid Build Coastguard Worker AudioFlingerServiceTraits::setBinder(audioFlinger);
317*ec779b8eSAndroid Build Coastguard Worker }
318*ec779b8eSAndroid Build Coastguard Worker
setLocalAudioFlinger(const sp<IAudioFlinger> & af)319*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setLocalAudioFlinger(const sp<IAudioFlinger>& af) {
320*ec779b8eSAndroid Build Coastguard Worker return AudioFlingerServiceTraits::setLocalService(af);
321*ec779b8eSAndroid Build Coastguard Worker }
322*ec779b8eSAndroid Build Coastguard Worker
getIoDescriptor(audio_io_handle_t ioHandle)323*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle) {
324*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> desc;
325*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlingerClient> afc = getAudioFlingerClient();
326*ec779b8eSAndroid Build Coastguard Worker if (afc != 0) {
327*ec779b8eSAndroid Build Coastguard Worker desc = afc->getIoDescriptor(ioHandle);
328*ec779b8eSAndroid Build Coastguard Worker }
329*ec779b8eSAndroid Build Coastguard Worker return desc;
330*ec779b8eSAndroid Build Coastguard Worker }
331*ec779b8eSAndroid Build Coastguard Worker
checkAudioFlinger()332*ec779b8eSAndroid Build Coastguard Worker /* static */ status_t AudioSystem::checkAudioFlinger() {
333*ec779b8eSAndroid Build Coastguard Worker if (AudioFlingerServiceTraits::isValid()) return OK;
334*ec779b8eSAndroid Build Coastguard Worker return DEAD_OBJECT;
335*ec779b8eSAndroid Build Coastguard Worker }
336*ec779b8eSAndroid Build Coastguard Worker
337*ec779b8eSAndroid Build Coastguard Worker // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp
338*ec779b8eSAndroid Build Coastguard Worker
muteMicrophone(bool state)339*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::muteMicrophone(bool state) {
340*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
341*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
342*ec779b8eSAndroid Build Coastguard Worker return af->setMicMute(state);
343*ec779b8eSAndroid Build Coastguard Worker }
344*ec779b8eSAndroid Build Coastguard Worker
isMicrophoneMuted(bool * state)345*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::isMicrophoneMuted(bool* state) {
346*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
347*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
348*ec779b8eSAndroid Build Coastguard Worker *state = af->getMicMute();
349*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
350*ec779b8eSAndroid Build Coastguard Worker }
351*ec779b8eSAndroid Build Coastguard Worker
setMasterVolume(float value)352*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setMasterVolume(float value) {
353*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
354*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
355*ec779b8eSAndroid Build Coastguard Worker af->setMasterVolume(value);
356*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
357*ec779b8eSAndroid Build Coastguard Worker }
358*ec779b8eSAndroid Build Coastguard Worker
setMasterMute(bool mute)359*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setMasterMute(bool mute) {
360*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
361*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
362*ec779b8eSAndroid Build Coastguard Worker af->setMasterMute(mute);
363*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
364*ec779b8eSAndroid Build Coastguard Worker }
365*ec779b8eSAndroid Build Coastguard Worker
getMasterVolume(float * volume)366*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMasterVolume(float* volume) {
367*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
368*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
369*ec779b8eSAndroid Build Coastguard Worker *volume = af->masterVolume();
370*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
371*ec779b8eSAndroid Build Coastguard Worker }
372*ec779b8eSAndroid Build Coastguard Worker
getMasterMute(bool * mute)373*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMasterMute(bool* mute) {
374*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
375*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
376*ec779b8eSAndroid Build Coastguard Worker *mute = af->masterMute();
377*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
378*ec779b8eSAndroid Build Coastguard Worker }
379*ec779b8eSAndroid Build Coastguard Worker
setStreamVolume(audio_stream_type_t stream,float value,bool muted,audio_io_handle_t output)380*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value,
381*ec779b8eSAndroid Build Coastguard Worker bool muted, audio_io_handle_t output) {
382*ec779b8eSAndroid Build Coastguard Worker if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
383*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
384*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
385*ec779b8eSAndroid Build Coastguard Worker af->setStreamVolume(stream, value, muted, output);
386*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
387*ec779b8eSAndroid Build Coastguard Worker }
388*ec779b8eSAndroid Build Coastguard Worker
setStreamMute(audio_stream_type_t stream,bool mute)389*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute) {
390*ec779b8eSAndroid Build Coastguard Worker if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
391*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
392*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
393*ec779b8eSAndroid Build Coastguard Worker af->setStreamMute(stream, mute);
394*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
395*ec779b8eSAndroid Build Coastguard Worker }
396*ec779b8eSAndroid Build Coastguard Worker
setPortsVolume(const std::vector<audio_port_handle_t> & portIds,float volume,bool muted,audio_io_handle_t output)397*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setPortsVolume(
398*ec779b8eSAndroid Build Coastguard Worker const std::vector<audio_port_handle_t>& portIds, float volume, bool muted,
399*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output) {
400*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
401*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
402*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> portIdsAidl = VALUE_OR_RETURN_STATUS(
403*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<int32_t>>(
404*ec779b8eSAndroid Build Coastguard Worker portIds, legacy2aidl_audio_port_handle_t_int32_t));
405*ec779b8eSAndroid Build Coastguard Worker int32_t outputAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(output));
406*ec779b8eSAndroid Build Coastguard Worker af->setPortsVolume(portIdsAidl, volume, muted, outputAidl);
407*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
408*ec779b8eSAndroid Build Coastguard Worker }
409*ec779b8eSAndroid Build Coastguard Worker
setMode(audio_mode_t mode)410*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setMode(audio_mode_t mode) {
411*ec779b8eSAndroid Build Coastguard Worker if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE;
412*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
413*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
414*ec779b8eSAndroid Build Coastguard Worker return af->setMode(mode);
415*ec779b8eSAndroid Build Coastguard Worker }
416*ec779b8eSAndroid Build Coastguard Worker
setSimulateDeviceConnections(bool enabled)417*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setSimulateDeviceConnections(bool enabled) {
418*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
419*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
420*ec779b8eSAndroid Build Coastguard Worker return af->setSimulateDeviceConnections(enabled);
421*ec779b8eSAndroid Build Coastguard Worker }
422*ec779b8eSAndroid Build Coastguard Worker
setParameters(audio_io_handle_t ioHandle,const String8 & keyValuePairs)423*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) {
424*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
425*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
426*ec779b8eSAndroid Build Coastguard Worker return af->setParameters(ioHandle, keyValuePairs);
427*ec779b8eSAndroid Build Coastguard Worker }
428*ec779b8eSAndroid Build Coastguard Worker
getParameters(audio_io_handle_t ioHandle,const String8 & keys)429*ec779b8eSAndroid Build Coastguard Worker String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) {
430*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
431*ec779b8eSAndroid Build Coastguard Worker String8 result = String8("");
432*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return result;
433*ec779b8eSAndroid Build Coastguard Worker
434*ec779b8eSAndroid Build Coastguard Worker result = af->getParameters(ioHandle, keys);
435*ec779b8eSAndroid Build Coastguard Worker return result;
436*ec779b8eSAndroid Build Coastguard Worker }
437*ec779b8eSAndroid Build Coastguard Worker
setParameters(const String8 & keyValuePairs)438*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setParameters(const String8& keyValuePairs) {
439*ec779b8eSAndroid Build Coastguard Worker return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs);
440*ec779b8eSAndroid Build Coastguard Worker }
441*ec779b8eSAndroid Build Coastguard Worker
getParameters(const String8 & keys)442*ec779b8eSAndroid Build Coastguard Worker String8 AudioSystem::getParameters(const String8& keys) {
443*ec779b8eSAndroid Build Coastguard Worker return getParameters(AUDIO_IO_HANDLE_NONE, keys);
444*ec779b8eSAndroid Build Coastguard Worker }
445*ec779b8eSAndroid Build Coastguard Worker
446*ec779b8eSAndroid Build Coastguard Worker // convert volume steps to natural log scale
447*ec779b8eSAndroid Build Coastguard Worker
448*ec779b8eSAndroid Build Coastguard Worker // change this value to change volume scaling
449*ec779b8eSAndroid Build Coastguard Worker constexpr float kdbPerStep = 0.5f;
450*ec779b8eSAndroid Build Coastguard Worker // shouldn't need to touch these
451*ec779b8eSAndroid Build Coastguard Worker constexpr float kdBConvert = -kdbPerStep * 2.302585093f / 20.0f;
452*ec779b8eSAndroid Build Coastguard Worker constexpr float kdBConvertInverse = 1.0f / kdBConvert;
453*ec779b8eSAndroid Build Coastguard Worker
linearToLog(int volume)454*ec779b8eSAndroid Build Coastguard Worker float AudioSystem::linearToLog(int volume) {
455*ec779b8eSAndroid Build Coastguard Worker // float v = volume ? exp(float(100 - volume) * kdBConvert) : 0;
456*ec779b8eSAndroid Build Coastguard Worker // ALOGD("linearToLog(%d)=%f", volume, v);
457*ec779b8eSAndroid Build Coastguard Worker // return v;
458*ec779b8eSAndroid Build Coastguard Worker return volume ? exp(float(100 - volume) * kdBConvert) : 0;
459*ec779b8eSAndroid Build Coastguard Worker }
460*ec779b8eSAndroid Build Coastguard Worker
logToLinear(float volume)461*ec779b8eSAndroid Build Coastguard Worker int AudioSystem::logToLinear(float volume) {
462*ec779b8eSAndroid Build Coastguard Worker // int v = volume ? 100 - int(kdBConvertInverse * log(volume) + 0.5) : 0;
463*ec779b8eSAndroid Build Coastguard Worker // ALOGD("logTolinear(%d)=%f", v, volume);
464*ec779b8eSAndroid Build Coastguard Worker // return v;
465*ec779b8eSAndroid Build Coastguard Worker return volume ? 100 - int(kdBConvertInverse * log(volume) + 0.5) : 0;
466*ec779b8eSAndroid Build Coastguard Worker }
467*ec779b8eSAndroid Build Coastguard Worker
calculateMinFrameCount(uint32_t afLatencyMs,uint32_t afFrameCount,uint32_t afSampleRate,uint32_t sampleRate,float speed)468*ec779b8eSAndroid Build Coastguard Worker /* static */ size_t AudioSystem::calculateMinFrameCount(
469*ec779b8eSAndroid Build Coastguard Worker uint32_t afLatencyMs, uint32_t afFrameCount, uint32_t afSampleRate,
470*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, float speed /*, uint32_t notificationsPerBufferReq*/) {
471*ec779b8eSAndroid Build Coastguard Worker // Ensure that buffer depth covers at least audio hardware latency
472*ec779b8eSAndroid Build Coastguard Worker uint32_t minBufCount = afLatencyMs / ((1000 * afFrameCount) / afSampleRate);
473*ec779b8eSAndroid Build Coastguard Worker if (minBufCount < 2) {
474*ec779b8eSAndroid Build Coastguard Worker minBufCount = 2;
475*ec779b8eSAndroid Build Coastguard Worker }
476*ec779b8eSAndroid Build Coastguard Worker #if 0
477*ec779b8eSAndroid Build Coastguard Worker // The notificationsPerBufferReq parameter is not yet used for non-fast tracks,
478*ec779b8eSAndroid Build Coastguard Worker // but keeping the code here to make it easier to add later.
479*ec779b8eSAndroid Build Coastguard Worker if (minBufCount < notificationsPerBufferReq) {
480*ec779b8eSAndroid Build Coastguard Worker minBufCount = notificationsPerBufferReq;
481*ec779b8eSAndroid Build Coastguard Worker }
482*ec779b8eSAndroid Build Coastguard Worker #endif
483*ec779b8eSAndroid Build Coastguard Worker ALOGV("calculateMinFrameCount afLatency %u afFrameCount %u afSampleRate %u "
484*ec779b8eSAndroid Build Coastguard Worker "sampleRate %u speed %f minBufCount: %u" /*" notificationsPerBufferReq %u"*/,
485*ec779b8eSAndroid Build Coastguard Worker afLatencyMs, afFrameCount, afSampleRate, sampleRate, speed, minBufCount
486*ec779b8eSAndroid Build Coastguard Worker /*, notificationsPerBufferReq*/);
487*ec779b8eSAndroid Build Coastguard Worker return minBufCount * sourceFramesNeededWithTimestretch(
488*ec779b8eSAndroid Build Coastguard Worker sampleRate, afFrameCount, afSampleRate, speed);
489*ec779b8eSAndroid Build Coastguard Worker }
490*ec779b8eSAndroid Build Coastguard Worker
491*ec779b8eSAndroid Build Coastguard Worker
492*ec779b8eSAndroid Build Coastguard Worker status_t
getOutputSamplingRate(uint32_t * samplingRate,audio_stream_type_t streamType)493*ec779b8eSAndroid Build Coastguard Worker AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType) {
494*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output;
495*ec779b8eSAndroid Build Coastguard Worker
496*ec779b8eSAndroid Build Coastguard Worker if (streamType == AUDIO_STREAM_DEFAULT) {
497*ec779b8eSAndroid Build Coastguard Worker streamType = AUDIO_STREAM_MUSIC;
498*ec779b8eSAndroid Build Coastguard Worker }
499*ec779b8eSAndroid Build Coastguard Worker
500*ec779b8eSAndroid Build Coastguard Worker output = getOutput(streamType);
501*ec779b8eSAndroid Build Coastguard Worker if (output == 0) {
502*ec779b8eSAndroid Build Coastguard Worker return PERMISSION_DENIED;
503*ec779b8eSAndroid Build Coastguard Worker }
504*ec779b8eSAndroid Build Coastguard Worker
505*ec779b8eSAndroid Build Coastguard Worker return getSamplingRate(output, samplingRate);
506*ec779b8eSAndroid Build Coastguard Worker }
507*ec779b8eSAndroid Build Coastguard Worker
getSamplingRate(audio_io_handle_t ioHandle,uint32_t * samplingRate)508*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getSamplingRate(audio_io_handle_t ioHandle,
509*ec779b8eSAndroid Build Coastguard Worker uint32_t* samplingRate) {
510*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
511*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
512*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
513*ec779b8eSAndroid Build Coastguard Worker if (desc == 0) {
514*ec779b8eSAndroid Build Coastguard Worker *samplingRate = af->sampleRate(ioHandle);
515*ec779b8eSAndroid Build Coastguard Worker } else {
516*ec779b8eSAndroid Build Coastguard Worker *samplingRate = desc->getSamplingRate();
517*ec779b8eSAndroid Build Coastguard Worker }
518*ec779b8eSAndroid Build Coastguard Worker if (*samplingRate == 0) {
519*ec779b8eSAndroid Build Coastguard Worker ALOGE("AudioSystem::getSamplingRate failed for ioHandle %d", ioHandle);
520*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
521*ec779b8eSAndroid Build Coastguard Worker }
522*ec779b8eSAndroid Build Coastguard Worker
523*ec779b8eSAndroid Build Coastguard Worker ALOGV("getSamplingRate() ioHandle %d, sampling rate %u", ioHandle, *samplingRate);
524*ec779b8eSAndroid Build Coastguard Worker
525*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
526*ec779b8eSAndroid Build Coastguard Worker }
527*ec779b8eSAndroid Build Coastguard Worker
getOutputFrameCount(size_t * frameCount,audio_stream_type_t streamType)528*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType) {
529*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output;
530*ec779b8eSAndroid Build Coastguard Worker
531*ec779b8eSAndroid Build Coastguard Worker if (streamType == AUDIO_STREAM_DEFAULT) {
532*ec779b8eSAndroid Build Coastguard Worker streamType = AUDIO_STREAM_MUSIC;
533*ec779b8eSAndroid Build Coastguard Worker }
534*ec779b8eSAndroid Build Coastguard Worker
535*ec779b8eSAndroid Build Coastguard Worker output = getOutput(streamType);
536*ec779b8eSAndroid Build Coastguard Worker if (output == AUDIO_IO_HANDLE_NONE) {
537*ec779b8eSAndroid Build Coastguard Worker return PERMISSION_DENIED;
538*ec779b8eSAndroid Build Coastguard Worker }
539*ec779b8eSAndroid Build Coastguard Worker
540*ec779b8eSAndroid Build Coastguard Worker return getFrameCount(output, frameCount);
541*ec779b8eSAndroid Build Coastguard Worker }
542*ec779b8eSAndroid Build Coastguard Worker
getFrameCount(audio_io_handle_t ioHandle,size_t * frameCount)543*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getFrameCount(audio_io_handle_t ioHandle,
544*ec779b8eSAndroid Build Coastguard Worker size_t* frameCount) {
545*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
546*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
547*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
548*ec779b8eSAndroid Build Coastguard Worker if (desc == 0) {
549*ec779b8eSAndroid Build Coastguard Worker *frameCount = af->frameCount(ioHandle);
550*ec779b8eSAndroid Build Coastguard Worker } else {
551*ec779b8eSAndroid Build Coastguard Worker *frameCount = desc->getFrameCount();
552*ec779b8eSAndroid Build Coastguard Worker }
553*ec779b8eSAndroid Build Coastguard Worker if (*frameCount == 0) {
554*ec779b8eSAndroid Build Coastguard Worker ALOGE("AudioSystem::getFrameCount failed for ioHandle %d", ioHandle);
555*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
556*ec779b8eSAndroid Build Coastguard Worker }
557*ec779b8eSAndroid Build Coastguard Worker
558*ec779b8eSAndroid Build Coastguard Worker ALOGV("getFrameCount() ioHandle %d, frameCount %zu", ioHandle, *frameCount);
559*ec779b8eSAndroid Build Coastguard Worker
560*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
561*ec779b8eSAndroid Build Coastguard Worker }
562*ec779b8eSAndroid Build Coastguard Worker
getOutputLatency(uint32_t * latency,audio_stream_type_t streamType)563*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType) {
564*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output;
565*ec779b8eSAndroid Build Coastguard Worker
566*ec779b8eSAndroid Build Coastguard Worker if (streamType == AUDIO_STREAM_DEFAULT) {
567*ec779b8eSAndroid Build Coastguard Worker streamType = AUDIO_STREAM_MUSIC;
568*ec779b8eSAndroid Build Coastguard Worker }
569*ec779b8eSAndroid Build Coastguard Worker
570*ec779b8eSAndroid Build Coastguard Worker output = getOutput(streamType);
571*ec779b8eSAndroid Build Coastguard Worker if (output == AUDIO_IO_HANDLE_NONE) {
572*ec779b8eSAndroid Build Coastguard Worker return PERMISSION_DENIED;
573*ec779b8eSAndroid Build Coastguard Worker }
574*ec779b8eSAndroid Build Coastguard Worker
575*ec779b8eSAndroid Build Coastguard Worker return getLatency(output, latency);
576*ec779b8eSAndroid Build Coastguard Worker }
577*ec779b8eSAndroid Build Coastguard Worker
getLatency(audio_io_handle_t output,uint32_t * latency)578*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getLatency(audio_io_handle_t output,
579*ec779b8eSAndroid Build Coastguard Worker uint32_t* latency) {
580*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
581*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
582*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output);
583*ec779b8eSAndroid Build Coastguard Worker if (outputDesc == 0) {
584*ec779b8eSAndroid Build Coastguard Worker *latency = af->latency(output);
585*ec779b8eSAndroid Build Coastguard Worker } else {
586*ec779b8eSAndroid Build Coastguard Worker *latency = outputDesc->getLatency();
587*ec779b8eSAndroid Build Coastguard Worker }
588*ec779b8eSAndroid Build Coastguard Worker
589*ec779b8eSAndroid Build Coastguard Worker ALOGV("getLatency() output %d, latency %d", output, *latency);
590*ec779b8eSAndroid Build Coastguard Worker
591*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
592*ec779b8eSAndroid Build Coastguard Worker }
593*ec779b8eSAndroid Build Coastguard Worker
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * buffSize)594*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
595*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, size_t* buffSize) {
596*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlingerClient> afc = getAudioFlingerClient();
597*ec779b8eSAndroid Build Coastguard Worker if (afc == 0) {
598*ec779b8eSAndroid Build Coastguard Worker return NO_INIT;
599*ec779b8eSAndroid Build Coastguard Worker }
600*ec779b8eSAndroid Build Coastguard Worker return afc->getInputBufferSize(sampleRate, format, channelMask, buffSize);
601*ec779b8eSAndroid Build Coastguard Worker }
602*ec779b8eSAndroid Build Coastguard Worker
setVoiceVolume(float value)603*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setVoiceVolume(float value) {
604*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
605*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
606*ec779b8eSAndroid Build Coastguard Worker return af->setVoiceVolume(value);
607*ec779b8eSAndroid Build Coastguard Worker }
608*ec779b8eSAndroid Build Coastguard Worker
getRenderPosition(audio_io_handle_t output,uint32_t * halFrames,uint32_t * dspFrames)609*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t* halFrames,
610*ec779b8eSAndroid Build Coastguard Worker uint32_t* dspFrames) {
611*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
612*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
613*ec779b8eSAndroid Build Coastguard Worker
614*ec779b8eSAndroid Build Coastguard Worker return af->getRenderPosition(halFrames, dspFrames, output);
615*ec779b8eSAndroid Build Coastguard Worker }
616*ec779b8eSAndroid Build Coastguard Worker
getInputFramesLost(audio_io_handle_t ioHandle)617*ec779b8eSAndroid Build Coastguard Worker uint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) {
618*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
619*ec779b8eSAndroid Build Coastguard Worker uint32_t result = 0;
620*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return result;
621*ec779b8eSAndroid Build Coastguard Worker if (ioHandle == AUDIO_IO_HANDLE_NONE) return result;
622*ec779b8eSAndroid Build Coastguard Worker
623*ec779b8eSAndroid Build Coastguard Worker result = af->getInputFramesLost(ioHandle);
624*ec779b8eSAndroid Build Coastguard Worker return result;
625*ec779b8eSAndroid Build Coastguard Worker }
626*ec779b8eSAndroid Build Coastguard Worker
newAudioUniqueId(audio_unique_id_use_t use)627*ec779b8eSAndroid Build Coastguard Worker audio_unique_id_t AudioSystem::newAudioUniqueId(audio_unique_id_use_t use) {
628*ec779b8eSAndroid Build Coastguard Worker // Must not use AF as IDs will re-roll on audioserver restart, b/130369529.
629*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
630*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AUDIO_UNIQUE_ID_ALLOCATE;
631*ec779b8eSAndroid Build Coastguard Worker return af->newAudioUniqueId(use);
632*ec779b8eSAndroid Build Coastguard Worker }
633*ec779b8eSAndroid Build Coastguard Worker
acquireAudioSessionId(audio_session_t audioSession,pid_t pid,uid_t uid)634*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) {
635*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
636*ec779b8eSAndroid Build Coastguard Worker if (af != 0) {
637*ec779b8eSAndroid Build Coastguard Worker af->acquireAudioSessionId(audioSession, pid, uid);
638*ec779b8eSAndroid Build Coastguard Worker }
639*ec779b8eSAndroid Build Coastguard Worker }
640*ec779b8eSAndroid Build Coastguard Worker
releaseAudioSessionId(audio_session_t audioSession,pid_t pid)641*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::releaseAudioSessionId(audio_session_t audioSession, pid_t pid) {
642*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
643*ec779b8eSAndroid Build Coastguard Worker if (af != 0) {
644*ec779b8eSAndroid Build Coastguard Worker af->releaseAudioSessionId(audioSession, pid);
645*ec779b8eSAndroid Build Coastguard Worker }
646*ec779b8eSAndroid Build Coastguard Worker }
647*ec779b8eSAndroid Build Coastguard Worker
getAudioHwSyncForSession(audio_session_t sessionId)648*ec779b8eSAndroid Build Coastguard Worker audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) {
649*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
650*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AUDIO_HW_SYNC_INVALID;
651*ec779b8eSAndroid Build Coastguard Worker return af->getAudioHwSyncForSession(sessionId);
652*ec779b8eSAndroid Build Coastguard Worker }
653*ec779b8eSAndroid Build Coastguard Worker
systemReady()654*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::systemReady() {
655*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
656*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return NO_INIT;
657*ec779b8eSAndroid Build Coastguard Worker return af->systemReady();
658*ec779b8eSAndroid Build Coastguard Worker }
659*ec779b8eSAndroid Build Coastguard Worker
audioPolicyReady()660*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::audioPolicyReady() {
661*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
662*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return NO_INIT;
663*ec779b8eSAndroid Build Coastguard Worker return af->audioPolicyReady();
664*ec779b8eSAndroid Build Coastguard Worker }
665*ec779b8eSAndroid Build Coastguard Worker
getFrameCountHAL(audio_io_handle_t ioHandle,size_t * frameCount)666*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getFrameCountHAL(audio_io_handle_t ioHandle,
667*ec779b8eSAndroid Build Coastguard Worker size_t* frameCount) {
668*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
669*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
670*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle);
671*ec779b8eSAndroid Build Coastguard Worker if (desc == 0) {
672*ec779b8eSAndroid Build Coastguard Worker *frameCount = af->frameCountHAL(ioHandle);
673*ec779b8eSAndroid Build Coastguard Worker } else {
674*ec779b8eSAndroid Build Coastguard Worker *frameCount = desc->getFrameCountHAL();
675*ec779b8eSAndroid Build Coastguard Worker }
676*ec779b8eSAndroid Build Coastguard Worker if (*frameCount == 0) {
677*ec779b8eSAndroid Build Coastguard Worker ALOGE("AudioSystem::getFrameCountHAL failed for ioHandle %d", ioHandle);
678*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
679*ec779b8eSAndroid Build Coastguard Worker }
680*ec779b8eSAndroid Build Coastguard Worker
681*ec779b8eSAndroid Build Coastguard Worker ALOGV("getFrameCountHAL() ioHandle %d, frameCount %zu", ioHandle, *frameCount);
682*ec779b8eSAndroid Build Coastguard Worker
683*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
684*ec779b8eSAndroid Build Coastguard Worker }
685*ec779b8eSAndroid Build Coastguard Worker
686*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
687*ec779b8eSAndroid Build Coastguard Worker
688*ec779b8eSAndroid Build Coastguard Worker
clearIoCache()689*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::AudioFlingerClient::clearIoCache() {
690*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
691*ec779b8eSAndroid Build Coastguard Worker mIoDescriptors.clear();
692*ec779b8eSAndroid Build Coastguard Worker mInBuffSize = 0;
693*ec779b8eSAndroid Build Coastguard Worker mInSamplingRate = 0;
694*ec779b8eSAndroid Build Coastguard Worker mInFormat = AUDIO_FORMAT_DEFAULT;
695*ec779b8eSAndroid Build Coastguard Worker mInChannelMask = AUDIO_CHANNEL_NONE;
696*ec779b8eSAndroid Build Coastguard Worker }
697*ec779b8eSAndroid Build Coastguard Worker
ioConfigChanged(media::AudioIoConfigEvent _event,const media::AudioIoDescriptor & _ioDesc)698*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioFlingerClient::ioConfigChanged(
699*ec779b8eSAndroid Build Coastguard Worker media::AudioIoConfigEvent _event,
700*ec779b8eSAndroid Build Coastguard Worker const media::AudioIoDescriptor& _ioDesc) {
701*ec779b8eSAndroid Build Coastguard Worker audio_io_config_event_t event = VALUE_OR_RETURN_BINDER_STATUS(
702*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioIoConfigEvent_audio_io_config_event_t(_event));
703*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> ioDesc(
704*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_BINDER_STATUS(
705*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(_ioDesc)));
706*ec779b8eSAndroid Build Coastguard Worker
707*ec779b8eSAndroid Build Coastguard Worker ALOGV("ioConfigChanged() event %d", event);
708*ec779b8eSAndroid Build Coastguard Worker
709*ec779b8eSAndroid Build Coastguard Worker if (ioDesc->getIoHandle() == AUDIO_IO_HANDLE_NONE) return Status::ok();
710*ec779b8eSAndroid Build Coastguard Worker
711*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector deviceIds;
712*ec779b8eSAndroid Build Coastguard Worker std::vector<sp<AudioDeviceCallback>> callbacksToCall;
713*ec779b8eSAndroid Build Coastguard Worker {
714*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
715*ec779b8eSAndroid Build Coastguard Worker auto callbacks = std::map<audio_port_handle_t, wp<AudioDeviceCallback>>();
716*ec779b8eSAndroid Build Coastguard Worker
717*ec779b8eSAndroid Build Coastguard Worker switch (event) {
718*ec779b8eSAndroid Build Coastguard Worker case AUDIO_OUTPUT_OPENED:
719*ec779b8eSAndroid Build Coastguard Worker case AUDIO_OUTPUT_REGISTERED:
720*ec779b8eSAndroid Build Coastguard Worker case AUDIO_INPUT_OPENED:
721*ec779b8eSAndroid Build Coastguard Worker case AUDIO_INPUT_REGISTERED: {
722*ec779b8eSAndroid Build Coastguard Worker if (sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->getIoHandle())) {
723*ec779b8eSAndroid Build Coastguard Worker deviceIds = oldDesc->getDeviceIds();
724*ec779b8eSAndroid Build Coastguard Worker }
725*ec779b8eSAndroid Build Coastguard Worker mIoDescriptors[ioDesc->getIoHandle()] = ioDesc;
726*ec779b8eSAndroid Build Coastguard Worker
727*ec779b8eSAndroid Build Coastguard Worker if (!ioDesc->getDeviceIds().empty()) {
728*ec779b8eSAndroid Build Coastguard Worker deviceIds = ioDesc->getDeviceIds();
729*ec779b8eSAndroid Build Coastguard Worker if (event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED) {
730*ec779b8eSAndroid Build Coastguard Worker auto it = mAudioDeviceCallbacks.find(ioDesc->getIoHandle());
731*ec779b8eSAndroid Build Coastguard Worker if (it != mAudioDeviceCallbacks.end()) {
732*ec779b8eSAndroid Build Coastguard Worker callbacks = it->second;
733*ec779b8eSAndroid Build Coastguard Worker }
734*ec779b8eSAndroid Build Coastguard Worker }
735*ec779b8eSAndroid Build Coastguard Worker }
736*ec779b8eSAndroid Build Coastguard Worker ALOGV("ioConfigChanged() new %s %s %s",
737*ec779b8eSAndroid Build Coastguard Worker event == AUDIO_OUTPUT_OPENED || event == AUDIO_OUTPUT_REGISTERED ?
738*ec779b8eSAndroid Build Coastguard Worker "output" : "input",
739*ec779b8eSAndroid Build Coastguard Worker event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED ?
740*ec779b8eSAndroid Build Coastguard Worker "opened" : "registered",
741*ec779b8eSAndroid Build Coastguard Worker ioDesc->toDebugString().c_str());
742*ec779b8eSAndroid Build Coastguard Worker }
743*ec779b8eSAndroid Build Coastguard Worker break;
744*ec779b8eSAndroid Build Coastguard Worker case AUDIO_OUTPUT_CLOSED:
745*ec779b8eSAndroid Build Coastguard Worker case AUDIO_INPUT_CLOSED: {
746*ec779b8eSAndroid Build Coastguard Worker if (getIoDescriptor_l(ioDesc->getIoHandle()) == 0) {
747*ec779b8eSAndroid Build Coastguard Worker ALOGW("ioConfigChanged() closing unknown %s %d",
748*ec779b8eSAndroid Build Coastguard Worker event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->getIoHandle());
749*ec779b8eSAndroid Build Coastguard Worker break;
750*ec779b8eSAndroid Build Coastguard Worker }
751*ec779b8eSAndroid Build Coastguard Worker ALOGV("ioConfigChanged() %s %d closed",
752*ec779b8eSAndroid Build Coastguard Worker event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->getIoHandle());
753*ec779b8eSAndroid Build Coastguard Worker
754*ec779b8eSAndroid Build Coastguard Worker mIoDescriptors.erase(ioDesc->getIoHandle());
755*ec779b8eSAndroid Build Coastguard Worker mAudioDeviceCallbacks.erase(ioDesc->getIoHandle());
756*ec779b8eSAndroid Build Coastguard Worker }
757*ec779b8eSAndroid Build Coastguard Worker break;
758*ec779b8eSAndroid Build Coastguard Worker
759*ec779b8eSAndroid Build Coastguard Worker case AUDIO_OUTPUT_CONFIG_CHANGED:
760*ec779b8eSAndroid Build Coastguard Worker case AUDIO_INPUT_CONFIG_CHANGED: {
761*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->getIoHandle());
762*ec779b8eSAndroid Build Coastguard Worker if (oldDesc == 0) {
763*ec779b8eSAndroid Build Coastguard Worker ALOGW("ioConfigChanged() modifying unknown %s! %d",
764*ec779b8eSAndroid Build Coastguard Worker event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input",
765*ec779b8eSAndroid Build Coastguard Worker ioDesc->getIoHandle());
766*ec779b8eSAndroid Build Coastguard Worker break;
767*ec779b8eSAndroid Build Coastguard Worker }
768*ec779b8eSAndroid Build Coastguard Worker
769*ec779b8eSAndroid Build Coastguard Worker deviceIds = oldDesc->getDeviceIds();
770*ec779b8eSAndroid Build Coastguard Worker mIoDescriptors[ioDesc->getIoHandle()] = ioDesc;
771*ec779b8eSAndroid Build Coastguard Worker
772*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector ioDescDeviceIds = ioDesc->getDeviceIds();
773*ec779b8eSAndroid Build Coastguard Worker if (!areDeviceIdsEqual(deviceIds, ioDescDeviceIds)) {
774*ec779b8eSAndroid Build Coastguard Worker deviceIds = ioDescDeviceIds;
775*ec779b8eSAndroid Build Coastguard Worker auto it = mAudioDeviceCallbacks.find(ioDesc->getIoHandle());
776*ec779b8eSAndroid Build Coastguard Worker if (it != mAudioDeviceCallbacks.end()) {
777*ec779b8eSAndroid Build Coastguard Worker callbacks = it->second;
778*ec779b8eSAndroid Build Coastguard Worker }
779*ec779b8eSAndroid Build Coastguard Worker }
780*ec779b8eSAndroid Build Coastguard Worker ALOGV("ioConfigChanged() new config for %s %s",
781*ec779b8eSAndroid Build Coastguard Worker event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input",
782*ec779b8eSAndroid Build Coastguard Worker ioDesc->toDebugString().c_str());
783*ec779b8eSAndroid Build Coastguard Worker
784*ec779b8eSAndroid Build Coastguard Worker }
785*ec779b8eSAndroid Build Coastguard Worker break;
786*ec779b8eSAndroid Build Coastguard Worker case AUDIO_CLIENT_STARTED: {
787*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->getIoHandle());
788*ec779b8eSAndroid Build Coastguard Worker if (oldDesc == 0) {
789*ec779b8eSAndroid Build Coastguard Worker ALOGW("ioConfigChanged() start client on unknown io! %d",
790*ec779b8eSAndroid Build Coastguard Worker ioDesc->getIoHandle());
791*ec779b8eSAndroid Build Coastguard Worker break;
792*ec779b8eSAndroid Build Coastguard Worker }
793*ec779b8eSAndroid Build Coastguard Worker ALOGV("ioConfigChanged() AUDIO_CLIENT_STARTED io %d port %d num callbacks %zu",
794*ec779b8eSAndroid Build Coastguard Worker ioDesc->getIoHandle(), ioDesc->getPortId(), mAudioDeviceCallbacks.size());
795*ec779b8eSAndroid Build Coastguard Worker oldDesc->setPatch(ioDesc->getPatch());
796*ec779b8eSAndroid Build Coastguard Worker auto it = mAudioDeviceCallbacks.find(ioDesc->getIoHandle());
797*ec779b8eSAndroid Build Coastguard Worker if (it != mAudioDeviceCallbacks.end()) {
798*ec779b8eSAndroid Build Coastguard Worker auto cbks = it->second;
799*ec779b8eSAndroid Build Coastguard Worker auto it2 = cbks.find(ioDesc->getPortId());
800*ec779b8eSAndroid Build Coastguard Worker if (it2 != cbks.end()) {
801*ec779b8eSAndroid Build Coastguard Worker callbacks.emplace(ioDesc->getPortId(), it2->second);
802*ec779b8eSAndroid Build Coastguard Worker deviceIds = oldDesc->getDeviceIds();
803*ec779b8eSAndroid Build Coastguard Worker }
804*ec779b8eSAndroid Build Coastguard Worker }
805*ec779b8eSAndroid Build Coastguard Worker }
806*ec779b8eSAndroid Build Coastguard Worker break;
807*ec779b8eSAndroid Build Coastguard Worker }
808*ec779b8eSAndroid Build Coastguard Worker
809*ec779b8eSAndroid Build Coastguard Worker for (auto wpCbk : callbacks) {
810*ec779b8eSAndroid Build Coastguard Worker sp<AudioDeviceCallback> spCbk = wpCbk.second.promote();
811*ec779b8eSAndroid Build Coastguard Worker if (spCbk != nullptr) {
812*ec779b8eSAndroid Build Coastguard Worker callbacksToCall.push_back(spCbk);
813*ec779b8eSAndroid Build Coastguard Worker }
814*ec779b8eSAndroid Build Coastguard Worker }
815*ec779b8eSAndroid Build Coastguard Worker }
816*ec779b8eSAndroid Build Coastguard Worker
817*ec779b8eSAndroid Build Coastguard Worker // Callbacks must be called without mMutex held. May lead to dead lock if calling for
818*ec779b8eSAndroid Build Coastguard Worker // example getRoutedDevice that updates the device and tries to acquire mMutex.
819*ec779b8eSAndroid Build Coastguard Worker for (auto cb : callbacksToCall) {
820*ec779b8eSAndroid Build Coastguard Worker // If callbacksToCall is not empty, it implies ioDesc->getIoHandle() and deviceId are valid
821*ec779b8eSAndroid Build Coastguard Worker cb->onAudioDeviceUpdate(ioDesc->getIoHandle(), deviceIds);
822*ec779b8eSAndroid Build Coastguard Worker }
823*ec779b8eSAndroid Build Coastguard Worker
824*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
825*ec779b8eSAndroid Build Coastguard Worker }
826*ec779b8eSAndroid Build Coastguard Worker
onSupportedLatencyModesChanged(int output,const std::vector<media::audio::common::AudioLatencyMode> & latencyModes)827*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioFlingerClient::onSupportedLatencyModesChanged(
828*ec779b8eSAndroid Build Coastguard Worker int output, const std::vector<media::audio::common::AudioLatencyMode>& latencyModes) {
829*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t outputLegacy = VALUE_OR_RETURN_BINDER_STATUS(
830*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_audio_io_handle_t(output));
831*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_latency_mode_t> modesLegacy = VALUE_OR_RETURN_BINDER_STATUS(
832*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<audio_latency_mode_t>>(
833*ec779b8eSAndroid Build Coastguard Worker latencyModes, aidl2legacy_AudioLatencyMode_audio_latency_mode_t));
834*ec779b8eSAndroid Build Coastguard Worker
835*ec779b8eSAndroid Build Coastguard Worker std::vector<sp<SupportedLatencyModesCallback>> callbacks;
836*ec779b8eSAndroid Build Coastguard Worker {
837*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
838*ec779b8eSAndroid Build Coastguard Worker for (auto callback : mSupportedLatencyModesCallbacks) {
839*ec779b8eSAndroid Build Coastguard Worker if (auto ref = callback.promote(); ref != nullptr) {
840*ec779b8eSAndroid Build Coastguard Worker callbacks.push_back(ref);
841*ec779b8eSAndroid Build Coastguard Worker }
842*ec779b8eSAndroid Build Coastguard Worker }
843*ec779b8eSAndroid Build Coastguard Worker }
844*ec779b8eSAndroid Build Coastguard Worker for (const auto& callback : callbacks) {
845*ec779b8eSAndroid Build Coastguard Worker callback->onSupportedLatencyModesChanged(outputLegacy, modesLegacy);
846*ec779b8eSAndroid Build Coastguard Worker }
847*ec779b8eSAndroid Build Coastguard Worker
848*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
849*ec779b8eSAndroid Build Coastguard Worker }
850*ec779b8eSAndroid Build Coastguard Worker
getInputBufferSize(uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t * buffSize)851*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::AudioFlingerClient::getInputBufferSize(
852*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, audio_format_t format,
853*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, size_t* buffSize) {
854*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
855*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
856*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
857*ec779b8eSAndroid Build Coastguard Worker // Do we have a stale mInBuffSize or are we requesting the input buffer size for new values
858*ec779b8eSAndroid Build Coastguard Worker if ((mInBuffSize == 0) || (sampleRate != mInSamplingRate) || (format != mInFormat)
859*ec779b8eSAndroid Build Coastguard Worker || (channelMask != mInChannelMask)) {
860*ec779b8eSAndroid Build Coastguard Worker size_t inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask);
861*ec779b8eSAndroid Build Coastguard Worker if (inBuffSize == 0) {
862*ec779b8eSAndroid Build Coastguard Worker ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %#x",
863*ec779b8eSAndroid Build Coastguard Worker sampleRate, format, channelMask);
864*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
865*ec779b8eSAndroid Build Coastguard Worker }
866*ec779b8eSAndroid Build Coastguard Worker // A benign race is possible here: we could overwrite a fresher cache entry
867*ec779b8eSAndroid Build Coastguard Worker // save the request params
868*ec779b8eSAndroid Build Coastguard Worker mInSamplingRate = sampleRate;
869*ec779b8eSAndroid Build Coastguard Worker mInFormat = format;
870*ec779b8eSAndroid Build Coastguard Worker mInChannelMask = channelMask;
871*ec779b8eSAndroid Build Coastguard Worker
872*ec779b8eSAndroid Build Coastguard Worker mInBuffSize = inBuffSize;
873*ec779b8eSAndroid Build Coastguard Worker }
874*ec779b8eSAndroid Build Coastguard Worker
875*ec779b8eSAndroid Build Coastguard Worker *buffSize = mInBuffSize;
876*ec779b8eSAndroid Build Coastguard Worker
877*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
878*ec779b8eSAndroid Build Coastguard Worker }
879*ec779b8eSAndroid Build Coastguard Worker
880*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor>
getIoDescriptor_l(audio_io_handle_t ioHandle)881*ec779b8eSAndroid Build Coastguard Worker AudioSystem::AudioFlingerClient::getIoDescriptor_l(audio_io_handle_t ioHandle) {
882*ec779b8eSAndroid Build Coastguard Worker if (const auto it = mIoDescriptors.find(ioHandle);
883*ec779b8eSAndroid Build Coastguard Worker it != mIoDescriptors.end()) {
884*ec779b8eSAndroid Build Coastguard Worker return it->second;
885*ec779b8eSAndroid Build Coastguard Worker }
886*ec779b8eSAndroid Build Coastguard Worker return {};
887*ec779b8eSAndroid Build Coastguard Worker }
888*ec779b8eSAndroid Build Coastguard Worker
getIoDescriptor(audio_io_handle_t ioHandle)889*ec779b8eSAndroid Build Coastguard Worker sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle) {
890*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
891*ec779b8eSAndroid Build Coastguard Worker return getIoDescriptor_l(ioHandle);
892*ec779b8eSAndroid Build Coastguard Worker }
893*ec779b8eSAndroid Build Coastguard Worker
addAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)894*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback(
895*ec779b8eSAndroid Build Coastguard Worker const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
896*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId) {
897*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
898*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
899*ec779b8eSAndroid Build Coastguard Worker auto& callbacks = mAudioDeviceCallbacks.emplace(
900*ec779b8eSAndroid Build Coastguard Worker audioIo,
901*ec779b8eSAndroid Build Coastguard Worker std::map<audio_port_handle_t, wp<AudioDeviceCallback>>()).first->second;
902*ec779b8eSAndroid Build Coastguard Worker auto result = callbacks.try_emplace(portId, callback);
903*ec779b8eSAndroid Build Coastguard Worker if (!result.second) {
904*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION;
905*ec779b8eSAndroid Build Coastguard Worker }
906*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
907*ec779b8eSAndroid Build Coastguard Worker }
908*ec779b8eSAndroid Build Coastguard Worker
removeAudioDeviceCallback(const wp<AudioDeviceCallback> & callback __unused,audio_io_handle_t audioIo,audio_port_handle_t portId)909*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback(
910*ec779b8eSAndroid Build Coastguard Worker const wp<AudioDeviceCallback>& callback __unused, audio_io_handle_t audioIo,
911*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId) {
912*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId);
913*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
914*ec779b8eSAndroid Build Coastguard Worker auto it = mAudioDeviceCallbacks.find(audioIo);
915*ec779b8eSAndroid Build Coastguard Worker if (it == mAudioDeviceCallbacks.end()) {
916*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION;
917*ec779b8eSAndroid Build Coastguard Worker }
918*ec779b8eSAndroid Build Coastguard Worker if (it->second.erase(portId) == 0) {
919*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION;
920*ec779b8eSAndroid Build Coastguard Worker }
921*ec779b8eSAndroid Build Coastguard Worker if (it->second.size() == 0) {
922*ec779b8eSAndroid Build Coastguard Worker mAudioDeviceCallbacks.erase(audioIo);
923*ec779b8eSAndroid Build Coastguard Worker }
924*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
925*ec779b8eSAndroid Build Coastguard Worker }
926*ec779b8eSAndroid Build Coastguard Worker
addSupportedLatencyModesCallback(const sp<SupportedLatencyModesCallback> & callback)927*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::AudioFlingerClient::addSupportedLatencyModesCallback(
928*ec779b8eSAndroid Build Coastguard Worker const sp<SupportedLatencyModesCallback>& callback) {
929*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
930*ec779b8eSAndroid Build Coastguard Worker if (std::find(mSupportedLatencyModesCallbacks.begin(),
931*ec779b8eSAndroid Build Coastguard Worker mSupportedLatencyModesCallbacks.end(),
932*ec779b8eSAndroid Build Coastguard Worker callback) != mSupportedLatencyModesCallbacks.end()) {
933*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION;
934*ec779b8eSAndroid Build Coastguard Worker }
935*ec779b8eSAndroid Build Coastguard Worker mSupportedLatencyModesCallbacks.push_back(callback);
936*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
937*ec779b8eSAndroid Build Coastguard Worker }
938*ec779b8eSAndroid Build Coastguard Worker
removeSupportedLatencyModesCallback(const sp<SupportedLatencyModesCallback> & callback)939*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::AudioFlingerClient::removeSupportedLatencyModesCallback(
940*ec779b8eSAndroid Build Coastguard Worker const sp<SupportedLatencyModesCallback>& callback) {
941*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
942*ec779b8eSAndroid Build Coastguard Worker auto it = std::find(mSupportedLatencyModesCallbacks.begin(),
943*ec779b8eSAndroid Build Coastguard Worker mSupportedLatencyModesCallbacks.end(),
944*ec779b8eSAndroid Build Coastguard Worker callback);
945*ec779b8eSAndroid Build Coastguard Worker if (it == mSupportedLatencyModesCallbacks.end()) {
946*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION;
947*ec779b8eSAndroid Build Coastguard Worker }
948*ec779b8eSAndroid Build Coastguard Worker mSupportedLatencyModesCallbacks.erase(it);
949*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
950*ec779b8eSAndroid Build Coastguard Worker }
951*ec779b8eSAndroid Build Coastguard Worker
addErrorCallback(audio_error_callback cb)952*ec779b8eSAndroid Build Coastguard Worker /* static */ uintptr_t AudioSystem::addErrorCallback(audio_error_callback cb) {
953*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gErrorCallbacksMutex);
954*ec779b8eSAndroid Build Coastguard Worker gAudioErrorCallbacks.insert(cb);
955*ec779b8eSAndroid Build Coastguard Worker return reinterpret_cast<uintptr_t>(cb);
956*ec779b8eSAndroid Build Coastguard Worker }
957*ec779b8eSAndroid Build Coastguard Worker
removeErrorCallback(uintptr_t cb)958*ec779b8eSAndroid Build Coastguard Worker /* static */ void AudioSystem::removeErrorCallback(uintptr_t cb) {
959*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gErrorCallbacksMutex);
960*ec779b8eSAndroid Build Coastguard Worker gAudioErrorCallbacks.erase(reinterpret_cast<audio_error_callback>(cb));
961*ec779b8eSAndroid Build Coastguard Worker }
962*ec779b8eSAndroid Build Coastguard Worker
reportError(status_t err)963*ec779b8eSAndroid Build Coastguard Worker /* static */ void AudioSystem::reportError(status_t err) {
964*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gErrorCallbacksMutex);
965*ec779b8eSAndroid Build Coastguard Worker for (auto callback : gAudioErrorCallbacks) {
966*ec779b8eSAndroid Build Coastguard Worker callback(err);
967*ec779b8eSAndroid Build Coastguard Worker }
968*ec779b8eSAndroid Build Coastguard Worker }
969*ec779b8eSAndroid Build Coastguard Worker
setDynPolicyCallback(dynamic_policy_callback cb)970*ec779b8eSAndroid Build Coastguard Worker /*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb) {
971*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gMutex);
972*ec779b8eSAndroid Build Coastguard Worker gDynPolicyCallback = cb;
973*ec779b8eSAndroid Build Coastguard Worker }
974*ec779b8eSAndroid Build Coastguard Worker
setRecordConfigCallback(record_config_callback cb)975*ec779b8eSAndroid Build Coastguard Worker /*static*/ void AudioSystem::setRecordConfigCallback(record_config_callback cb) {
976*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gMutex);
977*ec779b8eSAndroid Build Coastguard Worker gRecordConfigCallback = cb;
978*ec779b8eSAndroid Build Coastguard Worker }
979*ec779b8eSAndroid Build Coastguard Worker
setRoutingCallback(routing_callback cb)980*ec779b8eSAndroid Build Coastguard Worker /*static*/ void AudioSystem::setRoutingCallback(routing_callback cb) {
981*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gMutex);
982*ec779b8eSAndroid Build Coastguard Worker gRoutingCallback = cb;
983*ec779b8eSAndroid Build Coastguard Worker }
984*ec779b8eSAndroid Build Coastguard Worker
setVolInitReqCallback(vol_range_init_req_callback cb)985*ec779b8eSAndroid Build Coastguard Worker /*static*/ void AudioSystem::setVolInitReqCallback(vol_range_init_req_callback cb) {
986*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gMutex);
987*ec779b8eSAndroid Build Coastguard Worker gVolRangeInitReqCallback = cb;
988*ec779b8eSAndroid Build Coastguard Worker }
989*ec779b8eSAndroid Build Coastguard Worker
990*ec779b8eSAndroid Build Coastguard Worker
991*ec779b8eSAndroid Build Coastguard Worker // AudioPolicyServiceTraits is a collection of methods that parameterize the
992*ec779b8eSAndroid Build Coastguard Worker // ServiceSingleton class implementation of IAudioPolicyService.
993*ec779b8eSAndroid Build Coastguard Worker
994*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyServiceTraits {
995*ec779b8eSAndroid Build Coastguard Worker public:
996*ec779b8eSAndroid Build Coastguard Worker // ------- methods required by ServiceSingleton
997*ec779b8eSAndroid Build Coastguard Worker
getServiceName()998*ec779b8eSAndroid Build Coastguard Worker static constexpr const char* getServiceName() { return "media.audio_policy"; }
999*ec779b8eSAndroid Build Coastguard Worker
onNewService(const sp<IAudioPolicyService> & aps)1000*ec779b8eSAndroid Build Coastguard Worker static void onNewService(const sp<IAudioPolicyService>& aps) {
1001*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: %s service obtained %p", __func__, getServiceName(), aps.get());
1002*ec779b8eSAndroid Build Coastguard Worker sp<AudioSystem::AudioPolicyServiceClient> client;
1003*ec779b8eSAndroid Build Coastguard Worker {
1004*ec779b8eSAndroid Build Coastguard Worker std::lock_guard l(mMutex);
1005*ec779b8eSAndroid Build Coastguard Worker ALOGW_IF(mValid, "%s: %s service already valid, continuing with initialization",
1006*ec779b8eSAndroid Build Coastguard Worker __func__, getServiceName());
1007*ec779b8eSAndroid Build Coastguard Worker if (mClient == nullptr) {
1008*ec779b8eSAndroid Build Coastguard Worker mClient = sp<AudioSystem::AudioPolicyServiceClient>::make();
1009*ec779b8eSAndroid Build Coastguard Worker }
1010*ec779b8eSAndroid Build Coastguard Worker client = mClient;
1011*ec779b8eSAndroid Build Coastguard Worker mService = aps;
1012*ec779b8eSAndroid Build Coastguard Worker mValid = true;
1013*ec779b8eSAndroid Build Coastguard Worker }
1014*ec779b8eSAndroid Build Coastguard Worker // TODO(b/375280520) consider registerClient() within mMutex lock.
1015*ec779b8eSAndroid Build Coastguard Worker const int64_t token = IPCThreadState::self()->clearCallingIdentity();
1016*ec779b8eSAndroid Build Coastguard Worker aps->registerClient(client);
1017*ec779b8eSAndroid Build Coastguard Worker aps->setAudioPortCallbacksEnabled(client->isAudioPortCbEnabled());
1018*ec779b8eSAndroid Build Coastguard Worker aps->setAudioVolumeGroupCallbacksEnabled(client->isAudioVolumeGroupCbEnabled());
1019*ec779b8eSAndroid Build Coastguard Worker IPCThreadState::self()->restoreCallingIdentity(token);
1020*ec779b8eSAndroid Build Coastguard Worker }
1021*ec779b8eSAndroid Build Coastguard Worker
onServiceDied(const sp<IAudioPolicyService> & service)1022*ec779b8eSAndroid Build Coastguard Worker static void onServiceDied(const sp<IAudioPolicyService>& service) {
1023*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: %s service died %p", __func__, getServiceName(), service.get());
1024*ec779b8eSAndroid Build Coastguard Worker sp<AudioSystem::AudioPolicyServiceClient> client;
1025*ec779b8eSAndroid Build Coastguard Worker {
1026*ec779b8eSAndroid Build Coastguard Worker std::lock_guard l(mMutex);
1027*ec779b8eSAndroid Build Coastguard Worker if (!mValid) {
1028*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: %s service already invalidated, ignoring", __func__, getServiceName());
1029*ec779b8eSAndroid Build Coastguard Worker return;
1030*ec779b8eSAndroid Build Coastguard Worker }
1031*ec779b8eSAndroid Build Coastguard Worker if (mService != service) {
1032*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: %s unmatched service death pointers, ignoring",
1033*ec779b8eSAndroid Build Coastguard Worker __func__, getServiceName());
1034*ec779b8eSAndroid Build Coastguard Worker return;
1035*ec779b8eSAndroid Build Coastguard Worker }
1036*ec779b8eSAndroid Build Coastguard Worker mValid = false;
1037*ec779b8eSAndroid Build Coastguard Worker client = mClient;
1038*ec779b8eSAndroid Build Coastguard Worker }
1039*ec779b8eSAndroid Build Coastguard Worker if (client) {
1040*ec779b8eSAndroid Build Coastguard Worker client->onServiceDied();
1041*ec779b8eSAndroid Build Coastguard Worker } else {
1042*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: null client", __func__);
1043*ec779b8eSAndroid Build Coastguard Worker }
1044*ec779b8eSAndroid Build Coastguard Worker }
1045*ec779b8eSAndroid Build Coastguard Worker
options()1046*ec779b8eSAndroid Build Coastguard Worker static constexpr mediautils::ServiceOptions options() {
1047*ec779b8eSAndroid Build Coastguard Worker return mediautils::ServiceOptions::kNone;
1048*ec779b8eSAndroid Build Coastguard Worker }
1049*ec779b8eSAndroid Build Coastguard Worker
1050*ec779b8eSAndroid Build Coastguard Worker // ------- methods required by AudioSystem
1051*ec779b8eSAndroid Build Coastguard Worker
getService(std::chrono::milliseconds waitMs=std::chrono::milliseconds{-1})1052*ec779b8eSAndroid Build Coastguard Worker static sp<IAudioPolicyService> getService(
1053*ec779b8eSAndroid Build Coastguard Worker std::chrono::milliseconds waitMs = std::chrono::milliseconds{-1}) {
1054*ec779b8eSAndroid Build Coastguard Worker static bool init = false;
1055*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
1056*ec779b8eSAndroid Build Coastguard Worker if (!init) {
1057*ec779b8eSAndroid Build Coastguard Worker if (!mDisableThreadPoolStart) {
1058*ec779b8eSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
1059*ec779b8eSAndroid Build Coastguard Worker }
1060*ec779b8eSAndroid Build Coastguard Worker if (multiuser_get_app_id(getuid()) == AID_AUDIOSERVER) {
1061*ec779b8eSAndroid Build Coastguard Worker mediautils::skipService<IAudioPolicyService>(mediautils::SkipMode::kWait);
1062*ec779b8eSAndroid Build Coastguard Worker mWaitMs = std::chrono::milliseconds(INT32_MAX);
1063*ec779b8eSAndroid Build Coastguard Worker } else {
1064*ec779b8eSAndroid Build Coastguard Worker mediautils::initService<IAudioPolicyService, AudioPolicyServiceTraits>();
1065*ec779b8eSAndroid Build Coastguard Worker mWaitMs = std::chrono::milliseconds(
1066*ec779b8eSAndroid Build Coastguard Worker property_get_int32(kServiceWaitProperty, kServiceClientWaitMs));
1067*ec779b8eSAndroid Build Coastguard Worker }
1068*ec779b8eSAndroid Build Coastguard Worker init = true;
1069*ec779b8eSAndroid Build Coastguard Worker }
1070*ec779b8eSAndroid Build Coastguard Worker if (mValid) return mService;
1071*ec779b8eSAndroid Build Coastguard Worker if (waitMs.count() < 0) waitMs = mWaitMs;
1072*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
1073*ec779b8eSAndroid Build Coastguard Worker
1074*ec779b8eSAndroid Build Coastguard Worker auto service = mediautils::getService<
1075*ec779b8eSAndroid Build Coastguard Worker media::IAudioPolicyService>(waitMs);
1076*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: checking for service %s: %p", __func__, getServiceName(), service.get());
1077*ec779b8eSAndroid Build Coastguard Worker
1078*ec779b8eSAndroid Build Coastguard Worker // mediautils::getService() will return early if setLocalService() is called
1079*ec779b8eSAndroid Build Coastguard Worker // (whereupon mService contained the actual local service pointer to use).
1080*ec779b8eSAndroid Build Coastguard Worker // we should always return mService.
1081*ec779b8eSAndroid Build Coastguard Worker ul.lock();
1082*ec779b8eSAndroid Build Coastguard Worker return mService;
1083*ec779b8eSAndroid Build Coastguard Worker }
1084*ec779b8eSAndroid Build Coastguard Worker
getClient()1085*ec779b8eSAndroid Build Coastguard Worker static sp<AudioSystem::AudioPolicyServiceClient> getClient() {
1086*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
1087*ec779b8eSAndroid Build Coastguard Worker if (mValid) return mClient;
1088*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
1089*ec779b8eSAndroid Build Coastguard Worker
1090*ec779b8eSAndroid Build Coastguard Worker auto service = getService();
1091*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: checking for service: %p", __func__, service.get());
1092*ec779b8eSAndroid Build Coastguard Worker
1093*ec779b8eSAndroid Build Coastguard Worker ul.lock();
1094*ec779b8eSAndroid Build Coastguard Worker return mClient;
1095*ec779b8eSAndroid Build Coastguard Worker }
1096*ec779b8eSAndroid Build Coastguard Worker
setLocalService(const sp<IAudioPolicyService> & aps)1097*ec779b8eSAndroid Build Coastguard Worker static status_t setLocalService(const sp<IAudioPolicyService>& aps) {
1098*ec779b8eSAndroid Build Coastguard Worker mediautils::skipService<IAudioPolicyService>();
1099*ec779b8eSAndroid Build Coastguard Worker sp<IAudioPolicyService> old;
1100*ec779b8eSAndroid Build Coastguard Worker audio_utils::unique_lock ul(mMutex);
1101*ec779b8eSAndroid Build Coastguard Worker old = mService;
1102*ec779b8eSAndroid Build Coastguard Worker if (old) {
1103*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
1104*ec779b8eSAndroid Build Coastguard Worker onServiceDied(old);
1105*ec779b8eSAndroid Build Coastguard Worker ul.lock();
1106*ec779b8eSAndroid Build Coastguard Worker if (mService != old) {
1107*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: service changed during callback, ignoring.", __func__);
1108*ec779b8eSAndroid Build Coastguard Worker return OK;
1109*ec779b8eSAndroid Build Coastguard Worker }
1110*ec779b8eSAndroid Build Coastguard Worker }
1111*ec779b8eSAndroid Build Coastguard Worker mService = aps;
1112*ec779b8eSAndroid Build Coastguard Worker ul.unlock();
1113*ec779b8eSAndroid Build Coastguard Worker if (aps) onNewService(aps);
1114*ec779b8eSAndroid Build Coastguard Worker return OK;
1115*ec779b8eSAndroid Build Coastguard Worker }
1116*ec779b8eSAndroid Build Coastguard Worker
disableThreadPoolStart()1117*ec779b8eSAndroid Build Coastguard Worker static void disableThreadPoolStart() {
1118*ec779b8eSAndroid Build Coastguard Worker mDisableThreadPoolStart = true;
1119*ec779b8eSAndroid Build Coastguard Worker }
1120*ec779b8eSAndroid Build Coastguard Worker
1121*ec779b8eSAndroid Build Coastguard Worker // called to determine error on nullptr service return.
getError()1122*ec779b8eSAndroid Build Coastguard Worker static constexpr status_t getError() {
1123*ec779b8eSAndroid Build Coastguard Worker return DEAD_OBJECT;
1124*ec779b8eSAndroid Build Coastguard Worker }
1125*ec779b8eSAndroid Build Coastguard Worker private:
1126*ec779b8eSAndroid Build Coastguard Worker
1127*ec779b8eSAndroid Build Coastguard Worker static inline constinit std::mutex mMutex;
1128*ec779b8eSAndroid Build Coastguard Worker static inline constinit sp<AudioSystem::AudioPolicyServiceClient> mClient GUARDED_BY(mMutex);
1129*ec779b8eSAndroid Build Coastguard Worker static inline constinit sp<IAudioPolicyService> mService GUARDED_BY(mMutex);
1130*ec779b8eSAndroid Build Coastguard Worker static inline constinit bool mValid GUARDED_BY(mMutex) = false;
1131*ec779b8eSAndroid Build Coastguard Worker static inline constinit std::chrono::milliseconds mWaitMs
GUARDED_BY(mMutex)1132*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mMutex) {kServiceClientWaitMs};
1133*ec779b8eSAndroid Build Coastguard Worker static inline constinit std::atomic_bool mDisableThreadPoolStart = false;
1134*ec779b8eSAndroid Build Coastguard Worker };
1135*ec779b8eSAndroid Build Coastguard Worker
1136*ec779b8eSAndroid Build Coastguard Worker
get_audio_policy_service()1137*ec779b8eSAndroid Build Coastguard Worker sp<IAudioPolicyService> AudioSystem::get_audio_policy_service() {
1138*ec779b8eSAndroid Build Coastguard Worker return AudioPolicyServiceTraits::getService();
1139*ec779b8eSAndroid Build Coastguard Worker }
1140*ec779b8eSAndroid Build Coastguard Worker
setLocalAudioPolicyService(const sp<IAudioPolicyService> & aps)1141*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setLocalAudioPolicyService(const sp<IAudioPolicyService>& aps) {
1142*ec779b8eSAndroid Build Coastguard Worker return AudioPolicyServiceTraits::setLocalService(aps);
1143*ec779b8eSAndroid Build Coastguard Worker }
1144*ec779b8eSAndroid Build Coastguard Worker
getAudioPolicyClient()1145*ec779b8eSAndroid Build Coastguard Worker sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::getAudioPolicyClient() {
1146*ec779b8eSAndroid Build Coastguard Worker return AudioPolicyServiceTraits::getClient();
1147*ec779b8eSAndroid Build Coastguard Worker }
1148*ec779b8eSAndroid Build Coastguard Worker
disableThreadPool()1149*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::disableThreadPool() {
1150*ec779b8eSAndroid Build Coastguard Worker AudioFlingerServiceTraits::disableThreadPoolStart();
1151*ec779b8eSAndroid Build Coastguard Worker AudioPolicyServiceTraits::disableThreadPoolStart();
1152*ec779b8eSAndroid Build Coastguard Worker }
1153*ec779b8eSAndroid Build Coastguard Worker
1154*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1155*ec779b8eSAndroid Build Coastguard Worker
onNewAudioModulesAvailable()1156*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::onNewAudioModulesAvailable() {
1157*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1158*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return;
1159*ec779b8eSAndroid Build Coastguard Worker aps->onNewAudioModulesAvailable();
1160*ec779b8eSAndroid Build Coastguard Worker }
1161*ec779b8eSAndroid Build Coastguard Worker
setDeviceConnectionState(audio_policy_dev_state_t state,const android::media::audio::common::AudioPort & port,audio_format_t encodedFormat)1162*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setDeviceConnectionState(audio_policy_dev_state_t state,
1163*ec779b8eSAndroid Build Coastguard Worker const android::media::audio::common::AudioPort& port,
1164*ec779b8eSAndroid Build Coastguard Worker audio_format_t encodedFormat) {
1165*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1166*ec779b8eSAndroid Build Coastguard Worker
1167*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1168*ec779b8eSAndroid Build Coastguard Worker
1169*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1170*ec779b8eSAndroid Build Coastguard Worker aps->setDeviceConnectionState(
1171*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(
1172*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(state)),
1173*ec779b8eSAndroid Build Coastguard Worker port,
1174*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(
1175*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_format_t_AudioFormatDescription(encodedFormat))));
1176*ec779b8eSAndroid Build Coastguard Worker }
1177*ec779b8eSAndroid Build Coastguard Worker
getDeviceConnectionState(audio_devices_t device,const char * device_address)1178*ec779b8eSAndroid Build Coastguard Worker audio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device,
1179*ec779b8eSAndroid Build Coastguard Worker const char* device_address) {
1180*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1181*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
1182*ec779b8eSAndroid Build Coastguard Worker
1183*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<audio_policy_dev_state_t> {
1184*ec779b8eSAndroid Build Coastguard Worker AudioDevice deviceAidl = VALUE_OR_RETURN(
1185*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_device_AudioDevice(device, device_address));
1186*ec779b8eSAndroid Build Coastguard Worker
1187*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyDeviceState result;
1188*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(statusTFromBinderStatus(
1189*ec779b8eSAndroid Build Coastguard Worker aps->getDeviceConnectionState(deviceAidl, &result)));
1190*ec779b8eSAndroid Build Coastguard Worker
1191*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(result);
1192*ec779b8eSAndroid Build Coastguard Worker }();
1193*ec779b8eSAndroid Build Coastguard Worker return result.value_or(AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE);
1194*ec779b8eSAndroid Build Coastguard Worker }
1195*ec779b8eSAndroid Build Coastguard Worker
handleDeviceConfigChange(audio_devices_t device,const char * device_address,const char * device_name,audio_format_t encodedFormat)1196*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::handleDeviceConfigChange(audio_devices_t device,
1197*ec779b8eSAndroid Build Coastguard Worker const char* device_address,
1198*ec779b8eSAndroid Build Coastguard Worker const char* device_name,
1199*ec779b8eSAndroid Build Coastguard Worker audio_format_t encodedFormat) {
1200*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1201*ec779b8eSAndroid Build Coastguard Worker const char* address = "";
1202*ec779b8eSAndroid Build Coastguard Worker const char* name = "";
1203*ec779b8eSAndroid Build Coastguard Worker
1204*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1205*ec779b8eSAndroid Build Coastguard Worker
1206*ec779b8eSAndroid Build Coastguard Worker if (device_address != NULL) {
1207*ec779b8eSAndroid Build Coastguard Worker address = device_address;
1208*ec779b8eSAndroid Build Coastguard Worker }
1209*ec779b8eSAndroid Build Coastguard Worker if (device_name != NULL) {
1210*ec779b8eSAndroid Build Coastguard Worker name = device_name;
1211*ec779b8eSAndroid Build Coastguard Worker }
1212*ec779b8eSAndroid Build Coastguard Worker
1213*ec779b8eSAndroid Build Coastguard Worker AudioDevice deviceAidl = VALUE_OR_RETURN_STATUS(
1214*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_device_AudioDevice(device, address));
1215*ec779b8eSAndroid Build Coastguard Worker
1216*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1217*ec779b8eSAndroid Build Coastguard Worker aps->handleDeviceConfigChange(deviceAidl, name, VALUE_OR_RETURN_STATUS(
1218*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_format_t_AudioFormatDescription(encodedFormat))));
1219*ec779b8eSAndroid Build Coastguard Worker }
1220*ec779b8eSAndroid Build Coastguard Worker
setPhoneState(audio_mode_t state,uid_t uid)1221*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setPhoneState(audio_mode_t state, uid_t uid) {
1222*ec779b8eSAndroid Build Coastguard Worker if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE;
1223*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1224*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1225*ec779b8eSAndroid Build Coastguard Worker
1226*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setPhoneState(
1227*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(legacy2aidl_audio_mode_t_AudioMode(state)),
1228*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid))));
1229*ec779b8eSAndroid Build Coastguard Worker }
1230*ec779b8eSAndroid Build Coastguard Worker
1231*ec779b8eSAndroid Build Coastguard Worker status_t
setForceUse(audio_policy_force_use_t usage,audio_policy_forced_cfg_t config)1232*ec779b8eSAndroid Build Coastguard Worker AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) {
1233*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1234*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1235*ec779b8eSAndroid Build Coastguard Worker
1236*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1237*ec779b8eSAndroid Build Coastguard Worker aps->setForceUse(
1238*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(
1239*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_policy_force_use_t_AudioPolicyForceUse(usage)),
1240*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(
1241*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
1242*ec779b8eSAndroid Build Coastguard Worker config))));
1243*ec779b8eSAndroid Build Coastguard Worker }
1244*ec779b8eSAndroid Build Coastguard Worker
getForceUse(audio_policy_force_use_t usage)1245*ec779b8eSAndroid Build Coastguard Worker audio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) {
1246*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1247*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AUDIO_POLICY_FORCE_NONE;
1248*ec779b8eSAndroid Build Coastguard Worker
1249*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<audio_policy_forced_cfg_t> {
1250*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyForceUse usageAidl = VALUE_OR_RETURN(
1251*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_policy_force_use_t_AudioPolicyForceUse(usage));
1252*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyForcedConfig configAidl;
1253*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(statusTFromBinderStatus(
1254*ec779b8eSAndroid Build Coastguard Worker aps->getForceUse(usageAidl, &configAidl)));
1255*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl);
1256*ec779b8eSAndroid Build Coastguard Worker }();
1257*ec779b8eSAndroid Build Coastguard Worker
1258*ec779b8eSAndroid Build Coastguard Worker return result.value_or(AUDIO_POLICY_FORCE_NONE);
1259*ec779b8eSAndroid Build Coastguard Worker }
1260*ec779b8eSAndroid Build Coastguard Worker
1261*ec779b8eSAndroid Build Coastguard Worker
getOutput(audio_stream_type_t stream)1262*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream) {
1263*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1264*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AUDIO_IO_HANDLE_NONE;
1265*ec779b8eSAndroid Build Coastguard Worker
1266*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<audio_io_handle_t> {
1267*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN(
1268*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1269*ec779b8eSAndroid Build Coastguard Worker int32_t outputAidl;
1270*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(
1271*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->getOutput(streamAidl, &outputAidl)));
1272*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_int32_t_audio_io_handle_t(outputAidl);
1273*ec779b8eSAndroid Build Coastguard Worker }();
1274*ec779b8eSAndroid Build Coastguard Worker
1275*ec779b8eSAndroid Build Coastguard Worker return result.value_or(AUDIO_IO_HANDLE_NONE);
1276*ec779b8eSAndroid Build Coastguard Worker }
1277*ec779b8eSAndroid Build Coastguard Worker
getOutputForAttr(audio_attributes_t * attr,audio_io_handle_t * output,audio_session_t session,audio_stream_type_t * stream,const AttributionSourceState & attributionSource,audio_config_t * config,audio_output_flags_t flags,DeviceIdVector * selectedDeviceIds,audio_port_handle_t * portId,std::vector<audio_io_handle_t> * secondaryOutputs,bool * isSpatialized,bool * isBitPerfect,float * volume,bool * muted)1278*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getOutputForAttr(audio_attributes_t* attr,
1279*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t* output,
1280*ec779b8eSAndroid Build Coastguard Worker audio_session_t session,
1281*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t* stream,
1282*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource,
1283*ec779b8eSAndroid Build Coastguard Worker audio_config_t* config,
1284*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t flags,
1285*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector* selectedDeviceIds,
1286*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t* portId,
1287*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_io_handle_t>* secondaryOutputs,
1288*ec779b8eSAndroid Build Coastguard Worker bool *isSpatialized,
1289*ec779b8eSAndroid Build Coastguard Worker bool *isBitPerfect,
1290*ec779b8eSAndroid Build Coastguard Worker float *volume,
1291*ec779b8eSAndroid Build Coastguard Worker bool *muted) {
1292*ec779b8eSAndroid Build Coastguard Worker if (attr == nullptr) {
1293*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s NULL audio attributes", __func__);
1294*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1295*ec779b8eSAndroid Build Coastguard Worker }
1296*ec779b8eSAndroid Build Coastguard Worker if (output == nullptr) {
1297*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s NULL output - shouldn't happen", __func__);
1298*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1299*ec779b8eSAndroid Build Coastguard Worker }
1300*ec779b8eSAndroid Build Coastguard Worker if (selectedDeviceIds == nullptr) {
1301*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s NULL selectedDeviceIds - shouldn't happen", __func__);
1302*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1303*ec779b8eSAndroid Build Coastguard Worker }
1304*ec779b8eSAndroid Build Coastguard Worker if (portId == nullptr) {
1305*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s NULL portId - shouldn't happen", __func__);
1306*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1307*ec779b8eSAndroid Build Coastguard Worker }
1308*ec779b8eSAndroid Build Coastguard Worker if (secondaryOutputs == nullptr) {
1309*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__);
1310*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1311*ec779b8eSAndroid Build Coastguard Worker }
1312*ec779b8eSAndroid Build Coastguard Worker
1313*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1314*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return NO_INIT;
1315*ec779b8eSAndroid Build Coastguard Worker
1316*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
1317*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
1318*ec779b8eSAndroid Build Coastguard Worker int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1319*ec779b8eSAndroid Build Coastguard Worker AudioConfig configAidl = VALUE_OR_RETURN_STATUS(
1320*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_config_t_AudioConfig(*config, false /*isInput*/));
1321*ec779b8eSAndroid Build Coastguard Worker int32_t flagsAidl = VALUE_OR_RETURN_STATUS(
1322*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
1323*ec779b8eSAndroid Build Coastguard Worker auto selectedDeviceIdsAidl = VALUE_OR_RETURN_STATUS(convertContainer<std::vector<int32_t>>(
1324*ec779b8eSAndroid Build Coastguard Worker *selectedDeviceIds, legacy2aidl_audio_port_handle_t_int32_t));
1325*ec779b8eSAndroid Build Coastguard Worker
1326*ec779b8eSAndroid Build Coastguard Worker media::GetOutputForAttrResponse responseAidl;
1327*ec779b8eSAndroid Build Coastguard Worker
1328*ec779b8eSAndroid Build Coastguard Worker status_t status = statusTFromBinderStatus(
1329*ec779b8eSAndroid Build Coastguard Worker aps->getOutputForAttr(attrAidl, sessionAidl, attributionSource, configAidl, flagsAidl,
1330*ec779b8eSAndroid Build Coastguard Worker selectedDeviceIdsAidl, &responseAidl));
1331*ec779b8eSAndroid Build Coastguard Worker if (status != NO_ERROR) {
1332*ec779b8eSAndroid Build Coastguard Worker config->format = VALUE_OR_RETURN_STATUS(
1333*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioFormatDescription_audio_format_t(responseAidl.configBase.format));
1334*ec779b8eSAndroid Build Coastguard Worker config->channel_mask = VALUE_OR_RETURN_STATUS(
1335*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
1336*ec779b8eSAndroid Build Coastguard Worker responseAidl.configBase.channelMask, false /*isInput*/));
1337*ec779b8eSAndroid Build Coastguard Worker config->sample_rate = responseAidl.configBase.sampleRate;
1338*ec779b8eSAndroid Build Coastguard Worker return status;
1339*ec779b8eSAndroid Build Coastguard Worker }
1340*ec779b8eSAndroid Build Coastguard Worker
1341*ec779b8eSAndroid Build Coastguard Worker *output = VALUE_OR_RETURN_STATUS(
1342*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_audio_io_handle_t(responseAidl.output));
1343*ec779b8eSAndroid Build Coastguard Worker
1344*ec779b8eSAndroid Build Coastguard Worker if (stream != nullptr) {
1345*ec779b8eSAndroid Build Coastguard Worker *stream = VALUE_OR_RETURN_STATUS(
1346*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioStreamType_audio_stream_type_t(responseAidl.stream));
1347*ec779b8eSAndroid Build Coastguard Worker }
1348*ec779b8eSAndroid Build Coastguard Worker *selectedDeviceIds = VALUE_OR_RETURN_STATUS(convertContainer<DeviceIdVector>(
1349*ec779b8eSAndroid Build Coastguard Worker responseAidl.selectedDeviceIds, aidl2legacy_int32_t_audio_port_handle_t));
1350*ec779b8eSAndroid Build Coastguard Worker *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(responseAidl.portId));
1351*ec779b8eSAndroid Build Coastguard Worker *secondaryOutputs = VALUE_OR_RETURN_STATUS(convertContainer<std::vector<audio_io_handle_t>>(
1352*ec779b8eSAndroid Build Coastguard Worker responseAidl.secondaryOutputs, aidl2legacy_int32_t_audio_io_handle_t));
1353*ec779b8eSAndroid Build Coastguard Worker *isSpatialized = responseAidl.isSpatialized;
1354*ec779b8eSAndroid Build Coastguard Worker *isBitPerfect = responseAidl.isBitPerfect;
1355*ec779b8eSAndroid Build Coastguard Worker *attr = VALUE_OR_RETURN_STATUS(
1356*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioAttributes_audio_attributes_t(responseAidl.attr));
1357*ec779b8eSAndroid Build Coastguard Worker *volume = responseAidl.volume;
1358*ec779b8eSAndroid Build Coastguard Worker *muted = responseAidl.muted;
1359*ec779b8eSAndroid Build Coastguard Worker
1360*ec779b8eSAndroid Build Coastguard Worker return OK;
1361*ec779b8eSAndroid Build Coastguard Worker }
1362*ec779b8eSAndroid Build Coastguard Worker
startOutput(audio_port_handle_t portId)1363*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::startOutput(audio_port_handle_t portId) {
1364*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1365*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1366*ec779b8eSAndroid Build Coastguard Worker
1367*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1368*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->startOutput(portIdAidl));
1369*ec779b8eSAndroid Build Coastguard Worker }
1370*ec779b8eSAndroid Build Coastguard Worker
stopOutput(audio_port_handle_t portId)1371*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::stopOutput(audio_port_handle_t portId) {
1372*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1373*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1374*ec779b8eSAndroid Build Coastguard Worker
1375*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1376*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->stopOutput(portIdAidl));
1377*ec779b8eSAndroid Build Coastguard Worker }
1378*ec779b8eSAndroid Build Coastguard Worker
releaseOutput(audio_port_handle_t portId)1379*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::releaseOutput(audio_port_handle_t portId) {
1380*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1381*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return;
1382*ec779b8eSAndroid Build Coastguard Worker
1383*ec779b8eSAndroid Build Coastguard Worker auto status = [&]() -> status_t {
1384*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(
1385*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_handle_t_int32_t(portId));
1386*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(aps->releaseOutput(portIdAidl)));
1387*ec779b8eSAndroid Build Coastguard Worker return OK;
1388*ec779b8eSAndroid Build Coastguard Worker }();
1389*ec779b8eSAndroid Build Coastguard Worker
1390*ec779b8eSAndroid Build Coastguard Worker // Ignore status.
1391*ec779b8eSAndroid Build Coastguard Worker (void) status;
1392*ec779b8eSAndroid Build Coastguard Worker }
1393*ec779b8eSAndroid Build Coastguard Worker
getInputForAttr(const audio_attributes_t * attr,audio_io_handle_t * input,audio_unique_id_t riid,audio_session_t session,const AttributionSourceState & attributionSource,audio_config_base_t * config,audio_input_flags_t flags,audio_port_handle_t * selectedDeviceId,audio_port_handle_t * portId)1394*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getInputForAttr(const audio_attributes_t* attr,
1395*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t* input,
1396*ec779b8eSAndroid Build Coastguard Worker audio_unique_id_t riid,
1397*ec779b8eSAndroid Build Coastguard Worker audio_session_t session,
1398*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState &attributionSource,
1399*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t* config,
1400*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags,
1401*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t* selectedDeviceId,
1402*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t* portId) {
1403*ec779b8eSAndroid Build Coastguard Worker if (attr == NULL) {
1404*ec779b8eSAndroid Build Coastguard Worker ALOGE("getInputForAttr NULL attr - shouldn't happen");
1405*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1406*ec779b8eSAndroid Build Coastguard Worker }
1407*ec779b8eSAndroid Build Coastguard Worker if (input == NULL) {
1408*ec779b8eSAndroid Build Coastguard Worker ALOGE("getInputForAttr NULL input - shouldn't happen");
1409*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1410*ec779b8eSAndroid Build Coastguard Worker }
1411*ec779b8eSAndroid Build Coastguard Worker if (selectedDeviceId == NULL) {
1412*ec779b8eSAndroid Build Coastguard Worker ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
1413*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1414*ec779b8eSAndroid Build Coastguard Worker }
1415*ec779b8eSAndroid Build Coastguard Worker if (portId == NULL) {
1416*ec779b8eSAndroid Build Coastguard Worker ALOGE("getInputForAttr NULL portId - shouldn't happen");
1417*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1418*ec779b8eSAndroid Build Coastguard Worker }
1419*ec779b8eSAndroid Build Coastguard Worker
1420*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1421*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return NO_INIT;
1422*ec779b8eSAndroid Build Coastguard Worker
1423*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
1424*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
1425*ec779b8eSAndroid Build Coastguard Worker int32_t inputAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
1426*ec779b8eSAndroid Build Coastguard Worker int32_t riidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_unique_id_t_int32_t(riid));
1427*ec779b8eSAndroid Build Coastguard Worker int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1428*ec779b8eSAndroid Build Coastguard Worker AudioConfigBase configAidl = VALUE_OR_RETURN_STATUS(
1429*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_config_base_t_AudioConfigBase(*config, true /*isInput*/));
1430*ec779b8eSAndroid Build Coastguard Worker int32_t flagsAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
1431*ec779b8eSAndroid Build Coastguard Worker int32_t selectedDeviceIdAidl = VALUE_OR_RETURN_STATUS(
1432*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_handle_t_int32_t(*selectedDeviceId));
1433*ec779b8eSAndroid Build Coastguard Worker
1434*ec779b8eSAndroid Build Coastguard Worker media::GetInputForAttrResponse response;
1435*ec779b8eSAndroid Build Coastguard Worker
1436*ec779b8eSAndroid Build Coastguard Worker const Status res = aps->getInputForAttr(attrAidl, inputAidl, riidAidl, sessionAidl,
1437*ec779b8eSAndroid Build Coastguard Worker attributionSource, configAidl, flagsAidl,
1438*ec779b8eSAndroid Build Coastguard Worker selectedDeviceIdAidl, &response);
1439*ec779b8eSAndroid Build Coastguard Worker if (!res.isOk()) {
1440*ec779b8eSAndroid Build Coastguard Worker ALOGE("getInputForAttr error: %s", res.toString8().c_str());
1441*ec779b8eSAndroid Build Coastguard Worker *config = VALUE_OR_RETURN_STATUS(
1442*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioConfigBase_audio_config_base_t(response.config, true /*isInput*/));
1443*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(res);
1444*ec779b8eSAndroid Build Coastguard Worker }
1445*ec779b8eSAndroid Build Coastguard Worker
1446*ec779b8eSAndroid Build Coastguard Worker *input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(response.input));
1447*ec779b8eSAndroid Build Coastguard Worker *selectedDeviceId = VALUE_OR_RETURN_STATUS(
1448*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_audio_port_handle_t(response.selectedDeviceId));
1449*ec779b8eSAndroid Build Coastguard Worker *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(response.portId));
1450*ec779b8eSAndroid Build Coastguard Worker
1451*ec779b8eSAndroid Build Coastguard Worker return OK;
1452*ec779b8eSAndroid Build Coastguard Worker }
1453*ec779b8eSAndroid Build Coastguard Worker
startInput(audio_port_handle_t portId)1454*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::startInput(audio_port_handle_t portId) {
1455*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1456*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1457*ec779b8eSAndroid Build Coastguard Worker
1458*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1459*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->startInput(portIdAidl));
1460*ec779b8eSAndroid Build Coastguard Worker }
1461*ec779b8eSAndroid Build Coastguard Worker
stopInput(audio_port_handle_t portId)1462*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::stopInput(audio_port_handle_t portId) {
1463*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1464*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1465*ec779b8eSAndroid Build Coastguard Worker
1466*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1467*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->stopInput(portIdAidl));
1468*ec779b8eSAndroid Build Coastguard Worker }
1469*ec779b8eSAndroid Build Coastguard Worker
releaseInput(audio_port_handle_t portId)1470*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::releaseInput(audio_port_handle_t portId) {
1471*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1472*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return;
1473*ec779b8eSAndroid Build Coastguard Worker
1474*ec779b8eSAndroid Build Coastguard Worker auto status = [&]() -> status_t {
1475*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(
1476*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_handle_t_int32_t(portId));
1477*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(aps->releaseInput(portIdAidl)));
1478*ec779b8eSAndroid Build Coastguard Worker return OK;
1479*ec779b8eSAndroid Build Coastguard Worker }();
1480*ec779b8eSAndroid Build Coastguard Worker
1481*ec779b8eSAndroid Build Coastguard Worker // Ignore status.
1482*ec779b8eSAndroid Build Coastguard Worker (void) status;
1483*ec779b8eSAndroid Build Coastguard Worker }
1484*ec779b8eSAndroid Build Coastguard Worker
setDeviceAbsoluteVolumeEnabled(audio_devices_t deviceType,const char * address,bool enabled,audio_stream_type_t streamToDriveAbs)1485*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setDeviceAbsoluteVolumeEnabled(audio_devices_t deviceType,
1486*ec779b8eSAndroid Build Coastguard Worker const char *address,
1487*ec779b8eSAndroid Build Coastguard Worker bool enabled,
1488*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamToDriveAbs) {
1489*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1490*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1491*ec779b8eSAndroid Build Coastguard Worker
1492*ec779b8eSAndroid Build Coastguard Worker AudioDevice deviceAidl = VALUE_OR_RETURN_STATUS(
1493*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_device_AudioDevice(deviceType, address));
1494*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamToDriveAbsAidl = VALUE_OR_RETURN_STATUS(
1495*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(streamToDriveAbs));
1496*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1497*ec779b8eSAndroid Build Coastguard Worker aps->setDeviceAbsoluteVolumeEnabled(deviceAidl, enabled, streamToDriveAbsAidl));
1498*ec779b8eSAndroid Build Coastguard Worker }
1499*ec779b8eSAndroid Build Coastguard Worker
initStreamVolume(audio_stream_type_t stream,int indexMin,int indexMax)1500*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::initStreamVolume(audio_stream_type_t stream,
1501*ec779b8eSAndroid Build Coastguard Worker int indexMin,
1502*ec779b8eSAndroid Build Coastguard Worker int indexMax) {
1503*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1504*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1505*ec779b8eSAndroid Build Coastguard Worker
1506*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1507*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1508*ec779b8eSAndroid Build Coastguard Worker int32_t indexMinAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(indexMin));
1509*ec779b8eSAndroid Build Coastguard Worker int32_t indexMaxAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(indexMax));
1510*ec779b8eSAndroid Build Coastguard Worker status_t status = statusTFromBinderStatus(
1511*ec779b8eSAndroid Build Coastguard Worker aps->initStreamVolume(streamAidl, indexMinAidl, indexMaxAidl));
1512*ec779b8eSAndroid Build Coastguard Worker return status;
1513*ec779b8eSAndroid Build Coastguard Worker }
1514*ec779b8eSAndroid Build Coastguard Worker
setStreamVolumeIndex(audio_stream_type_t stream,int index,bool muted,audio_devices_t device)1515*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream,
1516*ec779b8eSAndroid Build Coastguard Worker int index,
1517*ec779b8eSAndroid Build Coastguard Worker bool muted,
1518*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device) {
1519*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1520*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1521*ec779b8eSAndroid Build Coastguard Worker
1522*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1523*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1524*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(index));
1525*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription deviceAidl = VALUE_OR_RETURN_STATUS(
1526*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
1527*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1528*ec779b8eSAndroid Build Coastguard Worker aps->setStreamVolumeIndex(streamAidl, deviceAidl, indexAidl, muted));
1529*ec779b8eSAndroid Build Coastguard Worker }
1530*ec779b8eSAndroid Build Coastguard Worker
getStreamVolumeIndex(audio_stream_type_t stream,int * index,audio_devices_t device)1531*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream,
1532*ec779b8eSAndroid Build Coastguard Worker int* index,
1533*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device) {
1534*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1535*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1536*ec779b8eSAndroid Build Coastguard Worker
1537*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1538*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1539*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription deviceAidl = VALUE_OR_RETURN_STATUS(
1540*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
1541*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl;
1542*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1543*ec779b8eSAndroid Build Coastguard Worker aps->getStreamVolumeIndex(streamAidl, deviceAidl, &indexAidl)));
1544*ec779b8eSAndroid Build Coastguard Worker if (index != nullptr) {
1545*ec779b8eSAndroid Build Coastguard Worker *index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1546*ec779b8eSAndroid Build Coastguard Worker }
1547*ec779b8eSAndroid Build Coastguard Worker return OK;
1548*ec779b8eSAndroid Build Coastguard Worker }
1549*ec779b8eSAndroid Build Coastguard Worker
setVolumeIndexForAttributes(const audio_attributes_t & attr,int index,bool muted,audio_devices_t device)1550*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setVolumeIndexForAttributes(const audio_attributes_t& attr,
1551*ec779b8eSAndroid Build Coastguard Worker int index,
1552*ec779b8eSAndroid Build Coastguard Worker bool muted,
1553*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device) {
1554*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1555*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1556*ec779b8eSAndroid Build Coastguard Worker
1557*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
1558*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(attr));
1559*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(index));
1560*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription deviceAidl = VALUE_OR_RETURN_STATUS(
1561*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
1562*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1563*ec779b8eSAndroid Build Coastguard Worker aps->setVolumeIndexForAttributes(attrAidl, deviceAidl, indexAidl, muted));
1564*ec779b8eSAndroid Build Coastguard Worker }
1565*ec779b8eSAndroid Build Coastguard Worker
getVolumeIndexForAttributes(const audio_attributes_t & attr,int & index,audio_devices_t device)1566*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getVolumeIndexForAttributes(const audio_attributes_t& attr,
1567*ec779b8eSAndroid Build Coastguard Worker int& index,
1568*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device) {
1569*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1570*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1571*ec779b8eSAndroid Build Coastguard Worker
1572*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
1573*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(attr));
1574*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription deviceAidl = VALUE_OR_RETURN_STATUS(
1575*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
1576*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl;
1577*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1578*ec779b8eSAndroid Build Coastguard Worker aps->getVolumeIndexForAttributes(attrAidl, deviceAidl, &indexAidl)));
1579*ec779b8eSAndroid Build Coastguard Worker index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1580*ec779b8eSAndroid Build Coastguard Worker return OK;
1581*ec779b8eSAndroid Build Coastguard Worker }
1582*ec779b8eSAndroid Build Coastguard Worker
getMaxVolumeIndexForAttributes(const audio_attributes_t & attr,int & index)1583*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMaxVolumeIndexForAttributes(const audio_attributes_t& attr, int& index) {
1584*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1585*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1586*ec779b8eSAndroid Build Coastguard Worker
1587*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
1588*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(attr));
1589*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl;
1590*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1591*ec779b8eSAndroid Build Coastguard Worker aps->getMaxVolumeIndexForAttributes(attrAidl, &indexAidl)));
1592*ec779b8eSAndroid Build Coastguard Worker index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1593*ec779b8eSAndroid Build Coastguard Worker return OK;
1594*ec779b8eSAndroid Build Coastguard Worker }
1595*ec779b8eSAndroid Build Coastguard Worker
getMinVolumeIndexForAttributes(const audio_attributes_t & attr,int & index)1596*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMinVolumeIndexForAttributes(const audio_attributes_t& attr, int& index) {
1597*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1598*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1599*ec779b8eSAndroid Build Coastguard Worker
1600*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
1601*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(attr));
1602*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl;
1603*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1604*ec779b8eSAndroid Build Coastguard Worker aps->getMinVolumeIndexForAttributes(attrAidl, &indexAidl)));
1605*ec779b8eSAndroid Build Coastguard Worker index = VALUE_OR_RETURN_STATUS(convertIntegral<int>(indexAidl));
1606*ec779b8eSAndroid Build Coastguard Worker return OK;
1607*ec779b8eSAndroid Build Coastguard Worker }
1608*ec779b8eSAndroid Build Coastguard Worker
getStrategyForStream(audio_stream_type_t stream)1609*ec779b8eSAndroid Build Coastguard Worker product_strategy_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) {
1610*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1611*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return PRODUCT_STRATEGY_NONE;
1612*ec779b8eSAndroid Build Coastguard Worker
1613*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<product_strategy_t> {
1614*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN(
1615*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1616*ec779b8eSAndroid Build Coastguard Worker int32_t resultAidl;
1617*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(statusTFromBinderStatus(
1618*ec779b8eSAndroid Build Coastguard Worker aps->getStrategyForStream(streamAidl, &resultAidl)));
1619*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_int32_t_product_strategy_t(resultAidl);
1620*ec779b8eSAndroid Build Coastguard Worker }();
1621*ec779b8eSAndroid Build Coastguard Worker return result.value_or(PRODUCT_STRATEGY_NONE);
1622*ec779b8eSAndroid Build Coastguard Worker }
1623*ec779b8eSAndroid Build Coastguard Worker
getDevicesForAttributes(const audio_attributes_t & aa,AudioDeviceTypeAddrVector * devices,bool forVolume)1624*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getDevicesForAttributes(const audio_attributes_t& aa,
1625*ec779b8eSAndroid Build Coastguard Worker AudioDeviceTypeAddrVector* devices,
1626*ec779b8eSAndroid Build Coastguard Worker bool forVolume) {
1627*ec779b8eSAndroid Build Coastguard Worker if (devices == nullptr) {
1628*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1629*ec779b8eSAndroid Build Coastguard Worker }
1630*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1631*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1632*ec779b8eSAndroid Build Coastguard Worker
1633*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes aaAidl = VALUE_OR_RETURN_STATUS(
1634*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(aa));
1635*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> retAidl;
1636*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
1637*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->getDevicesForAttributes(aaAidl, forVolume, &retAidl)));
1638*ec779b8eSAndroid Build Coastguard Worker *devices = VALUE_OR_RETURN_STATUS(
1639*ec779b8eSAndroid Build Coastguard Worker convertContainer<AudioDeviceTypeAddrVector>(
1640*ec779b8eSAndroid Build Coastguard Worker retAidl,
1641*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioDeviceTypeAddress));
1642*ec779b8eSAndroid Build Coastguard Worker return OK;
1643*ec779b8eSAndroid Build Coastguard Worker }
1644*ec779b8eSAndroid Build Coastguard Worker
getOutputForEffect(const effect_descriptor_t * desc)1645*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t* desc) {
1646*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1647*ec779b8eSAndroid Build Coastguard Worker // FIXME change return type to status_t, and return PERMISSION_DENIED here
1648*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AUDIO_IO_HANDLE_NONE;
1649*ec779b8eSAndroid Build Coastguard Worker
1650*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<audio_io_handle_t> {
1651*ec779b8eSAndroid Build Coastguard Worker media::EffectDescriptor descAidl = VALUE_OR_RETURN(
1652*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_effect_descriptor_t_EffectDescriptor(*desc));
1653*ec779b8eSAndroid Build Coastguard Worker int32_t retAidl;
1654*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(
1655*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->getOutputForEffect(descAidl, &retAidl)));
1656*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_int32_t_audio_io_handle_t(retAidl);
1657*ec779b8eSAndroid Build Coastguard Worker }();
1658*ec779b8eSAndroid Build Coastguard Worker
1659*ec779b8eSAndroid Build Coastguard Worker return result.value_or(AUDIO_IO_HANDLE_NONE);
1660*ec779b8eSAndroid Build Coastguard Worker }
1661*ec779b8eSAndroid Build Coastguard Worker
registerEffect(const effect_descriptor_t * desc,audio_io_handle_t io,product_strategy_t strategy,audio_session_t session,int id)1662*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::registerEffect(const effect_descriptor_t* desc,
1663*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t io,
1664*ec779b8eSAndroid Build Coastguard Worker product_strategy_t strategy,
1665*ec779b8eSAndroid Build Coastguard Worker audio_session_t session,
1666*ec779b8eSAndroid Build Coastguard Worker int id) {
1667*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1668*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1669*ec779b8eSAndroid Build Coastguard Worker
1670*ec779b8eSAndroid Build Coastguard Worker media::EffectDescriptor descAidl = VALUE_OR_RETURN_STATUS(
1671*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_effect_descriptor_t_EffectDescriptor(*desc));
1672*ec779b8eSAndroid Build Coastguard Worker int32_t ioAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
1673*ec779b8eSAndroid Build Coastguard Worker int32_t strategyAidl = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_product_strategy_t(strategy));
1674*ec779b8eSAndroid Build Coastguard Worker int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
1675*ec779b8eSAndroid Build Coastguard Worker int32_t idAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(id));
1676*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1677*ec779b8eSAndroid Build Coastguard Worker aps->registerEffect(descAidl, ioAidl, strategyAidl, sessionAidl, idAidl));
1678*ec779b8eSAndroid Build Coastguard Worker }
1679*ec779b8eSAndroid Build Coastguard Worker
unregisterEffect(int id)1680*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::unregisterEffect(int id) {
1681*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1682*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1683*ec779b8eSAndroid Build Coastguard Worker
1684*ec779b8eSAndroid Build Coastguard Worker int32_t idAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(id));
1685*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1686*ec779b8eSAndroid Build Coastguard Worker aps->unregisterEffect(idAidl));
1687*ec779b8eSAndroid Build Coastguard Worker }
1688*ec779b8eSAndroid Build Coastguard Worker
setEffectEnabled(int id,bool enabled)1689*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setEffectEnabled(int id, bool enabled) {
1690*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1691*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1692*ec779b8eSAndroid Build Coastguard Worker
1693*ec779b8eSAndroid Build Coastguard Worker int32_t idAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(id));
1694*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
1695*ec779b8eSAndroid Build Coastguard Worker aps->setEffectEnabled(idAidl, enabled));
1696*ec779b8eSAndroid Build Coastguard Worker }
1697*ec779b8eSAndroid Build Coastguard Worker
moveEffectsToIo(const std::vector<int> & ids,audio_io_handle_t io)1698*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) {
1699*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1700*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1701*ec779b8eSAndroid Build Coastguard Worker
1702*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> idsAidl = VALUE_OR_RETURN_STATUS(
1703*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<int32_t>>(ids, convertReinterpret<int32_t, int>));
1704*ec779b8eSAndroid Build Coastguard Worker int32_t ioAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
1705*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->moveEffectsToIo(idsAidl, ioAidl));
1706*ec779b8eSAndroid Build Coastguard Worker }
1707*ec779b8eSAndroid Build Coastguard Worker
isStreamActive(audio_stream_type_t stream,bool * state,uint32_t inPastMs)1708*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs) {
1709*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1710*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1711*ec779b8eSAndroid Build Coastguard Worker if (state == NULL) return BAD_VALUE;
1712*ec779b8eSAndroid Build Coastguard Worker
1713*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1714*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1715*ec779b8eSAndroid Build Coastguard Worker int32_t inPastMsAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(inPastMs));
1716*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1717*ec779b8eSAndroid Build Coastguard Worker aps->isStreamActive(streamAidl, inPastMsAidl, state)));
1718*ec779b8eSAndroid Build Coastguard Worker return OK;
1719*ec779b8eSAndroid Build Coastguard Worker }
1720*ec779b8eSAndroid Build Coastguard Worker
isStreamActiveRemotely(audio_stream_type_t stream,bool * state,uint32_t inPastMs)1721*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state,
1722*ec779b8eSAndroid Build Coastguard Worker uint32_t inPastMs) {
1723*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1724*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1725*ec779b8eSAndroid Build Coastguard Worker if (state == NULL) return BAD_VALUE;
1726*ec779b8eSAndroid Build Coastguard Worker
1727*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
1728*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
1729*ec779b8eSAndroid Build Coastguard Worker int32_t inPastMsAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(inPastMs));
1730*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1731*ec779b8eSAndroid Build Coastguard Worker aps->isStreamActiveRemotely(streamAidl, inPastMsAidl, state)));
1732*ec779b8eSAndroid Build Coastguard Worker return OK;
1733*ec779b8eSAndroid Build Coastguard Worker }
1734*ec779b8eSAndroid Build Coastguard Worker
isSourceActive(audio_source_t stream,bool * state)1735*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::isSourceActive(audio_source_t stream, bool* state) {
1736*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1737*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1738*ec779b8eSAndroid Build Coastguard Worker if (state == NULL) return BAD_VALUE;
1739*ec779b8eSAndroid Build Coastguard Worker
1740*ec779b8eSAndroid Build Coastguard Worker AudioSource streamAidl = VALUE_OR_RETURN_STATUS(
1741*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_source_t_AudioSource(stream));
1742*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1743*ec779b8eSAndroid Build Coastguard Worker aps->isSourceActive(streamAidl, state)));
1744*ec779b8eSAndroid Build Coastguard Worker return OK;
1745*ec779b8eSAndroid Build Coastguard Worker }
1746*ec779b8eSAndroid Build Coastguard Worker
getPrimaryOutputSamplingRate()1747*ec779b8eSAndroid Build Coastguard Worker uint32_t AudioSystem::getPrimaryOutputSamplingRate() {
1748*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
1749*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return 0;
1750*ec779b8eSAndroid Build Coastguard Worker return af->getPrimaryOutputSamplingRate();
1751*ec779b8eSAndroid Build Coastguard Worker }
1752*ec779b8eSAndroid Build Coastguard Worker
getPrimaryOutputFrameCount()1753*ec779b8eSAndroid Build Coastguard Worker size_t AudioSystem::getPrimaryOutputFrameCount() {
1754*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
1755*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return 0;
1756*ec779b8eSAndroid Build Coastguard Worker return af->getPrimaryOutputFrameCount();
1757*ec779b8eSAndroid Build Coastguard Worker }
1758*ec779b8eSAndroid Build Coastguard Worker
setLowRamDevice(bool isLowRamDevice,int64_t totalMemory)1759*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) {
1760*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
1761*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
1762*ec779b8eSAndroid Build Coastguard Worker return af->setLowRamDevice(isLowRamDevice, totalMemory);
1763*ec779b8eSAndroid Build Coastguard Worker }
1764*ec779b8eSAndroid Build Coastguard Worker
setSupportedSystemUsages(const std::vector<audio_usage_t> & systemUsages)1765*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setSupportedSystemUsages(const std::vector<audio_usage_t>& systemUsages) {
1766*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1767*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1768*ec779b8eSAndroid Build Coastguard Worker
1769*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioUsage> systemUsagesAidl = VALUE_OR_RETURN_STATUS(
1770*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioUsage>>(systemUsages,
1771*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_usage_t_AudioUsage));
1772*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setSupportedSystemUsages(systemUsagesAidl));
1773*ec779b8eSAndroid Build Coastguard Worker }
1774*ec779b8eSAndroid Build Coastguard Worker
setAllowedCapturePolicy(uid_t uid,audio_flags_mask_t capturePolicy)1775*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
1776*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1777*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1778*ec779b8eSAndroid Build Coastguard Worker
1779*ec779b8eSAndroid Build Coastguard Worker int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
1780*ec779b8eSAndroid Build Coastguard Worker int32_t capturePolicyAidl = VALUE_OR_RETURN_STATUS(
1781*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_flags_mask_t_int32_t_mask(capturePolicy));
1782*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setAllowedCapturePolicy(uidAidl, capturePolicyAidl));
1783*ec779b8eSAndroid Build Coastguard Worker }
1784*ec779b8eSAndroid Build Coastguard Worker
getOffloadSupport(const audio_offload_info_t & info)1785*ec779b8eSAndroid Build Coastguard Worker audio_offload_mode_t AudioSystem::getOffloadSupport(const audio_offload_info_t& info) {
1786*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s", __func__);
1787*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1788*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AUDIO_OFFLOAD_NOT_SUPPORTED;
1789*ec779b8eSAndroid Build Coastguard Worker
1790*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<audio_offload_mode_t> {
1791*ec779b8eSAndroid Build Coastguard Worker AudioOffloadInfo infoAidl = VALUE_OR_RETURN(
1792*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_offload_info_t_AudioOffloadInfo(info));
1793*ec779b8eSAndroid Build Coastguard Worker media::AudioOffloadMode retAidl;
1794*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(
1795*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->getOffloadSupport(infoAidl, &retAidl)));
1796*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_AudioOffloadMode_audio_offload_mode_t(retAidl);
1797*ec779b8eSAndroid Build Coastguard Worker }();
1798*ec779b8eSAndroid Build Coastguard Worker
1799*ec779b8eSAndroid Build Coastguard Worker return result.value_or(static_cast<audio_offload_mode_t>(0));
1800*ec779b8eSAndroid Build Coastguard Worker }
1801*ec779b8eSAndroid Build Coastguard Worker
listAudioPorts(audio_port_role_t role,audio_port_type_t type,unsigned int * num_ports,struct audio_port_v7 * ports,unsigned int * generation)1802*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::listAudioPorts(audio_port_role_t role,
1803*ec779b8eSAndroid Build Coastguard Worker audio_port_type_t type,
1804*ec779b8eSAndroid Build Coastguard Worker unsigned int* num_ports,
1805*ec779b8eSAndroid Build Coastguard Worker struct audio_port_v7* ports,
1806*ec779b8eSAndroid Build Coastguard Worker unsigned int* generation) {
1807*ec779b8eSAndroid Build Coastguard Worker if (num_ports == nullptr || (*num_ports != 0 && ports == nullptr) ||
1808*ec779b8eSAndroid Build Coastguard Worker generation == nullptr) {
1809*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1810*ec779b8eSAndroid Build Coastguard Worker }
1811*ec779b8eSAndroid Build Coastguard Worker
1812*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1813*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1814*ec779b8eSAndroid Build Coastguard Worker
1815*ec779b8eSAndroid Build Coastguard Worker media::AudioPortRole roleAidl = VALUE_OR_RETURN_STATUS(
1816*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_role_t_AudioPortRole(role));
1817*ec779b8eSAndroid Build Coastguard Worker media::AudioPortType typeAidl = VALUE_OR_RETURN_STATUS(
1818*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_type_t_AudioPortType(type));
1819*ec779b8eSAndroid Build Coastguard Worker Int numPortsAidl;
1820*ec779b8eSAndroid Build Coastguard Worker numPortsAidl.value = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*num_ports));
1821*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioPortFw> portsAidl;
1822*ec779b8eSAndroid Build Coastguard Worker int32_t generationAidl;
1823*ec779b8eSAndroid Build Coastguard Worker
1824*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1825*ec779b8eSAndroid Build Coastguard Worker aps->listAudioPorts(roleAidl, typeAidl, &numPortsAidl, &portsAidl, &generationAidl)));
1826*ec779b8eSAndroid Build Coastguard Worker *num_ports = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(numPortsAidl.value));
1827*ec779b8eSAndroid Build Coastguard Worker *generation = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(generationAidl));
1828*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(convertRange(portsAidl.begin(), portsAidl.end(), ports,
1829*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPortFw_audio_port_v7));
1830*ec779b8eSAndroid Build Coastguard Worker return OK;
1831*ec779b8eSAndroid Build Coastguard Worker }
1832*ec779b8eSAndroid Build Coastguard Worker
listDeclaredDevicePorts(media::AudioPortRole role,std::vector<media::AudioPortFw> * result)1833*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::listDeclaredDevicePorts(media::AudioPortRole role,
1834*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioPortFw>* result) {
1835*ec779b8eSAndroid Build Coastguard Worker if (result == nullptr) return BAD_VALUE;
1836*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1837*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1838*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(aps->listDeclaredDevicePorts(role, result)));
1839*ec779b8eSAndroid Build Coastguard Worker return OK;
1840*ec779b8eSAndroid Build Coastguard Worker }
1841*ec779b8eSAndroid Build Coastguard Worker
getAudioPort(struct audio_port_v7 * port)1842*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getAudioPort(struct audio_port_v7* port) {
1843*ec779b8eSAndroid Build Coastguard Worker if (port == nullptr) {
1844*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1845*ec779b8eSAndroid Build Coastguard Worker }
1846*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1847*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1848*ec779b8eSAndroid Build Coastguard Worker
1849*ec779b8eSAndroid Build Coastguard Worker media::AudioPortFw portAidl;
1850*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
1851*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->getAudioPort(port->id, &portAidl)));
1852*ec779b8eSAndroid Build Coastguard Worker *port = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioPortFw_audio_port_v7(portAidl));
1853*ec779b8eSAndroid Build Coastguard Worker return OK;
1854*ec779b8eSAndroid Build Coastguard Worker }
1855*ec779b8eSAndroid Build Coastguard Worker
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle)1856*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::createAudioPatch(const struct audio_patch* patch,
1857*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t* handle) {
1858*ec779b8eSAndroid Build Coastguard Worker if (patch == nullptr || handle == nullptr) {
1859*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1860*ec779b8eSAndroid Build Coastguard Worker }
1861*ec779b8eSAndroid Build Coastguard Worker
1862*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1863*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1864*ec779b8eSAndroid Build Coastguard Worker
1865*ec779b8eSAndroid Build Coastguard Worker media::AudioPatchFw patchAidl = VALUE_OR_RETURN_STATUS(
1866*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_patch_AudioPatchFw(*patch));
1867*ec779b8eSAndroid Build Coastguard Worker int32_t handleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(*handle));
1868*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
1869*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->createAudioPatch(patchAidl, handleAidl, &handleAidl)));
1870*ec779b8eSAndroid Build Coastguard Worker *handle = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
1871*ec779b8eSAndroid Build Coastguard Worker return OK;
1872*ec779b8eSAndroid Build Coastguard Worker }
1873*ec779b8eSAndroid Build Coastguard Worker
releaseAudioPatch(audio_patch_handle_t handle)1874*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle) {
1875*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1876*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1877*ec779b8eSAndroid Build Coastguard Worker
1878*ec779b8eSAndroid Build Coastguard Worker int32_t handleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1879*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->releaseAudioPatch(handleAidl));
1880*ec779b8eSAndroid Build Coastguard Worker }
1881*ec779b8eSAndroid Build Coastguard Worker
listAudioPatches(unsigned int * num_patches,struct audio_patch * patches,unsigned int * generation)1882*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::listAudioPatches(unsigned int* num_patches,
1883*ec779b8eSAndroid Build Coastguard Worker struct audio_patch* patches,
1884*ec779b8eSAndroid Build Coastguard Worker unsigned int* generation) {
1885*ec779b8eSAndroid Build Coastguard Worker if (num_patches == nullptr || (*num_patches != 0 && patches == nullptr) ||
1886*ec779b8eSAndroid Build Coastguard Worker generation == nullptr) {
1887*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1888*ec779b8eSAndroid Build Coastguard Worker }
1889*ec779b8eSAndroid Build Coastguard Worker
1890*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1891*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1892*ec779b8eSAndroid Build Coastguard Worker
1893*ec779b8eSAndroid Build Coastguard Worker
1894*ec779b8eSAndroid Build Coastguard Worker Int numPatchesAidl;
1895*ec779b8eSAndroid Build Coastguard Worker numPatchesAidl.value = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*num_patches));
1896*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioPatchFw> patchesAidl;
1897*ec779b8eSAndroid Build Coastguard Worker int32_t generationAidl;
1898*ec779b8eSAndroid Build Coastguard Worker
1899*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
1900*ec779b8eSAndroid Build Coastguard Worker aps->listAudioPatches(&numPatchesAidl, &patchesAidl, &generationAidl)));
1901*ec779b8eSAndroid Build Coastguard Worker *num_patches = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(numPatchesAidl.value));
1902*ec779b8eSAndroid Build Coastguard Worker *generation = VALUE_OR_RETURN_STATUS(convertIntegral<unsigned int>(generationAidl));
1903*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(convertRange(patchesAidl.begin(), patchesAidl.end(), patches,
1904*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPatchFw_audio_patch));
1905*ec779b8eSAndroid Build Coastguard Worker return OK;
1906*ec779b8eSAndroid Build Coastguard Worker }
1907*ec779b8eSAndroid Build Coastguard Worker
setAudioPortConfig(const struct audio_port_config * config)1908*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setAudioPortConfig(const struct audio_port_config* config) {
1909*ec779b8eSAndroid Build Coastguard Worker if (config == nullptr) {
1910*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
1911*ec779b8eSAndroid Build Coastguard Worker }
1912*ec779b8eSAndroid Build Coastguard Worker
1913*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1914*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1915*ec779b8eSAndroid Build Coastguard Worker
1916*ec779b8eSAndroid Build Coastguard Worker media::AudioPortConfigFw configAidl = VALUE_OR_RETURN_STATUS(
1917*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_config_AudioPortConfigFw(*config));
1918*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setAudioPortConfig(configAidl));
1919*ec779b8eSAndroid Build Coastguard Worker }
1920*ec779b8eSAndroid Build Coastguard Worker
addAudioPortCallback(const sp<AudioPortCallback> & callback)1921*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callback) {
1922*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1923*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1924*ec779b8eSAndroid Build Coastguard Worker const auto apc = getAudioPolicyClient();
1925*ec779b8eSAndroid Build Coastguard Worker if (apc == nullptr) return NO_INIT;
1926*ec779b8eSAndroid Build Coastguard Worker
1927*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gApsCallbackMutex);
1928*ec779b8eSAndroid Build Coastguard Worker const int ret = apc->addAudioPortCallback(callback);
1929*ec779b8eSAndroid Build Coastguard Worker if (ret == 1) {
1930*ec779b8eSAndroid Build Coastguard Worker aps->setAudioPortCallbacksEnabled(true);
1931*ec779b8eSAndroid Build Coastguard Worker }
1932*ec779b8eSAndroid Build Coastguard Worker return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1933*ec779b8eSAndroid Build Coastguard Worker }
1934*ec779b8eSAndroid Build Coastguard Worker
1935*ec779b8eSAndroid Build Coastguard Worker /*static*/
removeAudioPortCallback(const sp<AudioPortCallback> & callback)1936*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callback) {
1937*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1938*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1939*ec779b8eSAndroid Build Coastguard Worker const auto apc = AudioSystem::getAudioPolicyClient();
1940*ec779b8eSAndroid Build Coastguard Worker if (apc == nullptr) return NO_INIT;
1941*ec779b8eSAndroid Build Coastguard Worker
1942*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gApsCallbackMutex);
1943*ec779b8eSAndroid Build Coastguard Worker const int ret = apc->removeAudioPortCallback(callback);
1944*ec779b8eSAndroid Build Coastguard Worker if (ret == 0) {
1945*ec779b8eSAndroid Build Coastguard Worker aps->setAudioPortCallbacksEnabled(false);
1946*ec779b8eSAndroid Build Coastguard Worker }
1947*ec779b8eSAndroid Build Coastguard Worker return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1948*ec779b8eSAndroid Build Coastguard Worker }
1949*ec779b8eSAndroid Build Coastguard Worker
addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1950*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback) {
1951*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1952*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1953*ec779b8eSAndroid Build Coastguard Worker const auto apc = AudioSystem::getAudioPolicyClient();
1954*ec779b8eSAndroid Build Coastguard Worker if (apc == nullptr) return NO_INIT;
1955*ec779b8eSAndroid Build Coastguard Worker
1956*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gApsCallbackMutex);
1957*ec779b8eSAndroid Build Coastguard Worker const int ret = apc->addAudioVolumeGroupCallback(callback);
1958*ec779b8eSAndroid Build Coastguard Worker if (ret == 1) {
1959*ec779b8eSAndroid Build Coastguard Worker aps->setAudioVolumeGroupCallbacksEnabled(true);
1960*ec779b8eSAndroid Build Coastguard Worker }
1961*ec779b8eSAndroid Build Coastguard Worker return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1962*ec779b8eSAndroid Build Coastguard Worker }
1963*ec779b8eSAndroid Build Coastguard Worker
removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)1964*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback) {
1965*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
1966*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
1967*ec779b8eSAndroid Build Coastguard Worker const auto apc = AudioSystem::getAudioPolicyClient();
1968*ec779b8eSAndroid Build Coastguard Worker if (apc == nullptr) return NO_INIT;
1969*ec779b8eSAndroid Build Coastguard Worker
1970*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(gApsCallbackMutex);
1971*ec779b8eSAndroid Build Coastguard Worker const int ret = apc->removeAudioVolumeGroupCallback(callback);
1972*ec779b8eSAndroid Build Coastguard Worker if (ret == 0) {
1973*ec779b8eSAndroid Build Coastguard Worker aps->setAudioVolumeGroupCallbacksEnabled(false);
1974*ec779b8eSAndroid Build Coastguard Worker }
1975*ec779b8eSAndroid Build Coastguard Worker return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
1976*ec779b8eSAndroid Build Coastguard Worker }
1977*ec779b8eSAndroid Build Coastguard Worker
addAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)1978*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::addAudioDeviceCallback(
1979*ec779b8eSAndroid Build Coastguard Worker const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
1980*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId) {
1981*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlingerClient> afc = getAudioFlingerClient();
1982*ec779b8eSAndroid Build Coastguard Worker if (afc == 0) {
1983*ec779b8eSAndroid Build Coastguard Worker return NO_INIT;
1984*ec779b8eSAndroid Build Coastguard Worker }
1985*ec779b8eSAndroid Build Coastguard Worker status_t status = afc->addAudioDeviceCallback(callback, audioIo, portId);
1986*ec779b8eSAndroid Build Coastguard Worker if (status == NO_ERROR) {
1987*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
1988*ec779b8eSAndroid Build Coastguard Worker if (af != 0) {
1989*ec779b8eSAndroid Build Coastguard Worker af->registerClient(afc);
1990*ec779b8eSAndroid Build Coastguard Worker }
1991*ec779b8eSAndroid Build Coastguard Worker }
1992*ec779b8eSAndroid Build Coastguard Worker return status;
1993*ec779b8eSAndroid Build Coastguard Worker }
1994*ec779b8eSAndroid Build Coastguard Worker
removeAudioDeviceCallback(const wp<AudioDeviceCallback> & callback,audio_io_handle_t audioIo,audio_port_handle_t portId)1995*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeAudioDeviceCallback(
1996*ec779b8eSAndroid Build Coastguard Worker const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo,
1997*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId) {
1998*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlingerClient> afc = getAudioFlingerClient();
1999*ec779b8eSAndroid Build Coastguard Worker if (afc == 0) {
2000*ec779b8eSAndroid Build Coastguard Worker return NO_INIT;
2001*ec779b8eSAndroid Build Coastguard Worker }
2002*ec779b8eSAndroid Build Coastguard Worker return afc->removeAudioDeviceCallback(callback, audioIo, portId);
2003*ec779b8eSAndroid Build Coastguard Worker }
2004*ec779b8eSAndroid Build Coastguard Worker
addSupportedLatencyModesCallback(const sp<SupportedLatencyModesCallback> & callback)2005*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::addSupportedLatencyModesCallback(
2006*ec779b8eSAndroid Build Coastguard Worker const sp<SupportedLatencyModesCallback>& callback) {
2007*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlingerClient> afc = getAudioFlingerClient();
2008*ec779b8eSAndroid Build Coastguard Worker if (afc == 0) {
2009*ec779b8eSAndroid Build Coastguard Worker return NO_INIT;
2010*ec779b8eSAndroid Build Coastguard Worker }
2011*ec779b8eSAndroid Build Coastguard Worker return afc->addSupportedLatencyModesCallback(callback);
2012*ec779b8eSAndroid Build Coastguard Worker }
2013*ec779b8eSAndroid Build Coastguard Worker
removeSupportedLatencyModesCallback(const sp<SupportedLatencyModesCallback> & callback)2014*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeSupportedLatencyModesCallback(
2015*ec779b8eSAndroid Build Coastguard Worker const sp<SupportedLatencyModesCallback>& callback) {
2016*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlingerClient> afc = getAudioFlingerClient();
2017*ec779b8eSAndroid Build Coastguard Worker if (afc == 0) {
2018*ec779b8eSAndroid Build Coastguard Worker return NO_INIT;
2019*ec779b8eSAndroid Build Coastguard Worker }
2020*ec779b8eSAndroid Build Coastguard Worker return afc->removeSupportedLatencyModesCallback(callback);
2021*ec779b8eSAndroid Build Coastguard Worker }
2022*ec779b8eSAndroid Build Coastguard Worker
getDeviceIdsForIo(audio_io_handle_t audioIo,DeviceIdVector & deviceIds)2023*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getDeviceIdsForIo(audio_io_handle_t audioIo, DeviceIdVector& deviceIds) {
2024*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2025*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2026*ec779b8eSAndroid Build Coastguard Worker const sp<AudioIoDescriptor> desc = getIoDescriptor(audioIo);
2027*ec779b8eSAndroid Build Coastguard Worker if (desc == 0) {
2028*ec779b8eSAndroid Build Coastguard Worker deviceIds.clear();
2029*ec779b8eSAndroid Build Coastguard Worker } else {
2030*ec779b8eSAndroid Build Coastguard Worker deviceIds = desc->getDeviceIds();
2031*ec779b8eSAndroid Build Coastguard Worker }
2032*ec779b8eSAndroid Build Coastguard Worker return OK;
2033*ec779b8eSAndroid Build Coastguard Worker }
2034*ec779b8eSAndroid Build Coastguard Worker
acquireSoundTriggerSession(audio_session_t * session,audio_io_handle_t * ioHandle,audio_devices_t * device)2035*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::acquireSoundTriggerSession(audio_session_t* session,
2036*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t* ioHandle,
2037*ec779b8eSAndroid Build Coastguard Worker audio_devices_t* device) {
2038*ec779b8eSAndroid Build Coastguard Worker if (session == nullptr || ioHandle == nullptr || device == nullptr) {
2039*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2040*ec779b8eSAndroid Build Coastguard Worker }
2041*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2042*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2043*ec779b8eSAndroid Build Coastguard Worker
2044*ec779b8eSAndroid Build Coastguard Worker media::SoundTriggerSession retAidl;
2045*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
2046*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->acquireSoundTriggerSession(&retAidl)));
2047*ec779b8eSAndroid Build Coastguard Worker *session = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_session_t(retAidl.session));
2048*ec779b8eSAndroid Build Coastguard Worker *ioHandle = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(retAidl.ioHandle));
2049*ec779b8eSAndroid Build Coastguard Worker *device = VALUE_OR_RETURN_STATUS(
2050*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioDeviceDescription_audio_devices_t(retAidl.device));
2051*ec779b8eSAndroid Build Coastguard Worker return OK;
2052*ec779b8eSAndroid Build Coastguard Worker }
2053*ec779b8eSAndroid Build Coastguard Worker
releaseSoundTriggerSession(audio_session_t session)2054*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session) {
2055*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2056*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2057*ec779b8eSAndroid Build Coastguard Worker
2058*ec779b8eSAndroid Build Coastguard Worker int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
2059*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->releaseSoundTriggerSession(sessionAidl));
2060*ec779b8eSAndroid Build Coastguard Worker }
2061*ec779b8eSAndroid Build Coastguard Worker
getPhoneState()2062*ec779b8eSAndroid Build Coastguard Worker audio_mode_t AudioSystem::getPhoneState() {
2063*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2064*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AUDIO_MODE_INVALID;
2065*ec779b8eSAndroid Build Coastguard Worker
2066*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<audio_mode_t> {
2067*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioMode retAidl;
2068*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(statusTFromBinderStatus(aps->getPhoneState(&retAidl)));
2069*ec779b8eSAndroid Build Coastguard Worker return aidl2legacy_AudioMode_audio_mode_t(retAidl);
2070*ec779b8eSAndroid Build Coastguard Worker }();
2071*ec779b8eSAndroid Build Coastguard Worker
2072*ec779b8eSAndroid Build Coastguard Worker return result.value_or(AUDIO_MODE_INVALID);
2073*ec779b8eSAndroid Build Coastguard Worker }
2074*ec779b8eSAndroid Build Coastguard Worker
registerPolicyMixes(const Vector<AudioMix> & mixes,bool registration)2075*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) {
2076*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2077*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2078*ec779b8eSAndroid Build Coastguard Worker
2079*ec779b8eSAndroid Build Coastguard Worker size_t mixesSize = std::min(mixes.size(), size_t{MAX_MIXES_PER_POLICY});
2080*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioMix> mixesAidl;
2081*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
2082*ec779b8eSAndroid Build Coastguard Worker convertRange(mixes.begin(), mixes.begin() + mixesSize, std::back_inserter(mixesAidl),
2083*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioMix));
2084*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->registerPolicyMixes(mixesAidl, registration));
2085*ec779b8eSAndroid Build Coastguard Worker }
2086*ec779b8eSAndroid Build Coastguard Worker
getRegisteredPolicyMixes(std::vector<AudioMix> & mixes)2087*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getRegisteredPolicyMixes(std::vector<AudioMix>& mixes) {
2088*ec779b8eSAndroid Build Coastguard Worker if (!audio_flags::audio_mix_test_api()) {
2089*ec779b8eSAndroid Build Coastguard Worker return INVALID_OPERATION;
2090*ec779b8eSAndroid Build Coastguard Worker }
2091*ec779b8eSAndroid Build Coastguard Worker
2092*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = AudioSystem::get_audio_policy_service();
2093*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2094*ec779b8eSAndroid Build Coastguard Worker
2095*ec779b8eSAndroid Build Coastguard Worker std::vector<::android::media::AudioMix> aidlMixes;
2096*ec779b8eSAndroid Build Coastguard Worker Status status = aps->getRegisteredPolicyMixes(&aidlMixes);
2097*ec779b8eSAndroid Build Coastguard Worker
2098*ec779b8eSAndroid Build Coastguard Worker for (const auto& aidlMix : aidlMixes) {
2099*ec779b8eSAndroid Build Coastguard Worker AudioMix mix = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioMix(aidlMix));
2100*ec779b8eSAndroid Build Coastguard Worker mixes.push_back(mix);
2101*ec779b8eSAndroid Build Coastguard Worker }
2102*ec779b8eSAndroid Build Coastguard Worker
2103*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(status);
2104*ec779b8eSAndroid Build Coastguard Worker }
2105*ec779b8eSAndroid Build Coastguard Worker
updatePolicyMixes(const std::vector<std::pair<AudioMix,std::vector<AudioMixMatchCriterion>>> & mixesWithUpdates)2106*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::updatePolicyMixes(
2107*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::pair<AudioMix, std::vector<AudioMixMatchCriterion>>>&
2108*ec779b8eSAndroid Build Coastguard Worker mixesWithUpdates) {
2109*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2110*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2111*ec779b8eSAndroid Build Coastguard Worker
2112*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioMixUpdate> updatesAidl;
2113*ec779b8eSAndroid Build Coastguard Worker updatesAidl.reserve(mixesWithUpdates.size());
2114*ec779b8eSAndroid Build Coastguard Worker
2115*ec779b8eSAndroid Build Coastguard Worker for (const auto& update : mixesWithUpdates) {
2116*ec779b8eSAndroid Build Coastguard Worker media::AudioMixUpdate updateAidl;
2117*ec779b8eSAndroid Build Coastguard Worker updateAidl.audioMix = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioMix(update.first));
2118*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(convertRange(update.second.begin(), update.second.end(),
2119*ec779b8eSAndroid Build Coastguard Worker std::back_inserter(updateAidl.newCriteria),
2120*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioMixMatchCriterion));
2121*ec779b8eSAndroid Build Coastguard Worker updatesAidl.emplace_back(updateAidl);
2122*ec779b8eSAndroid Build Coastguard Worker }
2123*ec779b8eSAndroid Build Coastguard Worker
2124*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->updatePolicyMixes(updatesAidl));
2125*ec779b8eSAndroid Build Coastguard Worker }
2126*ec779b8eSAndroid Build Coastguard Worker
setUidDeviceAffinities(uid_t uid,const AudioDeviceTypeAddrVector & devices)2127*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setUidDeviceAffinities(uid_t uid, const AudioDeviceTypeAddrVector& devices) {
2128*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2129*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2130*ec779b8eSAndroid Build Coastguard Worker
2131*ec779b8eSAndroid Build Coastguard Worker int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
2132*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2133*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2134*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2135*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setUidDeviceAffinities(uidAidl, devicesAidl));
2136*ec779b8eSAndroid Build Coastguard Worker }
2137*ec779b8eSAndroid Build Coastguard Worker
removeUidDeviceAffinities(uid_t uid)2138*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeUidDeviceAffinities(uid_t uid) {
2139*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2140*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2141*ec779b8eSAndroid Build Coastguard Worker
2142*ec779b8eSAndroid Build Coastguard Worker int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
2143*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->removeUidDeviceAffinities(uidAidl));
2144*ec779b8eSAndroid Build Coastguard Worker }
2145*ec779b8eSAndroid Build Coastguard Worker
setUserIdDeviceAffinities(int userId,const AudioDeviceTypeAddrVector & devices)2146*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setUserIdDeviceAffinities(int userId,
2147*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddrVector& devices) {
2148*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2149*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2150*ec779b8eSAndroid Build Coastguard Worker
2151*ec779b8eSAndroid Build Coastguard Worker int32_t userIdAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(userId));
2152*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2153*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2154*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2155*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2156*ec779b8eSAndroid Build Coastguard Worker aps->setUserIdDeviceAffinities(userIdAidl, devicesAidl));
2157*ec779b8eSAndroid Build Coastguard Worker }
2158*ec779b8eSAndroid Build Coastguard Worker
removeUserIdDeviceAffinities(int userId)2159*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeUserIdDeviceAffinities(int userId) {
2160*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2161*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2162*ec779b8eSAndroid Build Coastguard Worker int32_t userIdAidl = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(userId));
2163*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->removeUserIdDeviceAffinities(userIdAidl));
2164*ec779b8eSAndroid Build Coastguard Worker }
2165*ec779b8eSAndroid Build Coastguard Worker
startAudioSource(const struct audio_port_config * source,const audio_attributes_t * attributes,audio_port_handle_t * portId)2166*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::startAudioSource(const struct audio_port_config* source,
2167*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t* attributes,
2168*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t* portId) {
2169*ec779b8eSAndroid Build Coastguard Worker if (source == nullptr || attributes == nullptr || portId == nullptr) {
2170*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2171*ec779b8eSAndroid Build Coastguard Worker }
2172*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2173*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2174*ec779b8eSAndroid Build Coastguard Worker
2175*ec779b8eSAndroid Build Coastguard Worker media::AudioPortConfigFw sourceAidl = VALUE_OR_RETURN_STATUS(
2176*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_config_AudioPortConfigFw(*source));
2177*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attributesAidl = VALUE_OR_RETURN_STATUS(
2178*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attributes));
2179*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl;
2180*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2181*ec779b8eSAndroid Build Coastguard Worker aps->startAudioSource(sourceAidl, attributesAidl, &portIdAidl)));
2182*ec779b8eSAndroid Build Coastguard Worker *portId = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2183*ec779b8eSAndroid Build Coastguard Worker return OK;
2184*ec779b8eSAndroid Build Coastguard Worker }
2185*ec779b8eSAndroid Build Coastguard Worker
stopAudioSource(audio_port_handle_t portId)2186*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::stopAudioSource(audio_port_handle_t portId) {
2187*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2188*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2189*ec779b8eSAndroid Build Coastguard Worker
2190*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2191*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->stopAudioSource(portIdAidl));
2192*ec779b8eSAndroid Build Coastguard Worker }
2193*ec779b8eSAndroid Build Coastguard Worker
setMasterMono(bool mono)2194*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setMasterMono(bool mono) {
2195*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2196*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2197*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setMasterMono(mono));
2198*ec779b8eSAndroid Build Coastguard Worker }
2199*ec779b8eSAndroid Build Coastguard Worker
getMasterMono(bool * mono)2200*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMasterMono(bool* mono) {
2201*ec779b8eSAndroid Build Coastguard Worker if (mono == nullptr) {
2202*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2203*ec779b8eSAndroid Build Coastguard Worker }
2204*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2205*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2206*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->getMasterMono(mono));
2207*ec779b8eSAndroid Build Coastguard Worker }
2208*ec779b8eSAndroid Build Coastguard Worker
setMasterBalance(float balance)2209*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setMasterBalance(float balance) {
2210*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2211*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2212*ec779b8eSAndroid Build Coastguard Worker return af->setMasterBalance(balance);
2213*ec779b8eSAndroid Build Coastguard Worker }
2214*ec779b8eSAndroid Build Coastguard Worker
getMasterBalance(float * balance)2215*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMasterBalance(float* balance) {
2216*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2217*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2218*ec779b8eSAndroid Build Coastguard Worker return af->getMasterBalance(balance);
2219*ec779b8eSAndroid Build Coastguard Worker }
2220*ec779b8eSAndroid Build Coastguard Worker
2221*ec779b8eSAndroid Build Coastguard Worker float
getStreamVolumeDB(audio_stream_type_t stream,int index,audio_devices_t device)2222*ec779b8eSAndroid Build Coastguard Worker AudioSystem::getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device) {
2223*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2224*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return NAN;
2225*ec779b8eSAndroid Build Coastguard Worker
2226*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<float> {
2227*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamAidl = VALUE_OR_RETURN(
2228*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
2229*ec779b8eSAndroid Build Coastguard Worker int32_t indexAidl = VALUE_OR_RETURN(convertIntegral<int32_t>(index));
2230*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription deviceAidl = VALUE_OR_RETURN(
2231*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
2232*ec779b8eSAndroid Build Coastguard Worker float retAidl;
2233*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(statusTFromBinderStatus(
2234*ec779b8eSAndroid Build Coastguard Worker aps->getStreamVolumeDB(streamAidl, indexAidl, deviceAidl, &retAidl)));
2235*ec779b8eSAndroid Build Coastguard Worker return retAidl;
2236*ec779b8eSAndroid Build Coastguard Worker }();
2237*ec779b8eSAndroid Build Coastguard Worker return result.value_or(NAN);
2238*ec779b8eSAndroid Build Coastguard Worker }
2239*ec779b8eSAndroid Build Coastguard Worker
getMicrophones(std::vector<media::MicrophoneInfoFw> * microphones)2240*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMicrophones(std::vector<media::MicrophoneInfoFw>* microphones) {
2241*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2242*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2243*ec779b8eSAndroid Build Coastguard Worker return af->getMicrophones(microphones);
2244*ec779b8eSAndroid Build Coastguard Worker }
2245*ec779b8eSAndroid Build Coastguard Worker
setAudioHalPids(const std::vector<pid_t> & pids)2246*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setAudioHalPids(const std::vector<pid_t>& pids) {
2247*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2248*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2249*ec779b8eSAndroid Build Coastguard Worker return af->setAudioHalPids(pids);
2250*ec779b8eSAndroid Build Coastguard Worker }
2251*ec779b8eSAndroid Build Coastguard Worker
getSurroundFormats(unsigned int * numSurroundFormats,audio_format_t * surroundFormats,bool * surroundFormatsEnabled)2252*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getSurroundFormats(unsigned int* numSurroundFormats,
2253*ec779b8eSAndroid Build Coastguard Worker audio_format_t* surroundFormats,
2254*ec779b8eSAndroid Build Coastguard Worker bool* surroundFormatsEnabled) {
2255*ec779b8eSAndroid Build Coastguard Worker if (numSurroundFormats == nullptr || (*numSurroundFormats != 0 &&
2256*ec779b8eSAndroid Build Coastguard Worker (surroundFormats == nullptr ||
2257*ec779b8eSAndroid Build Coastguard Worker surroundFormatsEnabled == nullptr))) {
2258*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2259*ec779b8eSAndroid Build Coastguard Worker }
2260*ec779b8eSAndroid Build Coastguard Worker
2261*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2262*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2263*ec779b8eSAndroid Build Coastguard Worker Int numSurroundFormatsAidl;
2264*ec779b8eSAndroid Build Coastguard Worker numSurroundFormatsAidl.value =
2265*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*numSurroundFormats));
2266*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioFormatDescription> surroundFormatsAidl;
2267*ec779b8eSAndroid Build Coastguard Worker std::vector<bool> surroundFormatsEnabledAidl;
2268*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2269*ec779b8eSAndroid Build Coastguard Worker aps->getSurroundFormats(&numSurroundFormatsAidl, &surroundFormatsAidl,
2270*ec779b8eSAndroid Build Coastguard Worker &surroundFormatsEnabledAidl)));
2271*ec779b8eSAndroid Build Coastguard Worker
2272*ec779b8eSAndroid Build Coastguard Worker *numSurroundFormats = VALUE_OR_RETURN_STATUS(
2273*ec779b8eSAndroid Build Coastguard Worker convertIntegral<unsigned int>(numSurroundFormatsAidl.value));
2274*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
2275*ec779b8eSAndroid Build Coastguard Worker convertRange(surroundFormatsAidl.begin(), surroundFormatsAidl.end(), surroundFormats,
2276*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioFormatDescription_audio_format_t));
2277*ec779b8eSAndroid Build Coastguard Worker std::copy(surroundFormatsEnabledAidl.begin(), surroundFormatsEnabledAidl.end(),
2278*ec779b8eSAndroid Build Coastguard Worker surroundFormatsEnabled);
2279*ec779b8eSAndroid Build Coastguard Worker return OK;
2280*ec779b8eSAndroid Build Coastguard Worker }
2281*ec779b8eSAndroid Build Coastguard Worker
getReportedSurroundFormats(unsigned int * numSurroundFormats,audio_format_t * surroundFormats)2282*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getReportedSurroundFormats(unsigned int* numSurroundFormats,
2283*ec779b8eSAndroid Build Coastguard Worker audio_format_t* surroundFormats) {
2284*ec779b8eSAndroid Build Coastguard Worker if (numSurroundFormats == nullptr || (*numSurroundFormats != 0 && surroundFormats == nullptr)) {
2285*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2286*ec779b8eSAndroid Build Coastguard Worker }
2287*ec779b8eSAndroid Build Coastguard Worker
2288*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2289*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2290*ec779b8eSAndroid Build Coastguard Worker Int numSurroundFormatsAidl;
2291*ec779b8eSAndroid Build Coastguard Worker numSurroundFormatsAidl.value =
2292*ec779b8eSAndroid Build Coastguard Worker VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*numSurroundFormats));
2293*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioFormatDescription> surroundFormatsAidl;
2294*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2295*ec779b8eSAndroid Build Coastguard Worker aps->getReportedSurroundFormats(&numSurroundFormatsAidl, &surroundFormatsAidl)));
2296*ec779b8eSAndroid Build Coastguard Worker
2297*ec779b8eSAndroid Build Coastguard Worker *numSurroundFormats = VALUE_OR_RETURN_STATUS(
2298*ec779b8eSAndroid Build Coastguard Worker convertIntegral<unsigned int>(numSurroundFormatsAidl.value));
2299*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
2300*ec779b8eSAndroid Build Coastguard Worker convertRange(surroundFormatsAidl.begin(), surroundFormatsAidl.end(), surroundFormats,
2301*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioFormatDescription_audio_format_t));
2302*ec779b8eSAndroid Build Coastguard Worker return OK;
2303*ec779b8eSAndroid Build Coastguard Worker }
2304*ec779b8eSAndroid Build Coastguard Worker
setSurroundFormatEnabled(audio_format_t audioFormat,bool enabled)2305*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) {
2306*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2307*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2308*ec779b8eSAndroid Build Coastguard Worker
2309*ec779b8eSAndroid Build Coastguard Worker AudioFormatDescription audioFormatAidl = VALUE_OR_RETURN_STATUS(
2310*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_format_t_AudioFormatDescription(audioFormat));
2311*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2312*ec779b8eSAndroid Build Coastguard Worker aps->setSurroundFormatEnabled(audioFormatAidl, enabled));
2313*ec779b8eSAndroid Build Coastguard Worker }
2314*ec779b8eSAndroid Build Coastguard Worker
setAssistantServicesUids(const std::vector<uid_t> & uids)2315*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setAssistantServicesUids(const std::vector<uid_t>& uids) {
2316*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2317*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2318*ec779b8eSAndroid Build Coastguard Worker
2319*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> uidsAidl = VALUE_OR_RETURN_STATUS(
2320*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<int32_t>>(uids, legacy2aidl_uid_t_int32_t));
2321*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setAssistantServicesUids(uidsAidl));
2322*ec779b8eSAndroid Build Coastguard Worker }
2323*ec779b8eSAndroid Build Coastguard Worker
setActiveAssistantServicesUids(const std::vector<uid_t> & activeUids)2324*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setActiveAssistantServicesUids(const std::vector<uid_t>& activeUids) {
2325*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2326*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2327*ec779b8eSAndroid Build Coastguard Worker
2328*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> activeUidsAidl = VALUE_OR_RETURN_STATUS(
2329*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<int32_t>>(activeUids, legacy2aidl_uid_t_int32_t));
2330*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setActiveAssistantServicesUids(activeUidsAidl));
2331*ec779b8eSAndroid Build Coastguard Worker }
2332*ec779b8eSAndroid Build Coastguard Worker
setA11yServicesUids(const std::vector<uid_t> & uids)2333*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids) {
2334*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2335*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2336*ec779b8eSAndroid Build Coastguard Worker
2337*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> uidsAidl = VALUE_OR_RETURN_STATUS(
2338*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<int32_t>>(uids, legacy2aidl_uid_t_int32_t));
2339*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setA11yServicesUids(uidsAidl));
2340*ec779b8eSAndroid Build Coastguard Worker }
2341*ec779b8eSAndroid Build Coastguard Worker
setCurrentImeUid(uid_t uid)2342*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setCurrentImeUid(uid_t uid) {
2343*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2344*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2345*ec779b8eSAndroid Build Coastguard Worker
2346*ec779b8eSAndroid Build Coastguard Worker int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
2347*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setCurrentImeUid(uidAidl));
2348*ec779b8eSAndroid Build Coastguard Worker }
2349*ec779b8eSAndroid Build Coastguard Worker
isHapticPlaybackSupported()2350*ec779b8eSAndroid Build Coastguard Worker bool AudioSystem::isHapticPlaybackSupported() {
2351*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2352*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return false;
2353*ec779b8eSAndroid Build Coastguard Worker
2354*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<bool> {
2355*ec779b8eSAndroid Build Coastguard Worker bool retVal;
2356*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(
2357*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->isHapticPlaybackSupported(&retVal)));
2358*ec779b8eSAndroid Build Coastguard Worker return retVal;
2359*ec779b8eSAndroid Build Coastguard Worker }();
2360*ec779b8eSAndroid Build Coastguard Worker return result.value_or(false);
2361*ec779b8eSAndroid Build Coastguard Worker }
2362*ec779b8eSAndroid Build Coastguard Worker
isUltrasoundSupported()2363*ec779b8eSAndroid Build Coastguard Worker bool AudioSystem::isUltrasoundSupported() {
2364*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2365*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return false;
2366*ec779b8eSAndroid Build Coastguard Worker
2367*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<bool> {
2368*ec779b8eSAndroid Build Coastguard Worker bool retVal;
2369*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(
2370*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->isUltrasoundSupported(&retVal)));
2371*ec779b8eSAndroid Build Coastguard Worker return retVal;
2372*ec779b8eSAndroid Build Coastguard Worker }();
2373*ec779b8eSAndroid Build Coastguard Worker return result.value_or(false);
2374*ec779b8eSAndroid Build Coastguard Worker }
2375*ec779b8eSAndroid Build Coastguard Worker
getHwOffloadFormatsSupportedForBluetoothMedia(audio_devices_t device,std::vector<audio_format_t> * formats)2376*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getHwOffloadFormatsSupportedForBluetoothMedia(
2377*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device, std::vector<audio_format_t>* formats) {
2378*ec779b8eSAndroid Build Coastguard Worker if (formats == nullptr) {
2379*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2380*ec779b8eSAndroid Build Coastguard Worker }
2381*ec779b8eSAndroid Build Coastguard Worker
2382*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2383*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2384*ec779b8eSAndroid Build Coastguard Worker
2385*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioFormatDescription> formatsAidl;
2386*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription deviceAidl = VALUE_OR_RETURN_STATUS(
2387*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
2388*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2389*ec779b8eSAndroid Build Coastguard Worker aps->getHwOffloadFormatsSupportedForBluetoothMedia(deviceAidl, &formatsAidl)));
2390*ec779b8eSAndroid Build Coastguard Worker *formats = VALUE_OR_RETURN_STATUS(
2391*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<audio_format_t>>(
2392*ec779b8eSAndroid Build Coastguard Worker formatsAidl,
2393*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioFormatDescription_audio_format_t));
2394*ec779b8eSAndroid Build Coastguard Worker return OK;
2395*ec779b8eSAndroid Build Coastguard Worker }
2396*ec779b8eSAndroid Build Coastguard Worker
listAudioProductStrategies(AudioProductStrategyVector & strategies)2397*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::listAudioProductStrategies(AudioProductStrategyVector& strategies) {
2398*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2399*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2400*ec779b8eSAndroid Build Coastguard Worker
2401*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioProductStrategy> strategiesAidl;
2402*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2403*ec779b8eSAndroid Build Coastguard Worker aps->listAudioProductStrategies(&strategiesAidl)));
2404*ec779b8eSAndroid Build Coastguard Worker strategies = VALUE_OR_RETURN_STATUS(
2405*ec779b8eSAndroid Build Coastguard Worker convertContainer<AudioProductStrategyVector>(strategiesAidl,
2406*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioProductStrategy));
2407*ec779b8eSAndroid Build Coastguard Worker return OK;
2408*ec779b8eSAndroid Build Coastguard Worker }
2409*ec779b8eSAndroid Build Coastguard Worker
streamTypeToAttributes(audio_stream_type_t stream)2410*ec779b8eSAndroid Build Coastguard Worker audio_attributes_t AudioSystem::streamTypeToAttributes(audio_stream_type_t stream) {
2411*ec779b8eSAndroid Build Coastguard Worker AudioProductStrategyVector strategies;
2412*ec779b8eSAndroid Build Coastguard Worker listAudioProductStrategies(strategies);
2413*ec779b8eSAndroid Build Coastguard Worker for (const auto& strategy : strategies) {
2414*ec779b8eSAndroid Build Coastguard Worker auto attrVect = strategy.getVolumeGroupAttributes();
2415*ec779b8eSAndroid Build Coastguard Worker auto iter = std::find_if(begin(attrVect), end(attrVect), [&stream](const auto& attributes) {
2416*ec779b8eSAndroid Build Coastguard Worker return attributes.getStreamType() == stream;
2417*ec779b8eSAndroid Build Coastguard Worker });
2418*ec779b8eSAndroid Build Coastguard Worker if (iter != end(attrVect)) {
2419*ec779b8eSAndroid Build Coastguard Worker return iter->getAttributes();
2420*ec779b8eSAndroid Build Coastguard Worker }
2421*ec779b8eSAndroid Build Coastguard Worker }
2422*ec779b8eSAndroid Build Coastguard Worker ALOGE("invalid stream type %s when converting to attributes", toString(stream).c_str());
2423*ec779b8eSAndroid Build Coastguard Worker return AUDIO_ATTRIBUTES_INITIALIZER;
2424*ec779b8eSAndroid Build Coastguard Worker }
2425*ec779b8eSAndroid Build Coastguard Worker
attributesToStreamType(const audio_attributes_t & attr)2426*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t AudioSystem::attributesToStreamType(const audio_attributes_t& attr) {
2427*ec779b8eSAndroid Build Coastguard Worker product_strategy_t psId;
2428*ec779b8eSAndroid Build Coastguard Worker status_t ret = AudioSystem::getProductStrategyFromAudioAttributes(attr, psId);
2429*ec779b8eSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2430*ec779b8eSAndroid Build Coastguard Worker ALOGE("no strategy found for attributes %s", toString(attr).c_str());
2431*ec779b8eSAndroid Build Coastguard Worker return AUDIO_STREAM_MUSIC;
2432*ec779b8eSAndroid Build Coastguard Worker }
2433*ec779b8eSAndroid Build Coastguard Worker AudioProductStrategyVector strategies;
2434*ec779b8eSAndroid Build Coastguard Worker listAudioProductStrategies(strategies);
2435*ec779b8eSAndroid Build Coastguard Worker for (const auto& strategy : strategies) {
2436*ec779b8eSAndroid Build Coastguard Worker if (strategy.getId() == psId) {
2437*ec779b8eSAndroid Build Coastguard Worker auto attrVect = strategy.getVolumeGroupAttributes();
2438*ec779b8eSAndroid Build Coastguard Worker auto iter = std::find_if(begin(attrVect), end(attrVect), [&attr](const auto& refAttr) {
2439*ec779b8eSAndroid Build Coastguard Worker return refAttr.matchesScore(attr) > 0;
2440*ec779b8eSAndroid Build Coastguard Worker });
2441*ec779b8eSAndroid Build Coastguard Worker if (iter != end(attrVect)) {
2442*ec779b8eSAndroid Build Coastguard Worker return iter->getStreamType();
2443*ec779b8eSAndroid Build Coastguard Worker }
2444*ec779b8eSAndroid Build Coastguard Worker }
2445*ec779b8eSAndroid Build Coastguard Worker }
2446*ec779b8eSAndroid Build Coastguard Worker switch (attr.usage) {
2447*ec779b8eSAndroid Build Coastguard Worker case AUDIO_USAGE_VIRTUAL_SOURCE:
2448*ec779b8eSAndroid Build Coastguard Worker // virtual source is not expected to have an associated product strategy
2449*ec779b8eSAndroid Build Coastguard Worker break;
2450*ec779b8eSAndroid Build Coastguard Worker default:
2451*ec779b8eSAndroid Build Coastguard Worker ALOGE("invalid attributes %s when converting to stream", toString(attr).c_str());
2452*ec779b8eSAndroid Build Coastguard Worker break;
2453*ec779b8eSAndroid Build Coastguard Worker }
2454*ec779b8eSAndroid Build Coastguard Worker return AUDIO_STREAM_MUSIC;
2455*ec779b8eSAndroid Build Coastguard Worker }
2456*ec779b8eSAndroid Build Coastguard Worker
getProductStrategyFromAudioAttributes(const audio_attributes_t & aa,product_strategy_t & productStrategy,bool fallbackOnDefault)2457*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getProductStrategyFromAudioAttributes(const audio_attributes_t& aa,
2458*ec779b8eSAndroid Build Coastguard Worker product_strategy_t& productStrategy,
2459*ec779b8eSAndroid Build Coastguard Worker bool fallbackOnDefault) {
2460*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2461*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2462*ec779b8eSAndroid Build Coastguard Worker
2463*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes aaAidl = VALUE_OR_RETURN_STATUS(
2464*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(aa));
2465*ec779b8eSAndroid Build Coastguard Worker int32_t productStrategyAidl;
2466*ec779b8eSAndroid Build Coastguard Worker
2467*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2468*ec779b8eSAndroid Build Coastguard Worker aps->getProductStrategyFromAudioAttributes(aaAidl, fallbackOnDefault,
2469*ec779b8eSAndroid Build Coastguard Worker &productStrategyAidl)));
2470*ec779b8eSAndroid Build Coastguard Worker productStrategy = VALUE_OR_RETURN_STATUS(
2471*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_product_strategy_t(productStrategyAidl));
2472*ec779b8eSAndroid Build Coastguard Worker return OK;
2473*ec779b8eSAndroid Build Coastguard Worker }
2474*ec779b8eSAndroid Build Coastguard Worker
listAudioVolumeGroups(AudioVolumeGroupVector & groups)2475*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::listAudioVolumeGroups(AudioVolumeGroupVector& groups) {
2476*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2477*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2478*ec779b8eSAndroid Build Coastguard Worker
2479*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioVolumeGroup> groupsAidl;
2480*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(
2481*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->listAudioVolumeGroups(&groupsAidl)));
2482*ec779b8eSAndroid Build Coastguard Worker groups = VALUE_OR_RETURN_STATUS(
2483*ec779b8eSAndroid Build Coastguard Worker convertContainer<AudioVolumeGroupVector>(groupsAidl, aidl2legacy_AudioVolumeGroup));
2484*ec779b8eSAndroid Build Coastguard Worker return OK;
2485*ec779b8eSAndroid Build Coastguard Worker }
2486*ec779b8eSAndroid Build Coastguard Worker
getVolumeGroupFromAudioAttributes(const audio_attributes_t & aa,volume_group_t & volumeGroup,bool fallbackOnDefault)2487*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getVolumeGroupFromAudioAttributes(const audio_attributes_t &aa,
2488*ec779b8eSAndroid Build Coastguard Worker volume_group_t& volumeGroup,
2489*ec779b8eSAndroid Build Coastguard Worker bool fallbackOnDefault) {
2490*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2491*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2492*ec779b8eSAndroid Build Coastguard Worker
2493*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes aaAidl = VALUE_OR_RETURN_STATUS(
2494*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(aa));
2495*ec779b8eSAndroid Build Coastguard Worker int32_t volumeGroupAidl;
2496*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2497*ec779b8eSAndroid Build Coastguard Worker aps->getVolumeGroupFromAudioAttributes(aaAidl, fallbackOnDefault, &volumeGroupAidl)));
2498*ec779b8eSAndroid Build Coastguard Worker volumeGroup = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_volume_group_t(volumeGroupAidl));
2499*ec779b8eSAndroid Build Coastguard Worker return OK;
2500*ec779b8eSAndroid Build Coastguard Worker }
2501*ec779b8eSAndroid Build Coastguard Worker
setRttEnabled(bool enabled)2502*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setRttEnabled(bool enabled) {
2503*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2504*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2505*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->setRttEnabled(enabled));
2506*ec779b8eSAndroid Build Coastguard Worker }
2507*ec779b8eSAndroid Build Coastguard Worker
isCallScreenModeSupported()2508*ec779b8eSAndroid Build Coastguard Worker bool AudioSystem::isCallScreenModeSupported() {
2509*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2510*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return false;
2511*ec779b8eSAndroid Build Coastguard Worker
2512*ec779b8eSAndroid Build Coastguard Worker auto result = [&]() -> ConversionResult<bool> {
2513*ec779b8eSAndroid Build Coastguard Worker bool retAidl;
2514*ec779b8eSAndroid Build Coastguard Worker RETURN_IF_ERROR(
2515*ec779b8eSAndroid Build Coastguard Worker statusTFromBinderStatus(aps->isCallScreenModeSupported(&retAidl)));
2516*ec779b8eSAndroid Build Coastguard Worker return retAidl;
2517*ec779b8eSAndroid Build Coastguard Worker }();
2518*ec779b8eSAndroid Build Coastguard Worker return result.value_or(false);
2519*ec779b8eSAndroid Build Coastguard Worker }
2520*ec779b8eSAndroid Build Coastguard Worker
setDevicesRoleForStrategy(product_strategy_t strategy,device_role_t role,const AudioDeviceTypeAddrVector & devices)2521*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setDevicesRoleForStrategy(product_strategy_t strategy,
2522*ec779b8eSAndroid Build Coastguard Worker device_role_t role,
2523*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddrVector& devices) {
2524*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2525*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2526*ec779b8eSAndroid Build Coastguard Worker
2527*ec779b8eSAndroid Build Coastguard Worker int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2528*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2529*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2530*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2531*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2532*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2533*ec779b8eSAndroid Build Coastguard Worker aps->setDevicesRoleForStrategy(strategyAidl, roleAidl, devicesAidl));
2534*ec779b8eSAndroid Build Coastguard Worker }
2535*ec779b8eSAndroid Build Coastguard Worker
removeDevicesRoleForStrategy(product_strategy_t strategy,device_role_t role,const AudioDeviceTypeAddrVector & devices)2536*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeDevicesRoleForStrategy(product_strategy_t strategy,
2537*ec779b8eSAndroid Build Coastguard Worker device_role_t role,
2538*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddrVector& devices) {
2539*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2540*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2541*ec779b8eSAndroid Build Coastguard Worker
2542*ec779b8eSAndroid Build Coastguard Worker int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2543*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2544*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2545*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2546*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2547*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2548*ec779b8eSAndroid Build Coastguard Worker aps->removeDevicesRoleForStrategy(strategyAidl, roleAidl, devicesAidl));
2549*ec779b8eSAndroid Build Coastguard Worker }
2550*ec779b8eSAndroid Build Coastguard Worker
2551*ec779b8eSAndroid Build Coastguard Worker status_t
clearDevicesRoleForStrategy(product_strategy_t strategy,device_role_t role)2552*ec779b8eSAndroid Build Coastguard Worker AudioSystem::clearDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role) {
2553*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2554*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2555*ec779b8eSAndroid Build Coastguard Worker
2556*ec779b8eSAndroid Build Coastguard Worker int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2557*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2558*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2559*ec779b8eSAndroid Build Coastguard Worker aps->clearDevicesRoleForStrategy(strategyAidl, roleAidl));
2560*ec779b8eSAndroid Build Coastguard Worker }
2561*ec779b8eSAndroid Build Coastguard Worker
getDevicesForRoleAndStrategy(product_strategy_t strategy,device_role_t role,AudioDeviceTypeAddrVector & devices)2562*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getDevicesForRoleAndStrategy(product_strategy_t strategy,
2563*ec779b8eSAndroid Build Coastguard Worker device_role_t role,
2564*ec779b8eSAndroid Build Coastguard Worker AudioDeviceTypeAddrVector& devices) {
2565*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2566*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2567*ec779b8eSAndroid Build Coastguard Worker
2568*ec779b8eSAndroid Build Coastguard Worker int32_t strategyAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_product_strategy_t_int32_t(strategy));
2569*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2570*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl;
2571*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2572*ec779b8eSAndroid Build Coastguard Worker aps->getDevicesForRoleAndStrategy(strategyAidl, roleAidl, &devicesAidl)));
2573*ec779b8eSAndroid Build Coastguard Worker devices = VALUE_OR_RETURN_STATUS(
2574*ec779b8eSAndroid Build Coastguard Worker convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2575*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioDeviceTypeAddress));
2576*ec779b8eSAndroid Build Coastguard Worker return OK;
2577*ec779b8eSAndroid Build Coastguard Worker }
2578*ec779b8eSAndroid Build Coastguard Worker
setDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role,const AudioDeviceTypeAddrVector & devices)2579*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setDevicesRoleForCapturePreset(audio_source_t audioSource,
2580*ec779b8eSAndroid Build Coastguard Worker device_role_t role,
2581*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddrVector& devices) {
2582*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2583*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2584*ec779b8eSAndroid Build Coastguard Worker
2585*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSourceAidl = VALUE_OR_RETURN_STATUS(
2586*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_source_t_AudioSource(audioSource));
2587*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2588*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2589*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2590*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2591*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2592*ec779b8eSAndroid Build Coastguard Worker aps->setDevicesRoleForCapturePreset(audioSourceAidl, roleAidl, devicesAidl));
2593*ec779b8eSAndroid Build Coastguard Worker }
2594*ec779b8eSAndroid Build Coastguard Worker
addDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role,const AudioDeviceTypeAddrVector & devices)2595*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::addDevicesRoleForCapturePreset(audio_source_t audioSource,
2596*ec779b8eSAndroid Build Coastguard Worker device_role_t role,
2597*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddrVector& devices) {
2598*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2599*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2600*ec779b8eSAndroid Build Coastguard Worker
2601*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSourceAidl = VALUE_OR_RETURN_STATUS(
2602*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_source_t_AudioSource(audioSource));
2603*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2604*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2605*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2606*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2607*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2608*ec779b8eSAndroid Build Coastguard Worker aps->addDevicesRoleForCapturePreset(audioSourceAidl, roleAidl, devicesAidl));
2609*ec779b8eSAndroid Build Coastguard Worker }
2610*ec779b8eSAndroid Build Coastguard Worker
removeDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role,const AudioDeviceTypeAddrVector & devices)2611*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::removeDevicesRoleForCapturePreset(
2612*ec779b8eSAndroid Build Coastguard Worker audio_source_t audioSource, device_role_t role, const AudioDeviceTypeAddrVector& devices) {
2613*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2614*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2615*ec779b8eSAndroid Build Coastguard Worker
2616*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSourceAidl = VALUE_OR_RETURN_STATUS(
2617*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_source_t_AudioSource(audioSource));
2618*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2619*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2620*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2621*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2622*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2623*ec779b8eSAndroid Build Coastguard Worker aps->removeDevicesRoleForCapturePreset(audioSourceAidl, roleAidl, devicesAidl));
2624*ec779b8eSAndroid Build Coastguard Worker }
2625*ec779b8eSAndroid Build Coastguard Worker
clearDevicesRoleForCapturePreset(audio_source_t audioSource,device_role_t role)2626*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::clearDevicesRoleForCapturePreset(audio_source_t audioSource,
2627*ec779b8eSAndroid Build Coastguard Worker device_role_t role) {
2628*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2629*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2630*ec779b8eSAndroid Build Coastguard Worker
2631*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSourceAidl = VALUE_OR_RETURN_STATUS(
2632*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_source_t_AudioSource(audioSource));
2633*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2634*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2635*ec779b8eSAndroid Build Coastguard Worker aps->clearDevicesRoleForCapturePreset(audioSourceAidl, roleAidl));
2636*ec779b8eSAndroid Build Coastguard Worker }
2637*ec779b8eSAndroid Build Coastguard Worker
getDevicesForRoleAndCapturePreset(audio_source_t audioSource,device_role_t role,AudioDeviceTypeAddrVector & devices)2638*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
2639*ec779b8eSAndroid Build Coastguard Worker device_role_t role,
2640*ec779b8eSAndroid Build Coastguard Worker AudioDeviceTypeAddrVector& devices) {
2641*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2642*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2643*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSourceAidl = VALUE_OR_RETURN_STATUS(
2644*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_source_t_AudioSource(audioSource));
2645*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole roleAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_device_role_t_DeviceRole(role));
2646*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl;
2647*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2648*ec779b8eSAndroid Build Coastguard Worker aps->getDevicesForRoleAndCapturePreset(audioSourceAidl, roleAidl, &devicesAidl)));
2649*ec779b8eSAndroid Build Coastguard Worker devices = VALUE_OR_RETURN_STATUS(
2650*ec779b8eSAndroid Build Coastguard Worker convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2651*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioDeviceTypeAddress));
2652*ec779b8eSAndroid Build Coastguard Worker return OK;
2653*ec779b8eSAndroid Build Coastguard Worker }
2654*ec779b8eSAndroid Build Coastguard Worker
getSpatializer(const sp<media::INativeSpatializerCallback> & callback,sp<media::ISpatializer> * spatializer)2655*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getSpatializer(const sp<media::INativeSpatializerCallback>& callback,
2656*ec779b8eSAndroid Build Coastguard Worker sp<media::ISpatializer>* spatializer) {
2657*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2658*ec779b8eSAndroid Build Coastguard Worker if (spatializer == nullptr) {
2659*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2660*ec779b8eSAndroid Build Coastguard Worker }
2661*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2662*ec779b8eSAndroid Build Coastguard Worker media::GetSpatializerResponse response;
2663*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2664*ec779b8eSAndroid Build Coastguard Worker aps->getSpatializer(callback, &response)));
2665*ec779b8eSAndroid Build Coastguard Worker
2666*ec779b8eSAndroid Build Coastguard Worker *spatializer = response.spatializer;
2667*ec779b8eSAndroid Build Coastguard Worker return OK;
2668*ec779b8eSAndroid Build Coastguard Worker }
2669*ec779b8eSAndroid Build Coastguard Worker
canBeSpatialized(const audio_attributes_t * attr,const audio_config_t * config,const AudioDeviceTypeAddrVector & devices,bool * canBeSpatialized)2670*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::canBeSpatialized(const audio_attributes_t *attr,
2671*ec779b8eSAndroid Build Coastguard Worker const audio_config_t *config,
2672*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddrVector &devices,
2673*ec779b8eSAndroid Build Coastguard Worker bool *canBeSpatialized) {
2674*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2675*ec779b8eSAndroid Build Coastguard Worker if (canBeSpatialized == nullptr) {
2676*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2677*ec779b8eSAndroid Build Coastguard Worker }
2678*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2679*ec779b8eSAndroid Build Coastguard Worker audio_attributes_t attributes = attr != nullptr ? *attr : AUDIO_ATTRIBUTES_INITIALIZER;
2680*ec779b8eSAndroid Build Coastguard Worker audio_config_t configuration = config != nullptr ? *config : AUDIO_CONFIG_INITIALIZER;
2681*ec779b8eSAndroid Build Coastguard Worker
2682*ec779b8eSAndroid Build Coastguard Worker std::optional<media::audio::common::AudioAttributes> attrAidl = VALUE_OR_RETURN_STATUS(
2683*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(attributes));
2684*ec779b8eSAndroid Build Coastguard Worker std::optional<AudioConfig> configAidl = VALUE_OR_RETURN_STATUS(
2685*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_config_t_AudioConfig(configuration, false /*isInput*/));
2686*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice> devicesAidl = VALUE_OR_RETURN_STATUS(
2687*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<AudioDevice>>(devices,
2688*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioDeviceTypeAddress));
2689*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2690*ec779b8eSAndroid Build Coastguard Worker aps->canBeSpatialized(attrAidl, configAidl, devicesAidl, canBeSpatialized)));
2691*ec779b8eSAndroid Build Coastguard Worker return OK;
2692*ec779b8eSAndroid Build Coastguard Worker }
2693*ec779b8eSAndroid Build Coastguard Worker
getSoundDoseInterface(const sp<media::ISoundDoseCallback> & callback,sp<media::ISoundDose> * soundDose)2694*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback,
2695*ec779b8eSAndroid Build Coastguard Worker sp<media::ISoundDose>* soundDose) {
2696*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2697*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2698*ec779b8eSAndroid Build Coastguard Worker if (soundDose == nullptr) {
2699*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2700*ec779b8eSAndroid Build Coastguard Worker }
2701*ec779b8eSAndroid Build Coastguard Worker
2702*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(af->getSoundDoseInterface(callback, soundDose));
2703*ec779b8eSAndroid Build Coastguard Worker return OK;
2704*ec779b8eSAndroid Build Coastguard Worker }
2705*ec779b8eSAndroid Build Coastguard Worker
getDirectPlaybackSupport(const audio_attributes_t * attr,const audio_config_t * config,audio_direct_mode_t * directMode)2706*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getDirectPlaybackSupport(const audio_attributes_t *attr,
2707*ec779b8eSAndroid Build Coastguard Worker const audio_config_t *config,
2708*ec779b8eSAndroid Build Coastguard Worker audio_direct_mode_t* directMode) {
2709*ec779b8eSAndroid Build Coastguard Worker if (attr == nullptr || config == nullptr || directMode == nullptr) {
2710*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2711*ec779b8eSAndroid Build Coastguard Worker }
2712*ec779b8eSAndroid Build Coastguard Worker
2713*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2714*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2715*ec779b8eSAndroid Build Coastguard Worker
2716*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
2717*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
2718*ec779b8eSAndroid Build Coastguard Worker AudioConfig configAidl = VALUE_OR_RETURN_STATUS(
2719*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_config_t_AudioConfig(*config, false /*isInput*/));
2720*ec779b8eSAndroid Build Coastguard Worker
2721*ec779b8eSAndroid Build Coastguard Worker media::AudioDirectMode retAidl;
2722*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2723*ec779b8eSAndroid Build Coastguard Worker aps->getDirectPlaybackSupport(attrAidl, configAidl, &retAidl)));
2724*ec779b8eSAndroid Build Coastguard Worker *directMode = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_direct_mode_t_mask(
2725*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(retAidl)));
2726*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
2727*ec779b8eSAndroid Build Coastguard Worker }
2728*ec779b8eSAndroid Build Coastguard Worker
getDirectProfilesForAttributes(const audio_attributes_t * attr,std::vector<audio_profile> * audioProfiles)2729*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getDirectProfilesForAttributes(const audio_attributes_t* attr,
2730*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_profile>* audioProfiles) {
2731*ec779b8eSAndroid Build Coastguard Worker if (attr == nullptr || audioProfiles == nullptr) {
2732*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
2733*ec779b8eSAndroid Build Coastguard Worker }
2734*ec779b8eSAndroid Build Coastguard Worker
2735*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2736*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2737*ec779b8eSAndroid Build Coastguard Worker
2738*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
2739*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
2740*ec779b8eSAndroid Build Coastguard Worker
2741*ec779b8eSAndroid Build Coastguard Worker std::vector<media::audio::common::AudioProfile> audioProfilesAidl;
2742*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2743*ec779b8eSAndroid Build Coastguard Worker aps->getDirectProfilesForAttributes(attrAidl, &audioProfilesAidl)));
2744*ec779b8eSAndroid Build Coastguard Worker *audioProfiles = VALUE_OR_RETURN_STATUS(convertContainer<std::vector<audio_profile>>(
2745*ec779b8eSAndroid Build Coastguard Worker audioProfilesAidl, aidl2legacy_AudioProfile_audio_profile, false /*isInput*/));
2746*ec779b8eSAndroid Build Coastguard Worker
2747*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
2748*ec779b8eSAndroid Build Coastguard Worker }
2749*ec779b8eSAndroid Build Coastguard Worker
setRequestedLatencyMode(audio_io_handle_t output,audio_latency_mode_t mode)2750*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setRequestedLatencyMode(
2751*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, audio_latency_mode_t mode) {
2752*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2753*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2754*ec779b8eSAndroid Build Coastguard Worker return af->setRequestedLatencyMode(output, mode);
2755*ec779b8eSAndroid Build Coastguard Worker }
2756*ec779b8eSAndroid Build Coastguard Worker
getSupportedLatencyModes(audio_io_handle_t output,std::vector<audio_latency_mode_t> * modes)2757*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getSupportedLatencyModes(audio_io_handle_t output,
2758*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_latency_mode_t>* modes) {
2759*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2760*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2761*ec779b8eSAndroid Build Coastguard Worker return af->getSupportedLatencyModes(output, modes);
2762*ec779b8eSAndroid Build Coastguard Worker }
2763*ec779b8eSAndroid Build Coastguard Worker
setBluetoothVariableLatencyEnabled(bool enabled)2764*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setBluetoothVariableLatencyEnabled(bool enabled) {
2765*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2766*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2767*ec779b8eSAndroid Build Coastguard Worker return af->setBluetoothVariableLatencyEnabled(enabled);
2768*ec779b8eSAndroid Build Coastguard Worker }
2769*ec779b8eSAndroid Build Coastguard Worker
isBluetoothVariableLatencyEnabled(bool * enabled)2770*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::isBluetoothVariableLatencyEnabled(
2771*ec779b8eSAndroid Build Coastguard Worker bool *enabled) {
2772*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2773*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2774*ec779b8eSAndroid Build Coastguard Worker return af->isBluetoothVariableLatencyEnabled(enabled);
2775*ec779b8eSAndroid Build Coastguard Worker }
2776*ec779b8eSAndroid Build Coastguard Worker
supportsBluetoothVariableLatency(bool * support)2777*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::supportsBluetoothVariableLatency(
2778*ec779b8eSAndroid Build Coastguard Worker bool *support) {
2779*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2780*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2781*ec779b8eSAndroid Build Coastguard Worker return af->supportsBluetoothVariableLatency(support);
2782*ec779b8eSAndroid Build Coastguard Worker }
2783*ec779b8eSAndroid Build Coastguard Worker
getAudioPolicyConfig(media::AudioPolicyConfig * config)2784*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getAudioPolicyConfig(media::AudioPolicyConfig *config) {
2785*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2786*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2787*ec779b8eSAndroid Build Coastguard Worker return af->getAudioPolicyConfig(config);
2788*ec779b8eSAndroid Build Coastguard Worker }
2789*ec779b8eSAndroid Build Coastguard Worker
2790*ec779b8eSAndroid Build Coastguard Worker class CaptureStateListenerImpl : public media::BnCaptureStateListener,
2791*ec779b8eSAndroid Build Coastguard Worker public IBinder::DeathRecipient {
2792*ec779b8eSAndroid Build Coastguard Worker public:
CaptureStateListenerImpl(const sp<IAudioPolicyService> & aps,const sp<AudioSystem::CaptureStateListener> & listener)2793*ec779b8eSAndroid Build Coastguard Worker CaptureStateListenerImpl(
2794*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService>& aps,
2795*ec779b8eSAndroid Build Coastguard Worker const sp<AudioSystem::CaptureStateListener>& listener)
2796*ec779b8eSAndroid Build Coastguard Worker : mAps(aps), mListener(listener) {}
2797*ec779b8eSAndroid Build Coastguard Worker
init()2798*ec779b8eSAndroid Build Coastguard Worker void init() {
2799*ec779b8eSAndroid Build Coastguard Worker bool active;
2800*ec779b8eSAndroid Build Coastguard Worker status_t status = statusTFromBinderStatus(
2801*ec779b8eSAndroid Build Coastguard Worker mAps->registerSoundTriggerCaptureStateListener(this, &active));
2802*ec779b8eSAndroid Build Coastguard Worker if (status != NO_ERROR) {
2803*ec779b8eSAndroid Build Coastguard Worker mListener->onServiceDied();
2804*ec779b8eSAndroid Build Coastguard Worker return;
2805*ec779b8eSAndroid Build Coastguard Worker }
2806*ec779b8eSAndroid Build Coastguard Worker mListener->onStateChanged(active);
2807*ec779b8eSAndroid Build Coastguard Worker IInterface::asBinder(mAps)->linkToDeath(this);
2808*ec779b8eSAndroid Build Coastguard Worker }
2809*ec779b8eSAndroid Build Coastguard Worker
setCaptureState(bool active)2810*ec779b8eSAndroid Build Coastguard Worker binder::Status setCaptureState(bool active) override {
2811*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gSoundTriggerMutex);
2812*ec779b8eSAndroid Build Coastguard Worker mListener->onStateChanged(active);
2813*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
2814*ec779b8eSAndroid Build Coastguard Worker }
2815*ec779b8eSAndroid Build Coastguard Worker
binderDied(const wp<IBinder> &)2816*ec779b8eSAndroid Build Coastguard Worker void binderDied(const wp<IBinder>&) override {
2817*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gSoundTriggerMutex);
2818*ec779b8eSAndroid Build Coastguard Worker mListener->onServiceDied();
2819*ec779b8eSAndroid Build Coastguard Worker AudioSystem::gSoundTriggerCaptureStateListener = nullptr;
2820*ec779b8eSAndroid Build Coastguard Worker }
2821*ec779b8eSAndroid Build Coastguard Worker
2822*ec779b8eSAndroid Build Coastguard Worker private:
2823*ec779b8eSAndroid Build Coastguard Worker // Need this in order to keep the death receipent alive.
2824*ec779b8eSAndroid Build Coastguard Worker sp<IAudioPolicyService> mAps;
2825*ec779b8eSAndroid Build Coastguard Worker sp<AudioSystem::CaptureStateListener> mListener;
2826*ec779b8eSAndroid Build Coastguard Worker };
2827*ec779b8eSAndroid Build Coastguard Worker
registerSoundTriggerCaptureStateListener(const sp<CaptureStateListener> & listener)2828*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::registerSoundTriggerCaptureStateListener(
2829*ec779b8eSAndroid Build Coastguard Worker const sp<CaptureStateListener>& listener) {
2830*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(listener == nullptr);
2831*ec779b8eSAndroid Build Coastguard Worker
2832*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2833*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2834*ec779b8eSAndroid Build Coastguard Worker
2835*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gSoundTriggerMutex);
2836*ec779b8eSAndroid Build Coastguard Worker gSoundTriggerCaptureStateListener = new CaptureStateListenerImpl(aps, listener);
2837*ec779b8eSAndroid Build Coastguard Worker gSoundTriggerCaptureStateListener->init();
2838*ec779b8eSAndroid Build Coastguard Worker
2839*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
2840*ec779b8eSAndroid Build Coastguard Worker }
2841*ec779b8eSAndroid Build Coastguard Worker
setVibratorInfos(const std::vector<media::AudioVibratorInfo> & vibratorInfos)2842*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setVibratorInfos(
2843*ec779b8eSAndroid Build Coastguard Worker const std::vector<media::AudioVibratorInfo>& vibratorInfos) {
2844*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2845*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2846*ec779b8eSAndroid Build Coastguard Worker return af->setVibratorInfos(vibratorInfos);
2847*ec779b8eSAndroid Build Coastguard Worker }
2848*ec779b8eSAndroid Build Coastguard Worker
getMmapPolicyInfos(AudioMMapPolicyType policyType,std::vector<AudioMMapPolicyInfo> * policyInfos)2849*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMmapPolicyInfos(
2850*ec779b8eSAndroid Build Coastguard Worker AudioMMapPolicyType policyType, std::vector<AudioMMapPolicyInfo> *policyInfos) {
2851*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2852*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2853*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->getMmapPolicyInfos(policyType, policyInfos));
2854*ec779b8eSAndroid Build Coastguard Worker }
2855*ec779b8eSAndroid Build Coastguard Worker
getAAudioMixerBurstCount()2856*ec779b8eSAndroid Build Coastguard Worker int32_t AudioSystem::getAAudioMixerBurstCount() {
2857*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2858*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2859*ec779b8eSAndroid Build Coastguard Worker return af->getAAudioMixerBurstCount();
2860*ec779b8eSAndroid Build Coastguard Worker }
2861*ec779b8eSAndroid Build Coastguard Worker
getAAudioHardwareBurstMinUsec()2862*ec779b8eSAndroid Build Coastguard Worker int32_t AudioSystem::getAAudioHardwareBurstMinUsec() {
2863*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioFlinger> af = get_audio_flinger();
2864*ec779b8eSAndroid Build Coastguard Worker if (af == nullptr) return AudioFlingerServiceTraits::getError();
2865*ec779b8eSAndroid Build Coastguard Worker return af->getAAudioHardwareBurstMinUsec();
2866*ec779b8eSAndroid Build Coastguard Worker }
2867*ec779b8eSAndroid Build Coastguard Worker
getSupportedMixerAttributes(audio_port_handle_t portId,std::vector<audio_mixer_attributes_t> * mixerAttrs)2868*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getSupportedMixerAttributes(
2869*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId, std::vector<audio_mixer_attributes_t> *mixerAttrs) {
2870*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2871*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2872*ec779b8eSAndroid Build Coastguard Worker
2873*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2874*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioMixerAttributesInternal> _aidlReturn;
2875*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2876*ec779b8eSAndroid Build Coastguard Worker aps->getSupportedMixerAttributes(portIdAidl, &_aidlReturn)));
2877*ec779b8eSAndroid Build Coastguard Worker *mixerAttrs = VALUE_OR_RETURN_STATUS(
2878*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<audio_mixer_attributes_t>>(
2879*ec779b8eSAndroid Build Coastguard Worker _aidlReturn,
2880*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t));
2881*ec779b8eSAndroid Build Coastguard Worker return OK;
2882*ec779b8eSAndroid Build Coastguard Worker }
2883*ec779b8eSAndroid Build Coastguard Worker
setPreferredMixerAttributes(const audio_attributes_t * attr,audio_port_handle_t portId,uid_t uid,const audio_mixer_attributes_t * mixerAttr)2884*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::setPreferredMixerAttributes(const audio_attributes_t *attr,
2885*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId,
2886*ec779b8eSAndroid Build Coastguard Worker uid_t uid,
2887*ec779b8eSAndroid Build Coastguard Worker const audio_mixer_attributes_t *mixerAttr) {
2888*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2889*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2890*ec779b8eSAndroid Build Coastguard Worker
2891*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
2892*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
2893*ec779b8eSAndroid Build Coastguard Worker media::AudioMixerAttributesInternal mixerAttrAidl = VALUE_OR_RETURN_STATUS(
2894*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal(*mixerAttr));
2895*ec779b8eSAndroid Build Coastguard Worker int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
2896*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2897*ec779b8eSAndroid Build Coastguard Worker
2898*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2899*ec779b8eSAndroid Build Coastguard Worker aps->setPreferredMixerAttributes(attrAidl, portIdAidl, uidAidl, mixerAttrAidl));
2900*ec779b8eSAndroid Build Coastguard Worker }
2901*ec779b8eSAndroid Build Coastguard Worker
getPreferredMixerAttributes(const audio_attributes_t * attr,audio_port_handle_t portId,std::optional<audio_mixer_attributes_t> * mixerAttr)2902*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getPreferredMixerAttributes(
2903*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t *attr,
2904*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId,
2905*ec779b8eSAndroid Build Coastguard Worker std::optional<audio_mixer_attributes_t> *mixerAttr) {
2906*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2907*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2908*ec779b8eSAndroid Build Coastguard Worker
2909*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
2910*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
2911*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2912*ec779b8eSAndroid Build Coastguard Worker std::optional<media::AudioMixerAttributesInternal> _aidlReturn;
2913*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
2914*ec779b8eSAndroid Build Coastguard Worker aps->getPreferredMixerAttributes(attrAidl, portIdAidl, &_aidlReturn)));
2915*ec779b8eSAndroid Build Coastguard Worker
2916*ec779b8eSAndroid Build Coastguard Worker if (_aidlReturn.has_value()) {
2917*ec779b8eSAndroid Build Coastguard Worker *mixerAttr = VALUE_OR_RETURN_STATUS(
2918*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t(
2919*ec779b8eSAndroid Build Coastguard Worker _aidlReturn.value()));
2920*ec779b8eSAndroid Build Coastguard Worker }
2921*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
2922*ec779b8eSAndroid Build Coastguard Worker }
2923*ec779b8eSAndroid Build Coastguard Worker
clearPreferredMixerAttributes(const audio_attributes_t * attr,audio_port_handle_t portId,uid_t uid)2924*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::clearPreferredMixerAttributes(const audio_attributes_t *attr,
2925*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId,
2926*ec779b8eSAndroid Build Coastguard Worker uid_t uid) {
2927*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2928*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) return AudioPolicyServiceTraits::getError();
2929*ec779b8eSAndroid Build Coastguard Worker
2930*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioAttributes attrAidl = VALUE_OR_RETURN_STATUS(
2931*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(*attr));
2932*ec779b8eSAndroid Build Coastguard Worker int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
2933*ec779b8eSAndroid Build Coastguard Worker int32_t portIdAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2934*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(
2935*ec779b8eSAndroid Build Coastguard Worker aps->clearPreferredMixerAttributes(attrAidl, portIdAidl, uidAidl));
2936*ec779b8eSAndroid Build Coastguard Worker }
2937*ec779b8eSAndroid Build Coastguard Worker
getMmapPolicyForDevice(AudioMMapPolicyType policyType,audio_devices_t device,AudioMMapPolicyInfo * policyInfo)2938*ec779b8eSAndroid Build Coastguard Worker status_t AudioSystem::getMmapPolicyForDevice(AudioMMapPolicyType policyType,
2939*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device,
2940*ec779b8eSAndroid Build Coastguard Worker AudioMMapPolicyInfo *policyInfo) {
2941*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioPolicyService> aps = get_audio_policy_service();
2942*ec779b8eSAndroid Build Coastguard Worker if (aps == nullptr) {
2943*ec779b8eSAndroid Build Coastguard Worker return PERMISSION_DENIED;
2944*ec779b8eSAndroid Build Coastguard Worker }
2945*ec779b8eSAndroid Build Coastguard Worker policyInfo->device.type = VALUE_OR_RETURN_STATUS(
2946*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
2947*ec779b8eSAndroid Build Coastguard Worker return statusTFromBinderStatus(aps->getMmapPolicyForDevice(policyType, policyInfo));
2948*ec779b8eSAndroid Build Coastguard Worker }
2949*ec779b8eSAndroid Build Coastguard Worker
2950*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
2951*ec779b8eSAndroid Build Coastguard Worker
addAudioPortCallback(const sp<AudioPortCallback> & callback)2952*ec779b8eSAndroid Build Coastguard Worker int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
2953*ec779b8eSAndroid Build Coastguard Worker const sp<AudioPortCallback>& callback) {
2954*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
2955*ec779b8eSAndroid Build Coastguard Worker return mAudioPortCallbacks.insert(callback).second ? mAudioPortCallbacks.size() : -1;
2956*ec779b8eSAndroid Build Coastguard Worker }
2957*ec779b8eSAndroid Build Coastguard Worker
removeAudioPortCallback(const sp<AudioPortCallback> & callback)2958*ec779b8eSAndroid Build Coastguard Worker int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback(
2959*ec779b8eSAndroid Build Coastguard Worker const sp<AudioPortCallback>& callback) {
2960*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
2961*ec779b8eSAndroid Build Coastguard Worker return mAudioPortCallbacks.erase(callback) > 0 ? mAudioPortCallbacks.size() : -1;
2962*ec779b8eSAndroid Build Coastguard Worker }
2963*ec779b8eSAndroid Build Coastguard Worker
onAudioPortListUpdate()2964*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() {
2965*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
2966*ec779b8eSAndroid Build Coastguard Worker for (const auto& callback : mAudioPortCallbacks) {
2967*ec779b8eSAndroid Build Coastguard Worker callback->onAudioPortListUpdate();
2968*ec779b8eSAndroid Build Coastguard Worker }
2969*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
2970*ec779b8eSAndroid Build Coastguard Worker }
2971*ec779b8eSAndroid Build Coastguard Worker
onAudioPatchListUpdate()2972*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() {
2973*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
2974*ec779b8eSAndroid Build Coastguard Worker for (const auto& callback : mAudioPortCallbacks) {
2975*ec779b8eSAndroid Build Coastguard Worker callback->onAudioPatchListUpdate();
2976*ec779b8eSAndroid Build Coastguard Worker }
2977*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
2978*ec779b8eSAndroid Build Coastguard Worker }
2979*ec779b8eSAndroid Build Coastguard Worker
2980*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)2981*ec779b8eSAndroid Build Coastguard Worker int AudioSystem::AudioPolicyServiceClient::addAudioVolumeGroupCallback(
2982*ec779b8eSAndroid Build Coastguard Worker const sp<AudioVolumeGroupCallback>& callback) {
2983*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
2984*ec779b8eSAndroid Build Coastguard Worker return mAudioVolumeGroupCallbacks.insert(callback).second
2985*ec779b8eSAndroid Build Coastguard Worker ? mAudioVolumeGroupCallbacks.size() : -1;
2986*ec779b8eSAndroid Build Coastguard Worker }
2987*ec779b8eSAndroid Build Coastguard Worker
removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback> & callback)2988*ec779b8eSAndroid Build Coastguard Worker int AudioSystem::AudioPolicyServiceClient::removeAudioVolumeGroupCallback(
2989*ec779b8eSAndroid Build Coastguard Worker const sp<AudioVolumeGroupCallback>& callback) {
2990*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
2991*ec779b8eSAndroid Build Coastguard Worker return mAudioVolumeGroupCallbacks.erase(callback) > 0
2992*ec779b8eSAndroid Build Coastguard Worker ? mAudioVolumeGroupCallbacks.size() : -1;
2993*ec779b8eSAndroid Build Coastguard Worker }
2994*ec779b8eSAndroid Build Coastguard Worker
onAudioVolumeGroupChanged(int32_t group,int32_t flags)2995*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onAudioVolumeGroupChanged(int32_t group,
2996*ec779b8eSAndroid Build Coastguard Worker int32_t flags) {
2997*ec779b8eSAndroid Build Coastguard Worker volume_group_t groupLegacy = VALUE_OR_RETURN_BINDER_STATUS(
2998*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_volume_group_t(group));
2999*ec779b8eSAndroid Build Coastguard Worker int flagsLegacy = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(flags));
3000*ec779b8eSAndroid Build Coastguard Worker
3001*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
3002*ec779b8eSAndroid Build Coastguard Worker for (const auto& callback : mAudioVolumeGroupCallbacks) {
3003*ec779b8eSAndroid Build Coastguard Worker callback->onAudioVolumeGroupChanged(groupLegacy, flagsLegacy);
3004*ec779b8eSAndroid Build Coastguard Worker }
3005*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
3006*ec779b8eSAndroid Build Coastguard Worker }
3007*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
3008*ec779b8eSAndroid Build Coastguard Worker
onDynamicPolicyMixStateUpdate(const::std::string & regId,int32_t state)3009*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(
3010*ec779b8eSAndroid Build Coastguard Worker const ::std::string& regId, int32_t state) {
3011*ec779b8eSAndroid Build Coastguard Worker ALOGV("AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(%s, %d)", regId.c_str(), state);
3012*ec779b8eSAndroid Build Coastguard Worker
3013*ec779b8eSAndroid Build Coastguard Worker String8 regIdLegacy = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_string_view_String8(regId));
3014*ec779b8eSAndroid Build Coastguard Worker int stateLegacy = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(state));
3015*ec779b8eSAndroid Build Coastguard Worker dynamic_policy_callback cb = NULL;
3016*ec779b8eSAndroid Build Coastguard Worker {
3017*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gMutex);
3018*ec779b8eSAndroid Build Coastguard Worker cb = gDynPolicyCallback;
3019*ec779b8eSAndroid Build Coastguard Worker }
3020*ec779b8eSAndroid Build Coastguard Worker
3021*ec779b8eSAndroid Build Coastguard Worker if (cb != NULL) {
3022*ec779b8eSAndroid Build Coastguard Worker cb(DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE, regIdLegacy, stateLegacy);
3023*ec779b8eSAndroid Build Coastguard Worker }
3024*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
3025*ec779b8eSAndroid Build Coastguard Worker }
3026*ec779b8eSAndroid Build Coastguard Worker
onRecordingConfigurationUpdate(int32_t event,const media::RecordClientInfo & clientInfo,const AudioConfigBase & clientConfig,const std::vector<media::EffectDescriptor> & clientEffects,const AudioConfigBase & deviceConfig,const std::vector<media::EffectDescriptor> & effects,int32_t patchHandle,AudioSource source)3027*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate(
3028*ec779b8eSAndroid Build Coastguard Worker int32_t event,
3029*ec779b8eSAndroid Build Coastguard Worker const media::RecordClientInfo& clientInfo,
3030*ec779b8eSAndroid Build Coastguard Worker const AudioConfigBase& clientConfig,
3031*ec779b8eSAndroid Build Coastguard Worker const std::vector<media::EffectDescriptor>& clientEffects,
3032*ec779b8eSAndroid Build Coastguard Worker const AudioConfigBase& deviceConfig,
3033*ec779b8eSAndroid Build Coastguard Worker const std::vector<media::EffectDescriptor>& effects,
3034*ec779b8eSAndroid Build Coastguard Worker int32_t patchHandle,
3035*ec779b8eSAndroid Build Coastguard Worker AudioSource source) {
3036*ec779b8eSAndroid Build Coastguard Worker record_config_callback cb = NULL;
3037*ec779b8eSAndroid Build Coastguard Worker {
3038*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gMutex);
3039*ec779b8eSAndroid Build Coastguard Worker cb = gRecordConfigCallback;
3040*ec779b8eSAndroid Build Coastguard Worker }
3041*ec779b8eSAndroid Build Coastguard Worker
3042*ec779b8eSAndroid Build Coastguard Worker if (cb != NULL) {
3043*ec779b8eSAndroid Build Coastguard Worker int eventLegacy = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(event));
3044*ec779b8eSAndroid Build Coastguard Worker record_client_info_t clientInfoLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3045*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_RecordClientInfo_record_client_info_t(clientInfo));
3046*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t clientConfigLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3047*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioConfigBase_audio_config_base_t(clientConfig, true /*isInput*/));
3048*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> clientEffectsLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3049*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<effect_descriptor_t>>(
3050*ec779b8eSAndroid Build Coastguard Worker clientEffects,
3051*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_EffectDescriptor_effect_descriptor_t));
3052*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t deviceConfigLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3053*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioConfigBase_audio_config_base_t(deviceConfig, true /*isInput*/));
3054*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> effectsLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3055*ec779b8eSAndroid Build Coastguard Worker convertContainer<std::vector<effect_descriptor_t>>(
3056*ec779b8eSAndroid Build Coastguard Worker effects,
3057*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_EffectDescriptor_effect_descriptor_t));
3058*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t patchHandleLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3059*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_audio_patch_handle_t(patchHandle));
3060*ec779b8eSAndroid Build Coastguard Worker audio_source_t sourceLegacy = VALUE_OR_RETURN_BINDER_STATUS(
3061*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioSource_audio_source_t(source));
3062*ec779b8eSAndroid Build Coastguard Worker cb(eventLegacy, &clientInfoLegacy, &clientConfigLegacy, clientEffectsLegacy,
3063*ec779b8eSAndroid Build Coastguard Worker &deviceConfigLegacy, effectsLegacy, patchHandleLegacy, sourceLegacy);
3064*ec779b8eSAndroid Build Coastguard Worker }
3065*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
3066*ec779b8eSAndroid Build Coastguard Worker }
3067*ec779b8eSAndroid Build Coastguard Worker
onRoutingUpdated()3068*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onRoutingUpdated() {
3069*ec779b8eSAndroid Build Coastguard Worker routing_callback cb = NULL;
3070*ec779b8eSAndroid Build Coastguard Worker {
3071*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gMutex);
3072*ec779b8eSAndroid Build Coastguard Worker cb = gRoutingCallback;
3073*ec779b8eSAndroid Build Coastguard Worker }
3074*ec779b8eSAndroid Build Coastguard Worker
3075*ec779b8eSAndroid Build Coastguard Worker if (cb != NULL) {
3076*ec779b8eSAndroid Build Coastguard Worker cb();
3077*ec779b8eSAndroid Build Coastguard Worker }
3078*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
3079*ec779b8eSAndroid Build Coastguard Worker }
3080*ec779b8eSAndroid Build Coastguard Worker
onVolumeRangeInitRequest()3081*ec779b8eSAndroid Build Coastguard Worker Status AudioSystem::AudioPolicyServiceClient::onVolumeRangeInitRequest() {
3082*ec779b8eSAndroid Build Coastguard Worker vol_range_init_req_callback cb = NULL;
3083*ec779b8eSAndroid Build Coastguard Worker {
3084*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(AudioSystem::gMutex);
3085*ec779b8eSAndroid Build Coastguard Worker cb = gVolRangeInitReqCallback;
3086*ec779b8eSAndroid Build Coastguard Worker }
3087*ec779b8eSAndroid Build Coastguard Worker
3088*ec779b8eSAndroid Build Coastguard Worker if (cb != NULL) {
3089*ec779b8eSAndroid Build Coastguard Worker cb();
3090*ec779b8eSAndroid Build Coastguard Worker }
3091*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
3092*ec779b8eSAndroid Build Coastguard Worker }
3093*ec779b8eSAndroid Build Coastguard Worker
onServiceDied()3094*ec779b8eSAndroid Build Coastguard Worker void AudioSystem::AudioPolicyServiceClient::onServiceDied() {
3095*ec779b8eSAndroid Build Coastguard Worker std::lock_guard _l(mMutex);
3096*ec779b8eSAndroid Build Coastguard Worker for (const auto& callback : mAudioPortCallbacks) {
3097*ec779b8eSAndroid Build Coastguard Worker callback->onServiceDied();
3098*ec779b8eSAndroid Build Coastguard Worker }
3099*ec779b8eSAndroid Build Coastguard Worker for (const auto& callback : mAudioVolumeGroupCallbacks) {
3100*ec779b8eSAndroid Build Coastguard Worker callback->onServiceDied();
3101*ec779b8eSAndroid Build Coastguard Worker }
3102*ec779b8eSAndroid Build Coastguard Worker }
3103*ec779b8eSAndroid Build Coastguard Worker
3104*ec779b8eSAndroid Build Coastguard Worker ConversionResult<record_client_info_t>
aidl2legacy_RecordClientInfo_record_client_info_t(const media::RecordClientInfo & aidl)3105*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_RecordClientInfo_record_client_info_t(const media::RecordClientInfo& aidl) {
3106*ec779b8eSAndroid Build Coastguard Worker record_client_info_t legacy;
3107*ec779b8eSAndroid Build Coastguard Worker legacy.riid = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_unique_id_t(aidl.riid));
3108*ec779b8eSAndroid Build Coastguard Worker legacy.uid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.uid));
3109*ec779b8eSAndroid Build Coastguard Worker legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
3110*ec779b8eSAndroid Build Coastguard Worker legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(aidl.source));
3111*ec779b8eSAndroid Build Coastguard Worker legacy.port_id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
3112*ec779b8eSAndroid Build Coastguard Worker legacy.silenced = aidl.silenced;
3113*ec779b8eSAndroid Build Coastguard Worker return legacy;
3114*ec779b8eSAndroid Build Coastguard Worker }
3115*ec779b8eSAndroid Build Coastguard Worker
3116*ec779b8eSAndroid Build Coastguard Worker ConversionResult<media::RecordClientInfo>
legacy2aidl_record_client_info_t_RecordClientInfo(const record_client_info_t & legacy)3117*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_record_client_info_t_RecordClientInfo(const record_client_info_t& legacy) {
3118*ec779b8eSAndroid Build Coastguard Worker media::RecordClientInfo aidl;
3119*ec779b8eSAndroid Build Coastguard Worker aidl.riid = VALUE_OR_RETURN(legacy2aidl_audio_unique_id_t_int32_t(legacy.riid));
3120*ec779b8eSAndroid Build Coastguard Worker aidl.uid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.uid));
3121*ec779b8eSAndroid Build Coastguard Worker aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
3122*ec779b8eSAndroid Build Coastguard Worker aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source));
3123*ec779b8eSAndroid Build Coastguard Worker aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.port_id));
3124*ec779b8eSAndroid Build Coastguard Worker aidl.silenced = legacy.silenced;
3125*ec779b8eSAndroid Build Coastguard Worker return aidl;
3126*ec779b8eSAndroid Build Coastguard Worker }
3127*ec779b8eSAndroid Build Coastguard Worker
3128*ec779b8eSAndroid Build Coastguard Worker } // namespace android
3129