• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 <log/log.h>
18 #include <system/audio.h>
19 #include PATH(APM_XSD_ENUMS_H_FILENAME)
20 #include "primary_device.h"
21 #include "stream_in.h"
22 #include "stream_out.h"
23 #include "util.h"
24 #include "debug.h"
25 
26 namespace xsd {
27 using namespace ::android::audio::policy::configuration::CPP_VERSION;
28 }
29 
30 namespace android {
31 namespace hardware {
32 namespace audio {
33 namespace CPP_VERSION {
34 namespace implementation {
35 
36 constexpr size_t kInBufferDurationMs = 15;
37 constexpr size_t kOutBufferDurationMs = 22;
38 
39 using ::android::hardware::Void;
40 
Device()41 Device::Device() {}
42 
initCheck()43 Return<Result> Device::initCheck() {
44     return Result::OK;
45 }
46 
setMasterVolume(float volume)47 Return<Result> Device::setMasterVolume(float volume) {
48     if (isnan(volume) || volume < 0 || volume > 1.0) {
49         return FAILURE(Result::INVALID_ARGUMENTS);
50     }
51 
52     mMasterVolume = volume;
53     updateOutputStreamVolume(mMasterMute ? 0.0f : volume);
54     return Result::OK;
55 }
56 
getMasterVolume(getMasterVolume_cb _hidl_cb)57 Return<void> Device::getMasterVolume(getMasterVolume_cb _hidl_cb) {
58     _hidl_cb(Result::OK, mMasterVolume);
59     return Void();
60 }
61 
setMicMute(bool mute)62 Return<Result> Device::setMicMute(bool mute) {
63     mMicMute = mute;
64     updateInputStreamMicMute(mute);
65     return Result::OK;
66 }
67 
getMicMute(getMicMute_cb _hidl_cb)68 Return<void> Device::getMicMute(getMicMute_cb _hidl_cb) {
69     _hidl_cb(Result::OK, mMicMute);
70     return Void();
71 }
72 
setMasterMute(bool mute)73 Return<Result> Device::setMasterMute(bool mute) {
74     mMasterMute = mute;
75     updateOutputStreamVolume(mute ? 0.0f : mMasterVolume);
76     return Result::OK;
77 }
78 
getMasterMute(getMasterMute_cb _hidl_cb)79 Return<void> Device::getMasterMute(getMasterMute_cb _hidl_cb) {
80     _hidl_cb(Result::OK, mMasterMute);
81     return Void();
82 }
83 
getInputBufferSize(const AudioConfig & config,getInputBufferSize_cb _hidl_cb)84 Return<void> Device::getInputBufferSize(const AudioConfig& config, getInputBufferSize_cb _hidl_cb) {
85     AudioConfig suggestedConfig;
86     if (util::checkAudioConfig(false, kInBufferDurationMs, config, suggestedConfig)) {
87         const size_t sz =
88             suggestedConfig.frameCount
89             * util::countChannels(suggestedConfig.base.channelMask)
90             * util::getBytesPerSample(suggestedConfig.base.format);
91 
92         _hidl_cb(Result::OK, sz);
93     } else {
94         _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), 0);
95     }
96 
97     return Void();
98 }
99 
openOutputStream(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SourceMetadata & sourceMetadata,openOutputStream_cb _hidl_cb)100 Return<void> Device::openOutputStream(int32_t ioHandle,
101                                       const DeviceAddress& device,
102                                       const AudioConfig& config,
103                                       const hidl_vec<AudioInOutFlag>& flags,
104                                       const SourceMetadata& sourceMetadata,
105                                       openOutputStream_cb _hidl_cb) {
106     auto [result, stream, cfg] = openOutputStreamImpl(ioHandle, device,
107             config, flags, sourceMetadata);
108     _hidl_cb(result, stream, cfg);
109     return Void();
110 }
111 
openInputStream(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SinkMetadata & sinkMetadata,openInputStream_cb _hidl_cb)112 Return<void> Device::openInputStream(int32_t ioHandle,
113                                      const DeviceAddress& device,
114                                      const AudioConfig& config,
115                                      const hidl_vec<AudioInOutFlag>& flags,
116                                      const SinkMetadata& sinkMetadata,
117                                      openInputStream_cb _hidl_cb) {
118     auto [result, stream, cfg] = openInputStreamImpl(ioHandle, device,
119             config, flags, sinkMetadata);
120     _hidl_cb(result, stream, cfg);
121     return Void();
122 }
123 
supportsAudioPatches()124 Return<bool> Device::supportsAudioPatches() {
125     return true;
126 }
127 
createAudioPatch(const hidl_vec<AudioPortConfig> & sources,const hidl_vec<AudioPortConfig> & sinks,createAudioPatch_cb _hidl_cb)128 Return<void> Device::createAudioPatch(const hidl_vec<AudioPortConfig>& sources,
129                                       const hidl_vec<AudioPortConfig>& sinks,
130                                       createAudioPatch_cb _hidl_cb) {
131     if (sources.size() == 1 && sinks.size() == 1) {
132         AudioPatch patch;
133         if (!util::checkAudioPortConfig(sources[0]) || !util::checkAudioPortConfig(sinks[0])) {
134             _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), 0);
135             return Void();
136         }
137         patch.source = sources[0];
138         patch.sink = sinks[0];
139 
140         AudioPatchHandle handle;
141         while (true) {
142             handle = mNextAudioPatchHandle;
143             mNextAudioPatchHandle = std::max(handle + 1, 0);
144             if (mAudioPatches.insert({handle, patch}).second) {
145                 break;
146             }
147         }
148 
149         _hidl_cb(Result::OK, handle);
150     } else {
151         _hidl_cb(FAILURE(Result::NOT_SUPPORTED), 0);
152     }
153 
154     return Void();
155 }
156 
updateAudioPatch(AudioPatchHandle previousPatchHandle,const hidl_vec<AudioPortConfig> & sources,const hidl_vec<AudioPortConfig> & sinks,updateAudioPatch_cb _hidl_cb)157 Return<void> Device::updateAudioPatch(AudioPatchHandle previousPatchHandle,
158                                       const hidl_vec<AudioPortConfig>& sources,
159                                       const hidl_vec<AudioPortConfig>& sinks,
160                                       updateAudioPatch_cb _hidl_cb) {
161     const auto i = mAudioPatches.find(previousPatchHandle);
162     if (i == mAudioPatches.end()) {
163         _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), previousPatchHandle);
164     } else {
165         if (sources.size() == 1 && sinks.size() == 1) {
166             AudioPatch patch;
167             patch.source = sources[0];
168             patch.sink = sinks[0];
169             i->second = patch;
170 
171             _hidl_cb(Result::OK, previousPatchHandle);
172         } else {
173             _hidl_cb(Result::NOT_SUPPORTED, previousPatchHandle);
174         }
175     }
176 
177     return Void();
178 }
179 
releaseAudioPatch(AudioPatchHandle patchHandle)180 Return<Result> Device::releaseAudioPatch(AudioPatchHandle patchHandle) {
181     return (mAudioPatches.erase(patchHandle) == 1) ? Result::OK : FAILURE(Result::INVALID_ARGUMENTS);
182 }
183 
getAudioPort(const AudioPort & port,getAudioPort_cb _hidl_cb)184 Return<void> Device::getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) {
185     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), port);
186     return Void();
187 }
188 
setAudioPortConfig(const AudioPortConfig & config)189 Return<Result> Device::setAudioPortConfig(const AudioPortConfig& config) {
190     (void)config;
191     return FAILURE(Result::NOT_SUPPORTED);
192 }
193 
setScreenState(bool turnedOn)194 Return<Result> Device::setScreenState(bool turnedOn) {
195     (void)turnedOn;
196     return Result::OK;
197 }
198 
getHwAvSync(getHwAvSync_cb _hidl_cb)199 Return<void> Device::getHwAvSync(getHwAvSync_cb _hidl_cb) {
200     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), {});
201     return Void();
202 }
203 
getParameters(const hidl_vec<ParameterValue> & context,const hidl_vec<hidl_string> & keys,getParameters_cb _hidl_cb)204 Return<void> Device::getParameters(const hidl_vec<ParameterValue>& context,
205                                    const hidl_vec<hidl_string>& keys,
206                                    getParameters_cb _hidl_cb) {
207     (void)context;
208     if (keys.size() == 0) {
209         _hidl_cb(Result::OK, {});
210     } else {
211         _hidl_cb(FAILURE(Result::NOT_SUPPORTED), {});
212     }
213     return Void();
214 }
215 
setParameters(const hidl_vec<ParameterValue> & context,const hidl_vec<ParameterValue> & parameters)216 Return<Result> Device::setParameters(const hidl_vec<ParameterValue>& context,
217                                      const hidl_vec<ParameterValue>& parameters) {
218     (void)context;
219     (void)parameters;
220     return Result::OK;
221 }
222 
getMicrophones(getMicrophones_cb _hidl_cb)223 Return<void> Device::getMicrophones(getMicrophones_cb _hidl_cb) {
224     _hidl_cb(Result::OK, {util::getMicrophoneInfo()});
225     return Void();
226 }
227 
setConnectedState(const DeviceAddress & dev_addr,bool connected)228 Return<Result> Device::setConnectedState(const DeviceAddress& dev_addr, bool connected) {
229     (void)dev_addr;
230     (void)connected;
231     return FAILURE(Result::NOT_SUPPORTED);
232 }
233 
close()234 Return<Result> Device::close() {
235     std::lock_guard<std::mutex> guard(mMutex);
236 
237     return (mInputStreams.empty() && mOutputStreams.empty())
238         ? Result::OK : FAILURE(Result::INVALID_STATE);
239 }
240 
addDeviceEffect(AudioPortHandle device,uint64_t effectId)241 Return<Result> Device::addDeviceEffect(AudioPortHandle device, uint64_t effectId) {
242     (void)device;
243     (void)effectId;
244     return FAILURE(Result::NOT_SUPPORTED);
245 }
246 
removeDeviceEffect(AudioPortHandle device,uint64_t effectId)247 Return<Result> Device::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) {
248     (void)device;
249     (void)effectId;
250     return FAILURE(Result::NOT_SUPPORTED);
251 }
252 
unrefDevice(StreamIn * sin)253 void Device::unrefDevice(StreamIn *sin) {
254     std::lock_guard<std::mutex> guard(mMutex);
255     LOG_ALWAYS_FATAL_IF(mInputStreams.erase(sin) < 1);
256 }
257 
unrefDevice(StreamOut * sout)258 void Device::unrefDevice(StreamOut *sout) {
259     std::lock_guard<std::mutex> guard(mMutex);
260     LOG_ALWAYS_FATAL_IF(mOutputStreams.erase(sout) < 1);
261 }
262 
updateOutputStreamVolume(float masterVolume) const263 void Device::updateOutputStreamVolume(float masterVolume) const {
264     std::lock_guard<std::mutex> guard(mMutex);
265     for (StreamOut *stream : mOutputStreams) {
266         stream->setMasterVolume(masterVolume);
267     }
268 }
269 
updateInputStreamMicMute(bool micMute) const270 void Device::updateInputStreamMicMute(bool micMute) const {
271     std::lock_guard<std::mutex> guard(mMutex);
272     for (StreamIn *stream : mInputStreams) {
273         stream->setMicMute(micMute);
274     }
275 }
276 
openOutputStreamImpl(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SourceMetadata & sourceMetadata)277 std::tuple<Result, sp<IStreamOut>, AudioConfig> Device::openOutputStreamImpl(
278         int32_t ioHandle, const DeviceAddress& device,
279         const AudioConfig& config, const hidl_vec<AudioInOutFlag>& flags,
280         const SourceMetadata& sourceMetadata) {
281     if (!StreamOut::validateDeviceAddress(device)
282             || !util::checkAudioConfig(config)
283             || !StreamOut::validateFlags(flags)
284             || !StreamOut::validateSourceMetadata(sourceMetadata)) {
285         return {FAILURE(Result::INVALID_ARGUMENTS), {}, {}};
286     }
287 
288     AudioConfig suggestedConfig;
289     if (util::checkAudioConfig(true, kOutBufferDurationMs, config, suggestedConfig)) {
290         auto stream = std::make_unique<StreamOut>(
291             this, ioHandle, device, suggestedConfig, flags, sourceMetadata);
292 
293         stream->setMasterVolume(mMasterMute ? 0.0f : mMasterVolume);
294 
295         {
296             std::lock_guard<std::mutex> guard(mMutex);
297             LOG_ALWAYS_FATAL_IF(!mOutputStreams.insert(stream.get()).second);
298         }
299 
300         return {Result::OK, stream.release(), suggestedConfig};
301     }
302     return {FAILURE(Result::INVALID_ARGUMENTS), {}, suggestedConfig};
303 }
304 
openInputStreamImpl(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SinkMetadata & sinkMetadata)305 std::tuple<Result, sp<IStreamIn>, AudioConfig> Device::openInputStreamImpl(
306         int32_t ioHandle, const DeviceAddress& device,
307         const AudioConfig& config, const hidl_vec<AudioInOutFlag>& flags,
308         const SinkMetadata& sinkMetadata) {
309     if (!StreamIn::validateDeviceAddress(device)
310             || !util::checkAudioConfig(config)
311             || !StreamIn::validateFlags(flags)
312             || !StreamIn::validateSinkMetadata(sinkMetadata)) {
313         return {FAILURE(Result::INVALID_ARGUMENTS), {}, {}};
314     }
315 
316     AudioConfig suggestedConfig;
317     if (util::checkAudioConfig(false, kInBufferDurationMs, config, suggestedConfig)) {
318         auto stream = std::make_unique<StreamIn>(
319             this, ioHandle, device, suggestedConfig, flags, sinkMetadata);
320 
321         stream->setMicMute(mMicMute);
322 
323         {
324             std::lock_guard<std::mutex> guard(mMutex);
325             LOG_ALWAYS_FATAL_IF(!mInputStreams.insert(stream.get()).second);
326         }
327 
328         return {Result::OK, stream.release(), suggestedConfig};
329     }
330     return {FAILURE(Result::INVALID_ARGUMENTS), {}, suggestedConfig};
331 }
332 
333 #if MAJOR_VERSION == 7 && MINOR_VERSION == 1
openOutputStream_7_1(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SourceMetadata & sourceMetadata,openOutputStream_7_1_cb _hidl_cb)334 Return<void> Device::openOutputStream_7_1(int32_t ioHandle, const DeviceAddress& device,
335         const AudioConfig& config, const hidl_vec<AudioInOutFlag>& flags,
336         const SourceMetadata& sourceMetadata, openOutputStream_7_1_cb _hidl_cb) {
337     auto [result, stream, cfg] = openOutputStreamImpl(ioHandle, device,
338             config, flags, sourceMetadata);
339     _hidl_cb(result, stream, cfg);
340     return Void();
341 }
342 
setConnectedState_7_1(const AudioPort & devicePort,bool connected)343 Return<Result> Device::setConnectedState_7_1(const AudioPort& devicePort,
344                                              bool connected) {
345     (void)devicePort;
346     (void)connected;
347     return FAILURE(Result::NOT_SUPPORTED);
348 }
349 #endif
350 
351 // ==================
352 
PrimaryDevice()353 PrimaryDevice::PrimaryDevice() : mDevice(sp<Device>::make()) {
354 }
355 
initCheck()356 Return<Result> PrimaryDevice::initCheck() {
357     return mDevice->initCheck();
358 }
359 
setMasterVolume(float volume)360 Return<Result> PrimaryDevice::setMasterVolume(float volume) {
361     return mDevice->setMasterVolume(volume);
362 }
363 
getMasterVolume(getMasterVolume_cb _hidl_cb)364 Return<void> PrimaryDevice::getMasterVolume(getMasterVolume_cb _hidl_cb) {
365     return mDevice->getMasterVolume(_hidl_cb);
366 }
367 
setMicMute(bool mute)368 Return<Result> PrimaryDevice::setMicMute(bool mute) {
369     return mDevice->setMicMute(mute);
370 }
371 
getMicMute(getMicMute_cb _hidl_cb)372 Return<void> PrimaryDevice::getMicMute(getMicMute_cb _hidl_cb) {
373     return mDevice->getMicMute(_hidl_cb);
374 }
375 
setMasterMute(bool mute)376 Return<Result> PrimaryDevice::setMasterMute(bool mute) {
377     return mDevice->setMasterMute(mute);
378 }
379 
getMasterMute(getMasterMute_cb _hidl_cb)380 Return<void> PrimaryDevice::getMasterMute(getMasterMute_cb _hidl_cb) {
381     return mDevice->getMasterMute(_hidl_cb);
382 }
383 
getInputBufferSize(const AudioConfig & config,getInputBufferSize_cb _hidl_cb)384 Return<void> PrimaryDevice::getInputBufferSize(const AudioConfig& config,
385                                                getInputBufferSize_cb _hidl_cb) {
386     return mDevice->getInputBufferSize(config, _hidl_cb);
387 }
388 
openOutputStream(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SourceMetadata & sourceMetadata,openOutputStream_cb _hidl_cb)389 Return<void> PrimaryDevice::openOutputStream(int32_t ioHandle,
390                                              const DeviceAddress& device,
391                                              const AudioConfig& config,
392                                              const hidl_vec<AudioInOutFlag>& flags,
393                                              const SourceMetadata& sourceMetadata,
394                                              openOutputStream_cb _hidl_cb) {
395     return mDevice->openOutputStream(ioHandle, device, config, flags, sourceMetadata, _hidl_cb);
396 }
397 
openInputStream(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,const hidl_vec<AudioInOutFlag> & flags,const SinkMetadata & sinkMetadata,openInputStream_cb _hidl_cb)398 Return<void> PrimaryDevice::openInputStream(int32_t ioHandle,
399                                             const DeviceAddress& device,
400                                             const AudioConfig& config,
401                                             const hidl_vec<AudioInOutFlag>& flags,
402                                             const SinkMetadata& sinkMetadata,
403                                             openInputStream_cb _hidl_cb) {
404     return mDevice->openInputStream(ioHandle, device, config, flags, sinkMetadata, _hidl_cb);
405 }
406 
supportsAudioPatches()407 Return<bool> PrimaryDevice::supportsAudioPatches() {
408     return mDevice->supportsAudioPatches();
409 }
410 
createAudioPatch(const hidl_vec<AudioPortConfig> & sources,const hidl_vec<AudioPortConfig> & sinks,createAudioPatch_cb _hidl_cb)411 Return<void> PrimaryDevice::createAudioPatch(const hidl_vec<AudioPortConfig>& sources,
412                                              const hidl_vec<AudioPortConfig>& sinks,
413                                              createAudioPatch_cb _hidl_cb) {
414     return mDevice->createAudioPatch(sources, sinks, _hidl_cb);
415 }
416 
updateAudioPatch(int32_t previousPatch,const hidl_vec<AudioPortConfig> & sources,const hidl_vec<AudioPortConfig> & sinks,updateAudioPatch_cb _hidl_cb)417 Return<void> PrimaryDevice::updateAudioPatch(int32_t previousPatch,
418                                              const hidl_vec<AudioPortConfig>& sources,
419                                              const hidl_vec<AudioPortConfig>& sinks,
420                                              updateAudioPatch_cb _hidl_cb) {
421     return mDevice->updateAudioPatch(previousPatch, sources, sinks, _hidl_cb);
422 }
423 
releaseAudioPatch(int32_t patch)424 Return<Result> PrimaryDevice::releaseAudioPatch(int32_t patch) {
425     return mDevice->releaseAudioPatch(patch);
426 }
427 
getAudioPort(const AudioPort & port,getAudioPort_cb _hidl_cb)428 Return<void> PrimaryDevice::getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) {
429     return mDevice->getAudioPort(port, _hidl_cb);
430 }
431 
setAudioPortConfig(const AudioPortConfig & config)432 Return<Result> PrimaryDevice::setAudioPortConfig(const AudioPortConfig& config) {
433     return mDevice->setAudioPortConfig(config);
434 }
435 
setScreenState(bool turnedOn)436 Return<Result> PrimaryDevice::setScreenState(bool turnedOn) {
437     return mDevice->setScreenState(turnedOn);
438 }
439 
getHwAvSync(getHwAvSync_cb _hidl_cb)440 Return<void> PrimaryDevice::getHwAvSync(getHwAvSync_cb _hidl_cb) {
441     return mDevice->getHwAvSync(_hidl_cb);
442 }
443 
getParameters(const hidl_vec<ParameterValue> & context,const hidl_vec<hidl_string> & keys,getParameters_cb _hidl_cb)444 Return<void> PrimaryDevice::getParameters(const hidl_vec<ParameterValue>& context,
445                                           const hidl_vec<hidl_string>& keys,
446                                           getParameters_cb _hidl_cb) {
447     return mDevice->getParameters(context, keys, _hidl_cb);
448 }
449 
setParameters(const hidl_vec<ParameterValue> & context,const hidl_vec<ParameterValue> & parameters)450 Return<Result> PrimaryDevice::setParameters(const hidl_vec<ParameterValue>& context,
451                                             const hidl_vec<ParameterValue>& parameters) {
452     return mDevice->setParameters(context, parameters);
453 }
454 
getMicrophones(getMicrophones_cb _hidl_cb)455 Return<void> PrimaryDevice::getMicrophones(getMicrophones_cb _hidl_cb) {
456     return mDevice->getMicrophones(_hidl_cb);
457 }
458 
setConnectedState(const DeviceAddress & dev_addr,bool connected)459 Return<Result> PrimaryDevice::setConnectedState(const DeviceAddress& dev_addr, bool connected) {
460     return mDevice->setConnectedState(dev_addr, connected);
461 }
462 
close()463 Return<Result> PrimaryDevice::close() {
464     return mDevice->close();
465 }
466 
addDeviceEffect(AudioPortHandle device,uint64_t effectId)467 Return<Result> PrimaryDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) {
468     return mDevice->addDeviceEffect(device, effectId);
469 }
470 
removeDeviceEffect(AudioPortHandle device,uint64_t effectId)471 Return<Result> PrimaryDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) {
472     return mDevice->removeDeviceEffect(device, effectId);
473 }
474 
setVoiceVolume(float volume)475 Return<Result> PrimaryDevice::setVoiceVolume(float volume) {
476     return (volume >= 0 && volume <= 1.0) ? Result::OK : FAILURE(Result::INVALID_ARGUMENTS);
477 }
478 
setMode(AudioMode mode)479 Return<Result> PrimaryDevice::setMode(AudioMode mode) {
480     switch (mode) {
481     case AudioMode::NORMAL:
482     case AudioMode::RINGTONE:
483     case AudioMode::IN_CALL:
484     case AudioMode::IN_COMMUNICATION:
485         return Result::OK;
486 
487     default:
488         return FAILURE(Result::INVALID_ARGUMENTS);
489     }
490 }
491 
setBtScoHeadsetDebugName(const hidl_string & name)492 Return<Result> PrimaryDevice::setBtScoHeadsetDebugName(const hidl_string& name) {
493     (void)name;
494     return FAILURE(Result::NOT_SUPPORTED);
495 }
496 
getBtScoNrecEnabled(getBtScoNrecEnabled_cb _hidl_cb)497 Return<void> PrimaryDevice::getBtScoNrecEnabled(getBtScoNrecEnabled_cb _hidl_cb) {
498     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
499     return Void();
500 }
501 
setBtScoNrecEnabled(bool enabled)502 Return<Result> PrimaryDevice::setBtScoNrecEnabled(bool enabled) {
503     (void)enabled;
504     return FAILURE(Result::NOT_SUPPORTED);
505 }
506 
getBtScoWidebandEnabled(getBtScoWidebandEnabled_cb _hidl_cb)507 Return<void> PrimaryDevice::getBtScoWidebandEnabled(getBtScoWidebandEnabled_cb _hidl_cb) {
508     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
509     return Void();
510 }
511 
setBtScoWidebandEnabled(bool enabled)512 Return<Result> PrimaryDevice::setBtScoWidebandEnabled(bool enabled) {
513     (void)enabled;
514     return FAILURE(Result::NOT_SUPPORTED);
515 }
516 
getTtyMode(getTtyMode_cb _hidl_cb)517 Return<void> PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) {
518     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), TtyMode::OFF);
519     return Void();
520 }
521 
setTtyMode(IPrimaryDevice::TtyMode mode)522 Return<Result> PrimaryDevice::setTtyMode(IPrimaryDevice::TtyMode mode) {
523     (void)mode;
524     return FAILURE(Result::NOT_SUPPORTED);
525 }
526 
getHacEnabled(getHacEnabled_cb _hidl_cb)527 Return<void> PrimaryDevice::getHacEnabled(getHacEnabled_cb _hidl_cb) {
528     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
529     return Void();
530 }
531 
setHacEnabled(bool enabled)532 Return<Result> PrimaryDevice::setHacEnabled(bool enabled) {
533     (void)enabled;
534     return FAILURE(Result::NOT_SUPPORTED);
535 }
536 
getBtHfpEnabled(getBtHfpEnabled_cb _hidl_cb)537 Return<void> PrimaryDevice::getBtHfpEnabled(getBtHfpEnabled_cb _hidl_cb) {
538     _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
539     return Void();
540 }
541 
setBtHfpEnabled(bool enabled)542 Return<Result> PrimaryDevice::setBtHfpEnabled(bool enabled) {
543     (void)enabled;
544     return FAILURE(Result::NOT_SUPPORTED);
545 }
546 
setBtHfpSampleRate(uint32_t sampleRateHz)547 Return<Result> PrimaryDevice::setBtHfpSampleRate(uint32_t sampleRateHz) {
548     (void)sampleRateHz;
549     return FAILURE(Result::NOT_SUPPORTED);
550 }
551 
setBtHfpVolume(float volume)552 Return<Result> PrimaryDevice::setBtHfpVolume(float volume) {
553     (void)volume;
554     return FAILURE(Result::NOT_SUPPORTED);
555 }
556 
updateRotation(IPrimaryDevice::Rotation rotation)557 Return<Result> PrimaryDevice::updateRotation(IPrimaryDevice::Rotation rotation) {
558     (void)rotation;
559     return FAILURE(Result::NOT_SUPPORTED);
560 }
561 
562 }  // namespace implementation
563 }  // namespace CPP_VERSION
564 }  // namespace audio
565 }  // namespace hardware
566 }  // namespace android
567