Convert AudioFlinger create* arguments to AIDL
This is a first step in AIDLizing IAudioFlinger, where we are
converting the in/out arguments from create{Track,Record} to stable
AIDL and add their respective conversion functions.
Bug: 160253486
Test: atest CtsMediaTestCases:Audio*
Manual verification of common playback and recording scenarios.
Change-Id: Iabb28472aedd90efbba673fb68574876528228df
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index e589eb9..4929346 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -22,12 +22,14 @@
// 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(), \
+#define VALUE_OR_FATAL(result) \
+ ({ \
+ auto _tmp = (result); \
+ LOG_ALWAYS_FATAL_IF(!_tmp.ok(), \
"Failed result (%d)", \
- _tmp.error()); \
- _tmp.value(); })
+ _tmp.error()); \
+ std::move(_tmp.value()); \
+ })
#include "Configuration.h"
#include <dirent.h>
@@ -755,10 +757,27 @@
// IAudioFlinger interface
-sp<IAudioTrack> AudioFlinger::createTrack(const CreateTrackInput& input,
- CreateTrackOutput& output,
- status_t *status)
+sp<IAudioTrack> AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
+ media::CreateTrackResponse& _output,
+ status_t* status)
{
+ // Local version of VALUE_OR_RETURN, specific to this method's calling conventions.
+#define VALUE_OR_EXIT(expr) \
+ ({ \
+ auto _tmp = (expr); \
+ if (!_tmp.ok()) { \
+ *status = _tmp.error(); \
+ return nullptr; \
+ } \
+ std::move(_tmp.value()); \
+ })
+
+ CreateTrackInput input = VALUE_OR_EXIT(CreateTrackInput::fromAidl(_input));
+
+#undef VALUE_OR_EXIT
+
+ CreateTrackOutput output;
+
sp<PlaybackThread::Track> track;
sp<TrackHandle> trackHandle;
sp<Client> client;
@@ -1015,6 +1034,8 @@
AudioSystem::moveEffectsToIo(effectIds, effectThreadId);
}
+ _output = VALUE_OR_FATAL(output.toAidl());
+
// return handle to client
trackHandle = new TrackHandle(track);
@@ -1997,10 +2018,26 @@
// ----------------------------------------------------------------------------
-sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& input,
- CreateRecordOutput& output,
- status_t *status)
+sp<media::IAudioRecord> AudioFlinger::createRecord(const media::CreateRecordRequest& _input,
+ media::CreateRecordResponse& _output,
+ status_t* status)
{
+ // Local version of VALUE_OR_RETURN, specific to this method's calling conventions.
+#define VALUE_OR_EXIT(expr) \
+ ({ \
+ auto _tmp = (expr); \
+ if (!_tmp.ok()) { \
+ *status = _tmp.error(); \
+ return nullptr; \
+ } \
+ std::move(_tmp.value()); \
+ })
+
+ CreateRecordInput input = VALUE_OR_EXIT(CreateRecordInput::fromAidl(_input));
+
+#undef VALUE_OR_EXIT
+ CreateRecordOutput output;
+
sp<RecordThread::RecordTrack> recordTrack;
sp<RecordHandle> recordHandle;
sp<Client> client;
@@ -2138,6 +2175,8 @@
output.buffers = recordTrack->getBuffers();
output.portId = portId;
+ _output = VALUE_OR_FATAL(output.toAidl());
+
// return handle to client
recordHandle = new RecordHandle(recordTrack);