xref: /aosp_15_r20/frameworks/av/media/libaudioclient/AudioEffect.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2010, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
20*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "AudioEffect"
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <limits.h>
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker #include <android/media/IAudioPolicyService.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversion.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioEffect.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <media/PolicyAidlConversion.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/ShmemCompat.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <private/media/AudioEffectShared.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker namespace android {
36*ec779b8eSAndroid Build Coastguard Worker using aidl_utils::statusTFromBinderStatus;
37*ec779b8eSAndroid Build Coastguard Worker using binder::Status;
38*ec779b8eSAndroid Build Coastguard Worker using media::IAudioPolicyService;
39*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioSource;
40*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUuid;
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker namespace {
43*ec779b8eSAndroid Build Coastguard Worker 
44*ec779b8eSAndroid Build Coastguard Worker // Copy from a raw pointer + size into a vector of bytes.
appendToBuffer(const void * data,size_t size,std::vector<uint8_t> * buffer)45*ec779b8eSAndroid Build Coastguard Worker void appendToBuffer(const void* data,
46*ec779b8eSAndroid Build Coastguard Worker                     size_t size,
47*ec779b8eSAndroid Build Coastguard Worker                     std::vector<uint8_t>* buffer) {
48*ec779b8eSAndroid Build Coastguard Worker     const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
49*ec779b8eSAndroid Build Coastguard Worker     buffer->insert(buffer->end(), p, p + size);
50*ec779b8eSAndroid Build Coastguard Worker }
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker }  // namespace
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
55*ec779b8eSAndroid Build Coastguard Worker 
AudioEffect(const android::content::AttributionSourceState & attributionSource)56*ec779b8eSAndroid Build Coastguard Worker AudioEffect::AudioEffect(const android::content::AttributionSourceState& attributionSource)
57*ec779b8eSAndroid Build Coastguard Worker     : mClientAttributionSource(attributionSource)
58*ec779b8eSAndroid Build Coastguard Worker {
59*ec779b8eSAndroid Build Coastguard Worker }
60*ec779b8eSAndroid Build Coastguard Worker 
set(const effect_uuid_t * type,const effect_uuid_t * uuid,int32_t priority,const wp<IAudioEffectCallback> & callback,audio_session_t sessionId,audio_io_handle_t io,const AudioDeviceTypeAddr & device,bool probe,bool notifyFramesProcessed)61*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::set(const effect_uuid_t *type,
62*ec779b8eSAndroid Build Coastguard Worker                 const effect_uuid_t *uuid,
63*ec779b8eSAndroid Build Coastguard Worker                 int32_t priority,
64*ec779b8eSAndroid Build Coastguard Worker                 const wp<IAudioEffectCallback>& callback,
65*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t sessionId,
66*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t io,
67*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddr& device,
68*ec779b8eSAndroid Build Coastguard Worker                 bool probe,
69*ec779b8eSAndroid Build Coastguard Worker                 bool notifyFramesProcessed)
70*ec779b8eSAndroid Build Coastguard Worker {
71*ec779b8eSAndroid Build Coastguard Worker     sp<media::IEffect> iEffect;
72*ec779b8eSAndroid Build Coastguard Worker     sp<IMemory> cblk;
73*ec779b8eSAndroid Build Coastguard Worker     int enabled;
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     ALOGV("set %p uuid: %p timeLow %08x", this, type, type ? type->timeLow : 0);
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker     if (mIEffect != 0) {
78*ec779b8eSAndroid Build Coastguard Worker         ALOGW("Effect already in use");
79*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
80*ec779b8eSAndroid Build Coastguard Worker     }
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     if (sessionId == AUDIO_SESSION_DEVICE && io != AUDIO_IO_HANDLE_NONE) {
83*ec779b8eSAndroid Build Coastguard Worker         ALOGW("IO handle should not be specified for device effect");
84*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
85*ec779b8eSAndroid Build Coastguard Worker     }
86*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
87*ec779b8eSAndroid Build Coastguard Worker     if (audioFlinger == 0) {
88*ec779b8eSAndroid Build Coastguard Worker         ALOGE("set(): Could not get audioflinger");
89*ec779b8eSAndroid Build Coastguard Worker         return NO_INIT;
90*ec779b8eSAndroid Build Coastguard Worker     }
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker     if (type == nullptr && uuid == nullptr) {
93*ec779b8eSAndroid Build Coastguard Worker         ALOGW("Must specify at least type or uuid");
94*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
95*ec779b8eSAndroid Build Coastguard Worker     }
96*ec779b8eSAndroid Build Coastguard Worker     mProbe = probe;
97*ec779b8eSAndroid Build Coastguard Worker     mPriority = priority;
98*ec779b8eSAndroid Build Coastguard Worker     mSessionId = sessionId;
99*ec779b8eSAndroid Build Coastguard Worker     mCallback = callback;
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     memset(&mDescriptor, 0, sizeof(effect_descriptor_t));
102*ec779b8eSAndroid Build Coastguard Worker     mDescriptor.type = *(type != nullptr ? type : EFFECT_UUID_NULL);
103*ec779b8eSAndroid Build Coastguard Worker     mDescriptor.uuid = *(uuid != nullptr ? uuid : EFFECT_UUID_NULL);
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     // TODO b/182392769: use attribution source util
106*ec779b8eSAndroid Build Coastguard Worker     mIEffectClient = new EffectClient(this);
107*ec779b8eSAndroid Build Coastguard Worker     pid_t pid = IPCThreadState::self()->getCallingPid();
108*ec779b8eSAndroid Build Coastguard Worker     mClientAttributionSource.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(pid));
109*ec779b8eSAndroid Build Coastguard Worker     pid_t uid = IPCThreadState::self()->getCallingUid();
110*ec779b8eSAndroid Build Coastguard Worker     mClientAttributionSource.uid = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker     media::CreateEffectRequest request;
113*ec779b8eSAndroid Build Coastguard Worker     request.desc = VALUE_OR_RETURN_STATUS(
114*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_effect_descriptor_t_EffectDescriptor(mDescriptor));
115*ec779b8eSAndroid Build Coastguard Worker     request.client = mIEffectClient;
116*ec779b8eSAndroid Build Coastguard Worker     request.priority = priority;
117*ec779b8eSAndroid Build Coastguard Worker     request.output = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
118*ec779b8eSAndroid Build Coastguard Worker     request.sessionId = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(mSessionId));
119*ec779b8eSAndroid Build Coastguard Worker     request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(device));
120*ec779b8eSAndroid Build Coastguard Worker     request.attributionSource = mClientAttributionSource;
121*ec779b8eSAndroid Build Coastguard Worker     request.probe = probe;
122*ec779b8eSAndroid Build Coastguard Worker     request.notifyFramesProcessed = notifyFramesProcessed;
123*ec779b8eSAndroid Build Coastguard Worker 
124*ec779b8eSAndroid Build Coastguard Worker     media::CreateEffectResponse response;
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker     mStatus = audioFlinger->createEffect(request, &response);
127*ec779b8eSAndroid Build Coastguard Worker 
128*ec779b8eSAndroid Build Coastguard Worker     if (mStatus == OK) {
129*ec779b8eSAndroid Build Coastguard Worker         if (response.alreadyExists) {
130*ec779b8eSAndroid Build Coastguard Worker             mStatus = ALREADY_EXISTS;
131*ec779b8eSAndroid Build Coastguard Worker         }
132*ec779b8eSAndroid Build Coastguard Worker         mId = response.id;
133*ec779b8eSAndroid Build Coastguard Worker         enabled = response.enabled;
134*ec779b8eSAndroid Build Coastguard Worker         iEffect = response.effect;
135*ec779b8eSAndroid Build Coastguard Worker         mDescriptor = VALUE_OR_RETURN_STATUS(
136*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_EffectDescriptor_effect_descriptor_t(response.desc));
137*ec779b8eSAndroid Build Coastguard Worker     }
138*ec779b8eSAndroid Build Coastguard Worker 
139*ec779b8eSAndroid Build Coastguard Worker     // In probe mode, we stop here and return the status: the IEffect interface to
140*ec779b8eSAndroid Build Coastguard Worker     // audio flinger will not be retained. initCheck() will return the creation status
141*ec779b8eSAndroid Build Coastguard Worker     // but all other APIs will return invalid operation.
142*ec779b8eSAndroid Build Coastguard Worker     if (probe || iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) {
143*ec779b8eSAndroid Build Coastguard Worker         char typeBuffer[64] = {}, uuidBuffer[64] = {};
144*ec779b8eSAndroid Build Coastguard Worker         guidToString(type, typeBuffer, sizeof(typeBuffer));
145*ec779b8eSAndroid Build Coastguard Worker         guidToString(uuid, uuidBuffer, sizeof(uuidBuffer));
146*ec779b8eSAndroid Build Coastguard Worker         ALOGE_IF(!probe, "set(): AudioFlinger could not create effect %s / %s, status: %d",
147*ec779b8eSAndroid Build Coastguard Worker                 type != nullptr ? typeBuffer : "NULL",
148*ec779b8eSAndroid Build Coastguard Worker                 uuid != nullptr ? uuidBuffer : "NULL",
149*ec779b8eSAndroid Build Coastguard Worker                 mStatus);
150*ec779b8eSAndroid Build Coastguard Worker         if (!probe && iEffect == 0) {
151*ec779b8eSAndroid Build Coastguard Worker             mStatus = NO_INIT;
152*ec779b8eSAndroid Build Coastguard Worker         }
153*ec779b8eSAndroid Build Coastguard Worker         return mStatus;
154*ec779b8eSAndroid Build Coastguard Worker     }
155*ec779b8eSAndroid Build Coastguard Worker 
156*ec779b8eSAndroid Build Coastguard Worker     mEnabled = (volatile int32_t)enabled;
157*ec779b8eSAndroid Build Coastguard Worker 
158*ec779b8eSAndroid Build Coastguard Worker     if (media::SharedFileRegion shmem;
159*ec779b8eSAndroid Build Coastguard Worker             !iEffect->getCblk(&shmem).isOk()
160*ec779b8eSAndroid Build Coastguard Worker             || !convertSharedFileRegionToIMemory(shmem, &cblk)
161*ec779b8eSAndroid Build Coastguard Worker             || cblk == 0) {
162*ec779b8eSAndroid Build Coastguard Worker         mStatus = NO_INIT;
163*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Could not get control block");
164*ec779b8eSAndroid Build Coastguard Worker         return mStatus;
165*ec779b8eSAndroid Build Coastguard Worker     }
166*ec779b8eSAndroid Build Coastguard Worker 
167*ec779b8eSAndroid Build Coastguard Worker     mIEffect = iEffect;
168*ec779b8eSAndroid Build Coastguard Worker     mCblkMemory = cblk;
169*ec779b8eSAndroid Build Coastguard Worker     // TODO: Using unsecurePointer() has some associated security pitfalls
170*ec779b8eSAndroid Build Coastguard Worker     //       (see declaration for details).
171*ec779b8eSAndroid Build Coastguard Worker     //       Either document why it is safe in this case or address the
172*ec779b8eSAndroid Build Coastguard Worker     //       issue (e.g. by copying).
173*ec779b8eSAndroid Build Coastguard Worker     mCblk = static_cast<effect_param_cblk_t*>(cblk->unsecurePointer());
174*ec779b8eSAndroid Build Coastguard Worker     int bufOffset = ((sizeof(effect_param_cblk_t) - 1) / sizeof(int) + 1) * sizeof(int);
175*ec779b8eSAndroid Build Coastguard Worker     mCblk->buffer = (uint8_t *)mCblk + bufOffset;
176*ec779b8eSAndroid Build Coastguard Worker 
177*ec779b8eSAndroid Build Coastguard Worker     IInterface::asBinder(iEffect)->linkToDeath(mIEffectClient);
178*ec779b8eSAndroid Build Coastguard Worker     ALOGV("set() %p OK effect: %s id: %d status %d enabled %d pid %d", this, mDescriptor.name, mId,
179*ec779b8eSAndroid Build Coastguard Worker             mStatus, mEnabled, mClientAttributionSource.pid);
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker     if (!audio_is_global_session(mSessionId)) {
182*ec779b8eSAndroid Build Coastguard Worker         AudioSystem::acquireAudioSessionId(mSessionId, pid, uid);
183*ec779b8eSAndroid Build Coastguard Worker     }
184*ec779b8eSAndroid Build Coastguard Worker 
185*ec779b8eSAndroid Build Coastguard Worker     return mStatus;
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker 
188*ec779b8eSAndroid Build Coastguard Worker namespace {
189*ec779b8eSAndroid Build Coastguard Worker class LegacyCallbackWrapper : public AudioEffect::IAudioEffectCallback {
190*ec779b8eSAndroid Build Coastguard Worker  public:
LegacyCallbackWrapper(AudioEffect::legacy_callback_t callback,void * user)191*ec779b8eSAndroid Build Coastguard Worker     LegacyCallbackWrapper(AudioEffect::legacy_callback_t callback, void* user):
192*ec779b8eSAndroid Build Coastguard Worker             mCallback(callback), mUser(user) {}
193*ec779b8eSAndroid Build Coastguard Worker  private:
onControlStatusChanged(bool isGranted)194*ec779b8eSAndroid Build Coastguard Worker     void onControlStatusChanged(bool isGranted) override {
195*ec779b8eSAndroid Build Coastguard Worker         mCallback(AudioEffect::EVENT_CONTROL_STATUS_CHANGED, mUser, &isGranted);
196*ec779b8eSAndroid Build Coastguard Worker     }
197*ec779b8eSAndroid Build Coastguard Worker 
onEnableStatusChanged(bool isEnabled)198*ec779b8eSAndroid Build Coastguard Worker     void onEnableStatusChanged(bool isEnabled) override {
199*ec779b8eSAndroid Build Coastguard Worker         mCallback(AudioEffect::EVENT_ENABLE_STATUS_CHANGED, mUser, &isEnabled);
200*ec779b8eSAndroid Build Coastguard Worker     }
201*ec779b8eSAndroid Build Coastguard Worker 
onParameterChanged(std::vector<uint8_t> param)202*ec779b8eSAndroid Build Coastguard Worker     void onParameterChanged(std::vector<uint8_t> param) override {
203*ec779b8eSAndroid Build Coastguard Worker         mCallback(AudioEffect::EVENT_PARAMETER_CHANGED, mUser, param.data());
204*ec779b8eSAndroid Build Coastguard Worker     }
205*ec779b8eSAndroid Build Coastguard Worker 
onError(status_t errorCode)206*ec779b8eSAndroid Build Coastguard Worker     void onError(status_t errorCode) override {
207*ec779b8eSAndroid Build Coastguard Worker         mCallback(AudioEffect::EVENT_ERROR, mUser, &errorCode);
208*ec779b8eSAndroid Build Coastguard Worker     }
209*ec779b8eSAndroid Build Coastguard Worker 
onFramesProcessed(int32_t framesProcessed)210*ec779b8eSAndroid Build Coastguard Worker     void onFramesProcessed(int32_t framesProcessed) override {
211*ec779b8eSAndroid Build Coastguard Worker         mCallback(AudioEffect::EVENT_FRAMES_PROCESSED, mUser, &framesProcessed);
212*ec779b8eSAndroid Build Coastguard Worker     }
213*ec779b8eSAndroid Build Coastguard Worker 
214*ec779b8eSAndroid Build Coastguard Worker     const AudioEffect::legacy_callback_t mCallback;
215*ec779b8eSAndroid Build Coastguard Worker     void* const mUser;
216*ec779b8eSAndroid Build Coastguard Worker };
217*ec779b8eSAndroid Build Coastguard Worker } // namespace
218*ec779b8eSAndroid Build Coastguard Worker 
set(const effect_uuid_t * type,const effect_uuid_t * uuid,int32_t priority,legacy_callback_t cbf,void * user,audio_session_t sessionId,audio_io_handle_t io,const AudioDeviceTypeAddr & device,bool probe,bool notifyFramesProcessed)219*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::set(const effect_uuid_t *type,
220*ec779b8eSAndroid Build Coastguard Worker                 const effect_uuid_t *uuid,
221*ec779b8eSAndroid Build Coastguard Worker                 int32_t priority,
222*ec779b8eSAndroid Build Coastguard Worker                 legacy_callback_t cbf,
223*ec779b8eSAndroid Build Coastguard Worker                 void* user,
224*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t sessionId,
225*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t io,
226*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddr& device,
227*ec779b8eSAndroid Build Coastguard Worker                 bool probe,
228*ec779b8eSAndroid Build Coastguard Worker                 bool notifyFramesProcessed)
229*ec779b8eSAndroid Build Coastguard Worker {
230*ec779b8eSAndroid Build Coastguard Worker     if (cbf != nullptr) {
231*ec779b8eSAndroid Build Coastguard Worker         mLegacyWrapper = sp<LegacyCallbackWrapper>::make(cbf, user);
232*ec779b8eSAndroid Build Coastguard Worker     } else if (user != nullptr) {
233*ec779b8eSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("%s: User provided without callback", __func__);
234*ec779b8eSAndroid Build Coastguard Worker     }
235*ec779b8eSAndroid Build Coastguard Worker     return set(type, uuid, priority, mLegacyWrapper, sessionId, io, device, probe,
236*ec779b8eSAndroid Build Coastguard Worker                notifyFramesProcessed);
237*ec779b8eSAndroid Build Coastguard Worker }
set(const char * typeStr,const char * uuidStr,int32_t priority,const wp<IAudioEffectCallback> & callback,audio_session_t sessionId,audio_io_handle_t io,const AudioDeviceTypeAddr & device,bool probe,bool notifyFramesProcessed)238*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::set(const char *typeStr,
239*ec779b8eSAndroid Build Coastguard Worker                 const char *uuidStr,
240*ec779b8eSAndroid Build Coastguard Worker                 int32_t priority,
241*ec779b8eSAndroid Build Coastguard Worker                 const wp<IAudioEffectCallback>& callback,
242*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t sessionId,
243*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t io,
244*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddr& device,
245*ec779b8eSAndroid Build Coastguard Worker                 bool probe,
246*ec779b8eSAndroid Build Coastguard Worker                 bool notifyFramesProcessed)
247*ec779b8eSAndroid Build Coastguard Worker {
248*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t type;
249*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t *pType = nullptr;
250*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t uuid;
251*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t *pUuid = nullptr;
252*ec779b8eSAndroid Build Coastguard Worker 
253*ec779b8eSAndroid Build Coastguard Worker     ALOGV("AudioEffect::set string\n - type: %s\n - uuid: %s",
254*ec779b8eSAndroid Build Coastguard Worker             typeStr ? typeStr : "nullptr", uuidStr ? uuidStr : "nullptr");
255*ec779b8eSAndroid Build Coastguard Worker 
256*ec779b8eSAndroid Build Coastguard Worker     if (stringToGuid(typeStr, &type) == NO_ERROR) {
257*ec779b8eSAndroid Build Coastguard Worker         pType = &type;
258*ec779b8eSAndroid Build Coastguard Worker     }
259*ec779b8eSAndroid Build Coastguard Worker     if (stringToGuid(uuidStr, &uuid) == NO_ERROR) {
260*ec779b8eSAndroid Build Coastguard Worker         pUuid = &uuid;
261*ec779b8eSAndroid Build Coastguard Worker     }
262*ec779b8eSAndroid Build Coastguard Worker 
263*ec779b8eSAndroid Build Coastguard Worker     return set(pType, pUuid, priority, callback, sessionId, io,
264*ec779b8eSAndroid Build Coastguard Worker                device, probe, notifyFramesProcessed);
265*ec779b8eSAndroid Build Coastguard Worker }
266*ec779b8eSAndroid Build Coastguard Worker 
set(const char * typeStr,const char * uuidStr,int32_t priority,legacy_callback_t cbf,void * user,audio_session_t sessionId,audio_io_handle_t io,const AudioDeviceTypeAddr & device,bool probe,bool notifyFramesProcessed)267*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::set(const char *typeStr,
268*ec779b8eSAndroid Build Coastguard Worker                 const char *uuidStr,
269*ec779b8eSAndroid Build Coastguard Worker                 int32_t priority,
270*ec779b8eSAndroid Build Coastguard Worker                 legacy_callback_t cbf,
271*ec779b8eSAndroid Build Coastguard Worker                 void* user,
272*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t sessionId,
273*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t io,
274*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddr& device,
275*ec779b8eSAndroid Build Coastguard Worker                 bool probe,
276*ec779b8eSAndroid Build Coastguard Worker                 bool notifyFramesProcessed)
277*ec779b8eSAndroid Build Coastguard Worker {
278*ec779b8eSAndroid Build Coastguard Worker     if (cbf != nullptr) {
279*ec779b8eSAndroid Build Coastguard Worker         mLegacyWrapper = sp<LegacyCallbackWrapper>::make(cbf, user);
280*ec779b8eSAndroid Build Coastguard Worker     } else if (user != nullptr) {
281*ec779b8eSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("%s: User provided without callback", __func__);
282*ec779b8eSAndroid Build Coastguard Worker     }
283*ec779b8eSAndroid Build Coastguard Worker     return set(typeStr, uuidStr, priority, mLegacyWrapper, sessionId, io, device, probe,
284*ec779b8eSAndroid Build Coastguard Worker                notifyFramesProcessed);
285*ec779b8eSAndroid Build Coastguard Worker }
~AudioEffect()286*ec779b8eSAndroid Build Coastguard Worker AudioEffect::~AudioEffect()
287*ec779b8eSAndroid Build Coastguard Worker {
288*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Destructor %p", this);
289*ec779b8eSAndroid Build Coastguard Worker 
290*ec779b8eSAndroid Build Coastguard Worker     if (!mProbe && (mStatus == NO_ERROR || mStatus == ALREADY_EXISTS)) {
291*ec779b8eSAndroid Build Coastguard Worker         if (!audio_is_global_session(mSessionId)) {
292*ec779b8eSAndroid Build Coastguard Worker             AudioSystem::releaseAudioSessionId(mSessionId,
293*ec779b8eSAndroid Build Coastguard Worker                 VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mClientAttributionSource.pid)));
294*ec779b8eSAndroid Build Coastguard Worker         }
295*ec779b8eSAndroid Build Coastguard Worker         if (mIEffect != nullptr) {
296*ec779b8eSAndroid Build Coastguard Worker             mIEffect->disconnect();
297*ec779b8eSAndroid Build Coastguard Worker             IInterface::asBinder(mIEffect)->unlinkToDeath(mIEffectClient);
298*ec779b8eSAndroid Build Coastguard Worker         }
299*ec779b8eSAndroid Build Coastguard Worker         mIEffect.clear();
300*ec779b8eSAndroid Build Coastguard Worker         mCblkMemory.clear();
301*ec779b8eSAndroid Build Coastguard Worker     }
302*ec779b8eSAndroid Build Coastguard Worker     mIEffectClient.clear();
303*ec779b8eSAndroid Build Coastguard Worker     IPCThreadState::self()->flushCommands();
304*ec779b8eSAndroid Build Coastguard Worker }
305*ec779b8eSAndroid Build Coastguard Worker 
306*ec779b8eSAndroid Build Coastguard Worker 
initCheck() const307*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::initCheck() const
308*ec779b8eSAndroid Build Coastguard Worker {
309*ec779b8eSAndroid Build Coastguard Worker     return mStatus;
310*ec779b8eSAndroid Build Coastguard Worker }
311*ec779b8eSAndroid Build Coastguard Worker 
312*ec779b8eSAndroid Build Coastguard Worker // -------------------------------------------------------------------------
313*ec779b8eSAndroid Build Coastguard Worker 
descriptor() const314*ec779b8eSAndroid Build Coastguard Worker effect_descriptor_t AudioEffect::descriptor() const
315*ec779b8eSAndroid Build Coastguard Worker {
316*ec779b8eSAndroid Build Coastguard Worker     return mDescriptor;
317*ec779b8eSAndroid Build Coastguard Worker }
318*ec779b8eSAndroid Build Coastguard Worker 
getEnabled() const319*ec779b8eSAndroid Build Coastguard Worker bool AudioEffect::getEnabled() const
320*ec779b8eSAndroid Build Coastguard Worker {
321*ec779b8eSAndroid Build Coastguard Worker     return (mEnabled != 0);
322*ec779b8eSAndroid Build Coastguard Worker }
323*ec779b8eSAndroid Build Coastguard Worker 
setEnabled(bool enabled)324*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::setEnabled(bool enabled)
325*ec779b8eSAndroid Build Coastguard Worker {
326*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
327*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
328*ec779b8eSAndroid Build Coastguard Worker     }
329*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR) {
330*ec779b8eSAndroid Build Coastguard Worker         return (mStatus == ALREADY_EXISTS) ? (status_t) INVALID_OPERATION : mStatus;
331*ec779b8eSAndroid Build Coastguard Worker     }
332*ec779b8eSAndroid Build Coastguard Worker 
333*ec779b8eSAndroid Build Coastguard Worker     status_t status = NO_ERROR;
334*ec779b8eSAndroid Build Coastguard Worker     AutoMutex lock(mLock);
335*ec779b8eSAndroid Build Coastguard Worker     if (enabled != mEnabled) {
336*ec779b8eSAndroid Build Coastguard Worker         Status bs;
337*ec779b8eSAndroid Build Coastguard Worker 
338*ec779b8eSAndroid Build Coastguard Worker         if (enabled) {
339*ec779b8eSAndroid Build Coastguard Worker             ALOGV("enable %p", this);
340*ec779b8eSAndroid Build Coastguard Worker             bs = mIEffect->enable(&status);
341*ec779b8eSAndroid Build Coastguard Worker         } else {
342*ec779b8eSAndroid Build Coastguard Worker             ALOGV("disable %p", this);
343*ec779b8eSAndroid Build Coastguard Worker             bs = mIEffect->disable(&status);
344*ec779b8eSAndroid Build Coastguard Worker         }
345*ec779b8eSAndroid Build Coastguard Worker         if (!bs.isOk()) {
346*ec779b8eSAndroid Build Coastguard Worker             status = statusTFromBinderStatus(bs);
347*ec779b8eSAndroid Build Coastguard Worker         }
348*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
349*ec779b8eSAndroid Build Coastguard Worker             mEnabled = enabled;
350*ec779b8eSAndroid Build Coastguard Worker         }
351*ec779b8eSAndroid Build Coastguard Worker     }
352*ec779b8eSAndroid Build Coastguard Worker     return status;
353*ec779b8eSAndroid Build Coastguard Worker }
354*ec779b8eSAndroid Build Coastguard Worker 
command(uint32_t cmdCode,uint32_t cmdSize,void * cmdData,uint32_t * replySize,void * replyData)355*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::command(uint32_t cmdCode,
356*ec779b8eSAndroid Build Coastguard Worker                               uint32_t cmdSize,
357*ec779b8eSAndroid Build Coastguard Worker                               void *cmdData,
358*ec779b8eSAndroid Build Coastguard Worker                               uint32_t *replySize,
359*ec779b8eSAndroid Build Coastguard Worker                               void *replyData)
360*ec779b8eSAndroid Build Coastguard Worker {
361*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
362*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
363*ec779b8eSAndroid Build Coastguard Worker     }
364*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS) {
365*ec779b8eSAndroid Build Coastguard Worker         ALOGV("command() bad status %d", mStatus);
366*ec779b8eSAndroid Build Coastguard Worker         return mStatus;
367*ec779b8eSAndroid Build Coastguard Worker     }
368*ec779b8eSAndroid Build Coastguard Worker 
369*ec779b8eSAndroid Build Coastguard Worker     std::unique_lock ul(mLock, std::defer_lock);
370*ec779b8eSAndroid Build Coastguard Worker     if (cmdCode == EFFECT_CMD_ENABLE || cmdCode == EFFECT_CMD_DISABLE) {
371*ec779b8eSAndroid Build Coastguard Worker         ul.lock();
372*ec779b8eSAndroid Build Coastguard Worker         if (mEnabled == (cmdCode == EFFECT_CMD_ENABLE)) {
373*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
374*ec779b8eSAndroid Build Coastguard Worker         }
375*ec779b8eSAndroid Build Coastguard Worker         if (replySize == nullptr || *replySize != sizeof(status_t) || replyData == nullptr) {
376*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
377*ec779b8eSAndroid Build Coastguard Worker         }
378*ec779b8eSAndroid Build Coastguard Worker     }
379*ec779b8eSAndroid Build Coastguard Worker 
380*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> data;
381*ec779b8eSAndroid Build Coastguard Worker     appendToBuffer(cmdData, cmdSize, &data);
382*ec779b8eSAndroid Build Coastguard Worker 
383*ec779b8eSAndroid Build Coastguard Worker     status_t status;
384*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> response;
385*ec779b8eSAndroid Build Coastguard Worker 
386*ec779b8eSAndroid Build Coastguard Worker     Status bs = mIEffect->command(cmdCode, data, *replySize, &response, &status);
387*ec779b8eSAndroid Build Coastguard Worker     if (!bs.isOk()) {
388*ec779b8eSAndroid Build Coastguard Worker         status = statusTFromBinderStatus(bs);
389*ec779b8eSAndroid Build Coastguard Worker     }
390*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
391*ec779b8eSAndroid Build Coastguard Worker         memcpy(replyData, response.data(), response.size());
392*ec779b8eSAndroid Build Coastguard Worker         *replySize = response.size();
393*ec779b8eSAndroid Build Coastguard Worker     }
394*ec779b8eSAndroid Build Coastguard Worker 
395*ec779b8eSAndroid Build Coastguard Worker     if (cmdCode == EFFECT_CMD_ENABLE || cmdCode == EFFECT_CMD_DISABLE) {
396*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
397*ec779b8eSAndroid Build Coastguard Worker             status = *(status_t *)replyData;
398*ec779b8eSAndroid Build Coastguard Worker         }
399*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
400*ec779b8eSAndroid Build Coastguard Worker             mEnabled = (cmdCode == EFFECT_CMD_ENABLE);
401*ec779b8eSAndroid Build Coastguard Worker         }
402*ec779b8eSAndroid Build Coastguard Worker     }
403*ec779b8eSAndroid Build Coastguard Worker 
404*ec779b8eSAndroid Build Coastguard Worker     return status;
405*ec779b8eSAndroid Build Coastguard Worker }
406*ec779b8eSAndroid Build Coastguard Worker 
setParameter(effect_param_t * param)407*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::setParameter(effect_param_t *param)
408*ec779b8eSAndroid Build Coastguard Worker {
409*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
410*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
411*ec779b8eSAndroid Build Coastguard Worker     }
412*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR) {
413*ec779b8eSAndroid Build Coastguard Worker         return (mStatus == ALREADY_EXISTS) ? (status_t) INVALID_OPERATION : mStatus;
414*ec779b8eSAndroid Build Coastguard Worker     }
415*ec779b8eSAndroid Build Coastguard Worker 
416*ec779b8eSAndroid Build Coastguard Worker     if (param == nullptr || param->psize == 0 || param->vsize == 0) {
417*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
418*ec779b8eSAndroid Build Coastguard Worker     }
419*ec779b8eSAndroid Build Coastguard Worker 
420*ec779b8eSAndroid Build Coastguard Worker     uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
421*ec779b8eSAndroid Build Coastguard Worker 
422*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setParameter: param: %d, param2: %d", *(int *)param->data,
423*ec779b8eSAndroid Build Coastguard Worker             (param->psize == 8) ? *((int *)param->data + 1): -1);
424*ec779b8eSAndroid Build Coastguard Worker 
425*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> cmd;
426*ec779b8eSAndroid Build Coastguard Worker     appendToBuffer(param, sizeof(effect_param_t) + psize, &cmd);
427*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> response;
428*ec779b8eSAndroid Build Coastguard Worker     status_t status;
429*ec779b8eSAndroid Build Coastguard Worker     Status bs = mIEffect->command(EFFECT_CMD_SET_PARAM,
430*ec779b8eSAndroid Build Coastguard Worker                                   cmd,
431*ec779b8eSAndroid Build Coastguard Worker                                   sizeof(int),
432*ec779b8eSAndroid Build Coastguard Worker                                   &response,
433*ec779b8eSAndroid Build Coastguard Worker                                   &status);
434*ec779b8eSAndroid Build Coastguard Worker     if (!bs.isOk()) {
435*ec779b8eSAndroid Build Coastguard Worker         status = statusTFromBinderStatus(bs);
436*ec779b8eSAndroid Build Coastguard Worker         return status;
437*ec779b8eSAndroid Build Coastguard Worker     }
438*ec779b8eSAndroid Build Coastguard Worker     assert(response.size() == sizeof(int));
439*ec779b8eSAndroid Build Coastguard Worker     memcpy(&param->status, response.data(), response.size());
440*ec779b8eSAndroid Build Coastguard Worker     return status;
441*ec779b8eSAndroid Build Coastguard Worker }
442*ec779b8eSAndroid Build Coastguard Worker 
setParameterDeferred(effect_param_t * param)443*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::setParameterDeferred(effect_param_t *param)
444*ec779b8eSAndroid Build Coastguard Worker {
445*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
446*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
447*ec779b8eSAndroid Build Coastguard Worker     }
448*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR) {
449*ec779b8eSAndroid Build Coastguard Worker         return (mStatus == ALREADY_EXISTS) ? (status_t) INVALID_OPERATION : mStatus;
450*ec779b8eSAndroid Build Coastguard Worker     }
451*ec779b8eSAndroid Build Coastguard Worker     if (param == nullptr || param->psize == 0 || param->vsize == 0) {
452*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
453*ec779b8eSAndroid Build Coastguard Worker     }
454*ec779b8eSAndroid Build Coastguard Worker 
455*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mCblk->lock);
456*ec779b8eSAndroid Build Coastguard Worker 
457*ec779b8eSAndroid Build Coastguard Worker     int psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
458*ec779b8eSAndroid Build Coastguard Worker     int size = ((sizeof(effect_param_t) + psize - 1) / sizeof(int) + 1) * sizeof(int);
459*ec779b8eSAndroid Build Coastguard Worker 
460*ec779b8eSAndroid Build Coastguard Worker     if (mCblk->clientIndex + size > EFFECT_PARAM_BUFFER_SIZE) {
461*ec779b8eSAndroid Build Coastguard Worker         return NO_MEMORY;
462*ec779b8eSAndroid Build Coastguard Worker     }
463*ec779b8eSAndroid Build Coastguard Worker     int *p = (int *)(mCblk->buffer + mCblk->clientIndex);
464*ec779b8eSAndroid Build Coastguard Worker     *p++ = size;
465*ec779b8eSAndroid Build Coastguard Worker     memcpy(p, param, sizeof(effect_param_t) + psize);
466*ec779b8eSAndroid Build Coastguard Worker     mCblk->clientIndex += size;
467*ec779b8eSAndroid Build Coastguard Worker 
468*ec779b8eSAndroid Build Coastguard Worker     return NO_ERROR;
469*ec779b8eSAndroid Build Coastguard Worker }
470*ec779b8eSAndroid Build Coastguard Worker 
setParameterCommit()471*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::setParameterCommit()
472*ec779b8eSAndroid Build Coastguard Worker {
473*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
474*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
475*ec779b8eSAndroid Build Coastguard Worker     }
476*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR) {
477*ec779b8eSAndroid Build Coastguard Worker         return (mStatus == ALREADY_EXISTS) ? (status_t) INVALID_OPERATION : mStatus;
478*ec779b8eSAndroid Build Coastguard Worker     }
479*ec779b8eSAndroid Build Coastguard Worker 
480*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mCblk->lock);
481*ec779b8eSAndroid Build Coastguard Worker     if (mCblk->clientIndex == 0) {
482*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
483*ec779b8eSAndroid Build Coastguard Worker     }
484*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> cmd;
485*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> response;
486*ec779b8eSAndroid Build Coastguard Worker     status_t status;
487*ec779b8eSAndroid Build Coastguard Worker     Status bs = mIEffect->command(EFFECT_CMD_SET_PARAM_COMMIT,
488*ec779b8eSAndroid Build Coastguard Worker                                   cmd,
489*ec779b8eSAndroid Build Coastguard Worker                                   0,
490*ec779b8eSAndroid Build Coastguard Worker                                   &response,
491*ec779b8eSAndroid Build Coastguard Worker                                   &status);
492*ec779b8eSAndroid Build Coastguard Worker     if (!bs.isOk()) {
493*ec779b8eSAndroid Build Coastguard Worker         status = statusTFromBinderStatus(bs);
494*ec779b8eSAndroid Build Coastguard Worker     }
495*ec779b8eSAndroid Build Coastguard Worker     return status;
496*ec779b8eSAndroid Build Coastguard Worker }
497*ec779b8eSAndroid Build Coastguard Worker 
getParameter(effect_param_t * param)498*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::getParameter(effect_param_t *param)
499*ec779b8eSAndroid Build Coastguard Worker {
500*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
501*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
502*ec779b8eSAndroid Build Coastguard Worker     }
503*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS) {
504*ec779b8eSAndroid Build Coastguard Worker         return mStatus;
505*ec779b8eSAndroid Build Coastguard Worker     }
506*ec779b8eSAndroid Build Coastguard Worker     if (param == nullptr || param->psize == 0 || param->vsize == 0) {
507*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
508*ec779b8eSAndroid Build Coastguard Worker     }
509*ec779b8eSAndroid Build Coastguard Worker 
510*ec779b8eSAndroid Build Coastguard Worker     ALOGV("getParameter: param: %d, param2: %d", *(int *)param->data,
511*ec779b8eSAndroid Build Coastguard Worker             (param->psize == 8) ? *((int *)param->data + 1): -1);
512*ec779b8eSAndroid Build Coastguard Worker 
513*ec779b8eSAndroid Build Coastguard Worker     uint32_t psize = sizeof(effect_param_t) + ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) +
514*ec779b8eSAndroid Build Coastguard Worker             param->vsize;
515*ec779b8eSAndroid Build Coastguard Worker 
516*ec779b8eSAndroid Build Coastguard Worker     status_t status;
517*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> cmd;
518*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> response;
519*ec779b8eSAndroid Build Coastguard Worker     appendToBuffer(param, sizeof(effect_param_t) + param->psize, &cmd);
520*ec779b8eSAndroid Build Coastguard Worker 
521*ec779b8eSAndroid Build Coastguard Worker     Status bs = mIEffect->command(EFFECT_CMD_GET_PARAM, cmd, psize, &response, &status);
522*ec779b8eSAndroid Build Coastguard Worker     if (!bs.isOk()) {
523*ec779b8eSAndroid Build Coastguard Worker         status = statusTFromBinderStatus(bs);
524*ec779b8eSAndroid Build Coastguard Worker         return status;
525*ec779b8eSAndroid Build Coastguard Worker     }
526*ec779b8eSAndroid Build Coastguard Worker     memcpy(param, response.data(), response.size());
527*ec779b8eSAndroid Build Coastguard Worker     return status;
528*ec779b8eSAndroid Build Coastguard Worker }
529*ec779b8eSAndroid Build Coastguard Worker 
getConfigs(audio_config_base_t * inputCfg,audio_config_base_t * outputCfg)530*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::getConfigs(
531*ec779b8eSAndroid Build Coastguard Worker         audio_config_base_t *inputCfg, audio_config_base_t *outputCfg)
532*ec779b8eSAndroid Build Coastguard Worker {
533*ec779b8eSAndroid Build Coastguard Worker     if (mProbe) {
534*ec779b8eSAndroid Build Coastguard Worker         return INVALID_OPERATION;
535*ec779b8eSAndroid Build Coastguard Worker     }
536*ec779b8eSAndroid Build Coastguard Worker     if (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS) {
537*ec779b8eSAndroid Build Coastguard Worker         return mStatus;
538*ec779b8eSAndroid Build Coastguard Worker     }
539*ec779b8eSAndroid Build Coastguard Worker     if (inputCfg == NULL || outputCfg == NULL) {
540*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
541*ec779b8eSAndroid Build Coastguard Worker     }
542*ec779b8eSAndroid Build Coastguard Worker     status_t status;
543*ec779b8eSAndroid Build Coastguard Worker     media::EffectConfig cfg;
544*ec779b8eSAndroid Build Coastguard Worker     Status bs = mIEffect->getConfig(&cfg, &status);
545*ec779b8eSAndroid Build Coastguard Worker     if (!bs.isOk()) {
546*ec779b8eSAndroid Build Coastguard Worker         status = statusTFromBinderStatus(bs);
547*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s received status %d from binder transaction", __func__, status);
548*ec779b8eSAndroid Build Coastguard Worker         return status;
549*ec779b8eSAndroid Build Coastguard Worker     }
550*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
551*ec779b8eSAndroid Build Coastguard Worker         *inputCfg = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioConfigBase_audio_config_base_t(
552*ec779b8eSAndroid Build Coastguard Worker                         cfg.inputCfg, cfg.isOnInputStream));
553*ec779b8eSAndroid Build Coastguard Worker         *outputCfg = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioConfigBase_audio_config_base_t(
554*ec779b8eSAndroid Build Coastguard Worker                         cfg.outputCfg, cfg.isOnInputStream));
555*ec779b8eSAndroid Build Coastguard Worker     } else {
556*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s received status %d from the effect", __func__, status);
557*ec779b8eSAndroid Build Coastguard Worker     }
558*ec779b8eSAndroid Build Coastguard Worker     return status;
559*ec779b8eSAndroid Build Coastguard Worker }
560*ec779b8eSAndroid Build Coastguard Worker 
561*ec779b8eSAndroid Build Coastguard Worker // -------------------------------------------------------------------------
562*ec779b8eSAndroid Build Coastguard Worker 
binderDied()563*ec779b8eSAndroid Build Coastguard Worker void AudioEffect::binderDied()
564*ec779b8eSAndroid Build Coastguard Worker {
565*ec779b8eSAndroid Build Coastguard Worker     ALOGW("IEffect died");
566*ec779b8eSAndroid Build Coastguard Worker     mStatus = DEAD_OBJECT;
567*ec779b8eSAndroid Build Coastguard Worker     auto cb = mCallback.promote();
568*ec779b8eSAndroid Build Coastguard Worker     if (cb != nullptr) {
569*ec779b8eSAndroid Build Coastguard Worker         cb->onError(mStatus);
570*ec779b8eSAndroid Build Coastguard Worker     }
571*ec779b8eSAndroid Build Coastguard Worker }
572*ec779b8eSAndroid Build Coastguard Worker 
573*ec779b8eSAndroid Build Coastguard Worker // -------------------------------------------------------------------------
574*ec779b8eSAndroid Build Coastguard Worker 
controlStatusChanged(bool controlGranted)575*ec779b8eSAndroid Build Coastguard Worker void AudioEffect::controlStatusChanged(bool controlGranted)
576*ec779b8eSAndroid Build Coastguard Worker {
577*ec779b8eSAndroid Build Coastguard Worker     auto cb = mCallback.promote();
578*ec779b8eSAndroid Build Coastguard Worker     ALOGV("controlStatusChanged %p control %d callback %p", this, controlGranted, cb.get());
579*ec779b8eSAndroid Build Coastguard Worker     if (controlGranted) {
580*ec779b8eSAndroid Build Coastguard Worker         if (mStatus == ALREADY_EXISTS) {
581*ec779b8eSAndroid Build Coastguard Worker             mStatus = NO_ERROR;
582*ec779b8eSAndroid Build Coastguard Worker         }
583*ec779b8eSAndroid Build Coastguard Worker     } else {
584*ec779b8eSAndroid Build Coastguard Worker         if (mStatus == NO_ERROR) {
585*ec779b8eSAndroid Build Coastguard Worker             mStatus = ALREADY_EXISTS;
586*ec779b8eSAndroid Build Coastguard Worker         }
587*ec779b8eSAndroid Build Coastguard Worker     }
588*ec779b8eSAndroid Build Coastguard Worker     if (cb != nullptr) {
589*ec779b8eSAndroid Build Coastguard Worker         cb->onControlStatusChanged(controlGranted);
590*ec779b8eSAndroid Build Coastguard Worker     }
591*ec779b8eSAndroid Build Coastguard Worker }
592*ec779b8eSAndroid Build Coastguard Worker 
enableStatusChanged(bool enabled)593*ec779b8eSAndroid Build Coastguard Worker void AudioEffect::enableStatusChanged(bool enabled)
594*ec779b8eSAndroid Build Coastguard Worker {
595*ec779b8eSAndroid Build Coastguard Worker     auto cb = mCallback.promote();
596*ec779b8eSAndroid Build Coastguard Worker     ALOGV("enableStatusChanged %p enabled %d mCallback %p", this, enabled, cb.get());
597*ec779b8eSAndroid Build Coastguard Worker     if (mStatus == ALREADY_EXISTS) {
598*ec779b8eSAndroid Build Coastguard Worker         mEnabled = enabled;
599*ec779b8eSAndroid Build Coastguard Worker         if (cb != nullptr) {
600*ec779b8eSAndroid Build Coastguard Worker             cb->onEnableStatusChanged(enabled);
601*ec779b8eSAndroid Build Coastguard Worker         }
602*ec779b8eSAndroid Build Coastguard Worker     }
603*ec779b8eSAndroid Build Coastguard Worker }
604*ec779b8eSAndroid Build Coastguard Worker 
commandExecuted(int32_t cmdCode,const std::vector<uint8_t> & cmdData,const std::vector<uint8_t> & replyData)605*ec779b8eSAndroid Build Coastguard Worker void AudioEffect::commandExecuted(int32_t cmdCode,
606*ec779b8eSAndroid Build Coastguard Worker                                   const std::vector<uint8_t>& cmdData,
607*ec779b8eSAndroid Build Coastguard Worker                                   const std::vector<uint8_t>& replyData)
608*ec779b8eSAndroid Build Coastguard Worker {
609*ec779b8eSAndroid Build Coastguard Worker     if (cmdData.empty() || replyData.empty()) {
610*ec779b8eSAndroid Build Coastguard Worker         return;
611*ec779b8eSAndroid Build Coastguard Worker     }
612*ec779b8eSAndroid Build Coastguard Worker     auto cb = mCallback.promote();
613*ec779b8eSAndroid Build Coastguard Worker     if (cb != nullptr && cmdCode == EFFECT_CMD_SET_PARAM) {
614*ec779b8eSAndroid Build Coastguard Worker         std::vector<uint8_t> cmdDataCopy(cmdData);
615*ec779b8eSAndroid Build Coastguard Worker         effect_param_t* cmd = reinterpret_cast<effect_param_t *>(cmdDataCopy.data());
616*ec779b8eSAndroid Build Coastguard Worker         cmd->status = *reinterpret_cast<const int32_t *>(replyData.data());
617*ec779b8eSAndroid Build Coastguard Worker         cb->onParameterChanged(std::move(cmdDataCopy));
618*ec779b8eSAndroid Build Coastguard Worker     }
619*ec779b8eSAndroid Build Coastguard Worker }
620*ec779b8eSAndroid Build Coastguard Worker 
framesProcessed(int32_t frames)621*ec779b8eSAndroid Build Coastguard Worker void AudioEffect::framesProcessed(int32_t frames)
622*ec779b8eSAndroid Build Coastguard Worker {
623*ec779b8eSAndroid Build Coastguard Worker     auto cb = mCallback.promote();
624*ec779b8eSAndroid Build Coastguard Worker     if (cb != nullptr) {
625*ec779b8eSAndroid Build Coastguard Worker         cb->onFramesProcessed(frames);
626*ec779b8eSAndroid Build Coastguard Worker     }
627*ec779b8eSAndroid Build Coastguard Worker }
628*ec779b8eSAndroid Build Coastguard Worker 
629*ec779b8eSAndroid Build Coastguard Worker // -------------------------------------------------------------------------
630*ec779b8eSAndroid Build Coastguard Worker 
queryNumberEffects(uint32_t * numEffects)631*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::queryNumberEffects(uint32_t *numEffects)
632*ec779b8eSAndroid Build Coastguard Worker {
633*ec779b8eSAndroid Build Coastguard Worker     if (numEffects == nullptr) {
634*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
635*ec779b8eSAndroid Build Coastguard Worker     }
636*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
637*ec779b8eSAndroid Build Coastguard Worker     if (af == 0) return PERMISSION_DENIED;
638*ec779b8eSAndroid Build Coastguard Worker     return af->queryNumberEffects(numEffects);
639*ec779b8eSAndroid Build Coastguard Worker }
640*ec779b8eSAndroid Build Coastguard Worker 
queryEffect(uint32_t index,effect_descriptor_t * descriptor)641*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::queryEffect(uint32_t index, effect_descriptor_t *descriptor)
642*ec779b8eSAndroid Build Coastguard Worker {
643*ec779b8eSAndroid Build Coastguard Worker     if (descriptor == nullptr) {
644*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
645*ec779b8eSAndroid Build Coastguard Worker     }
646*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
647*ec779b8eSAndroid Build Coastguard Worker     if (af == 0) return PERMISSION_DENIED;
648*ec779b8eSAndroid Build Coastguard Worker     return af->queryEffect(index, descriptor);
649*ec779b8eSAndroid Build Coastguard Worker }
650*ec779b8eSAndroid Build Coastguard Worker 
getEffectDescriptor(const effect_uuid_t * uuid,const effect_uuid_t * type,uint32_t preferredTypeFlag,effect_descriptor_t * descriptor)651*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::getEffectDescriptor(const effect_uuid_t *uuid,
652*ec779b8eSAndroid Build Coastguard Worker                                           const effect_uuid_t *type,
653*ec779b8eSAndroid Build Coastguard Worker                                           uint32_t preferredTypeFlag,
654*ec779b8eSAndroid Build Coastguard Worker                                           effect_descriptor_t *descriptor)
655*ec779b8eSAndroid Build Coastguard Worker {
656*ec779b8eSAndroid Build Coastguard Worker     if (uuid == nullptr || type == nullptr || descriptor == nullptr) {
657*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
658*ec779b8eSAndroid Build Coastguard Worker     }
659*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
660*ec779b8eSAndroid Build Coastguard Worker     if (af == 0) return PERMISSION_DENIED;
661*ec779b8eSAndroid Build Coastguard Worker     return af->getEffectDescriptor(uuid, type, preferredTypeFlag, descriptor);
662*ec779b8eSAndroid Build Coastguard Worker }
663*ec779b8eSAndroid Build Coastguard Worker 
queryDefaultPreProcessing(audio_session_t audioSession,effect_descriptor_t * descriptors,uint32_t * count)664*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::queryDefaultPreProcessing(audio_session_t audioSession,
665*ec779b8eSAndroid Build Coastguard Worker                                           effect_descriptor_t *descriptors,
666*ec779b8eSAndroid Build Coastguard Worker                                           uint32_t *count)
667*ec779b8eSAndroid Build Coastguard Worker {
668*ec779b8eSAndroid Build Coastguard Worker     if (descriptors == nullptr || count == nullptr) {
669*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
670*ec779b8eSAndroid Build Coastguard Worker     }
671*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
672*ec779b8eSAndroid Build Coastguard Worker     if (aps == 0) return PERMISSION_DENIED;
673*ec779b8eSAndroid Build Coastguard Worker 
674*ec779b8eSAndroid Build Coastguard Worker     int32_t audioSessionAidl = VALUE_OR_RETURN_STATUS(
675*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_session_t_int32_t(audioSession));
676*ec779b8eSAndroid Build Coastguard Worker     media::audio::common::Int countAidl;
677*ec779b8eSAndroid Build Coastguard Worker     countAidl.value = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(*count));
678*ec779b8eSAndroid Build Coastguard Worker     std::vector<media::EffectDescriptor> retAidl;
679*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
680*ec779b8eSAndroid Build Coastguard Worker             aps->queryDefaultPreProcessing(audioSessionAidl, &countAidl, &retAidl)));
681*ec779b8eSAndroid Build Coastguard Worker     *count = VALUE_OR_RETURN_STATUS(convertIntegral<uint32_t>(countAidl.value));
682*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(convertRange(retAidl.begin(), retAidl.end(), descriptors,
683*ec779b8eSAndroid Build Coastguard Worker                                         aidl2legacy_EffectDescriptor_effect_descriptor_t));
684*ec779b8eSAndroid Build Coastguard Worker     return OK;
685*ec779b8eSAndroid Build Coastguard Worker }
686*ec779b8eSAndroid Build Coastguard Worker 
newEffectUniqueId(audio_unique_id_t * id)687*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::newEffectUniqueId(audio_unique_id_t* id)
688*ec779b8eSAndroid Build Coastguard Worker {
689*ec779b8eSAndroid Build Coastguard Worker     if (id == nullptr) {
690*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
691*ec779b8eSAndroid Build Coastguard Worker     }
692*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
693*ec779b8eSAndroid Build Coastguard Worker     if (af == 0) return PERMISSION_DENIED;
694*ec779b8eSAndroid Build Coastguard Worker     *id = af->newAudioUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
695*ec779b8eSAndroid Build Coastguard Worker     return NO_ERROR;
696*ec779b8eSAndroid Build Coastguard Worker }
697*ec779b8eSAndroid Build Coastguard Worker 
addSourceDefaultEffect(const char * typeStr,const String16 & opPackageName,const char * uuidStr,int32_t priority,audio_source_t source,audio_unique_id_t * id)698*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::addSourceDefaultEffect(const char *typeStr,
699*ec779b8eSAndroid Build Coastguard Worker                                              const String16& opPackageName,
700*ec779b8eSAndroid Build Coastguard Worker                                              const char *uuidStr,
701*ec779b8eSAndroid Build Coastguard Worker                                              int32_t priority,
702*ec779b8eSAndroid Build Coastguard Worker                                              audio_source_t source,
703*ec779b8eSAndroid Build Coastguard Worker                                              audio_unique_id_t *id)
704*ec779b8eSAndroid Build Coastguard Worker {
705*ec779b8eSAndroid Build Coastguard Worker     if ((typeStr == nullptr && uuidStr == nullptr) || id == nullptr) {
706*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
707*ec779b8eSAndroid Build Coastguard Worker     }
708*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
709*ec779b8eSAndroid Build Coastguard Worker     if (aps == 0) return PERMISSION_DENIED;
710*ec779b8eSAndroid Build Coastguard Worker 
711*ec779b8eSAndroid Build Coastguard Worker     // Convert type & uuid from string to effect_uuid_t.
712*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t type;
713*ec779b8eSAndroid Build Coastguard Worker     if (typeStr != nullptr) {
714*ec779b8eSAndroid Build Coastguard Worker         status_t res = stringToGuid(typeStr, &type);
715*ec779b8eSAndroid Build Coastguard Worker         if (res != OK) return res;
716*ec779b8eSAndroid Build Coastguard Worker     } else {
717*ec779b8eSAndroid Build Coastguard Worker         type = *EFFECT_UUID_NULL;
718*ec779b8eSAndroid Build Coastguard Worker     }
719*ec779b8eSAndroid Build Coastguard Worker 
720*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t uuid;
721*ec779b8eSAndroid Build Coastguard Worker     if (uuidStr != nullptr) {
722*ec779b8eSAndroid Build Coastguard Worker         status_t res = stringToGuid(uuidStr, &uuid);
723*ec779b8eSAndroid Build Coastguard Worker         if (res != OK) return res;
724*ec779b8eSAndroid Build Coastguard Worker     } else {
725*ec779b8eSAndroid Build Coastguard Worker         uuid = *EFFECT_UUID_NULL;
726*ec779b8eSAndroid Build Coastguard Worker     }
727*ec779b8eSAndroid Build Coastguard Worker 
728*ec779b8eSAndroid Build Coastguard Worker     AudioUuid typeAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_uuid_t_AudioUuid(type));
729*ec779b8eSAndroid Build Coastguard Worker     AudioUuid uuidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_uuid_t_AudioUuid(uuid));
730*ec779b8eSAndroid Build Coastguard Worker     std::string opPackageNameAidl = VALUE_OR_RETURN_STATUS(
731*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_String16_string(opPackageName));
732*ec779b8eSAndroid Build Coastguard Worker     AudioSource sourceAidl = VALUE_OR_RETURN_STATUS(
733*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_source_t_AudioSource(source));
734*ec779b8eSAndroid Build Coastguard Worker     int32_t retAidl;
735*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
736*ec779b8eSAndroid Build Coastguard Worker             aps->addSourceDefaultEffect(typeAidl, opPackageNameAidl, uuidAidl, priority, sourceAidl,
737*ec779b8eSAndroid Build Coastguard Worker                                         &retAidl)));
738*ec779b8eSAndroid Build Coastguard Worker     *id = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_unique_id_t(retAidl));
739*ec779b8eSAndroid Build Coastguard Worker     return OK;
740*ec779b8eSAndroid Build Coastguard Worker }
741*ec779b8eSAndroid Build Coastguard Worker 
addStreamDefaultEffect(const char * typeStr,const String16 & opPackageName,const char * uuidStr,int32_t priority,audio_usage_t usage,audio_unique_id_t * id)742*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::addStreamDefaultEffect(const char *typeStr,
743*ec779b8eSAndroid Build Coastguard Worker                                              const String16& opPackageName,
744*ec779b8eSAndroid Build Coastguard Worker                                              const char *uuidStr,
745*ec779b8eSAndroid Build Coastguard Worker                                              int32_t priority,
746*ec779b8eSAndroid Build Coastguard Worker                                              audio_usage_t usage,
747*ec779b8eSAndroid Build Coastguard Worker                                              audio_unique_id_t *id)
748*ec779b8eSAndroid Build Coastguard Worker {
749*ec779b8eSAndroid Build Coastguard Worker     if ((typeStr == nullptr && uuidStr == nullptr) || id == nullptr) {
750*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
751*ec779b8eSAndroid Build Coastguard Worker     }
752*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
753*ec779b8eSAndroid Build Coastguard Worker     if (aps == 0) return PERMISSION_DENIED;
754*ec779b8eSAndroid Build Coastguard Worker 
755*ec779b8eSAndroid Build Coastguard Worker     // Convert type & uuid from string to effect_uuid_t.
756*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t type;
757*ec779b8eSAndroid Build Coastguard Worker     if (typeStr != nullptr) {
758*ec779b8eSAndroid Build Coastguard Worker         status_t res = stringToGuid(typeStr, &type);
759*ec779b8eSAndroid Build Coastguard Worker         if (res != OK) return res;
760*ec779b8eSAndroid Build Coastguard Worker     } else {
761*ec779b8eSAndroid Build Coastguard Worker         type = *EFFECT_UUID_NULL;
762*ec779b8eSAndroid Build Coastguard Worker     }
763*ec779b8eSAndroid Build Coastguard Worker 
764*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t uuid;
765*ec779b8eSAndroid Build Coastguard Worker     if (uuidStr != nullptr) {
766*ec779b8eSAndroid Build Coastguard Worker         status_t res = stringToGuid(uuidStr, &uuid);
767*ec779b8eSAndroid Build Coastguard Worker         if (res != OK) return res;
768*ec779b8eSAndroid Build Coastguard Worker     } else {
769*ec779b8eSAndroid Build Coastguard Worker         uuid = *EFFECT_UUID_NULL;
770*ec779b8eSAndroid Build Coastguard Worker     }
771*ec779b8eSAndroid Build Coastguard Worker 
772*ec779b8eSAndroid Build Coastguard Worker     AudioUuid typeAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_uuid_t_AudioUuid(type));
773*ec779b8eSAndroid Build Coastguard Worker     AudioUuid uuidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_uuid_t_AudioUuid(uuid));
774*ec779b8eSAndroid Build Coastguard Worker     std::string opPackageNameAidl = VALUE_OR_RETURN_STATUS(
775*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_String16_string(opPackageName));
776*ec779b8eSAndroid Build Coastguard Worker     media::audio::common::AudioUsage usageAidl = VALUE_OR_RETURN_STATUS(
777*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_usage_t_AudioUsage(usage));
778*ec779b8eSAndroid Build Coastguard Worker     int32_t retAidl;
779*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
780*ec779b8eSAndroid Build Coastguard Worker             aps->addStreamDefaultEffect(typeAidl, opPackageNameAidl, uuidAidl, priority, usageAidl,
781*ec779b8eSAndroid Build Coastguard Worker                                         &retAidl)));
782*ec779b8eSAndroid Build Coastguard Worker     *id = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_unique_id_t(retAidl));
783*ec779b8eSAndroid Build Coastguard Worker     return OK;
784*ec779b8eSAndroid Build Coastguard Worker }
785*ec779b8eSAndroid Build Coastguard Worker 
removeSourceDefaultEffect(audio_unique_id_t id)786*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::removeSourceDefaultEffect(audio_unique_id_t id)
787*ec779b8eSAndroid Build Coastguard Worker {
788*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
789*ec779b8eSAndroid Build Coastguard Worker     if (aps == 0) return PERMISSION_DENIED;
790*ec779b8eSAndroid Build Coastguard Worker 
791*ec779b8eSAndroid Build Coastguard Worker     int32_t idAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
792*ec779b8eSAndroid Build Coastguard Worker     return statusTFromBinderStatus(aps->removeSourceDefaultEffect(idAidl));
793*ec779b8eSAndroid Build Coastguard Worker }
794*ec779b8eSAndroid Build Coastguard Worker 
removeStreamDefaultEffect(audio_unique_id_t id)795*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::removeStreamDefaultEffect(audio_unique_id_t id)
796*ec779b8eSAndroid Build Coastguard Worker {
797*ec779b8eSAndroid Build Coastguard Worker     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
798*ec779b8eSAndroid Build Coastguard Worker     if (aps == 0) return PERMISSION_DENIED;
799*ec779b8eSAndroid Build Coastguard Worker 
800*ec779b8eSAndroid Build Coastguard Worker     int32_t idAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
801*ec779b8eSAndroid Build Coastguard Worker     return statusTFromBinderStatus(aps->removeStreamDefaultEffect(idAidl));
802*ec779b8eSAndroid Build Coastguard Worker }
803*ec779b8eSAndroid Build Coastguard Worker 
804*ec779b8eSAndroid Build Coastguard Worker // -------------------------------------------------------------------------
805*ec779b8eSAndroid Build Coastguard Worker 
stringToGuid(const char * str,effect_uuid_t * guid)806*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::stringToGuid(const char *str, effect_uuid_t *guid)
807*ec779b8eSAndroid Build Coastguard Worker {
808*ec779b8eSAndroid Build Coastguard Worker     if (str == nullptr || guid == nullptr) {
809*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
810*ec779b8eSAndroid Build Coastguard Worker     }
811*ec779b8eSAndroid Build Coastguard Worker 
812*ec779b8eSAndroid Build Coastguard Worker     int tmp[10];
813*ec779b8eSAndroid Build Coastguard Worker 
814*ec779b8eSAndroid Build Coastguard Worker     if (sscanf(str, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
815*ec779b8eSAndroid Build Coastguard Worker             tmp, tmp+1, tmp+2, tmp+3, tmp+4, tmp+5, tmp+6, tmp+7, tmp+8, tmp+9) < 10) {
816*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
817*ec779b8eSAndroid Build Coastguard Worker     }
818*ec779b8eSAndroid Build Coastguard Worker     guid->timeLow = (uint32_t)tmp[0];
819*ec779b8eSAndroid Build Coastguard Worker     guid->timeMid = (uint16_t)tmp[1];
820*ec779b8eSAndroid Build Coastguard Worker     guid->timeHiAndVersion = (uint16_t)tmp[2];
821*ec779b8eSAndroid Build Coastguard Worker     guid->clockSeq = (uint16_t)tmp[3];
822*ec779b8eSAndroid Build Coastguard Worker     guid->node[0] = (uint8_t)tmp[4];
823*ec779b8eSAndroid Build Coastguard Worker     guid->node[1] = (uint8_t)tmp[5];
824*ec779b8eSAndroid Build Coastguard Worker     guid->node[2] = (uint8_t)tmp[6];
825*ec779b8eSAndroid Build Coastguard Worker     guid->node[3] = (uint8_t)tmp[7];
826*ec779b8eSAndroid Build Coastguard Worker     guid->node[4] = (uint8_t)tmp[8];
827*ec779b8eSAndroid Build Coastguard Worker     guid->node[5] = (uint8_t)tmp[9];
828*ec779b8eSAndroid Build Coastguard Worker 
829*ec779b8eSAndroid Build Coastguard Worker     return NO_ERROR;
830*ec779b8eSAndroid Build Coastguard Worker }
831*ec779b8eSAndroid Build Coastguard Worker 
guidToString(const effect_uuid_t * guid,char * str,size_t maxLen)832*ec779b8eSAndroid Build Coastguard Worker status_t AudioEffect::guidToString(const effect_uuid_t *guid, char *str, size_t maxLen)
833*ec779b8eSAndroid Build Coastguard Worker {
834*ec779b8eSAndroid Build Coastguard Worker     if (guid == nullptr || str == nullptr) {
835*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
836*ec779b8eSAndroid Build Coastguard Worker     }
837*ec779b8eSAndroid Build Coastguard Worker 
838*ec779b8eSAndroid Build Coastguard Worker     snprintf(str, maxLen, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
839*ec779b8eSAndroid Build Coastguard Worker             guid->timeLow,
840*ec779b8eSAndroid Build Coastguard Worker             guid->timeMid,
841*ec779b8eSAndroid Build Coastguard Worker             guid->timeHiAndVersion,
842*ec779b8eSAndroid Build Coastguard Worker             guid->clockSeq,
843*ec779b8eSAndroid Build Coastguard Worker             guid->node[0],
844*ec779b8eSAndroid Build Coastguard Worker             guid->node[1],
845*ec779b8eSAndroid Build Coastguard Worker             guid->node[2],
846*ec779b8eSAndroid Build Coastguard Worker             guid->node[3],
847*ec779b8eSAndroid Build Coastguard Worker             guid->node[4],
848*ec779b8eSAndroid Build Coastguard Worker             guid->node[5]);
849*ec779b8eSAndroid Build Coastguard Worker 
850*ec779b8eSAndroid Build Coastguard Worker     return NO_ERROR;
851*ec779b8eSAndroid Build Coastguard Worker }
852*ec779b8eSAndroid Build Coastguard Worker 
853*ec779b8eSAndroid Build Coastguard Worker 
854*ec779b8eSAndroid Build Coastguard Worker } // namespace android
855