AudioFlinger: allow shared record audio history for fast capture
Enable shared audio history when a fast capture thread is present.
In this case, the fast capture thread is preserved but no fast record client
is allowed.
Bug: 186894758
Bug: 185972521
Test: atest AudioRecordSharedAudioTest
Change-Id: I78b11a35513c771e6966c533c2fd094c05a48ead
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 51f3032..9eb7003 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -7301,19 +7301,29 @@
// the only active track
// 2) invalidate this track: this will cause the client to reconnect and possibly
// be invalidated again until unsilenced
+ bool invalidate = false;
if (activeTrack->isSilenced()) {
if (size > 1) {
- activeTrack->invalidate();
- ALOG_ASSERT(fastTrackToRemove == 0);
- fastTrackToRemove = activeTrack;
- removeTrack_l(activeTrack);
- mActiveTracks.remove(activeTrack);
- size--;
- continue;
+ invalidate = true;
} else {
silenceFastCapture = true;
}
}
+ // Invalidate fast tracks if access to audio history is required as this is not
+ // possible with fast tracks. Once the fast track has been invalidated, no new
+ // fast track will be created until mMaxSharedAudioHistoryMs is cleared.
+ if (mMaxSharedAudioHistoryMs != 0) {
+ invalidate = true;
+ }
+ if (invalidate) {
+ activeTrack->invalidate();
+ ALOG_ASSERT(fastTrackToRemove == 0);
+ fastTrackToRemove = activeTrack;
+ removeTrack_l(activeTrack);
+ mActiveTracks.remove(activeTrack);
+ size--;
+ continue;
+ }
fastTrack = activeTrack;
}
@@ -7833,12 +7843,6 @@
lStatus = PERMISSION_DENIED;
goto Exit;
}
- //TODO: b/185972521 allow resampling buffer resizing on fast mixers by pausing
- // the fast mixer thread while resizing the buffer in the normal thread
- if (hasFastCapture()) {
- lStatus = BAD_VALUE;
- goto Exit;
- }
if (maxSharedAudioHistoryMs < 0
|| maxSharedAudioHistoryMs > AudioFlinger::kMaxSharedAudioHistoryMs) {
lStatus = BAD_VALUE;
@@ -7850,8 +7854,9 @@
}
sampleRate = *pSampleRate;
- // special case for FAST flag considered OK if fast capture is present
- if (hasFastCapture()) {
+ // special case for FAST flag considered OK if fast capture is present and access to
+ // audio history is not required
+ if (hasFastCapture() && mMaxSharedAudioHistoryMs == 0) {
inputFlags = (audio_input_flags_t)(inputFlags | AUDIO_INPUT_FLAG_FAST);
}
@@ -7863,8 +7868,9 @@
*flags = (audio_input_flags_t)(*flags & inputFlags);
}
- // client expresses a preference for FAST, but we get the final say
- if (*flags & AUDIO_INPUT_FLAG_FAST) {
+ // client expresses a preference for FAST and no access to audio history,
+ // but we get the final say
+ if (*flags & AUDIO_INPUT_FLAG_FAST && maxSharedAudioHistoryMs == 0) {
if (
// we formerly checked for a callback handler (non-0 tid),
// but that is no longer required for TRANSFER_OBTAIN mode
@@ -7984,7 +7990,6 @@
if (maxSharedAudioHistoryMs != 0) {
sendResizeBufferConfigEvent_l(maxSharedAudioHistoryMs);
}
-
}
lStatus = NO_ERROR;
@@ -8215,9 +8220,6 @@
status_t AudioFlinger::RecordThread::shareAudioHistory_l(
const std::string& sharedAudioPackageName, audio_session_t sharedSessionId,
int64_t sharedAudioStartMs) {
- if (hasFastCapture()) {
- return BAD_VALUE;
- }
if ((hasAudioSession_l(sharedSessionId) & ThreadBase::TRACK_SESSION) == 0) {
return BAD_VALUE;
}
@@ -8460,6 +8462,7 @@
// FIXME if client not keeping up, discard
LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames));
// 'filled' may be non-contiguous, so return only the first contiguous chunk
+
front &= recordThread->mRsmpInFramesP2 - 1;
size_t part1 = recordThread->mRsmpInFramesP2 - front;
if (part1 > (size_t) filled) {
@@ -8674,7 +8677,7 @@
// mRsmpInFrames must be 0 before calling resizeInputBuffer_l for the first time
mRsmpInFrames = 0;
- resizeInputBuffer_l();
+ resizeInputBuffer_l(0 /*maxSharedAudioHistoryMs*/);
// AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints.
// But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks?
@@ -8915,6 +8918,10 @@
int32_t previousRear = mRsmpInRear;
mRsmpInRear = 0;
+ ALOG_ASSERT(maxSharedAudioHistoryMs >= 0
+ && maxSharedAudioHistoryMs <= AudioFlinger::kMaxSharedAudioHistoryMs,
+ "resizeInputBuffer_l() called with invalid max shared history %d",
+ maxSharedAudioHistoryMs);
if (maxSharedAudioHistoryMs != 0) {
// resizeInputBuffer_l should never be called with a non zero shared history if the
// buffer was not already allocated
@@ -8927,6 +8934,7 @@
}
mRsmpInFrames = rsmpInFrames;
}
+ mMaxSharedAudioHistoryMs = maxSharedAudioHistoryMs;
// Note: mRsmpInFrames is 0 when called with maxSharedAudioHistoryMs equals to 0 so it is always
// initialized
if (mRsmpInFrames < minRsmpInFrames) {