blob: dfed784e82771039096906751adf769344dcd942 [file] [log] [blame]
Kevin Rocard4bcd67f2018-02-28 14:33:38 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "EffectsFactoryHalHidl"
18//#define LOG_NDEBUG 0
19
20#include <cutils/native_handle.h>
Kevin Rocardb9cfbf12018-02-23 19:11:06 -080021#include <libaudiohal/4.0/EffectsFactoryHalHidl.h>
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080022
23#include "ConversionHelperHidl.h"
24#include "EffectBufferHalHidl.h"
25#include "EffectHalHidl.h"
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080026#include "HidlUtils.h"
27
Kevin Rocard51e076a2018-02-28 14:36:53 -080028using ::android::hardware::audio::common::V4_0::HidlUtils;
29using ::android::hardware::audio::common::V4_0::Uuid;
30using ::android::hardware::audio::effect::V4_0::IEffect;
31using ::android::hardware::audio::effect::V4_0::Result;
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080032using ::android::hardware::Return;
33
34namespace android {
Kevin Rocard51e076a2018-02-28 14:36:53 -080035namespace V4_0 {
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080036
37EffectsFactoryHalHidl::EffectsFactoryHalHidl() : ConversionHelperHidl("EffectsFactory") {
38 mEffectsFactory = IEffectsFactory::getService();
39 if (mEffectsFactory == 0) {
40 ALOGE("Failed to obtain IEffectsFactory service, terminating process.");
41 exit(1);
42 }
43}
44
45EffectsFactoryHalHidl::~EffectsFactoryHalHidl() {
46}
47
48status_t EffectsFactoryHalHidl::queryAllDescriptors() {
49 if (mEffectsFactory == 0) return NO_INIT;
50 Result retval = Result::NOT_INITIALIZED;
51 Return<void> ret = mEffectsFactory->getAllDescriptors(
52 [&](Result r, const hidl_vec<EffectDescriptor>& result) {
53 retval = r;
54 if (retval == Result::OK) {
55 mLastDescriptors = result;
56 }
57 });
58 if (ret.isOk()) {
59 return retval == Result::OK ? OK : NO_INIT;
60 }
61 mLastDescriptors.resize(0);
62 return processReturn(__FUNCTION__, ret);
63}
64
65status_t EffectsFactoryHalHidl::queryNumberEffects(uint32_t *pNumEffects) {
66 status_t queryResult = queryAllDescriptors();
67 if (queryResult == OK) {
68 *pNumEffects = mLastDescriptors.size();
69 }
70 return queryResult;
71}
72
73status_t EffectsFactoryHalHidl::getDescriptor(
74 uint32_t index, effect_descriptor_t *pDescriptor) {
75 // TODO: We need somehow to track the changes on the server side
76 // or figure out how to convert everybody to query all the descriptors at once.
77 // TODO: check for nullptr
78 if (mLastDescriptors.size() == 0) {
79 status_t queryResult = queryAllDescriptors();
80 if (queryResult != OK) return queryResult;
81 }
82 if (index >= mLastDescriptors.size()) return NAME_NOT_FOUND;
83 EffectHalHidl::effectDescriptorToHal(mLastDescriptors[index], pDescriptor);
84 return OK;
85}
86
87status_t EffectsFactoryHalHidl::getDescriptor(
88 const effect_uuid_t *pEffectUuid, effect_descriptor_t *pDescriptor) {
89 // TODO: check for nullptr
90 if (mEffectsFactory == 0) return NO_INIT;
91 Uuid hidlUuid;
92 HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid);
93 Result retval = Result::NOT_INITIALIZED;
94 Return<void> ret = mEffectsFactory->getDescriptor(hidlUuid,
95 [&](Result r, const EffectDescriptor& result) {
96 retval = r;
97 if (retval == Result::OK) {
98 EffectHalHidl::effectDescriptorToHal(result, pDescriptor);
99 }
100 });
101 if (ret.isOk()) {
102 if (retval == Result::OK) return OK;
103 else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND;
104 else return NO_INIT;
105 }
106 return processReturn(__FUNCTION__, ret);
107}
108
109status_t EffectsFactoryHalHidl::createEffect(
110 const effect_uuid_t *pEffectUuid, int32_t sessionId, int32_t ioId,
111 sp<EffectHalInterface> *effect) {
112 if (mEffectsFactory == 0) return NO_INIT;
113 Uuid hidlUuid;
114 HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid);
115 Result retval = Result::NOT_INITIALIZED;
116 Return<void> ret = mEffectsFactory->createEffect(
117 hidlUuid, sessionId, ioId,
118 [&](Result r, const sp<IEffect>& result, uint64_t effectId) {
119 retval = r;
120 if (retval == Result::OK) {
121 *effect = new EffectHalHidl(result, effectId);
122 }
123 });
124 if (ret.isOk()) {
125 if (retval == Result::OK) return OK;
126 else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND;
127 else return NO_INIT;
128 }
129 return processReturn(__FUNCTION__, ret);
130}
131
132status_t EffectsFactoryHalHidl::dumpEffects(int fd) {
133 if (mEffectsFactory == 0) return NO_INIT;
134 native_handle_t* hidlHandle = native_handle_create(1, 0);
135 hidlHandle->data[0] = fd;
Kevin Rocardb9cfbf12018-02-23 19:11:06 -0800136 Return<void> ret = mEffectsFactory->debug(hidlHandle, {} /* options */);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800137 native_handle_delete(hidlHandle);
138 return processReturn(__FUNCTION__, ret);
139}
140
141status_t EffectsFactoryHalHidl::allocateBuffer(size_t size, sp<EffectBufferHalInterface>* buffer) {
142 return EffectBufferHalHidl::allocate(size, buffer);
143}
144
145status_t EffectsFactoryHalHidl::mirrorBuffer(void* external, size_t size,
146 sp<EffectBufferHalInterface>* buffer) {
147 return EffectBufferHalHidl::mirror(external, size, buffer);
148}
149
150
Kevin Rocard51e076a2018-02-28 14:36:53 -0800151} // namespace V4_0
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800152} // namespace android