Prepare openInput() signature to AIDL conversion
The purpose is to avoid having more than one primitive output argument
and to avoid in/out arguments.
Test: Audio-related CTS tests from CtsMediaTestCases
Change-Id: I6bb5dde7956dcca30ed874397f78658d79433202
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 423d98f..dacec15 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -298,6 +298,8 @@
"aidl/android/media/CreateRecordResponse.aidl",
"aidl/android/media/CreateTrackRequest.aidl",
"aidl/android/media/CreateTrackResponse.aidl",
+ "aidl/android/media/OpenInputRequest.aidl",
+ "aidl/android/media/OpenInputResponse.aidl",
"aidl/android/media/IAudioFlingerClient.aidl",
"aidl/android/media/IAudioRecord.aidl",
diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp
index 4d84a07..c19a126 100644
--- a/media/libaudioclient/IAudioFlinger.cpp
+++ b/media/libaudioclient/IAudioFlinger.cpp
@@ -601,40 +601,17 @@
return reply.readInt32();
}
- virtual status_t openInput(audio_module_handle_t module,
- audio_io_handle_t *input,
- audio_config_t *config,
- audio_devices_t *device,
- const String8& address,
- audio_source_t source,
- audio_input_flags_t flags)
+ virtual status_t openInput(const media::OpenInputRequest& request,
+ media::OpenInputResponse* response)
{
- if (input == NULL || config == NULL || device == NULL) {
- return BAD_VALUE;
- }
Parcel data, reply;
- data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
- data.writeInt32(module);
- data.writeInt32(*input);
- data.write(config, sizeof(audio_config_t));
- data.writeInt32(*device);
- data.writeString8(address);
- data.writeInt32(source);
- data.writeInt32(flags);
- status_t status = remote()->transact(OPEN_INPUT, data, &reply);
- if (status != NO_ERROR) {
- *input = AUDIO_IO_HANDLE_NONE;
- return status;
- }
- status = (status_t)reply.readInt32();
- if (status != NO_ERROR) {
- *input = AUDIO_IO_HANDLE_NONE;
- return status;
- }
- *input = (audio_io_handle_t)reply.readInt32();
- reply.read(config, sizeof(audio_config_t));
- *device = (audio_devices_t)reply.readInt32();
- return NO_ERROR;
+ status_t status;
+ return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor())
+ ?: data.writeParcelable(request)
+ ?: remote()->transact(OPEN_INPUT, data, &reply)
+ ?: reply.readInt32(&status)
+ ?: status
+ ?: reply.readParcelable(response);
}
virtual status_t closeInput(int input)
@@ -1366,26 +1343,13 @@
} break;
case OPEN_INPUT: {
CHECK_INTERFACE(IAudioFlinger, data, reply);
- audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
- audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
- audio_config_t config = {};
- if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
- ALOGE("b/23905951");
- }
- audio_devices_t device = (audio_devices_t)data.readInt32();
- String8 address(data.readString8());
- audio_source_t source = (audio_source_t)data.readInt32();
- audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
-
- status_t status = openInput(module, &input, &config,
- &device, address, source, flags);
- reply->writeInt32((int32_t) status);
- if (status == NO_ERROR) {
- reply->writeInt32((int32_t) input);
- reply->write(&config, sizeof(audio_config_t));
- reply->writeInt32(device);
- }
- return NO_ERROR;
+ media::OpenInputRequest request;
+ media::OpenInputResponse response;
+ status_t status;
+ return data.readParcelable(&request)
+ ?: (status = openInput(request, &response), OK)
+ ?: reply->writeInt32(status)
+ ?: reply->writeParcelable(response);
} break;
case CLOSE_INPUT: {
CHECK_INTERFACE(IAudioFlinger, data, reply);
diff --git a/media/libaudioclient/aidl/android/media/OpenInputRequest.aidl b/media/libaudioclient/aidl/android/media/OpenInputRequest.aidl
new file mode 100644
index 0000000..2e55526
--- /dev/null
+++ b/media/libaudioclient/aidl/android/media/OpenInputRequest.aidl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.media.AudioConfig;
+import android.media.AudioDevice;
+import android.media.AudioSourceType;
+
+/**
+ * {@hide}
+ */
+parcelable OpenInputRequest {
+ /** Interpreted as audio_module_handle_t. */
+ int module;
+ /** Interpreted as audio_io_handle_t. */
+ int input;
+ AudioConfig config;
+ AudioDevice device;
+ AudioSourceType source;
+ /** Bitmask, indexed by AudioInputFlag. */
+ int flags;
+}
diff --git a/media/libaudioclient/aidl/android/media/OpenInputResponse.aidl b/media/libaudioclient/aidl/android/media/OpenInputResponse.aidl
new file mode 100644
index 0000000..b613ba5
--- /dev/null
+++ b/media/libaudioclient/aidl/android/media/OpenInputResponse.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.media.AudioConfig;
+import android.media.AudioDevice;
+
+/**
+ * {@hide}
+ */
+parcelable OpenInputResponse {
+ /** Interpreted as audio_io_handle_t. */
+ int input;
+ AudioConfig config;
+ AudioDevice device;
+}
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index 8aa493f..06b1987 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -49,6 +49,8 @@
#include "android/media/IAudioTrackCallback.h"
#include "android/media/IEffect.h"
#include "android/media/IEffectClient.h"
+#include "android/media/OpenInputRequest.h"
+#include "android/media/OpenInputResponse.h"
namespace android {
@@ -248,13 +250,9 @@
virtual status_t suspendOutput(audio_io_handle_t output) = 0;
virtual status_t restoreOutput(audio_io_handle_t output) = 0;
- virtual status_t openInput(audio_module_handle_t module,
- audio_io_handle_t *input,
- audio_config_t *config,
- audio_devices_t *device,
- const String8& address,
- audio_source_t source,
- audio_input_flags_t flags) = 0;
+ virtual status_t openInput(const media::OpenInputRequest& request,
+ media::OpenInputResponse* response) = 0;
+
virtual status_t closeInput(audio_io_handle_t input) = 0;
virtual status_t invalidateStream(audio_stream_type_t stream) = 0;
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index ab15388..bba46c7 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -22,24 +22,6 @@
// Define AUDIO_ARRAYS_STATIC_CHECK to check all audio arrays are correct
#define AUDIO_ARRAYS_STATIC_CHECK 1
-#define VALUE_OR_FATAL(result) \
- ({ \
- auto _tmp = (result); \
- LOG_ALWAYS_FATAL_IF(!_tmp.ok(), \
- "Failed result (%d)", \
- _tmp.error()); \
- std::move(_tmp.value()); \
- })
-
-#define VALUE_OR_EXIT(expr) \
- ({ \
- auto _tmp = (expr); \
- if (!_tmp.ok()) { \
- return _tmp.error(); \
- } \
- std::move(_tmp.value()); \
- })
-
#include "Configuration.h"
#include <dirent.h>
#include <math.h>
@@ -100,6 +82,20 @@
#include "TypedLogger.h"
+#define VALUE_OR_FATAL(result) \
+ ({ \
+ auto _tmp = (result); \
+ LOG_ALWAYS_FATAL_IF(!_tmp.ok(), \
+ "Failed result (%d)", \
+ _tmp.error()); \
+ std::move(_tmp.value()); \
+ })
+
+#define VALUE_OR_RETURN_STATUS(x) \
+ ({ auto _tmp = (x); \
+ if (!_tmp.ok()) return _tmp.error(); \
+ std::move(_tmp.value()); })
+
// ----------------------------------------------------------------------------
// Note: the following macro is used for extremely verbose logging message. In
@@ -770,7 +766,7 @@
media::CreateTrackResponse& _output)
{
// Local version of VALUE_OR_RETURN, specific to this method's calling conventions.
- CreateTrackInput input = VALUE_OR_EXIT(CreateTrackInput::fromAidl(_input));
+ CreateTrackInput input = VALUE_OR_RETURN_STATUS(CreateTrackInput::fromAidl(_input));
CreateTrackOutput output;
sp<PlaybackThread::Track> track;
@@ -2013,7 +2009,7 @@
status_t AudioFlinger::createRecord(const media::CreateRecordRequest& _input,
media::CreateRecordResponse& _output)
{
- CreateRecordInput input = VALUE_OR_EXIT(CreateRecordInput::fromAidl(_input));
+ CreateRecordInput input = VALUE_OR_RETURN_STATUS(CreateRecordInput::fromAidl(_input));
CreateRecordOutput output;
sp<RecordThread::RecordTrack> recordTrack;
@@ -2778,22 +2774,36 @@
return NO_ERROR;
}
-status_t AudioFlinger::openInput(audio_module_handle_t module,
- audio_io_handle_t *input,
- audio_config_t *config,
- audio_devices_t *devices,
- const String8& address,
- audio_source_t source,
- audio_input_flags_t flags)
+status_t AudioFlinger::openInput(const media::OpenInputRequest& request,
+ media::OpenInputResponse* response)
{
Mutex::Autolock _l(mLock);
- if (*devices == AUDIO_DEVICE_NONE) {
+ if (request.device.type == AUDIO_DEVICE_NONE) {
return BAD_VALUE;
}
+ audio_io_handle_t input = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_int32_t_audio_io_handle_t(request.input));
+ audio_config_t config = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_AudioConfig_audio_config_t(request.config));
+ AudioDeviceTypeAddr device = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_AudioDeviceTypeAddress(request.device));
+
sp<ThreadBase> thread = openInput_l(
- module, input, config, *devices, address, source, flags, AUDIO_DEVICE_NONE, String8{});
+ VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_module_handle_t(request.module)),
+ &input,
+ &config,
+ device.mType,
+ device.address().c_str(),
+ VALUE_OR_RETURN_STATUS(aidl2legacy_AudioSourceType_audio_source_t(request.source)),
+ VALUE_OR_RETURN_STATUS(aidl2legacy_audio_input_flags_mask(request.flags)),
+ AUDIO_DEVICE_NONE,
+ String8{});
+
+ response->input = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(input));
+ response->config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(config));
+ response->device = request.device;
if (thread != 0) {
// notify client processes of the new input creation
@@ -2807,7 +2817,7 @@
audio_io_handle_t *input,
audio_config_t *config,
audio_devices_t devices,
- const String8& address,
+ const char* address,
audio_source_t source,
audio_input_flags_t flags,
audio_devices_t outputDevice,
@@ -2837,7 +2847,7 @@
sp<DeviceHalInterface> inHwHal = inHwDev->hwDevice();
sp<StreamInHalInterface> inStream;
status_t status = inHwHal->openInputStream(
- *input, devices, &halconfig, flags, address.string(), source,
+ *input, devices, &halconfig, flags, address, source,
outputDevice, outputDeviceAddress, &inStream);
ALOGV("openInput_l() openInputStream returned input %p, devices %#x, SamplingRate %d"
", Format %#x, Channels %#x, flags %#x, status %d addr %s",
@@ -2847,7 +2857,7 @@
halconfig.format,
halconfig.channel_mask,
flags,
- status, address.string());
+ status, address);
// If the input could not be opened with the requested parameters and we can handle the
// conversion internally, try to open again with the proposed parameters.
@@ -2861,7 +2871,7 @@
ALOGV("openInput_l() reopening with proposed sampling rate and channel mask");
inStream.clear();
status = inHwHal->openInputStream(
- *input, devices, &halconfig, flags, address.string(), source,
+ *input, devices, &halconfig, flags, address, source,
outputDevice, outputDeviceAddress, &inStream);
// FIXME log this new status; HAL should not propose any further changes
}
@@ -3478,15 +3488,16 @@
media::CreateEffectResponse* response) {
const sp<IEffectClient>& effectClient = request.client;
const int32_t priority = request.priority;
- const AudioDeviceTypeAddr device = VALUE_OR_EXIT(
+ const AudioDeviceTypeAddr device = VALUE_OR_RETURN_STATUS(
aidl2legacy_AudioDeviceTypeAddress(request.device));
- const String16 opPackageName = VALUE_OR_EXIT(
+ const String16 opPackageName = VALUE_OR_RETURN_STATUS(
aidl2legacy_string_view_String16(request.opPackageName));
- pid_t pid = VALUE_OR_EXIT(aidl2legacy_int32_t_pid_t(request.pid));
- const audio_session_t sessionId = VALUE_OR_EXIT(
+ pid_t pid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_pid_t(request.pid));
+ const audio_session_t sessionId = VALUE_OR_RETURN_STATUS(
aidl2legacy_int32_t_audio_session_t(request.sessionId));
- audio_io_handle_t io = VALUE_OR_EXIT(aidl2legacy_int32_t_audio_io_handle_t(request.output));
- const effect_descriptor_t descIn = VALUE_OR_EXIT(
+ audio_io_handle_t io = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_int32_t_audio_io_handle_t(request.output));
+ const effect_descriptor_t descIn = VALUE_OR_RETURN_STATUS(
aidl2legacy_EffectDescriptor_effect_descriptor_t(request.desc));
const bool probe = request.probe;
@@ -3762,7 +3773,8 @@
response->id = idOut;
response->enabled = enabledOut != 0;
response->effect = handle;
- response->desc = VALUE_OR_EXIT(legacy2aidl_effect_descriptor_t_EffectDescriptor(descOut));
+ response->desc = VALUE_OR_RETURN_STATUS(
+ legacy2aidl_effect_descriptor_t_EffectDescriptor(descOut));
Exit:
return lStatus;
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index ad07332..50dd8f6 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -196,13 +196,8 @@
virtual status_t restoreOutput(audio_io_handle_t output);
- virtual status_t openInput(audio_module_handle_t module,
- audio_io_handle_t *input,
- audio_config_t *config,
- audio_devices_t *device,
- const String8& address,
- audio_source_t source,
- audio_input_flags_t flags);
+ virtual status_t openInput(const media::OpenInputRequest& request,
+ media::OpenInputResponse* response);
virtual status_t closeInput(audio_io_handle_t input);
@@ -697,7 +692,7 @@
audio_io_handle_t *input,
audio_config_t *config,
audio_devices_t device,
- const String8& address,
+ const char* address,
audio_source_t source,
audio_input_flags_t flags,
audio_devices_t outputDevice,
diff --git a/services/audiopolicy/service/Android.bp b/services/audiopolicy/service/Android.bp
index 8a7a1b2..e823efa 100644
--- a/services/audiopolicy/service/Android.bp
+++ b/services/audiopolicy/service/Android.bp
@@ -15,6 +15,7 @@
shared_libs: [
"libaudioclient",
+ "libaudioclient_aidl_conversion",
"libaudiofoundation",
"libaudiopolicymanager",
"libaudioutils",
@@ -28,6 +29,8 @@
"libmediautils",
"libsensorprivacy",
"libutils",
+ "audioclient-types-aidl-unstable-cpp",
+ "audioflinger-aidl-unstable-cpp",
"capture_state_listener-aidl-cpp",
],
diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
index 1cc6d48..f7d570e 100644
--- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
@@ -23,6 +23,13 @@
#include "BinderProxy.h"
+#define VALUE_OR_RETURN_STATUS(exp) \
+ ({ \
+ auto _tmp = (exp); \
+ if (!_tmp.ok()) return _tmp.error(); \
+ std::move(_tmp.value()); \
+ })
+
namespace android {
/* implementation of the client interface from the policy manager */
@@ -111,7 +118,22 @@
return PERMISSION_DENIED;
}
- return af->openInput(module, input, config, device, address, source, flags);
+ AudioDeviceTypeAddr deviceTypeAddr(*device, address.c_str());
+
+ media::OpenInputRequest request;
+ request.module = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_module_handle_t_int32_t(module));
+ request.input = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
+ request.config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(*config));
+ request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(deviceTypeAddr));
+ request.source = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_source_t_AudioSourceType(source));
+ request.flags = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_mask(flags));
+
+ media::OpenInputResponse response;
+ status_t status = af->openInput(request, &response);
+ if (status == OK) {
+ *input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_module_handle_t(response.input));
+ }
+ return status;
}
status_t AudioPolicyService::AudioPolicyClient::closeInput(audio_io_handle_t input)