blob: 179a6554579bc26e7060a317e0cc034e76b84f74 [file] [log] [blame]
Shunkai Yao51202502022-12-12 06:11:46 +00001/*
2 * Copyright (C) 2022 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 "DeviceHalAidl"
18
Mikhail Naganovfab697c2023-01-11 19:33:13 +000019#include <aidl/android/hardware/audio/core/StreamDescriptor.h>
20#include <error/expected_utils.h>
21#include <media/AidlConversionCppNdk.h>
22#include <media/AidlConversionUtil.h>
Mikhail Naganov31d46652023-01-10 18:29:25 +000023#include <mediautils/TimeCheck.h>
24#include <utils/Log.h>
Shunkai Yao51202502022-12-12 06:11:46 +000025
Mikhail Naganov31d46652023-01-10 18:29:25 +000026#include "DeviceHalAidl.h"
27#include "StreamHalAidl.h"
28
Mikhail Naganovfab697c2023-01-11 19:33:13 +000029using aidl::android::aidl_utils::statusTFromBinderStatus;
30using aidl::android::media::audio::common::AudioMode;
31using aidl::android::media::audio::common::Float;
32using aidl::android::hardware::audio::core::IModule;
33using aidl::android::hardware::audio::core::ITelephony;
34using aidl::android::hardware::audio::core::StreamDescriptor;
Mikhail Naganov31d46652023-01-10 18:29:25 +000035
36namespace android {
37
38status_t DeviceHalAidl::getSupportedDevices(uint32_t*) {
39 // Obsolete.
40 return INVALID_OPERATION;
Shunkai Yao51202502022-12-12 06:11:46 +000041}
42
43status_t DeviceHalAidl::initCheck() {
Mikhail Naganov31d46652023-01-10 18:29:25 +000044 if (mModule == nullptr) return NO_INIT;
45 // HAL modules are already initialized by the time they are published to the SM.
Shunkai Yao51202502022-12-12 06:11:46 +000046 return OK;
47}
48
49status_t DeviceHalAidl::setVoiceVolume(float volume) {
Mikhail Naganov31d46652023-01-10 18:29:25 +000050 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +000051 if (!mModule) return NO_INIT;
52 std::shared_ptr<ITelephony> telephony;
53 if (ndk::ScopedAStatus status = mModule->getTelephony(&telephony);
54 status.isOk() && telephony != nullptr) {
55 ITelephony::TelecomConfig inConfig{ .voiceVolume = Float{volume} }, outConfig;
56 RETURN_STATUS_IF_ERROR(
57 statusTFromBinderStatus(telephony->setTelecomConfig(inConfig, &outConfig)));
58 ALOGW_IF(outConfig.voiceVolume.has_value() && volume != outConfig.voiceVolume.value().value,
59 "%s: the resulting voice volume %f is not the same as requested %f",
60 __func__, outConfig.voiceVolume.value().value, volume);
61 }
62 return INVALID_OPERATION;
Shunkai Yao51202502022-12-12 06:11:46 +000063}
64
65status_t DeviceHalAidl::setMasterVolume(float volume) {
Mikhail Naganov31d46652023-01-10 18:29:25 +000066 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +000067 if (!mModule) return NO_INIT;
68 return statusTFromBinderStatus(mModule->setMasterVolume(volume));
Shunkai Yao51202502022-12-12 06:11:46 +000069}
70
71status_t DeviceHalAidl::getMasterVolume(float *volume) {
Mikhail Naganov31d46652023-01-10 18:29:25 +000072 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +000073 if (!mModule) return NO_INIT;
74 return statusTFromBinderStatus(mModule->getMasterVolume(volume));
Shunkai Yao51202502022-12-12 06:11:46 +000075}
76
Mikhail Naganovfab697c2023-01-11 19:33:13 +000077status_t DeviceHalAidl::setMode(audio_mode_t mode) {
Mikhail Naganov31d46652023-01-10 18:29:25 +000078 TIME_CHECK();
79 if (!mModule) return NO_INIT;
Mikhail Naganovfab697c2023-01-11 19:33:13 +000080 AudioMode audioMode = VALUE_OR_FATAL(::aidl::android::legacy2aidl_audio_mode_t_AudioMode(mode));
81 std::shared_ptr<ITelephony> telephony;
82 if (ndk::ScopedAStatus status = mModule->getTelephony(&telephony);
83 status.isOk() && telephony != nullptr) {
84 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(telephony->switchAudioMode(audioMode)));
85 }
86 return statusTFromBinderStatus(mModule->updateAudioMode(audioMode));
Shunkai Yao51202502022-12-12 06:11:46 +000087}
88
89status_t DeviceHalAidl::setMicMute(bool state) {
Mikhail Naganov31d46652023-01-10 18:29:25 +000090 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +000091 if (!mModule) return NO_INIT;
92 return statusTFromBinderStatus(mModule->setMicMute(state));
Shunkai Yao51202502022-12-12 06:11:46 +000093}
Mikhail Naganov31d46652023-01-10 18:29:25 +000094
Shunkai Yao51202502022-12-12 06:11:46 +000095status_t DeviceHalAidl::getMicMute(bool *state) {
Mikhail Naganov31d46652023-01-10 18:29:25 +000096 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +000097 if (!mModule) return NO_INIT;
98 return statusTFromBinderStatus(mModule->getMicMute(state));
Shunkai Yao51202502022-12-12 06:11:46 +000099}
Mikhail Naganov31d46652023-01-10 18:29:25 +0000100
Shunkai Yao51202502022-12-12 06:11:46 +0000101status_t DeviceHalAidl::setMasterMute(bool state) {
Mikhail Naganov31d46652023-01-10 18:29:25 +0000102 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +0000103 if (!mModule) return NO_INIT;
104 return statusTFromBinderStatus(mModule->setMasterMute(state));
Shunkai Yao51202502022-12-12 06:11:46 +0000105}
Mikhail Naganov31d46652023-01-10 18:29:25 +0000106
Shunkai Yao51202502022-12-12 06:11:46 +0000107status_t DeviceHalAidl::getMasterMute(bool *state) {
Mikhail Naganov31d46652023-01-10 18:29:25 +0000108 TIME_CHECK();
Mikhail Naganovfab697c2023-01-11 19:33:13 +0000109 if (!mModule) return NO_INIT;
110 return statusTFromBinderStatus(mModule->getMasterMute(state));
Shunkai Yao51202502022-12-12 06:11:46 +0000111}
112
Mikhail Naganov31d46652023-01-10 18:29:25 +0000113status_t DeviceHalAidl::setParameters(const String8& kvPairs __unused) {
114 TIME_CHECK();
115 if (!mModule) return NO_INIT;
116 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000117 return OK;
118}
119
Mikhail Naganov31d46652023-01-10 18:29:25 +0000120status_t DeviceHalAidl::getParameters(const String8& keys __unused, String8 *values) {
121 TIME_CHECK();
122 values->clear();
123 if (!mModule) return NO_INIT;
124 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000125 return OK;
126}
127
Mikhail Naganov31d46652023-01-10 18:29:25 +0000128status_t DeviceHalAidl::getInputBufferSize(
129 const struct audio_config* config __unused, size_t* size __unused) {
130 TIME_CHECK();
131 if (!mModule) return NO_INIT;
132 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000133 return OK;
134}
135
Mikhail Naganov31d46652023-01-10 18:29:25 +0000136status_t DeviceHalAidl::openOutputStream(
137 audio_io_handle_t handle __unused, audio_devices_t devices __unused,
138 audio_output_flags_t flags __unused, struct audio_config* config,
139 const char* address __unused,
140 sp<StreamOutHalInterface>* outStream) {
141 if (!outStream || !config) {
142 return BAD_VALUE;
143 }
144 TIME_CHECK();
145 if (!mModule) return NO_INIT;
146 config->sample_rate = 48000;
147 config->format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
148 config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
149 StreamDescriptor descriptor;
150 descriptor.frameSizeBytes = audio_bytes_per_sample(config->format) *
151 audio_channel_count_from_out_mask(config->channel_mask);
152 descriptor.bufferSizeFrames = 600;
153 *outStream = sp<StreamOutHalAidl>::make(descriptor, nullptr);
Shunkai Yao51202502022-12-12 06:11:46 +0000154 return OK;
155}
156
Mikhail Naganov31d46652023-01-10 18:29:25 +0000157status_t DeviceHalAidl::openInputStream(
158 audio_io_handle_t handle __unused, audio_devices_t devices __unused,
159 struct audio_config* config, audio_input_flags_t flags __unused,
160 const char* address __unused, audio_source_t source __unused,
161 audio_devices_t outputDevice __unused,
162 const char* outputDeviceAddress __unused,
163 sp<StreamInHalInterface>* inStream) {
164 if (!inStream || !config) {
165 return BAD_VALUE;
166 }
167 TIME_CHECK();
168 if (!mModule) return NO_INIT;
169 config->sample_rate = 48000;
170 config->format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
171 config->channel_mask = AUDIO_CHANNEL_IN_STEREO;
172 StreamDescriptor descriptor;
173 descriptor.frameSizeBytes = audio_bytes_per_sample(config->format) *
174 audio_channel_count_from_out_mask(config->channel_mask);
175 descriptor.bufferSizeFrames = 600;
176 *inStream = sp<StreamInHalAidl>::make(descriptor, nullptr);
Shunkai Yao51202502022-12-12 06:11:46 +0000177 return OK;
178}
179
180status_t DeviceHalAidl::supportsAudioPatches(bool* supportsPatches) {
181 *supportsPatches = true;
182 return OK;
183}
184
Mikhail Naganov31d46652023-01-10 18:29:25 +0000185status_t DeviceHalAidl::createAudioPatch(unsigned int num_sources __unused,
186 const struct audio_port_config* sources __unused,
187 unsigned int num_sinks __unused,
188 const struct audio_port_config* sinks __unused,
189 audio_patch_handle_t* patch __unused) {
190 TIME_CHECK();
191 if (!mModule) return NO_INIT;
192 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000193 return OK;
194}
195
Mikhail Naganov31d46652023-01-10 18:29:25 +0000196status_t DeviceHalAidl::releaseAudioPatch(audio_patch_handle_t patch __unused) {
197 TIME_CHECK();
198 if (!mModule) return NO_INIT;
199 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000200 return OK;
201}
202
Mikhail Naganov31d46652023-01-10 18:29:25 +0000203status_t DeviceHalAidl::getAudioPort(struct audio_port* port __unused) {
204 TIME_CHECK();
205 ALOGE("%s not implemented yet", __func__);
206 return INVALID_OPERATION;
207}
208
209status_t DeviceHalAidl::getAudioPort(struct audio_port_v7 *port __unused) {
210 TIME_CHECK();
211 ALOGE("%s not implemented yet", __func__);
212 return INVALID_OPERATION;
213}
214
215status_t DeviceHalAidl::setAudioPortConfig(const struct audio_port_config* config __unused) {
216 TIME_CHECK();
217 if (!mModule) return NO_INIT;
218 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000219 return OK;
220}
221
222status_t DeviceHalAidl::getMicrophones(
Mikhail Naganov31d46652023-01-10 18:29:25 +0000223 std::vector<audio_microphone_characteristic_t>* microphones __unused) {
224 TIME_CHECK();
225 if (!mModule) return NO_INIT;
226 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000227 return OK;
228}
229
Mikhail Naganov31d46652023-01-10 18:29:25 +0000230status_t DeviceHalAidl::addDeviceEffect(audio_port_handle_t device __unused,
231 sp<EffectHalInterface> effect) {
Shunkai Yao51202502022-12-12 06:11:46 +0000232 if (!effect) {
233 return BAD_VALUE;
234 }
Mikhail Naganov31d46652023-01-10 18:29:25 +0000235 TIME_CHECK();
236 if (!mModule) return NO_INIT;
237 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000238 return OK;
239}
Mikhail Naganov31d46652023-01-10 18:29:25 +0000240status_t DeviceHalAidl::removeDeviceEffect(audio_port_handle_t device __unused,
Shunkai Yao51202502022-12-12 06:11:46 +0000241 sp<EffectHalInterface> effect) {
242 if (!effect) {
243 return BAD_VALUE;
244 }
Mikhail Naganov31d46652023-01-10 18:29:25 +0000245 TIME_CHECK();
246 if (!mModule) return NO_INIT;
247 ALOGE("%s not implemented yet", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000248 return OK;
249}
250
251status_t DeviceHalAidl::getMmapPolicyInfos(
252 media::audio::common::AudioMMapPolicyType policyType __unused,
253 std::vector<media::audio::common::AudioMMapPolicyInfo>* policyInfos __unused) {
Mikhail Naganov31d46652023-01-10 18:29:25 +0000254 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000255 ALOGE("%s not implemented yet", __func__);
256 return OK;
257}
258
259int32_t DeviceHalAidl::getAAudioMixerBurstCount() {
Mikhail Naganov31d46652023-01-10 18:29:25 +0000260 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000261 ALOGE("%s not implemented yet", __func__);
262 return OK;
263}
264
265int32_t DeviceHalAidl::getAAudioHardwareBurstMinUsec() {
Mikhail Naganov31d46652023-01-10 18:29:25 +0000266 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000267 ALOGE("%s not implemented yet", __func__);
268 return OK;
269}
270
271error::Result<audio_hw_sync_t> DeviceHalAidl::getHwAvSync() {
Mikhail Naganov31d46652023-01-10 18:29:25 +0000272 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000273 ALOGE("%s not implemented yet", __func__);
274 return base::unexpected(INVALID_OPERATION);
275}
276
Mikhail Naganovfab697c2023-01-11 19:33:13 +0000277status_t DeviceHalAidl::dump(int fd, const Vector<String16>& args) {
278 TIME_CHECK();
279 if (!mModule) return NO_INIT;
280 return mModule->dump(fd, Args(args).args(), args.size());
Shunkai Yao51202502022-12-12 06:11:46 +0000281};
282
Mikhail Naganov31d46652023-01-10 18:29:25 +0000283int32_t DeviceHalAidl::supportsBluetoothVariableLatency(bool* supports __unused) {
284 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000285 ALOGE("%s not implemented yet", __func__);
286 return INVALID_OPERATION;
287}
Mikhail Naganov31d46652023-01-10 18:29:25 +0000288
289} // namespace android