Loading services/audioflinger/AudioFlinger.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -1960,7 +1960,8 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu &output.notificationFrameCount, callingPid, clientUid, &output.flags, input.clientInfo.clientTid, &lStatus, portId); &lStatus, portId, input.opPackageName); LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0)); // lStatus == BAD_TYPE means FAST flag was rejected: request a new input from Loading services/audioflinger/RecordTracks.h +40 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,39 @@ #error This header file should only be included from AudioFlinger.h #endif // Checks and monitors OP_RECORD_AUDIO class OpRecordAudioMonitor : public RefBase { public: ~OpRecordAudioMonitor() override; bool hasOpRecordAudio() const; static sp<OpRecordAudioMonitor> createIfNeeded(uid_t uid, const String16& opPackageName); private: OpRecordAudioMonitor(uid_t uid, const String16& opPackageName); void onFirstRef() override; AppOpsManager mAppOpsManager; class RecordAudioOpCallback : public BnAppOpsCallback { public: explicit RecordAudioOpCallback(const wp<OpRecordAudioMonitor>& monitor); void opChanged(int32_t op, const String16& packageName) override; private: const wp<OpRecordAudioMonitor> mMonitor; }; sp<RecordAudioOpCallback> mOpCallback; // called by RecordAudioOpCallback when OP_RECORD_AUDIO is updated in AppOp callback // and in onFirstRef() void checkRecordAudio(); std::atomic_bool mHasOpRecordAudio; const uid_t mUid; const String16 mPackage; }; // record track class RecordTrack : public TrackBase { public: Loading @@ -36,6 +69,7 @@ public: uid_t uid, audio_input_flags_t flags, track_type type, const String16& opPackageName, audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE); virtual ~RecordTrack(); virtual status_t initCheck() const; Loading Loading @@ -68,7 +102,7 @@ public: { return (mFlags & AUDIO_INPUT_FLAG_DIRECT) != 0; } void setSilenced(bool silenced) { if (!isPatchTrack()) mSilenced = silenced; } bool isSilenced() const { return mSilenced; } bool isSilenced() const; status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones); Loading Loading @@ -111,6 +145,11 @@ private: audio_input_flags_t mFlags; bool mSilenced; // used to enforce OP_RECORD_AUDIO uid_t mUid; String16 mOpPackageName; sp<OpRecordAudioMonitor> mOpRecordAudioMonitor; }; // playback track, used by PatchPanel Loading services/audioflinger/Threads.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -7303,7 +7303,7 @@ reacquire_wakelock: // Sanitize before releasing if the track has no access to the source data // An idle UID receives silence from non virtual devices until active if (activeTrack->isSilenced()) { memset(activeTrack->mSink.raw, 0, framesOut * mFrameSize); memset(activeTrack->mSink.raw, 0, framesOut * activeTrack->frameSize()); } activeTrack->releaseBuffer(&activeTrack->mSink); } Loading Loading @@ -7464,7 +7464,8 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe audio_input_flags_t *flags, pid_t tid, status_t *status, audio_port_handle_t portId) audio_port_handle_t portId, const String16& opPackageName) { size_t frameCount = *pFrameCount; size_t notificationFrameCount = *pNotificationFrameCount; Loading Loading @@ -7598,7 +7599,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe track = new RecordTrack(this, client, attr, sampleRate, format, channelMask, frameCount, nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, creatorPid, uid, *flags, TrackBase::TYPE_DEFAULT, portId); *flags, TrackBase::TYPE_DEFAULT, opPackageName, portId); lStatus = track->initCheck(); if (lStatus != NO_ERROR) { Loading services/audioflinger/Threads.h +2 −1 Original line number Diff line number Diff line Loading @@ -1553,7 +1553,8 @@ public: audio_input_flags_t *flags, pid_t tid, status_t *status /*non-NULL*/, audio_port_handle_t portId); audio_port_handle_t portId, const String16& opPackageName); status_t start(RecordTrack* recordTrack, AudioSystem::sync_event_t event, Loading services/audioflinger/TrackBase.h +2 −0 Original line number Diff line number Diff line Loading @@ -215,6 +215,8 @@ protected: uint32_t channelCount() const { return mChannelCount; } size_t frameSize() const { return mFrameSize; } audio_channel_mask_t channelMask() const { return mChannelMask; } virtual uint32_t sampleRate() const { return mSampleRate; } Loading Loading
services/audioflinger/AudioFlinger.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -1960,7 +1960,8 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu &output.notificationFrameCount, callingPid, clientUid, &output.flags, input.clientInfo.clientTid, &lStatus, portId); &lStatus, portId, input.opPackageName); LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0)); // lStatus == BAD_TYPE means FAST flag was rejected: request a new input from Loading
services/audioflinger/RecordTracks.h +40 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,39 @@ #error This header file should only be included from AudioFlinger.h #endif // Checks and monitors OP_RECORD_AUDIO class OpRecordAudioMonitor : public RefBase { public: ~OpRecordAudioMonitor() override; bool hasOpRecordAudio() const; static sp<OpRecordAudioMonitor> createIfNeeded(uid_t uid, const String16& opPackageName); private: OpRecordAudioMonitor(uid_t uid, const String16& opPackageName); void onFirstRef() override; AppOpsManager mAppOpsManager; class RecordAudioOpCallback : public BnAppOpsCallback { public: explicit RecordAudioOpCallback(const wp<OpRecordAudioMonitor>& monitor); void opChanged(int32_t op, const String16& packageName) override; private: const wp<OpRecordAudioMonitor> mMonitor; }; sp<RecordAudioOpCallback> mOpCallback; // called by RecordAudioOpCallback when OP_RECORD_AUDIO is updated in AppOp callback // and in onFirstRef() void checkRecordAudio(); std::atomic_bool mHasOpRecordAudio; const uid_t mUid; const String16 mPackage; }; // record track class RecordTrack : public TrackBase { public: Loading @@ -36,6 +69,7 @@ public: uid_t uid, audio_input_flags_t flags, track_type type, const String16& opPackageName, audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE); virtual ~RecordTrack(); virtual status_t initCheck() const; Loading Loading @@ -68,7 +102,7 @@ public: { return (mFlags & AUDIO_INPUT_FLAG_DIRECT) != 0; } void setSilenced(bool silenced) { if (!isPatchTrack()) mSilenced = silenced; } bool isSilenced() const { return mSilenced; } bool isSilenced() const; status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones); Loading Loading @@ -111,6 +145,11 @@ private: audio_input_flags_t mFlags; bool mSilenced; // used to enforce OP_RECORD_AUDIO uid_t mUid; String16 mOpPackageName; sp<OpRecordAudioMonitor> mOpRecordAudioMonitor; }; // playback track, used by PatchPanel Loading
services/audioflinger/Threads.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -7303,7 +7303,7 @@ reacquire_wakelock: // Sanitize before releasing if the track has no access to the source data // An idle UID receives silence from non virtual devices until active if (activeTrack->isSilenced()) { memset(activeTrack->mSink.raw, 0, framesOut * mFrameSize); memset(activeTrack->mSink.raw, 0, framesOut * activeTrack->frameSize()); } activeTrack->releaseBuffer(&activeTrack->mSink); } Loading Loading @@ -7464,7 +7464,8 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe audio_input_flags_t *flags, pid_t tid, status_t *status, audio_port_handle_t portId) audio_port_handle_t portId, const String16& opPackageName) { size_t frameCount = *pFrameCount; size_t notificationFrameCount = *pNotificationFrameCount; Loading Loading @@ -7598,7 +7599,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe track = new RecordTrack(this, client, attr, sampleRate, format, channelMask, frameCount, nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, creatorPid, uid, *flags, TrackBase::TYPE_DEFAULT, portId); *flags, TrackBase::TYPE_DEFAULT, opPackageName, portId); lStatus = track->initCheck(); if (lStatus != NO_ERROR) { Loading
services/audioflinger/Threads.h +2 −1 Original line number Diff line number Diff line Loading @@ -1553,7 +1553,8 @@ public: audio_input_flags_t *flags, pid_t tid, status_t *status /*non-NULL*/, audio_port_handle_t portId); audio_port_handle_t portId, const String16& opPackageName); status_t start(RecordTrack* recordTrack, AudioSystem::sync_event_t event, Loading
services/audioflinger/TrackBase.h +2 −0 Original line number Diff line number Diff line Loading @@ -215,6 +215,8 @@ protected: uint32_t channelCount() const { return mChannelCount; } size_t frameSize() const { return mFrameSize; } audio_channel_mask_t channelMask() const { return mChannelMask; } virtual uint32_t sampleRate() const { return mSampleRate; } Loading