1948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent/*
2948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent**
3948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** Copyright 2010, The Android Open Source Project
4948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent**
5948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** Licensed under the Apache License, Version 2.0 (the "License");
6948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** you may not use this file except in compliance with the License.
7948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** You may obtain a copy of the License at
8948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent**
9948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent**     http://www.apache.org/licenses/LICENSE-2.0
10948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent**
11948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** Unless required by applicable law or agreed to in writing, software
12948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** distributed under the License is distributed on an "AS IS" BASIS,
13948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** See the License for the specific language governing permissions and
15948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent** limitations under the License.
16948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent*/
17948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
18948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
19948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent//#define LOG_NDEBUG 0
20948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#define LOG_TAG "AudioEffect"
21948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
22948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <stdint.h>
23948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <sys/types.h>
24948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <limits.h>
25948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
26948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <private/media/AudioEffectShared.h>
27948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <media/AudioEffect.h>
28948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
29948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <utils/Log.h>
30948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent#include <binder/IPCThreadState.h>
31948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
32948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
33948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
34948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentnamespace android {
35948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
36948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent// ---------------------------------------------------------------------------
37948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
38948235c06ed0d49190b2f49d9299b473c4dd61a9Eric LaurentAudioEffect::AudioEffect()
39948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    : mStatus(NO_INIT)
40948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
41948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
42948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
43948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
44948235c06ed0d49190b2f49d9299b473c4dd61a9Eric LaurentAudioEffect::AudioEffect(const effect_uuid_t *type,
45948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                const effect_uuid_t *uuid,
46948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                int32_t priority,
47948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                effect_callback_t cbf,
48948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                void* user,
49948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                int sessionId,
50464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent                audio_io_handle_t io
51948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                )
52948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    : mStatus(NO_INIT)
53948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
54464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent    mStatus = set(type, uuid, priority, cbf, user, sessionId, io);
55948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
56948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
57948235c06ed0d49190b2f49d9299b473c4dd61a9Eric LaurentAudioEffect::AudioEffect(const char *typeStr,
58948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                const char *uuidStr,
59948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                int32_t priority,
60948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                effect_callback_t cbf,
61948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                void* user,
62948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                int sessionId,
63464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent                audio_io_handle_t io
64948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                )
65948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    : mStatus(NO_INIT)
66948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
67948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    effect_uuid_t type;
68948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    effect_uuid_t *pType = NULL;
69948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    effect_uuid_t uuid;
70948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    effect_uuid_t *pUuid = NULL;
71948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
72948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGV("Constructor string\n - type: %s\n - uuid: %s", typeStr, uuidStr);
73948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
74948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (typeStr != NULL) {
75948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        if (stringToGuid(typeStr, &type) == NO_ERROR) {
76948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            pType = &type;
77948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        }
78948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
79948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
80948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (uuidStr != NULL) {
81948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        if (stringToGuid(uuidStr, &uuid) == NO_ERROR) {
82948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            pUuid = &uuid;
83948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        }
84948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
85948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
86464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent    mStatus = set(pType, pUuid, priority, cbf, user, sessionId, io);
87948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
88948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
89948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::set(const effect_uuid_t *type,
90948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                const effect_uuid_t *uuid,
91948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                int32_t priority,
92948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                effect_callback_t cbf,
93948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                void* user,
94948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent                int sessionId,
95464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent                audio_io_handle_t io)
96948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
97948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    sp<IEffect> iEffect;
98948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    sp<IMemory> cblk;
99948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    int enabled;
100948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
101464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent    LOGV("set %p mUserData: %p uuid: %p timeLow %08x", this, user, type, type ? type->timeLow : 0);
102948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
103948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mIEffect != 0) {
104948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        LOGW("Effect already in use");
105948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
106948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
107948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
108948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
109948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (audioFlinger == 0) {
110948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        LOGE("set(): Could not get audioflinger");
111948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return NO_INIT;
112948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
113948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
114948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (type == NULL && uuid == NULL) {
115948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        LOGW("Must specify at least type or uuid");
116948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
117948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
118948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
119948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mPriority = priority;
120948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mCbf = cbf;
121948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mUserData = user;
122948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mSessionId = sessionId;
123948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
124948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    memset(&mDescriptor, 0, sizeof(effect_descriptor_t));
125948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    memcpy(&mDescriptor.type, EFFECT_UUID_NULL, sizeof(effect_uuid_t));
126948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    memcpy(&mDescriptor.uuid, EFFECT_UUID_NULL, sizeof(effect_uuid_t));
127948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
128948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (type != NULL) {
129948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        memcpy(&mDescriptor.type, type, sizeof(effect_uuid_t));
130948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
131948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (uuid != NULL) {
132948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        memcpy(&mDescriptor.uuid, uuid, sizeof(effect_uuid_t));
133948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
134948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
135948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mIEffectClient = new EffectClient(this);
136948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
137948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    iEffect = audioFlinger->createEffect(getpid(), (effect_descriptor_t *)&mDescriptor,
138464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent            mIEffectClient, priority, io, mSessionId, &mStatus, &mId, &enabled);
139948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
140948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) {
141948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        LOGE("set(): AudioFlinger could not create effect, status: %d", mStatus);
142948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return mStatus;
143948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
144948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
145948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mEnabled = (volatile int32_t)enabled;
146948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
147948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mIEffect = iEffect;
148948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    cblk = iEffect->getCblk();
149948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (cblk == 0) {
150948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        mStatus = NO_INIT;
151948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        LOGE("Could not get control block");
152948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return mStatus;
153948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
154948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
155948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mIEffect = iEffect;
156948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mCblkMemory = cblk;
157948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mCblk = static_cast<effect_param_cblk_t*>(cblk->pointer());
158948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    int bufOffset = ((sizeof(effect_param_cblk_t) - 1) / sizeof(int) + 1) * sizeof(int);
159948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mCblk->buffer = (uint8_t *)mCblk + bufOffset;
160948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
161948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    iEffect->asBinder()->linkToDeath(mIEffectClient);
162948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGV("set() %p OK effect: %s id: %d status %d enabled %d, ", this, mDescriptor.name, mId, mStatus, mEnabled);
163948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
164948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return mStatus;
165948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
166948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
167948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
168948235c06ed0d49190b2f49d9299b473c4dd61a9Eric LaurentAudioEffect::~AudioEffect()
169948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
170948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGV("Destructor %p", this);
171948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
172948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus == NO_ERROR || mStatus == ALREADY_EXISTS) {
173948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        if (mIEffect != NULL) {
174948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            mIEffect->disconnect();
175948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            mIEffect->asBinder()->unlinkToDeath(mIEffectClient);
176948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        }
177948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent         IPCThreadState::self()->flushCommands();
178948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
179948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mIEffect.clear();
180948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mIEffectClient.clear();
181948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mCblkMemory.clear();
182948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
183948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
184948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
185948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::initCheck() const
186948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
187948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return mStatus;
188948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
189948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
190948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent// -------------------------------------------------------------------------
191948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
192948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurenteffect_descriptor_t AudioEffect::descriptor() const
193948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
194948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return mDescriptor;
195948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
196948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
197df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentbool AudioEffect::getEnabled() const
198948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
199948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return (mEnabled != 0);
200948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
201948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
202df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatus_t AudioEffect::setEnabled(bool enabled)
203948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
204948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus != NO_ERROR) {
205948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
206948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
207948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
208f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent    status_t status = NO_ERROR;
209f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent
210f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent    AutoMutex lock(mLock);
211f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent    if (enabled != mEnabled) {
212f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        if (enabled) {
213f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            LOGV("enable %p", this);
214f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            status = mIEffect->enable();
215f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        } else {
216f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            LOGV("disable %p", this);
217f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            status = mIEffect->disable();
218df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        }
219f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        if (status == NO_ERROR) {
220f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            mEnabled = enabled;
221df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        }
222948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
223f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent    return status;
224948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
225948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
226a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurentstatus_t AudioEffect::command(uint32_t cmdCode,
227a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                              uint32_t cmdSize,
228a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                              void *cmdData,
229a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                              uint32_t *replySize,
230a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                              void *replyData)
231948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
232948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS) {
2334d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent        LOGV("command() bad status %d", mStatus);
234948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
235948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
236948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
237f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent    if (cmdCode == EFFECT_CMD_ENABLE || cmdCode == EFFECT_CMD_DISABLE) {
238f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        if (mEnabled == (cmdCode == EFFECT_CMD_ENABLE)) {
239f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            return NO_ERROR;
240f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        }
241f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        if (replySize == NULL || *replySize != sizeof(status_t) || replyData == NULL) {
242f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            return BAD_VALUE;
243f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        }
244f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        mLock.lock();
2452a6b80bc65c4782b5a7168b300e1dc5ec9f617eeEric Laurent    }
2464d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent
2474d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent    status_t status = mIEffect->command(cmdCode, cmdSize, cmdData, replySize, replyData);
2482a6b80bc65c4782b5a7168b300e1dc5ec9f617eeEric Laurent
2494d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent    if (cmdCode == EFFECT_CMD_ENABLE || cmdCode == EFFECT_CMD_DISABLE) {
250f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        if (status == NO_ERROR) {
251f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            status = *(status_t *)replyData;
2524d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent        }
253f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        if (status == NO_ERROR) {
254f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent            mEnabled = (cmdCode == EFFECT_CMD_ENABLE);
2554d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent        }
256f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        mLock.unlock();
2572a6b80bc65c4782b5a7168b300e1dc5ec9f617eeEric Laurent    }
2584d3fb50782acefbcff29801629a79d78ffd4e332Eric Laurent
2592a6b80bc65c4782b5a7168b300e1dc5ec9f617eeEric Laurent    return status;
260948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
261948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
262948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
263948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::setParameter(effect_param_t *param)
264948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
265948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus != NO_ERROR) {
266948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
267948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
268948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
269948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (param == NULL || param->psize == 0 || param->vsize == 0) {
270948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
271948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
272948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
273a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent    uint32_t size = sizeof(int);
274a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent    uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
275948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
276948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGV("setParameter: param: %d, param2: %d", *(int *)param->data, (param->psize == 8) ? *((int *)param->data + 1): -1);
277948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
278948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return mIEffect->command(EFFECT_CMD_SET_PARAM, sizeof (effect_param_t) + psize, param, &size, &param->status);
279948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
280948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
281948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::setParameterDeferred(effect_param_t *param)
282948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
283948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus != NO_ERROR) {
284948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
285948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
286948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
287948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (param == NULL || param->psize == 0 || param->vsize == 0) {
288948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
289948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
290948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
291948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    Mutex::Autolock _l(mCblk->lock);
292948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
293948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    int psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
294948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    int size = ((sizeof(effect_param_t) + psize - 1) / sizeof(int) + 1) * sizeof(int);
295948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
296948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mCblk->clientIndex + size > EFFECT_PARAM_BUFFER_SIZE) {
297948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return NO_MEMORY;
298948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
299948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    int *p = (int *)(mCblk->buffer + mCblk->clientIndex);
300948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    *p++ = size;
301948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    memcpy(p, param, sizeof(effect_param_t) + psize);
302948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mCblk->clientIndex += size;
303948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
304948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return NO_ERROR;
305948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
306948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
307948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::setParameterCommit()
308948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
309948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus != NO_ERROR) {
310948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
311948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
312948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
313948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    Mutex::Autolock _l(mCblk->lock);
314948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mCblk->clientIndex == 0) {
315948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
316948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
317a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent    uint32_t size = 0;
318948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return mIEffect->command(EFFECT_CMD_SET_PARAM_COMMIT, 0, NULL, &size, NULL);
319948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
320948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
321948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::getParameter(effect_param_t *param)
322948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
323948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS) {
324948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return INVALID_OPERATION;
325948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
326948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
327948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (param == NULL || param->psize == 0 || param->vsize == 0) {
328948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
329948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
330948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
331948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGV("getParameter: param: %d, param2: %d", *(int *)param->data, (param->psize == 8) ? *((int *)param->data + 1): -1);
332948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
333a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent    uint32_t psize = sizeof(effect_param_t) + ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
334948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
335948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return mIEffect->command(EFFECT_CMD_GET_PARAM, sizeof(effect_param_t) + param->psize, param, &psize, param);
336948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
337948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
338948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
339948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent// -------------------------------------------------------------------------
340948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
341948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentvoid AudioEffect::binderDied()
342948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
343948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGW("IEffect died");
344948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mStatus = NO_INIT;
345948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mCbf) {
346948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        status_t status = DEAD_OBJECT;
347948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        mCbf(EVENT_ERROR, mUserData, &status);
348948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
349948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    mIEffect.clear();
350948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
351948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
352948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent// -------------------------------------------------------------------------
353948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
354948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentvoid AudioEffect::controlStatusChanged(bool controlGranted)
355948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
356948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    LOGV("controlStatusChanged %p control %d callback %p mUserData %p", this, controlGranted, mCbf, mUserData);
357948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (controlGranted) {
358948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        if (mStatus == ALREADY_EXISTS) {
359948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            mStatus = NO_ERROR;
360948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        }
361948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    } else {
362948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        if (mStatus == NO_ERROR) {
363948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            mStatus = ALREADY_EXISTS;
364948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        }
365948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
366948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mCbf) {
367948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        mCbf(EVENT_CONTROL_STATUS_CHANGED, mUserData, &controlGranted);
368948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
369948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
370948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
371948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentvoid AudioEffect::enableStatusChanged(bool enabled)
372948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
373df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent    LOGV("enableStatusChanged %p enabled %d mCbf %p", this, enabled, mCbf);
374948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mStatus == ALREADY_EXISTS) {
375f3d6dd0782e3135885efdc26cb86cf0bf811749fEric Laurent        mEnabled = enabled;
376948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        if (mCbf) {
377948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            mCbf(EVENT_ENABLE_STATUS_CHANGED, mUserData, &enabled);
378948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        }
379948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
380948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
381948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
382a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurentvoid AudioEffect::commandExecuted(uint32_t cmdCode,
383a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                  uint32_t cmdSize,
384a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                  void *cmdData,
385a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                  uint32_t replySize,
386a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                  void *replyData)
387948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
388948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (cmdData == NULL || replyData == NULL) {
389948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return;
390948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
391948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
392948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (mCbf && cmdCode == EFFECT_CMD_SET_PARAM) {
393948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        effect_param_t *cmd = (effect_param_t *)cmdData;
394948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        cmd->status = *(int32_t *)replyData;
395948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        mCbf(EVENT_PARAMETER_CHANGED, mUserData, cmd);
396948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
397948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
398948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
399948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent// -------------------------------------------------------------------------
400948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
401948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::queryNumberEffects(uint32_t *numEffects)
402948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
403948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
404948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (af == 0) return PERMISSION_DENIED;
405948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return af->queryNumberEffects(numEffects);
406948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
407948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
40853334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurentstatus_t AudioEffect::queryEffect(uint32_t index, effect_descriptor_t *descriptor)
409948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
410948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
411948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (af == 0) return PERMISSION_DENIED;
41253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent    return af->queryEffect(index, descriptor);
413948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
414948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
415948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::getEffectDescriptor(effect_uuid_t *uuid, effect_descriptor_t *descriptor)
416948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
417948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
418948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (af == 0) return PERMISSION_DENIED;
419948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return af->getEffectDescriptor(uuid, descriptor);
420948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
421948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
4220f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent
4230f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurentstatus_t AudioEffect::queryDefaultPreProcessing(int audioSession,
4240f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent                                          effect_descriptor_t *descriptors,
4250f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent                                          uint32_t *count)
4260f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent{
4270f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
4280f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent    if (aps == 0) return PERMISSION_DENIED;
4290f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent    return aps->queryDefaultPreProcessing(audioSession, descriptors, count);
4300f7f4ece1b6b73caf608d533d833a8cdc11c8131Eric Laurent}
431948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent// -------------------------------------------------------------------------
432948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
433948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::stringToGuid(const char *str, effect_uuid_t *guid)
434948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
435948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (str == NULL || guid == NULL) {
436948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
437948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
438948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
439948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    int tmp[10];
440948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
441948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (sscanf(str, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
442948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            tmp, tmp+1, tmp+2, tmp+3, tmp+4, tmp+5, tmp+6, tmp+7, tmp+8, tmp+9) < 10) {
443948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
444948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
445948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->timeLow = (uint32_t)tmp[0];
446948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->timeMid = (uint16_t)tmp[1];
447948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->timeHiAndVersion = (uint16_t)tmp[2];
448948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->clockSeq = (uint16_t)tmp[3];
449948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->node[0] = (uint8_t)tmp[4];
450948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->node[1] = (uint8_t)tmp[5];
451948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->node[2] = (uint8_t)tmp[6];
452948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->node[3] = (uint8_t)tmp[7];
453948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->node[4] = (uint8_t)tmp[8];
454948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    guid->node[5] = (uint8_t)tmp[9];
455948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
456948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return NO_ERROR;
457948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
458948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
459948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurentstatus_t AudioEffect::guidToString(const effect_uuid_t *guid, char *str, size_t maxLen)
460948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent{
461948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    if (guid == NULL || str == NULL) {
462948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent        return BAD_VALUE;
463948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    }
464948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
465948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    snprintf(str, maxLen, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
466948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->timeLow,
467948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->timeMid,
468948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->timeHiAndVersion,
469948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->clockSeq,
470948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->node[0],
471948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->node[1],
472948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->node[2],
473948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->node[3],
474948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->node[4],
475948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent            guid->node[5]);
476948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
477948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent    return NO_ERROR;
478948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}
479948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
480948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
481948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent}; // namespace android
482948235c06ed0d49190b2f49d9299b473c4dd61a9Eric Laurent
483