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/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index 5969f94..f01b1d0 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -748,7 +748,6 @@
IAudioFlinger::CreateRecordInput input;
IAudioFlinger::CreateRecordOutput output;
audio_session_t originalSessionId;
- sp<media::IAudioRecord> record;
void *iMemPointer;
audio_track_cblk_t* cblk;
status_t status;
@@ -817,7 +816,7 @@
do {
media::CreateRecordResponse response;
- record = audioFlinger->createRecord(VALUE_OR_FATAL(input.toAidl()), response, &status);
+ status = audioFlinger->createRecord(VALUE_OR_FATAL(input.toAidl()), response);
output = VALUE_OR_FATAL(IAudioFlinger::CreateRecordOutput::fromAidl(response));
if (status == NO_ERROR) {
break;
@@ -893,7 +892,7 @@
IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this);
mDeathNotifier.clear();
}
- mAudioRecord = record;
+ mAudioRecord = output.audioRecord;
mCblkMemory = output.cblk;
mBufferMemory = output.buffers;
IPCThreadState::self()->flushCommands();
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index 67938bc..8c53c5b 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -1608,9 +1608,7 @@
input.opPackageName = mOpPackageName;
media::CreateTrackResponse response;
- sp<media::IAudioTrack> track = audioFlinger->createTrack(VALUE_OR_FATAL(input.toAidl()),
- response,
- &status);
+ status = audioFlinger->createTrack(VALUE_OR_FATAL(input.toAidl()), response);
IAudioFlinger::CreateTrackOutput output = VALUE_OR_FATAL(
IAudioFlinger::CreateTrackOutput::fromAidl(
response));
@@ -1623,7 +1621,7 @@
}
goto exit;
}
- ALOG_ASSERT(track != 0);
+ ALOG_ASSERT(output.audioTrack != 0);
mFrameCount = output.frameCount;
mNotificationFramesAct = (uint32_t)output.notificationFrameCount;
@@ -1646,7 +1644,7 @@
// FIXME compare to AudioRecord
std::optional<media::SharedFileRegion> sfr;
- track->getCblk(&sfr);
+ output.audioTrack->getCblk(&sfr);
sp<IMemory> iMem = VALUE_OR_FATAL(aidl2legacy_NullableSharedFileRegion_IMemory(sfr));
if (iMem == 0) {
ALOGE("%s(%d): Could not get control block", __func__, mPortId);
@@ -1668,7 +1666,7 @@
IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
mDeathNotifier.clear();
}
- mAudioTrack = track;
+ mAudioTrack = output.audioTrack;
mCblkMemory = iMem;
IPCThreadState::self()->flushCommands();
diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp
index a4e26ca..b5c6547 100644
--- a/media/libaudioclient/IAudioFlinger.cpp
+++ b/media/libaudioclient/IAudioFlinger.cpp
@@ -153,6 +153,7 @@
aidl.afLatencyMs = VALUE_OR_RETURN(convertIntegral<int32_t>(afLatencyMs));
aidl.outputId = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(outputId));
aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(portId));
+ aidl.audioTrack = audioTrack;
return aidl;
}
@@ -173,6 +174,7 @@
legacy.afLatencyMs = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.afLatencyMs));
legacy.outputId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.outputId));
legacy.portId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
+ legacy.audioTrack = aidl.audioTrack;
return legacy;
}
@@ -226,6 +228,7 @@
aidl.cblk = VALUE_OR_RETURN(legacy2aidl_NullableIMemory_SharedFileRegion(cblk));
aidl.buffers = VALUE_OR_RETURN(legacy2aidl_NullableIMemory_SharedFileRegion(buffers));
aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(portId));
+ aidl.audioRecord = audioRecord;
return aidl;
}
@@ -245,6 +248,7 @@
legacy.cblk = VALUE_OR_RETURN(aidl2legacy_NullableSharedFileRegion_IMemory(aidl.cblk));
legacy.buffers = VALUE_OR_RETURN(aidl2legacy_NullableSharedFileRegion_IMemory(aidl.buffers));
legacy.portId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
+ legacy.audioRecord = aidl.audioRecord;
return legacy;
}
@@ -256,75 +260,58 @@
{
}
- virtual sp<media::IAudioTrack> createTrack(const media::CreateTrackRequest& input,
- media::CreateTrackResponse& output,
- status_t* status)
+ virtual status_t createTrack(const media::CreateTrackRequest& input,
+ media::CreateTrackResponse& output)
{
Parcel data, reply;
- sp<media::IAudioTrack> track;
+ status_t status;
data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-
- if (status == nullptr) {
- return track;
- }
-
data.writeParcelable(input);
status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
if (lStatus != NO_ERROR) {
ALOGE("createTrack transaction error %d", lStatus);
- *status = DEAD_OBJECT;
- return track;
+ return DEAD_OBJECT;
}
- *status = reply.readInt32();
- if (*status != NO_ERROR) {
- ALOGE("createTrack returned error %d", *status);
- return track;
- }
- track = interface_cast<media::IAudioTrack>(reply.readStrongBinder());
- if (track == 0) {
- ALOGE("createTrack returned an NULL IAudioTrack with status OK");
- *status = DEAD_OBJECT;
- return track;
+ status = reply.readInt32();
+ if (status != NO_ERROR) {
+ ALOGE("createTrack returned error %d", status);
+ return status;
}
output.readFromParcel(&reply);
- return track;
+ if (output.audioTrack == 0) {
+ ALOGE("createTrack returned an NULL IAudioTrack with status OK");
+ return DEAD_OBJECT;
+ }
+ return OK;
}
- virtual sp<media::IAudioRecord> createRecord(const media::CreateRecordRequest& input,
- media::CreateRecordResponse& output,
- status_t* status)
+ virtual status_t createRecord(const media::CreateRecordRequest& input,
+ media::CreateRecordResponse& output)
{
Parcel data, reply;
- sp<media::IAudioRecord> record;
+ status_t status;
data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
- if (status == nullptr) {
- return record;
- }
-
data.writeParcelable(input);
status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
if (lStatus != NO_ERROR) {
ALOGE("createRecord transaction error %d", lStatus);
- *status = DEAD_OBJECT;
- return record;
+ return DEAD_OBJECT;
}
- *status = reply.readInt32();
- if (*status != NO_ERROR) {
- ALOGE("createRecord returned error %d", *status);
- return record;
+ status = reply.readInt32();
+ if (status != NO_ERROR) {
+ ALOGE("createRecord returned error %d", status);
+ return status;
}
- record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
- if (record == 0) {
- ALOGE("createRecord returned a NULL IAudioRecord with status OK");
- *status = DEAD_OBJECT;
- return record;
- }
output.readFromParcel(&reply);
- return record;
+ if (output.audioRecord == 0) {
+ ALOGE("createRecord returned a NULL IAudioRecord with status OK");
+ return DEAD_OBJECT;
+ }
+ return OK;
}
virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
@@ -1199,16 +1186,13 @@
status_t status;
media::CreateTrackResponse output;
- sp<media::IAudioTrack> track= createTrack(input,
- output,
- &status);
+ status = createTrack(input, output);
- LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
+ LOG_ALWAYS_FATAL_IF((output.audioTrack != 0) != (status == NO_ERROR));
reply->writeInt32(status);
if (status != NO_ERROR) {
return NO_ERROR;
}
- reply->writeStrongBinder(IInterface::asBinder(track));
output.writeToParcel(reply);
return NO_ERROR;
} break;
@@ -1224,16 +1208,13 @@
status_t status;
media::CreateRecordResponse output;
- sp<media::IAudioRecord> record = createRecord(input,
- output,
- &status);
+ status = createRecord(input, output);
- LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
+ LOG_ALWAYS_FATAL_IF((output.audioRecord != 0) != (status == NO_ERROR));
reply->writeInt32(status);
if (status != NO_ERROR) {
return NO_ERROR;
}
- reply->writeStrongBinder(IInterface::asBinder(record));
output.writeToParcel(reply);
return NO_ERROR;
} break;
diff --git a/media/libaudioclient/aidl/android/media/CreateRecordResponse.aidl b/media/libaudioclient/aidl/android/media/CreateRecordResponse.aidl
index 0c9d7c3..d78b3fc 100644
--- a/media/libaudioclient/aidl/android/media/CreateRecordResponse.aidl
+++ b/media/libaudioclient/aidl/android/media/CreateRecordResponse.aidl
@@ -16,6 +16,7 @@
package android.media;
+import android.media.IAudioRecord;
import android.media.SharedFileRegion;
/**
@@ -40,4 +41,6 @@
@nullable SharedFileRegion buffers;
/** Interpreted as audio_port_handle_t. */
int portId;
+ /** The newly created record. */
+ @nullable IAudioRecord audioRecord;
}
diff --git a/media/libaudioclient/aidl/android/media/CreateTrackResponse.aidl b/media/libaudioclient/aidl/android/media/CreateTrackResponse.aidl
index 494e63f..6bdd8e4 100644
--- a/media/libaudioclient/aidl/android/media/CreateTrackResponse.aidl
+++ b/media/libaudioclient/aidl/android/media/CreateTrackResponse.aidl
@@ -16,6 +16,8 @@
package android.media;
+import android.media.IAudioTrack;
+
/**
* CreateTrackOutput contains all output arguments returned by AudioFlinger to AudioTrack
* when calling createTrack() including arguments that were passed as I/O for update by
@@ -39,4 +41,6 @@
int outputId;
/** Interpreted as audio_port_handle_t. */
int portId;
+ /** The newly created track. */
+ @nullable IAudioTrack audioTrack;
}
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index 20aabf9..9afd416 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -104,6 +104,7 @@
uint32_t afLatencyMs;
audio_io_handle_t outputId;
audio_port_handle_t portId;
+ sp<media::IAudioTrack> audioTrack;
ConversionResult<media::CreateTrackResponse> toAidl() const;
static ConversionResult<CreateTrackOutput> fromAidl(const media::CreateTrackResponse& aidl);
@@ -152,24 +153,25 @@
sp<IMemory> cblk;
sp<IMemory> buffers;
audio_port_handle_t portId;
+ sp<media::IAudioRecord> audioRecord;
ConversionResult<media::CreateRecordResponse> toAidl() const;
static ConversionResult<CreateRecordOutput> fromAidl(const media::CreateRecordResponse& aidl);
};
- // invariant on exit for all APIs that return an sp<>:
- // (return value != 0) == (*status == NO_ERROR)
-
/* create an audio track and registers it with AudioFlinger.
- * return null if the track cannot be created.
+ * The audioTrack field will be null if the track cannot be created and the status will reflect
+ * failure.
*/
- virtual sp<media::IAudioTrack> createTrack(const media::CreateTrackRequest& input,
- media::CreateTrackResponse& output,
- status_t* status) = 0;
+ virtual status_t createTrack(const media::CreateTrackRequest& input,
+ media::CreateTrackResponse& output) = 0;
- virtual sp<media::IAudioRecord> createRecord(const media::CreateRecordRequest& input,
- media::CreateRecordResponse& output,
- status_t* status) = 0;
+ /* create an audio record and registers it with AudioFlinger.
+ * The audioRecord field will be null if the track cannot be created and the status will reflect
+ * failure.
+ */
+ virtual status_t createRecord(const media::CreateRecordRequest& input,
+ media::CreateRecordResponse& output) = 0;
// FIXME Surprisingly, format/latency don't work for input handles
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;
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index eb9b7e5..42b5c99 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -135,13 +135,11 @@
virtual status_t dump(int fd, const Vector<String16>& args);
// IAudioFlinger interface, in binder opcode order
- virtual sp<media::IAudioTrack> createTrack(const media::CreateTrackRequest& input,
- media::CreateTrackResponse& output,
- status_t* status) override;
+ status_t createTrack(const media::CreateTrackRequest& input,
+ media::CreateTrackResponse& output) override;
- virtual sp<media::IAudioRecord> createRecord(const media::CreateRecordRequest& input,
- media::CreateRecordResponse& output,
- status_t* status) override;
+ status_t createRecord(const media::CreateRecordRequest& input,
+ media::CreateRecordResponse& output) override;
virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const;
virtual audio_format_t format(audio_io_handle_t output) const;