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 "primary_device.h"
20 #include "stream_in.h"
21 #include "stream_out.h"
22 #include "util.h"
23 #include "debug.h"
24
25 namespace android {
26 namespace hardware {
27 namespace audio {
28 namespace V6_0 {
29 namespace implementation {
30
31 constexpr size_t kInBufferDurationMs = 15;
32 constexpr size_t kOutBufferDurationMs = 22;
33
34 using ::android::hardware::Void;
35
PrimaryDevice()36 PrimaryDevice::PrimaryDevice() {}
37
initCheck()38 Return<Result> PrimaryDevice::initCheck() {
39 return Result::OK;
40 }
41
setMasterVolume(float volume)42 Return<Result> PrimaryDevice::setMasterVolume(float volume) {
43 if (isnan(volume) || volume < 0 || volume > 1.0) {
44 return FAILURE(Result::INVALID_ARGUMENTS);
45 }
46
47 mMasterVolume = volume;
48 updateOutputStreamVolume(mMasterMute ? 0.0f : volume);
49 return Result::OK;
50 }
51
getMasterVolume(getMasterVolume_cb _hidl_cb)52 Return<void> PrimaryDevice::getMasterVolume(getMasterVolume_cb _hidl_cb) {
53 _hidl_cb(Result::OK, mMasterVolume);
54 return Void();
55 }
56
setMicMute(bool mute)57 Return<Result> PrimaryDevice::PrimaryDevice::setMicMute(bool mute) {
58 mMicMute = mute;
59 updateInputStreamMicMute(mute);
60 return Result::OK;
61 }
62
getMicMute(getMicMute_cb _hidl_cb)63 Return<void> PrimaryDevice::getMicMute(getMicMute_cb _hidl_cb) {
64 _hidl_cb(Result::OK, mMicMute);
65 return Void();
66 }
67
setMasterMute(bool mute)68 Return<Result> PrimaryDevice::setMasterMute(bool mute) {
69 mMasterMute = mute;
70 updateOutputStreamVolume(mute ? 0.0f : mMasterVolume);
71 return Result::OK;
72 }
73
getMasterMute(getMasterMute_cb _hidl_cb)74 Return<void> PrimaryDevice::getMasterMute(getMasterMute_cb _hidl_cb) {
75 _hidl_cb(Result::OK, mMasterMute);
76 return Void();
77 }
78
getInputBufferSize(const AudioConfig & config,getInputBufferSize_cb _hidl_cb)79 Return<void> PrimaryDevice::getInputBufferSize(const AudioConfig& config,
80 getInputBufferSize_cb _hidl_cb) {
81 AudioConfig suggestedConfig;
82 if (util::checkAudioConfig(false, kInBufferDurationMs, config, suggestedConfig)) {
83 const size_t sz =
84 suggestedConfig.frameCount
85 * util::countChannels(suggestedConfig.channelMask)
86 * util::getBytesPerSample(suggestedConfig.format);
87
88 _hidl_cb(Result::OK, sz);
89 } else {
90 ALOGE("PrimaryDevice::%s:%d failed", __func__, __LINE__);
91 _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), 0);
92 }
93
94 return Void();
95 }
96
openOutputStream(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,hidl_bitfield<AudioOutputFlag> flags,const SourceMetadata & sourceMetadata,openOutputStream_cb _hidl_cb)97 Return<void> PrimaryDevice::openOutputStream(int32_t ioHandle,
98 const DeviceAddress& device,
99 const AudioConfig& config,
100 hidl_bitfield<AudioOutputFlag> flags,
101 const SourceMetadata& sourceMetadata,
102 openOutputStream_cb _hidl_cb) {
103 AudioConfig suggestedConfig;
104 if (util::checkAudioConfig(true, kOutBufferDurationMs, config, suggestedConfig)) {
105 auto stream = std::make_unique<StreamOut>(
106 this, ioHandle, device, suggestedConfig, flags, sourceMetadata);
107
108 stream->setMasterVolume(mMasterMute ? 0.0f : mMasterVolume);
109
110 {
111 std::lock_guard<std::mutex> guard(mMutex);
112 LOG_ALWAYS_FATAL_IF(!mOutputStreams.insert(stream.get()).second);
113 }
114
115 _hidl_cb(Result::OK, stream.release(), config);
116 } else {
117 ALOGE("PrimaryDevice::%s:%d failed", __func__, __LINE__);
118 _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), nullptr, suggestedConfig);
119 }
120
121 return Void();
122 }
123
openInputStream(int32_t ioHandle,const DeviceAddress & device,const AudioConfig & config,hidl_bitfield<AudioInputFlag> flags,const SinkMetadata & sinkMetadata,openInputStream_cb _hidl_cb)124 Return<void> PrimaryDevice::openInputStream(int32_t ioHandle,
125 const DeviceAddress& device,
126 const AudioConfig& config,
127 hidl_bitfield<AudioInputFlag> flags,
128 const SinkMetadata& sinkMetadata,
129 openInputStream_cb _hidl_cb) {
130 AudioConfig suggestedConfig;
131 if (util::checkAudioConfig(false, kInBufferDurationMs, config, suggestedConfig)) {
132 auto stream = std::make_unique<StreamIn>(
133 this, ioHandle, device, suggestedConfig, flags, sinkMetadata);
134
135 stream->setMicMute(mMicMute);
136
137 {
138 std::lock_guard<std::mutex> guard(mMutex);
139 LOG_ALWAYS_FATAL_IF(!mInputStreams.insert(stream.get()).second);
140 }
141
142 _hidl_cb(Result::OK, stream.release(), config);
143 } else {
144 ALOGE("PrimaryDevice::%s:%d failed", __func__, __LINE__);
145 _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), nullptr, suggestedConfig);
146 }
147
148 return Void();
149 }
150
supportsAudioPatches()151 Return<bool> PrimaryDevice::supportsAudioPatches() {
152 return true;
153 }
154
createAudioPatch(const hidl_vec<AudioPortConfig> & sources,const hidl_vec<AudioPortConfig> & sinks,createAudioPatch_cb _hidl_cb)155 Return<void> PrimaryDevice::createAudioPatch(const hidl_vec<AudioPortConfig>& sources,
156 const hidl_vec<AudioPortConfig>& sinks,
157 createAudioPatch_cb _hidl_cb) {
158 if (sources.size() == 1 && sinks.size() == 1) {
159 AudioPatch patch;
160 patch.source = sources[0];
161 patch.sink = sinks[0];
162
163 AudioPatchHandle handle;
164 while (true) {
165 handle = mNextAudioPatchHandle;
166 mNextAudioPatchHandle = std::max(handle + 1, 0);
167 if (mAudioPatches.insert({handle, patch}).second) {
168 break;
169 }
170 }
171
172 _hidl_cb(Result::OK, handle);
173 } else {
174 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), 0);
175 }
176
177 return Void();
178 }
179
updateAudioPatch(AudioPatchHandle previousPatchHandle,const hidl_vec<AudioPortConfig> & sources,const hidl_vec<AudioPortConfig> & sinks,updateAudioPatch_cb _hidl_cb)180 Return<void> PrimaryDevice::updateAudioPatch(AudioPatchHandle previousPatchHandle,
181 const hidl_vec<AudioPortConfig>& sources,
182 const hidl_vec<AudioPortConfig>& sinks,
183 updateAudioPatch_cb _hidl_cb) {
184 const auto i = mAudioPatches.find(previousPatchHandle);
185 if (i == mAudioPatches.end()) {
186 _hidl_cb(FAILURE(Result::INVALID_ARGUMENTS), previousPatchHandle);
187 } else {
188 if (sources.size() == 1 && sinks.size() == 1) {
189 AudioPatch patch;
190 patch.source = sources[0];
191 patch.sink = sinks[0];
192 i->second = patch;
193
194 _hidl_cb(Result::OK, previousPatchHandle);
195 } else {
196 _hidl_cb(Result::NOT_SUPPORTED, previousPatchHandle);
197 }
198 }
199
200 return Void();
201 }
202
releaseAudioPatch(AudioPatchHandle patchHandle)203 Return<Result> PrimaryDevice::releaseAudioPatch(AudioPatchHandle patchHandle) {
204 return (mAudioPatches.erase(patchHandle) == 1) ? Result::OK : FAILURE(Result::INVALID_ARGUMENTS);
205 }
206
getAudioPort(const AudioPort & port,getAudioPort_cb _hidl_cb)207 Return<void> PrimaryDevice::getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) {
208 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), port);
209 return Void();
210 }
211
setAudioPortConfig(const AudioPortConfig & config)212 Return<Result> PrimaryDevice::setAudioPortConfig(const AudioPortConfig& config) {
213 (void)config;
214 return FAILURE(Result::NOT_SUPPORTED);
215 }
216
setScreenState(bool turnedOn)217 Return<Result> PrimaryDevice::setScreenState(bool turnedOn) {
218 (void)turnedOn;
219 return Result::OK;
220 }
221
getHwAvSync(getHwAvSync_cb _hidl_cb)222 Return<void> PrimaryDevice::getHwAvSync(getHwAvSync_cb _hidl_cb) {
223 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), {});
224 return Void();
225 }
226
getParameters(const hidl_vec<ParameterValue> & context,const hidl_vec<hidl_string> & keys,getParameters_cb _hidl_cb)227 Return<void> PrimaryDevice::getParameters(const hidl_vec<ParameterValue>& context,
228 const hidl_vec<hidl_string>& keys,
229 getParameters_cb _hidl_cb) {
230 (void)context;
231 if (keys.size() == 0) {
232 _hidl_cb(Result::OK, {});
233 } else {
234 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), {});
235 }
236 return Void();
237 }
238
setParameters(const hidl_vec<ParameterValue> & context,const hidl_vec<ParameterValue> & parameters)239 Return<Result> PrimaryDevice::setParameters(const hidl_vec<ParameterValue>& context,
240 const hidl_vec<ParameterValue>& parameters) {
241 (void)context;
242 (void)parameters;
243 return Result::OK;
244 }
245
getMicrophones(getMicrophones_cb _hidl_cb)246 Return<void> PrimaryDevice::getMicrophones(getMicrophones_cb _hidl_cb) {
247 _hidl_cb(Result::OK, {util::getMicrophoneInfo()});
248 return Void();
249 }
250
setConnectedState(const DeviceAddress & dev_addr,bool connected)251 Return<Result> PrimaryDevice::setConnectedState(const DeviceAddress& dev_addr, bool connected) {
252 (void)dev_addr;
253 (void)connected;
254 return FAILURE(Result::NOT_SUPPORTED);
255 }
256
close()257 Return<Result> PrimaryDevice::close() {
258 std::lock_guard<std::mutex> guard(mMutex);
259
260 return (mInputStreams.empty() && mOutputStreams.empty())
261 ? Result::OK : FAILURE(Result::INVALID_STATE);
262 }
263
addDeviceEffect(AudioPortHandle device,uint64_t effectId)264 Return<Result> PrimaryDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) {
265 (void)device;
266 (void)effectId;
267 return FAILURE(Result::NOT_SUPPORTED);
268 }
269
removeDeviceEffect(AudioPortHandle device,uint64_t effectId)270 Return<Result> PrimaryDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) {
271 (void)device;
272 (void)effectId;
273 return FAILURE(Result::NOT_SUPPORTED);
274 }
275
setVoiceVolume(float volume)276 Return<Result> PrimaryDevice::setVoiceVolume(float volume) {
277 return (volume >= 0 && volume <= 1.0) ? Result::OK : FAILURE(Result::INVALID_ARGUMENTS);
278 }
279
setMode(AudioMode mode)280 Return<Result> PrimaryDevice::setMode(AudioMode mode) {
281 switch (mode) {
282 case AudioMode::NORMAL:
283 case AudioMode::RINGTONE:
284 case AudioMode::IN_CALL:
285 case AudioMode::IN_COMMUNICATION:
286 return Result::OK;
287
288 default:
289 return FAILURE(Result::INVALID_ARGUMENTS);
290 }
291 }
292
setBtScoHeadsetDebugName(const hidl_string & name)293 Return<Result> PrimaryDevice::setBtScoHeadsetDebugName(const hidl_string& name) {
294 (void)name;
295 return FAILURE(Result::NOT_SUPPORTED);
296 }
297
getBtScoNrecEnabled(getBtScoNrecEnabled_cb _hidl_cb)298 Return<void> PrimaryDevice::getBtScoNrecEnabled(getBtScoNrecEnabled_cb _hidl_cb) {
299 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
300 return Void();
301 }
302
setBtScoNrecEnabled(bool enabled)303 Return<Result> PrimaryDevice::setBtScoNrecEnabled(bool enabled) {
304 (void)enabled;
305 return FAILURE(Result::NOT_SUPPORTED);
306 }
307
getBtScoWidebandEnabled(getBtScoWidebandEnabled_cb _hidl_cb)308 Return<void> PrimaryDevice::getBtScoWidebandEnabled(getBtScoWidebandEnabled_cb _hidl_cb) {
309 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
310 return Void();
311 }
312
setBtScoWidebandEnabled(bool enabled)313 Return<Result> PrimaryDevice::setBtScoWidebandEnabled(bool enabled) {
314 (void)enabled;
315 return FAILURE(Result::NOT_SUPPORTED);
316 }
317
getTtyMode(getTtyMode_cb _hidl_cb)318 Return<void> PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) {
319 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), TtyMode::OFF);
320 return Void();
321 }
322
setTtyMode(IPrimaryDevice::TtyMode mode)323 Return<Result> PrimaryDevice::setTtyMode(IPrimaryDevice::TtyMode mode) {
324 (void)mode;
325 return FAILURE(Result::NOT_SUPPORTED);
326 }
327
getHacEnabled(getHacEnabled_cb _hidl_cb)328 Return<void> PrimaryDevice::getHacEnabled(getHacEnabled_cb _hidl_cb) {
329 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
330 return Void();
331 }
332
setHacEnabled(bool enabled)333 Return<Result> PrimaryDevice::setHacEnabled(bool enabled) {
334 (void)enabled;
335 return FAILURE(Result::NOT_SUPPORTED);
336 }
337
getBtHfpEnabled(getBtHfpEnabled_cb _hidl_cb)338 Return<void> PrimaryDevice::getBtHfpEnabled(getBtHfpEnabled_cb _hidl_cb) {
339 _hidl_cb(FAILURE(Result::NOT_SUPPORTED), false);
340 return Void();
341 }
342
setBtHfpEnabled(bool enabled)343 Return<Result> PrimaryDevice::setBtHfpEnabled(bool enabled) {
344 (void)enabled;
345 return FAILURE(Result::NOT_SUPPORTED);
346 }
347
setBtHfpSampleRate(uint32_t sampleRateHz)348 Return<Result> PrimaryDevice::setBtHfpSampleRate(uint32_t sampleRateHz) {
349 (void)sampleRateHz;
350 return FAILURE(Result::NOT_SUPPORTED);
351 }
352
setBtHfpVolume(float volume)353 Return<Result> PrimaryDevice::setBtHfpVolume(float volume) {
354 (void)volume;
355 return FAILURE(Result::NOT_SUPPORTED);
356 }
357
updateRotation(IPrimaryDevice::Rotation rotation)358 Return<Result> PrimaryDevice::updateRotation(IPrimaryDevice::Rotation rotation) {
359 (void)rotation;
360 return FAILURE(Result::NOT_SUPPORTED);
361 }
362
unrefDevice(StreamIn * sin)363 void PrimaryDevice::unrefDevice(StreamIn *sin) {
364 std::lock_guard<std::mutex> guard(mMutex);
365 LOG_ALWAYS_FATAL_IF(mInputStreams.erase(sin) < 1);
366 }
367
unrefDevice(StreamOut * sout)368 void PrimaryDevice::unrefDevice(StreamOut *sout) {
369 std::lock_guard<std::mutex> guard(mMutex);
370 LOG_ALWAYS_FATAL_IF(mOutputStreams.erase(sout) < 1);
371 }
372
updateOutputStreamVolume(float masterVolume) const373 void PrimaryDevice::updateOutputStreamVolume(float masterVolume) const {
374 std::lock_guard<std::mutex> guard(mMutex);
375 for (StreamOut *stream : mOutputStreams) {
376 stream->setMasterVolume(masterVolume);
377 }
378 }
379
updateInputStreamMicMute(bool micMute) const380 void PrimaryDevice::updateInputStreamMicMute(bool micMute) const {
381 std::lock_guard<std::mutex> guard(mMutex);
382 for (StreamIn *stream : mInputStreams) {
383 stream->setMicMute(micMute);
384 }
385 }
386
387 } // namespace implementation
388 } // namespace V6_0
389 } // namespace audio
390 } // namespace hardware
391 } // namespace android
392