blob: 010881687558a4ba06fa4161f3395932ca621c0b [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#include <stdio.h>
18
19#define LOG_TAG "DeviceHalHidl"
20//#define LOG_NDEBUG 0
21
Kevin Rocard95213bf2018-11-08 17:16:57 -080022#include PATH(android/hardware/audio/FILE_VERSION/IPrimaryDevice.h)
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080023#include <cutils/native_handle.h>
24#include <hwbinder/IPCThreadState.h>
jiabindaf49952019-11-22 14:10:57 -080025#include <media/AudioContainers.h>
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080026#include <utils/Log.h>
27
Kevin Rocardb9cfbf12018-02-23 19:11:06 -080028#include <common/all-versions/VersionUtils.h>
29
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080030#include "DeviceHalHidl.h"
Eric Laurentb82e6b72019-11-22 17:25:04 -080031#include "EffectHalHidl.h"
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080032#include "HidlUtils.h"
33#include "StreamHalHidl.h"
Kevin Rocardb9cfbf12018-02-23 19:11:06 -080034#include "VersionUtils.h"
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080035
Mikhail Naganov9ccaa162018-12-12 10:27:29 -080036using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils;
Kevin Rocard7a9f05a2018-11-28 16:52:25 -080037using ::android::hardware::audio::common::utils::EnumBitfield;
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080038using ::android::hardware::hidl_string;
39using ::android::hardware::hidl_vec;
40
41namespace android {
Kevin Rocard070e7512018-05-22 09:29:13 -070042namespace CPP_VERSION {
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080043
Mikhail Naganov9ccaa162018-12-12 10:27:29 -080044using namespace ::android::hardware::audio::common::CPP_VERSION;
45using namespace ::android::hardware::audio::CPP_VERSION;
46
Eric Laurentb82e6b72019-11-22 17:25:04 -080047using EffectHalHidl = ::android::effect::CPP_VERSION::EffectHalHidl;
48
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080049namespace {
50
Ytai Ben-Tsvi07892862020-11-06 10:09:52 -080051using ::android::hardware::audio::common::CPP_VERSION::AudioPort;
52using ::android::hardware::audio::common::CPP_VERSION::AudioPortConfig;
53
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080054status_t deviceAddressFromHal(
55 audio_devices_t device, const char* halAddress, DeviceAddress* address) {
56 address->device = AudioDevice(device);
57
Kevin Rocard5915fa32018-03-29 10:32:44 -070058 if (halAddress == nullptr || strnlen(halAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) {
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080059 return OK;
60 }
jiabindaf49952019-11-22 14:10:57 -080061 if (getAudioDeviceOutAllA2dpSet().count(device) > 0
62 || device == AUDIO_DEVICE_IN_BLUETOOTH_A2DP) {
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080063 int status = sscanf(halAddress,
64 "%hhX:%hhX:%hhX:%hhX:%hhX:%hhX",
65 &address->address.mac[0], &address->address.mac[1], &address->address.mac[2],
66 &address->address.mac[3], &address->address.mac[4], &address->address.mac[5]);
67 return status == 6 ? OK : BAD_VALUE;
jiabindaf49952019-11-22 14:10:57 -080068 } else if (device == AUDIO_DEVICE_OUT_IP || device == AUDIO_DEVICE_IN_IP) {
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080069 int status = sscanf(halAddress,
70 "%hhu.%hhu.%hhu.%hhu",
71 &address->address.ipv4[0], &address->address.ipv4[1],
72 &address->address.ipv4[2], &address->address.ipv4[3]);
73 return status == 4 ? OK : BAD_VALUE;
jiabindaf49952019-11-22 14:10:57 -080074 } else if (getAudioDeviceOutAllUsbSet().count(device) > 0
75 || getAudioDeviceInAllUsbSet().count(device) > 0) {
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080076 int status = sscanf(halAddress,
77 "card=%d;device=%d",
78 &address->address.alsa.card, &address->address.alsa.device);
79 return status == 2 ? OK : BAD_VALUE;
jiabindaf49952019-11-22 14:10:57 -080080 } else if (device == AUDIO_DEVICE_OUT_BUS || device == AUDIO_DEVICE_IN_BUS) {
81 address->busAddress = halAddress;
82 return OK;
83 } else if (device == AUDIO_DEVICE_OUT_REMOTE_SUBMIX
84 || device == AUDIO_DEVICE_IN_REMOTE_SUBMIX) {
85 address->rSubmixAddress = halAddress;
86 return OK;
Kevin Rocard4bcd67f2018-02-28 14:33:38 -080087 }
88 return OK;
89}
90
91} // namespace
92
93DeviceHalHidl::DeviceHalHidl(const sp<IDevice>& device)
94 : ConversionHelperHidl("Device"), mDevice(device),
95 mPrimaryDevice(IPrimaryDevice::castFrom(device)) {
96}
97
98DeviceHalHidl::~DeviceHalHidl() {
99 if (mDevice != 0) {
Mikhail Naganov3355e442019-11-20 14:20:01 -0800100#if MAJOR_VERSION <= 5
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800101 mDevice.clear();
102 hardware::IPCThreadState::self()->flushCommands();
Mikhail Naganov3355e442019-11-20 14:20:01 -0800103#elif MAJOR_VERSION >= 6
104 mDevice->close();
105#endif
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800106 }
107}
108
109status_t DeviceHalHidl::getSupportedDevices(uint32_t*) {
110 // Obsolete.
111 return INVALID_OPERATION;
112}
113
114status_t DeviceHalHidl::initCheck() {
115 if (mDevice == 0) return NO_INIT;
116 return processReturn("initCheck", mDevice->initCheck());
117}
118
119status_t DeviceHalHidl::setVoiceVolume(float volume) {
120 if (mDevice == 0) return NO_INIT;
121 if (mPrimaryDevice == 0) return INVALID_OPERATION;
122 return processReturn("setVoiceVolume", mPrimaryDevice->setVoiceVolume(volume));
123}
124
125status_t DeviceHalHidl::setMasterVolume(float volume) {
126 if (mDevice == 0) return NO_INIT;
Mikhail Naganovae1f6622019-02-21 15:20:05 -0800127 return processReturn("setMasterVolume", mDevice->setMasterVolume(volume));
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800128}
129
130status_t DeviceHalHidl::getMasterVolume(float *volume) {
131 if (mDevice == 0) return NO_INIT;
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800132 Result retval;
Mikhail Naganovae1f6622019-02-21 15:20:05 -0800133 Return<void> ret = mDevice->getMasterVolume(
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800134 [&](Result r, float v) {
135 retval = r;
136 if (retval == Result::OK) {
137 *volume = v;
138 }
139 });
140 return processReturn("getMasterVolume", ret, retval);
141}
142
143status_t DeviceHalHidl::setMode(audio_mode_t mode) {
144 if (mDevice == 0) return NO_INIT;
145 if (mPrimaryDevice == 0) return INVALID_OPERATION;
146 return processReturn("setMode", mPrimaryDevice->setMode(AudioMode(mode)));
147}
148
149status_t DeviceHalHidl::setMicMute(bool state) {
150 if (mDevice == 0) return NO_INIT;
151 return processReturn("setMicMute", mDevice->setMicMute(state));
152}
153
154status_t DeviceHalHidl::getMicMute(bool *state) {
155 if (mDevice == 0) return NO_INIT;
156 Result retval;
157 Return<void> ret = mDevice->getMicMute(
158 [&](Result r, bool mute) {
159 retval = r;
160 if (retval == Result::OK) {
161 *state = mute;
162 }
163 });
164 return processReturn("getMicMute", ret, retval);
165}
166
167status_t DeviceHalHidl::setMasterMute(bool state) {
168 if (mDevice == 0) return NO_INIT;
169 return processReturn("setMasterMute", mDevice->setMasterMute(state));
170}
171
172status_t DeviceHalHidl::getMasterMute(bool *state) {
173 if (mDevice == 0) return NO_INIT;
174 Result retval;
175 Return<void> ret = mDevice->getMasterMute(
176 [&](Result r, bool mute) {
177 retval = r;
178 if (retval == Result::OK) {
179 *state = mute;
180 }
181 });
182 return processReturn("getMasterMute", ret, retval);
183}
184
185status_t DeviceHalHidl::setParameters(const String8& kvPairs) {
186 if (mDevice == 0) return NO_INIT;
187 hidl_vec<ParameterValue> hidlParams;
188 status_t status = parametersFromHal(kvPairs, &hidlParams);
189 if (status != OK) return status;
Kevin Rocardb9cfbf12018-02-23 19:11:06 -0800190 // TODO: change the API so that context and kvPairs are separated
191 return processReturn("setParameters",
192 utils::setParameters(mDevice, {} /* context */, hidlParams));
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800193}
194
195status_t DeviceHalHidl::getParameters(const String8& keys, String8 *values) {
196 values->clear();
197 if (mDevice == 0) return NO_INIT;
198 hidl_vec<hidl_string> hidlKeys;
199 status_t status = keysFromHal(keys, &hidlKeys);
200 if (status != OK) return status;
201 Result retval;
Kevin Rocardb9cfbf12018-02-23 19:11:06 -0800202 Return<void> ret = utils::getParameters(mDevice,
203 {} /* context */,
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800204 hidlKeys,
205 [&](Result r, const hidl_vec<ParameterValue>& parameters) {
206 retval = r;
207 if (retval == Result::OK) {
208 parametersToHal(parameters, values);
209 }
210 });
211 return processReturn("getParameters", ret, retval);
212}
213
214status_t DeviceHalHidl::getInputBufferSize(
215 const struct audio_config *config, size_t *size) {
216 if (mDevice == 0) return NO_INIT;
217 AudioConfig hidlConfig;
Mikhail Naganov05e03192020-12-14 23:19:54 +0000218 HidlUtils::audioConfigFromHal(*config, true /*isInput*/, &hidlConfig);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800219 Result retval;
220 Return<void> ret = mDevice->getInputBufferSize(
221 hidlConfig,
222 [&](Result r, uint64_t bufferSize) {
223 retval = r;
224 if (retval == Result::OK) {
225 *size = static_cast<size_t>(bufferSize);
226 }
227 });
228 return processReturn("getInputBufferSize", ret, retval);
229}
230
231status_t DeviceHalHidl::openOutputStream(
232 audio_io_handle_t handle,
jiabin43810402019-10-24 14:58:31 -0700233 audio_devices_t deviceType,
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800234 audio_output_flags_t flags,
235 struct audio_config *config,
236 const char *address,
237 sp<StreamOutHalInterface> *outStream) {
238 if (mDevice == 0) return NO_INIT;
239 DeviceAddress hidlDevice;
jiabin43810402019-10-24 14:58:31 -0700240 status_t status = deviceAddressFromHal(deviceType, address, &hidlDevice);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800241 if (status != OK) return status;
242 AudioConfig hidlConfig;
Mikhail Naganov05e03192020-12-14 23:19:54 +0000243 HidlUtils::audioConfigFromHal(*config, false /*isInput*/, &hidlConfig);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800244 Result retval = Result::NOT_INITIALIZED;
245 Return<void> ret = mDevice->openOutputStream(
246 handle,
247 hidlDevice,
248 hidlConfig,
Kevin Rocard7a9f05a2018-11-28 16:52:25 -0800249 EnumBitfield<AudioOutputFlag>(flags),
Kevin Rocard3d48dce2018-11-08 17:16:57 -0800250#if MAJOR_VERSION >= 4
Kevin Rocardb9cfbf12018-02-23 19:11:06 -0800251 {} /* metadata */,
Kevin Rocard070e7512018-05-22 09:29:13 -0700252#endif
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800253 [&](Result r, const sp<IStreamOut>& result, const AudioConfig& suggestedConfig) {
254 retval = r;
255 if (retval == Result::OK) {
256 *outStream = new StreamOutHalHidl(result);
257 }
258 HidlUtils::audioConfigToHal(suggestedConfig, config);
259 });
260 return processReturn("openOutputStream", ret, retval);
261}
262
263status_t DeviceHalHidl::openInputStream(
264 audio_io_handle_t handle,
265 audio_devices_t devices,
266 struct audio_config *config,
267 audio_input_flags_t flags,
268 const char *address,
269 audio_source_t source,
Mikhail Naganovb4e037e2019-01-14 15:56:33 -0800270 audio_devices_t outputDevice,
271 const char *outputDeviceAddress,
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800272 sp<StreamInHalInterface> *inStream) {
273 if (mDevice == 0) return NO_INIT;
274 DeviceAddress hidlDevice;
275 status_t status = deviceAddressFromHal(devices, address, &hidlDevice);
276 if (status != OK) return status;
277 AudioConfig hidlConfig;
Mikhail Naganov05e03192020-12-14 23:19:54 +0000278 HidlUtils::audioConfigFromHal(*config, true /*isInput*/, &hidlConfig);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800279 Result retval = Result::NOT_INITIALIZED;
Kevin Rocard070e7512018-05-22 09:29:13 -0700280#if MAJOR_VERSION == 2
Mikhail Naganovd9499eb2018-12-17 16:23:22 -0800281 auto sinkMetadata = AudioSource(source);
Kevin Rocard3d48dce2018-11-08 17:16:57 -0800282#elif MAJOR_VERSION >= 4
Kevin Rocardb9cfbf12018-02-23 19:11:06 -0800283 // TODO: correctly propagate the tracks sources and volume
284 // for now, only send the main source at 1dbfs
Mikhail Naganovd9499eb2018-12-17 16:23:22 -0800285 SinkMetadata sinkMetadata = {{{ .source = AudioSource(source), .gain = 1 }}};
Kevin Rocard070e7512018-05-22 09:29:13 -0700286#endif
Mikhail Naganovb4e037e2019-01-14 15:56:33 -0800287#if MAJOR_VERSION < 5
288 (void)outputDevice;
289 (void)outputDeviceAddress;
290#else
291 if (outputDevice != AUDIO_DEVICE_NONE) {
292 DeviceAddress hidlOutputDevice;
293 status = deviceAddressFromHal(outputDevice, outputDeviceAddress, &hidlOutputDevice);
294 if (status != OK) return status;
295 sinkMetadata.tracks[0].destination.device(std::move(hidlOutputDevice));
296 }
297#endif
Mikhail Naganovbad15102019-12-10 16:44:19 -0800298#if MAJOR_VERSION <= 5
299 // Some flags were specific to framework and must not leak to the HAL.
300 flags = static_cast<audio_input_flags_t>(flags & ~AUDIO_INPUT_FLAG_DIRECT);
301#endif
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800302 Return<void> ret = mDevice->openInputStream(
303 handle,
304 hidlDevice,
305 hidlConfig,
Kevin Rocard7a9f05a2018-11-28 16:52:25 -0800306 EnumBitfield<AudioInputFlag>(flags),
Mikhail Naganovd9499eb2018-12-17 16:23:22 -0800307 sinkMetadata,
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800308 [&](Result r, const sp<IStreamIn>& result, const AudioConfig& suggestedConfig) {
309 retval = r;
310 if (retval == Result::OK) {
311 *inStream = new StreamInHalHidl(result);
312 }
313 HidlUtils::audioConfigToHal(suggestedConfig, config);
314 });
315 return processReturn("openInputStream", ret, retval);
316}
317
318status_t DeviceHalHidl::supportsAudioPatches(bool *supportsPatches) {
319 if (mDevice == 0) return NO_INIT;
320 return processReturn("supportsAudioPatches", mDevice->supportsAudioPatches(), supportsPatches);
321}
322
323status_t DeviceHalHidl::createAudioPatch(
324 unsigned int num_sources,
325 const struct audio_port_config *sources,
326 unsigned int num_sinks,
327 const struct audio_port_config *sinks,
328 audio_patch_handle_t *patch) {
329 if (mDevice == 0) return NO_INIT;
Eric Laurent8711cfd2019-06-10 18:06:33 -0700330 if (patch == nullptr) return BAD_VALUE;
331
Mikhail Naganov73bdf572019-12-11 12:34:15 -0800332#if MAJOR_VERSION < 6
Eric Laurent8711cfd2019-06-10 18:06:33 -0700333 if (*patch != AUDIO_PATCH_HANDLE_NONE) {
334 status_t status = releaseAudioPatch(*patch);
335 ALOGW_IF(status != NO_ERROR, "%s error %d releasing patch handle %d",
336 __func__, status, *patch);
Mikhail Naganov73bdf572019-12-11 12:34:15 -0800337 *patch = AUDIO_PATCH_HANDLE_NONE;
Eric Laurent8711cfd2019-06-10 18:06:33 -0700338 }
Mikhail Naganov73bdf572019-12-11 12:34:15 -0800339#endif
Eric Laurent8711cfd2019-06-10 18:06:33 -0700340
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800341 hidl_vec<AudioPortConfig> hidlSources, hidlSinks;
342 HidlUtils::audioPortConfigsFromHal(num_sources, sources, &hidlSources);
343 HidlUtils::audioPortConfigsFromHal(num_sinks, sinks, &hidlSinks);
Mikhail Naganov73bdf572019-12-11 12:34:15 -0800344 Result retval = Result::OK;
345 Return<void> ret;
346 std::string methodName = "createAudioPatch";
347 if (*patch == AUDIO_PATCH_HANDLE_NONE) { // always true for MAJOR_VERSION < 6
348 ret = mDevice->createAudioPatch(
349 hidlSources, hidlSinks,
350 [&](Result r, AudioPatchHandle hidlPatch) {
351 retval = r;
352 if (retval == Result::OK) {
353 *patch = static_cast<audio_patch_handle_t>(hidlPatch);
354 }
355 });
356 } else {
357#if MAJOR_VERSION >= 6
358 ret = mDevice->updateAudioPatch(
359 *patch,
360 hidlSources, hidlSinks,
361 [&](Result r, AudioPatchHandle hidlPatch) {
362 retval = r;
363 if (retval == Result::OK) {
364 *patch = static_cast<audio_patch_handle_t>(hidlPatch);
365 }
366 });
367 methodName = "updateAudioPatch";
368#endif
369 }
370 return processReturn(methodName.c_str(), ret, retval);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800371}
372
373status_t DeviceHalHidl::releaseAudioPatch(audio_patch_handle_t patch) {
374 if (mDevice == 0) return NO_INIT;
375 return processReturn("releaseAudioPatch", mDevice->releaseAudioPatch(patch));
376}
377
378status_t DeviceHalHidl::getAudioPort(struct audio_port *port) {
379 if (mDevice == 0) return NO_INIT;
380 AudioPort hidlPort;
381 HidlUtils::audioPortFromHal(*port, &hidlPort);
382 Result retval;
383 Return<void> ret = mDevice->getAudioPort(
384 hidlPort,
385 [&](Result r, const AudioPort& p) {
386 retval = r;
387 if (retval == Result::OK) {
388 HidlUtils::audioPortToHal(p, port);
389 }
390 });
391 return processReturn("getAudioPort", ret, retval);
392}
393
jiabinb4fed192020-09-22 14:45:40 -0700394status_t DeviceHalHidl::getAudioPort(struct audio_port_v7 *port) {
395 if (mDevice == 0) return NO_INIT;
396 status_t status = NO_ERROR;
397#if MAJOR_VERSION >= 7
398 AudioPort hidlPort;
399 HidlUtils::audioPortFromHal(*port, &hidlPort);
400 Result retval;
401 Return<void> ret = mDevice->getAudioPort(
402 hidlPort,
403 [&](Result r, const AudioPort& p) {
404 retval = r;
405 if (retval == Result::OK) {
406 HidlUtils::audioPortToHal(p, port);
407 }
408 });
409 status = processReturn("getAudioPort", ret, retval);
410#else
411 struct audio_port audioPort = {};
412 audio_populate_audio_port(port, &audioPort);
413 status = getAudioPort(&audioPort);
414 if (status == NO_ERROR) {
415 audio_populate_audio_port_v7(&audioPort, port);
416 }
417#endif
418 return status;
419}
420
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800421status_t DeviceHalHidl::setAudioPortConfig(const struct audio_port_config *config) {
422 if (mDevice == 0) return NO_INIT;
423 AudioPortConfig hidlConfig;
424 HidlUtils::audioPortConfigFromHal(*config, &hidlConfig);
425 return processReturn("setAudioPortConfig", mDevice->setAudioPortConfig(hidlConfig));
426}
427
Kevin Rocard070e7512018-05-22 09:29:13 -0700428#if MAJOR_VERSION == 2
429status_t DeviceHalHidl::getMicrophones(
430 std::vector<media::MicrophoneInfo> *microphonesInfo __unused) {
431 if (mDevice == 0) return NO_INIT;
432 return INVALID_OPERATION;
433}
Kevin Rocard3d48dce2018-11-08 17:16:57 -0800434#elif MAJOR_VERSION >= 4
jiabin9ff780e2018-03-19 18:19:52 -0700435status_t DeviceHalHidl::getMicrophones(std::vector<media::MicrophoneInfo> *microphonesInfo) {
436 if (mDevice == 0) return NO_INIT;
437 Result retval;
438 Return<void> ret = mDevice->getMicrophones(
439 [&](Result r, hidl_vec<MicrophoneInfo> micArrayHal) {
440 retval = r;
441 for (size_t k = 0; k < micArrayHal.size(); k++) {
442 audio_microphone_characteristic_t dst;
443 //convert
444 microphoneInfoToHal(micArrayHal[k], &dst);
445 media::MicrophoneInfo microphone = media::MicrophoneInfo(dst);
446 microphonesInfo->push_back(microphone);
447 }
448 });
449 return processReturn("getMicrophones", ret, retval);
450}
Kevin Rocard070e7512018-05-22 09:29:13 -0700451#endif
jiabin9ff780e2018-03-19 18:19:52 -0700452
Eric Laurentb82e6b72019-11-22 17:25:04 -0800453#if MAJOR_VERSION >= 6
454status_t DeviceHalHidl::addDeviceEffect(
455 audio_port_handle_t device, sp<EffectHalInterface> effect) {
456 if (mDevice == 0) return NO_INIT;
457 return processReturn("addDeviceEffect", mDevice->addDeviceEffect(
458 static_cast<AudioPortHandle>(device),
459 static_cast<EffectHalHidl*>(effect.get())->effectId()));
460}
461#else
462status_t DeviceHalHidl::addDeviceEffect(
463 audio_port_handle_t device __unused, sp<EffectHalInterface> effect __unused) {
464 return INVALID_OPERATION;
465}
466#endif
467
468#if MAJOR_VERSION >= 6
469status_t DeviceHalHidl::removeDeviceEffect(
470 audio_port_handle_t device, sp<EffectHalInterface> effect) {
471 if (mDevice == 0) return NO_INIT;
472 return processReturn("removeDeviceEffect", mDevice->removeDeviceEffect(
473 static_cast<AudioPortHandle>(device),
474 static_cast<EffectHalHidl*>(effect.get())->effectId()));
475}
476#else
477status_t DeviceHalHidl::removeDeviceEffect(
478 audio_port_handle_t device __unused, sp<EffectHalInterface> effect __unused) {
479 return INVALID_OPERATION;
480}
481#endif
482
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800483status_t DeviceHalHidl::dump(int fd) {
484 if (mDevice == 0) return NO_INIT;
485 native_handle_t* hidlHandle = native_handle_create(1, 0);
486 hidlHandle->data[0] = fd;
Kevin Rocardb9cfbf12018-02-23 19:11:06 -0800487 Return<void> ret = mDevice->debug(hidlHandle, {} /* options */);
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800488 native_handle_delete(hidlHandle);
489 return processReturn("dump", ret);
490}
491
Kevin Rocard070e7512018-05-22 09:29:13 -0700492} // namespace CPP_VERSION
Kevin Rocard4bcd67f2018-02-28 14:33:38 -0800493} // namespace android