• 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 "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