Include the returned IAudio{Track,Record} in response parcelable
In preparation to AIDLizing IAudioFlinger, having two return values is
inconvenient. It is also not consistent with most other methods, which
mostly return status_t. This change puts the returned
IAudio{Track,Record} in the response parcelable instead of having them
as separate return values.
Test: Audio-related CTS tests from CtsMediaTestCases
Change-Id: I97cbec21ca936b4e00e5caa06760ce00922739e8
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index a7f0980..bc8609f 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -31,6 +31,15 @@
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>
@@ -757,25 +766,11 @@
// IAudioFlinger interface
-sp<media::IAudioTrack> AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
- media::CreateTrackResponse& _output,
- status_t* status)
+status_t AudioFlinger::createTrack(const media::CreateTrackRequest& _input,
+ media::CreateTrackResponse& _output)
{
// 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;
@@ -1034,17 +1029,14 @@
AudioSystem::moveEffectsToIo(effectIds, effectThreadId);
}
+ output.audioTrack = new TrackHandle(track);
_output = VALUE_OR_FATAL(output.toAidl());
- // return handle to client
- trackHandle = new TrackHandle(track);
-
Exit:
if (lStatus != NO_ERROR && output.outputId != AUDIO_IO_HANDLE_NONE) {
AudioSystem::releaseOutput(portId);
}
- *status = lStatus;
- return trackHandle;
+ return lStatus;
}
uint32_t AudioFlinger::sampleRate(audio_io_handle_t ioHandle) const
@@ -2018,24 +2010,10 @@
// ----------------------------------------------------------------------------
-sp<media::IAudioRecord> AudioFlinger::createRecord(const media::CreateRecordRequest& _input,
- media::CreateRecordResponse& _output,
- status_t* status)
+status_t AudioFlinger::createRecord(const media::CreateRecordRequest& _input,
+ media::CreateRecordResponse& _output)
{
- // 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;
@@ -2175,11 +2153,9 @@
output.buffers = recordTrack->getBuffers();
output.portId = portId;
+ output.audioRecord = new RecordHandle(recordTrack);
_output = VALUE_OR_FATAL(output.toAidl());
- // return handle to client
- recordHandle = new RecordHandle(recordTrack);
-
Exit:
if (lStatus != NO_ERROR) {
// remove local strong reference to Client before deleting the RecordTrack so that the
@@ -2196,8 +2172,7 @@
}
}
- *status = lStatus;
- return recordHandle;
+ return lStatus;
}