Loading media/libaudioclient/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ cc_library { "audiopolicy-aidl-cpp", "audiopolicy-types-aidl-cpp", "capture_state_listener-aidl-cpp", "framework-permission-aidl-cpp", "libaudiofoundation", "libaudioclient_aidl_conversion", "libaudioutils", Loading Loading @@ -367,6 +368,7 @@ aidl_interface { ], imports: [ "audioclient-types-aidl", "framework-permission-aidl", ], backend: { cpp: { Loading media/libaudioclient/PolicyAidlConversion.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -243,6 +243,7 @@ aidl2legacy_AudioMix(const media::AudioMix& aidl) { legacy.mAllowPrivilegedMediaPlaybackCapture = aidl.allowPrivilegedMediaPlaybackCapture; legacy.mVoiceCommunicationCaptureAllowed = aidl.voiceCommunicationCaptureAllowed; legacy.mToken = aidl.mToken; legacy.mVirtualDeviceId = aidl.mVirtualDeviceId; return legacy; } Loading @@ -267,6 +268,7 @@ legacy2aidl_AudioMix(const AudioMix& legacy) { aidl.allowPrivilegedMediaPlaybackCapture = legacy.mAllowPrivilegedMediaPlaybackCapture; aidl.voiceCommunicationCaptureAllowed = legacy.mVoiceCommunicationCaptureAllowed; aidl.mToken = legacy.mToken; aidl.mVirtualDeviceId = legacy.mVirtualDeviceId; return aidl; } Loading media/libaudioclient/aidl/android/media/AudioMix.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -41,4 +41,6 @@ parcelable AudioMix { boolean voiceCommunicationCaptureAllowed; /** Identifies the owner of the AudioPolicy that this AudioMix belongs to */ IBinder mToken; /** Indicates the Id of the VirtualDevice this AudioMix was registered for */ int mVirtualDeviceId; } media/libaudioclient/include/media/AudioPolicy.h +1 −0 Original line number Diff line number Diff line Loading @@ -129,6 +129,7 @@ public: String8 mDeviceAddress; uint32_t mCbFlags; // flags indicating which callbacks to use, see kCbFlag* sp<IBinder> mToken; uint32_t mVirtualDeviceId; /** Ignore the AUDIO_FLAG_NO_MEDIA_PROJECTION */ bool mAllowPrivilegedMediaPlaybackCapture = false; /** Indicates if the caller can capture voice communication output */ Loading media/utils/ServiceUtilities.cpp +19 −6 Original line number Diff line number Diff line Loading @@ -115,6 +115,7 @@ std::optional<AttributionSourceState> resolveAttributionSource( } static bool checkRecordingInternal(const AttributionSourceState &attributionSource, const uint32_t virtualDeviceId, const String16 &msg, bool start, audio_source_t source) { // Okay to not track in app ops as audio server or media server is us and if // device is rooted security model is considered compromised. Loading @@ -127,7 +128,7 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour // We specify a pid and uid here as mediaserver (aka MediaRecorder or StageFrightRecorder) // may open a record track on behalf of a client. Note that pid may be a tid. // IMPORTANT: DON'T USE PermissionCache - RUNTIME PERMISSIONS CHANGE. const std::optional<AttributionSourceState> resolvedAttributionSource = std::optional<AttributionSourceState> resolvedAttributionSource = resolveAttributionSource(attributionSource); if (!resolvedAttributionSource.has_value()) { return false; Loading @@ -136,6 +137,7 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour const int32_t attributedOpCode = getOpForSource(source); permission::PermissionChecker permissionChecker; resolvedAttributionSource.value().deviceId = virtualDeviceId; bool permitted = false; if (start) { permitted = (permissionChecker.checkPermissionForStartDataDeliveryFromDatasource( Loading @@ -150,13 +152,24 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour return permitted; } static constexpr int DEVICE_ID_DEFAULT = 0; bool recordingAllowed(const AttributionSourceState &attributionSource, audio_source_t source) { return checkRecordingInternal(attributionSource, String16(), /*start*/ false, source); return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, String16(), /*start*/ false, source); } bool recordingAllowed(const AttributionSourceState &attributionSource, const uint32_t virtualDeviceId, audio_source_t source) { return checkRecordingInternal(attributionSource, virtualDeviceId, String16(), /*start*/ false, source); } bool startRecording(const AttributionSourceState& attributionSource, const String16& msg, audio_source_t source) { return checkRecordingInternal(attributionSource, msg, /*start*/ true, source); return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, msg, /*start*/ true, source); } void finishRecording(const AttributionSourceState& attributionSource, audio_source_t source) { Loading Loading
media/libaudioclient/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ cc_library { "audiopolicy-aidl-cpp", "audiopolicy-types-aidl-cpp", "capture_state_listener-aidl-cpp", "framework-permission-aidl-cpp", "libaudiofoundation", "libaudioclient_aidl_conversion", "libaudioutils", Loading Loading @@ -367,6 +368,7 @@ aidl_interface { ], imports: [ "audioclient-types-aidl", "framework-permission-aidl", ], backend: { cpp: { Loading
media/libaudioclient/PolicyAidlConversion.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -243,6 +243,7 @@ aidl2legacy_AudioMix(const media::AudioMix& aidl) { legacy.mAllowPrivilegedMediaPlaybackCapture = aidl.allowPrivilegedMediaPlaybackCapture; legacy.mVoiceCommunicationCaptureAllowed = aidl.voiceCommunicationCaptureAllowed; legacy.mToken = aidl.mToken; legacy.mVirtualDeviceId = aidl.mVirtualDeviceId; return legacy; } Loading @@ -267,6 +268,7 @@ legacy2aidl_AudioMix(const AudioMix& legacy) { aidl.allowPrivilegedMediaPlaybackCapture = legacy.mAllowPrivilegedMediaPlaybackCapture; aidl.voiceCommunicationCaptureAllowed = legacy.mVoiceCommunicationCaptureAllowed; aidl.mToken = legacy.mToken; aidl.mVirtualDeviceId = legacy.mVirtualDeviceId; return aidl; } Loading
media/libaudioclient/aidl/android/media/AudioMix.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -41,4 +41,6 @@ parcelable AudioMix { boolean voiceCommunicationCaptureAllowed; /** Identifies the owner of the AudioPolicy that this AudioMix belongs to */ IBinder mToken; /** Indicates the Id of the VirtualDevice this AudioMix was registered for */ int mVirtualDeviceId; }
media/libaudioclient/include/media/AudioPolicy.h +1 −0 Original line number Diff line number Diff line Loading @@ -129,6 +129,7 @@ public: String8 mDeviceAddress; uint32_t mCbFlags; // flags indicating which callbacks to use, see kCbFlag* sp<IBinder> mToken; uint32_t mVirtualDeviceId; /** Ignore the AUDIO_FLAG_NO_MEDIA_PROJECTION */ bool mAllowPrivilegedMediaPlaybackCapture = false; /** Indicates if the caller can capture voice communication output */ Loading
media/utils/ServiceUtilities.cpp +19 −6 Original line number Diff line number Diff line Loading @@ -115,6 +115,7 @@ std::optional<AttributionSourceState> resolveAttributionSource( } static bool checkRecordingInternal(const AttributionSourceState &attributionSource, const uint32_t virtualDeviceId, const String16 &msg, bool start, audio_source_t source) { // Okay to not track in app ops as audio server or media server is us and if // device is rooted security model is considered compromised. Loading @@ -127,7 +128,7 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour // We specify a pid and uid here as mediaserver (aka MediaRecorder or StageFrightRecorder) // may open a record track on behalf of a client. Note that pid may be a tid. // IMPORTANT: DON'T USE PermissionCache - RUNTIME PERMISSIONS CHANGE. const std::optional<AttributionSourceState> resolvedAttributionSource = std::optional<AttributionSourceState> resolvedAttributionSource = resolveAttributionSource(attributionSource); if (!resolvedAttributionSource.has_value()) { return false; Loading @@ -136,6 +137,7 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour const int32_t attributedOpCode = getOpForSource(source); permission::PermissionChecker permissionChecker; resolvedAttributionSource.value().deviceId = virtualDeviceId; bool permitted = false; if (start) { permitted = (permissionChecker.checkPermissionForStartDataDeliveryFromDatasource( Loading @@ -150,13 +152,24 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour return permitted; } static constexpr int DEVICE_ID_DEFAULT = 0; bool recordingAllowed(const AttributionSourceState &attributionSource, audio_source_t source) { return checkRecordingInternal(attributionSource, String16(), /*start*/ false, source); return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, String16(), /*start*/ false, source); } bool recordingAllowed(const AttributionSourceState &attributionSource, const uint32_t virtualDeviceId, audio_source_t source) { return checkRecordingInternal(attributionSource, virtualDeviceId, String16(), /*start*/ false, source); } bool startRecording(const AttributionSourceState& attributionSource, const String16& msg, audio_source_t source) { return checkRecordingInternal(attributionSource, msg, /*start*/ true, source); return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, msg, /*start*/ true, source); } void finishRecording(const AttributionSourceState& attributionSource, audio_source_t source) { Loading