xref: /aosp_15_r20/frameworks/av/media/libaudioclient/AudioSystem.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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