Skip to content

Commit

Permalink
Force unsilence record clients on startInput
Browse files Browse the repository at this point in the history
We call startRecording unconditionally in startInput, so we must
update the client state to be unsilenced (since we are treating as
such). We subsequently re-update the silence state (with the client
marked as active to dispatch ops) in updateUidStates_l.

This fixes an issue where we call startRecording for a silenced client,
then call it again when it moves to unsilenced when the client is active.
Since startRecording is ref-counted, this leaves the client in the
recording state leading to incorrect appop attributions.

Bug: 279905816
Bug: 281485019
Test: Manual verification of repro cases + verbose log analysis
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e7720b379bfaba648ab6d85c4c2df6f03ec854d3)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:2951ad10a6641f9b3554d674877ad314e8cc011f)
Merged-In: I31d50457ca8adae577407a28d4d4c0e8582bac5d
Change-Id: I31d50457ca8adae577407a28d4d4c0e8582bac5d
  • Loading branch information
atneya authored and whyredfire committed Jul 6, 2023
1 parent 195f2fd commit b21e37f
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
Expand Up @@ -795,8 +795,29 @@ Status AudioPolicyService::startInput(int32_t portIdAidl)

Mutex::Autolock _l(mLock);

ALOGW_IF(client->silenced, "startInput on silenced input for port %d, uid %d. Unsilencing.",
portIdAidl,
client->attributionSource.uid);

if (client->active) {
ALOGE("Client should never be active before startInput. Uid %d port %d",
client->attributionSource.uid, portId);
finishRecording(client->attributionSource, client->attributes.source);
return binderStatusFromStatusT(INVALID_OPERATION);
}

// Force the possibly silenced client to be unsilenced since we just called
// startRecording (i.e. we have assumed it is unsilenced).
// At this point in time, the client is inactive, so no calls to appops are sent in
// setAppState_l.
// This ensures existing clients have the same behavior as new clients (starting unsilenced).
// TODO(b/282076713)
setAppState_l(client, APP_STATE_TOP);

client->active = true;
client->startTimeNs = systemTime();
// This call updates the silenced state, and since we are active, appropriately notifies appops
// if we silence the track.
updateUidStates_l();

status_t status;
Expand Down

0 comments on commit b21e37f

Please sign in to comment.