AudioRecord: Allow to share capture history.
Add the possibility for privileged applications to
share part of their audio capture history with another app.
Bug: 183705547
Test: regression on capture use cases
Change-Id: I2b6547eee1dcd840e06090f42f40beafa3facb46
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index e15ef3d..c9d2320 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -226,7 +226,8 @@
const audio_attributes_t* pAttributes,
audio_port_handle_t selectedDeviceId,
audio_microphone_direction_t selectedMicDirection,
- float microphoneFieldDimension)
+ float microphoneFieldDimension,
+ int32_t maxSharedAudioHistoryMs)
{
status_t status = NO_ERROR;
uint32_t channelCount;
@@ -259,6 +260,7 @@
mSelectedDeviceId = selectedDeviceId;
mSelectedMicDirection = selectedMicDirection;
mSelectedMicFieldDimension = microphoneFieldDimension;
+ mMaxSharedAudioHistoryMs = maxSharedAudioHistoryMs;
switch (transferType) {
case TRANSFER_DEFAULT:
@@ -807,6 +809,7 @@
input.selectedDeviceId = mSelectedDeviceId;
input.sessionId = mSessionId;
originalSessionId = mSessionId;
+ input.maxSharedAudioHistoryMs = mMaxSharedAudioHistoryMs;
do {
media::CreateRecordResponse response;
@@ -828,7 +831,7 @@
usleep((20 + rand() % 30) * 10000);
} while (1);
- ALOG_ASSERT(record != 0);
+ ALOG_ASSERT(output.audioRecord != 0);
// AudioFlinger now owns the reference to the I/O handle,
// so we are no longer responsible for releasing it.
@@ -916,6 +919,10 @@
AudioSystem::addAudioDeviceCallback(this, output.inputId, output.portId);
}
+ if (!mSharedAudioPackageName.empty()) {
+ mAudioRecord->shareAudioHistory(mSharedAudioPackageName, mSharedAudioStartMs);
+ }
+
mPortId = output.portId;
// We retain a copy of the I/O handle, but don't own the reference
mInput = output.inputId;
@@ -1569,7 +1576,7 @@
void AudioRecord::setLogSessionId(const char *logSessionId)
{
- AutoMutex lock(mLock);
+ AutoMutex lock(mLock);
if (logSessionId == nullptr) logSessionId = ""; // an empty string is an unset session id.
if (mLogSessionId == logSessionId) return;
@@ -1580,6 +1587,22 @@
.record();
}
+status_t AudioRecord::shareAudioHistory(const std::string& sharedPackageName,
+ int64_t sharedStartMs)
+{
+ AutoMutex lock(mLock);
+ if (mAudioRecord == 0) {
+ return NO_INIT;
+ }
+ status_t status = statusTFromBinderStatus(
+ mAudioRecord->shareAudioHistory(sharedPackageName, sharedStartMs));
+ if (status == NO_ERROR) {
+ mSharedAudioPackageName = sharedPackageName;
+ mSharedAudioStartMs = sharedStartMs;
+ }
+ return status;
+}
+
// =========================================================================
void AudioRecord::DeathNotifier::binderDied(const wp<IBinder>& who __unused)
diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp
index 0feafc5..7656307 100644
--- a/media/libaudioclient/IAudioFlinger.cpp
+++ b/media/libaudioclient/IAudioFlinger.cpp
@@ -138,6 +138,8 @@
aidl.config = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(config));
aidl.clientInfo = VALUE_OR_RETURN(legacy2aidl_AudioClient_AudioClient(clientInfo));
aidl.riid = VALUE_OR_RETURN(legacy2aidl_audio_unique_id_t_int32_t(riid));
+ aidl.maxSharedAudioHistoryMs = VALUE_OR_RETURN(
+ convertIntegral<int32_t>(maxSharedAudioHistoryMs));
aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(frameCount));
aidl.notificationFrameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(notificationFrameCount));
@@ -151,10 +153,13 @@
IAudioFlinger::CreateRecordInput::fromAidl(
const media::CreateRecordRequest& aidl) {
IAudioFlinger::CreateRecordInput legacy;
- legacy.attr = VALUE_OR_RETURN(aidl2legacy_AudioAttributesInternal_audio_attributes_t(aidl.attr));
+ legacy.attr = VALUE_OR_RETURN(
+ aidl2legacy_AudioAttributesInternal_audio_attributes_t(aidl.attr));
legacy.config = VALUE_OR_RETURN(aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
legacy.clientInfo = VALUE_OR_RETURN(aidl2legacy_AudioClient_AudioClient(aidl.clientInfo));
legacy.riid = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_unique_id_t(aidl.riid));
+ legacy.maxSharedAudioHistoryMs = VALUE_OR_RETURN(
+ convertIntegral<int32_t>(aidl.maxSharedAudioHistoryMs));
legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_input_flags_t_mask(aidl.flags));
legacy.frameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
legacy.notificationFrameCount = VALUE_OR_RETURN(
diff --git a/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl b/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl
index 62007da..5b26d22 100644
--- a/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl
+++ b/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl
@@ -34,6 +34,7 @@
AudioClient clientInfo;
/** Interpreted as audio_unique_id_t. */
int riid;
+ int maxSharedAudioHistoryMs;
/** Bitmask, indexed by AudioInputFlags. */
int flags;
long frameCount;
diff --git a/media/libaudioclient/aidl/android/media/IAudioRecord.aidl b/media/libaudioclient/aidl/android/media/IAudioRecord.aidl
index 1772653..44ef80b 100644
--- a/media/libaudioclient/aidl/android/media/IAudioRecord.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioRecord.aidl
@@ -48,4 +48,6 @@
/* Set the microphone zoom (for processing).
*/
void setPreferredMicrophoneFieldDimension(float zoom);
+
+ void shareAudioHistory(@utf8InCpp String sharedAudioPackageName, long sharedAudioStartMs);
}
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index 82a29d4..0bf0e2d 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -241,7 +241,8 @@
audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
audio_microphone_direction_t
selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
- float selectedMicFieldDimension = MIC_FIELD_DIMENSION_DEFAULT);
+ float selectedMicFieldDimension = MIC_FIELD_DIMENSION_DEFAULT,
+ int32_t maxSharedAudioHistoryMs = 0);
/* Result of constructing the AudioRecord. This must be checked for successful initialization
* before using any AudioRecord API (except for set()), because using
@@ -583,6 +584,10 @@
*/
void setLogSessionId(const char *logSessionId);
+
+ status_t shareAudioHistory(const std::string& sharedPackageName,
+ int64_t sharedStartMs);
+
/*
* Dumps the state of an audio record.
*/
@@ -766,6 +771,10 @@
audio_microphone_direction_t mSelectedMicDirection;
float mSelectedMicFieldDimension;
+ int32_t mMaxSharedAudioHistoryMs = 0;
+ std::string mSharedAudioPackageName = {};
+ int64_t mSharedAudioStartMs = 0;
+
private:
class MediaMetrics {
public:
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index 7f7ca85..3a5d164 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -130,6 +130,7 @@
AudioClient clientInfo;
media::permission::Identity identity;
audio_unique_id_t riid;
+ int32_t maxSharedAudioHistoryMs;
/* input/output */
audio_input_flags_t flags;