Revert "audioflinger: implement silenced capture for mmap"

This reverts commit a2f478ca0b.

Bug: 78118584
Change-Id: Ie0da3dea445f2474c7a889c5f9919305c1c96d40
gugelfrei
Eric Laurent 6 years ago
parent a2f478ca0b
commit 611ebb95e7

@ -31,9 +31,8 @@ class MmapStreamCallback : public virtual RefBase {
* The mmap stream should be torn down because conditions that permitted its creation with * The mmap stream should be torn down because conditions that permitted its creation with
* the requested parameters have changed and do not allow it to operate with the requested * the requested parameters have changed and do not allow it to operate with the requested
* constraints any more. * constraints any more.
* \param[in] handle handle for the client stream to tear down.
*/ */
virtual void onTearDown(audio_port_handle_t handle) = 0; virtual void onTearDown() = 0;
/** /**
* The volume to be applied to the use case specified when opening the stream has changed * The volume to be applied to the use case specified when opening the stream has changed

@ -1000,12 +1000,14 @@ void AudioFlinger::setRecordSilenced(uid_t uid, bool silenced)
{ {
ALOGV("AudioFlinger::setRecordSilenced(uid:%d, silenced:%d)", uid, silenced); ALOGV("AudioFlinger::setRecordSilenced(uid:%d, silenced:%d)", uid, silenced);
// TODO: Notify MmapThreads
AutoMutex lock(mLock); AutoMutex lock(mLock);
for (size_t i = 0; i < mRecordThreads.size(); i++) { for (size_t i = 0; i < mRecordThreads.size(); i++) {
mRecordThreads[i]->setRecordSilenced(uid, silenced); sp<RecordThread> thread = mRecordThreads.valueAt(i);
} if (thread != 0) {
for (size_t i = 0; i < mMmapThreads.size(); i++) { thread->setRecordSilenced(uid, silenced);
mMmapThreads[i]->setRecordSilenced(uid, silenced); }
} }
} }

@ -43,15 +43,6 @@ public:
static void appendDumpHeader(String8& result); static void appendDumpHeader(String8& result);
void appendDump(String8& result, bool active); void appendDump(String8& result, bool active);
// protected by MMapThread::mLock
void setSilenced_l(bool silenced) { mSilenced = silenced;
mSilencedNotified = false;}
// protected by MMapThread::mLock
bool isSilenced_l() const { return mSilenced; }
// protected by MMapThread::mLock
bool getAndSetSilencedNotified_l() { bool silencedNotified = mSilencedNotified;
mSilencedNotified = true;
return silencedNotified; }
private: private:
friend class MmapThread; friend class MmapThread;
@ -67,7 +58,5 @@ private:
virtual void onTimestamp(const ExtendedTimestamp &timestamp); virtual void onTimestamp(const ExtendedTimestamp &timestamp);
pid_t mPid; pid_t mPid;
bool mSilenced; // protected by MMapThread::mLock
bool mSilencedNotified; // protected by MMapThread::mLock
}; // end of Track }; // end of Track

@ -7886,7 +7886,7 @@ AudioFlinger::MmapThread::MmapThread(
mSessionId(AUDIO_SESSION_NONE), mSessionId(AUDIO_SESSION_NONE),
mDeviceId(AUDIO_PORT_HANDLE_NONE), mPortId(AUDIO_PORT_HANDLE_NONE), mDeviceId(AUDIO_PORT_HANDLE_NONE), mPortId(AUDIO_PORT_HANDLE_NONE),
mHalStream(stream), mHalDevice(hwDev->hwDevice()), mAudioHwDev(hwDev), mHalStream(stream), mHalDevice(hwDev->hwDevice()), mAudioHwDev(hwDev),
mActiveTracks(&this->mLocalLog), mNoCallbackWarningCount(0) mActiveTracks(&this->mLocalLog)
{ {
mStandby = true; mStandby = true;
readHalParameters_l(); readHalParameters_l();
@ -7904,14 +7904,7 @@ void AudioFlinger::MmapThread::onFirstRef()
void AudioFlinger::MmapThread::disconnect() void AudioFlinger::MmapThread::disconnect()
{ {
ActiveTracks<MmapTrack> activeTracks; for (const sp<MmapTrack> &t : mActiveTracks) {
{
Mutex::Autolock _l(mLock);
for (const sp<MmapTrack> &t : mActiveTracks) {
activeTracks.add(t);
}
}
for (const sp<MmapTrack> &t : activeTracks) {
stop(t->portId()); stop(t->portId());
} }
// This will decrement references and may cause the destruction of this thread. // This will decrement references and may cause the destruction of this thread.
@ -7956,17 +7949,6 @@ status_t AudioFlinger::MmapThread::getMmapPosition(struct audio_mmap_position *p
return mHalStream->getMmapPosition(position); return mHalStream->getMmapPosition(position);
} }
status_t AudioFlinger::MmapThread::exitStandby()
{
status_t ret = mHalStream->start();
if (ret != NO_ERROR) {
ALOGE("%s: error mHalStream->start() = %d for first track", __FUNCTION__, ret);
return ret;
}
mStandby = false;
return NO_ERROR;
}
status_t AudioFlinger::MmapThread::start(const AudioClient& client, status_t AudioFlinger::MmapThread::start(const AudioClient& client,
audio_port_handle_t *handle) audio_port_handle_t *handle)
{ {
@ -7980,7 +7962,13 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client,
if (*handle == mPortId) { if (*handle == mPortId) {
// for the first track, reuse portId and session allocated when the stream was opened // for the first track, reuse portId and session allocated when the stream was opened
return exitStandby(); ret = mHalStream->start();
if (ret != NO_ERROR) {
ALOGE("%s: error mHalStream->start() = %d for first track", __FUNCTION__, ret);
return ret;
}
mStandby = false;
return NO_ERROR;
} }
audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
@ -8028,43 +8016,33 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client,
return BAD_VALUE; return BAD_VALUE;
} }
bool silenced = false;
if (isOutput()) { if (isOutput()) {
ret = AudioSystem::startOutput(mId, streamType(), mSessionId); ret = AudioSystem::startOutput(mId, streamType(), mSessionId);
} else { } else {
// TODO: Block recording for idle UIDs (b/72134552)
bool silenced;
ret = AudioSystem::startInput(portId, &silenced); ret = AudioSystem::startInput(portId, &silenced);
} }
Mutex::Autolock _l(mLock);
// abort if start is rejected by audio policy manager // abort if start is rejected by audio policy manager
if (ret != NO_ERROR) { if (ret != NO_ERROR) {
ALOGE("%s: error start rejected by AudioPolicyManager = %d", __FUNCTION__, ret); ALOGE("%s: error start rejected by AudioPolicyManager = %d", __FUNCTION__, ret);
if (mActiveTracks.size() != 0) { if (mActiveTracks.size() != 0) {
mLock.unlock();
if (isOutput()) { if (isOutput()) {
AudioSystem::releaseOutput(mId, streamType(), mSessionId); AudioSystem::releaseOutput(mId, streamType(), mSessionId);
} else { } else {
AudioSystem::releaseInput(portId); AudioSystem::releaseInput(portId);
} }
mLock.lock();
} else { } else {
mHalStream->stop(); mHalStream->stop();
} }
return PERMISSION_DENIED; return PERMISSION_DENIED;
} }
if (!isOutput() && !silenced) {
for (const sp<MmapTrack> &track : mActiveTracks) {
if (track->isSilenced_l() && track->uid() != client.clientUid)
track->invalidate();
}
}
// Given that MmapThread::mAttr is mutable, should a MmapTrack have attributes ? // Given that MmapThread::mAttr is mutable, should a MmapTrack have attributes ?
sp<MmapTrack> track = new MmapTrack(this, mAttr, mSampleRate, mFormat, mChannelMask, mSessionId, sp<MmapTrack> track = new MmapTrack(this, mAttr, mSampleRate, mFormat, mChannelMask, mSessionId,
client.clientUid, client.clientPid, portId); client.clientUid, client.clientPid, portId);
track->setSilenced_l(silenced);
mActiveTracks.add(track); mActiveTracks.add(track);
sp<EffectChain> chain = getEffectChain_l(mSessionId); sp<EffectChain> chain = getEffectChain_l(mSessionId);
if (chain != 0) { if (chain != 0) {
@ -8094,8 +8072,6 @@ status_t AudioFlinger::MmapThread::stop(audio_port_handle_t handle)
return NO_ERROR; return NO_ERROR;
} }
Mutex::Autolock _l(mLock);
sp<MmapTrack> track; sp<MmapTrack> track;
for (const sp<MmapTrack> &t : mActiveTracks) { for (const sp<MmapTrack> &t : mActiveTracks) {
if (handle == t->portId()) { if (handle == t->portId()) {
@ -8109,7 +8085,6 @@ status_t AudioFlinger::MmapThread::stop(audio_port_handle_t handle)
mActiveTracks.remove(track); mActiveTracks.remove(track);
mLock.unlock();
if (isOutput()) { if (isOutput()) {
AudioSystem::stopOutput(mId, streamType(), track->sessionId()); AudioSystem::stopOutput(mId, streamType(), track->sessionId());
AudioSystem::releaseOutput(mId, streamType(), track->sessionId()); AudioSystem::releaseOutput(mId, streamType(), track->sessionId());
@ -8117,7 +8092,6 @@ status_t AudioFlinger::MmapThread::stop(audio_port_handle_t handle)
AudioSystem::stopInput(track->portId()); AudioSystem::stopInput(track->portId());
AudioSystem::releaseInput(track->portId()); AudioSystem::releaseInput(track->portId());
} }
mLock.lock();
sp<EffectChain> chain = getEffectChain_l(track->sessionId()); sp<EffectChain> chain = getEffectChain_l(track->sessionId());
if (chain != 0) { if (chain != 0) {
@ -8544,11 +8518,9 @@ void AudioFlinger::MmapThread::checkInvalidTracks_l()
if (track->isInvalid()) { if (track->isInvalid()) {
sp<MmapStreamCallback> callback = mCallback.promote(); sp<MmapStreamCallback> callback = mCallback.promote();
if (callback != 0) { if (callback != 0) {
callback->onTearDown(track->portId()); callback->onTearDown();
} else if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
ALOGW("Could not notify MMAP stream tear down: no onTearDown callback!");
mNoCallbackWarningCount++;
} }
break;
} }
} }
} }
@ -8603,6 +8575,7 @@ AudioFlinger::MmapPlaybackThread::MmapPlaybackThread(
mStreamVolume(1.0), mStreamVolume(1.0),
mStreamMute(false), mStreamMute(false),
mHalVolFloat(-1.0f), // Initialize to illegal value so it always gets set properly later. mHalVolFloat(-1.0f), // Initialize to illegal value so it always gets set properly later.
mNoCallbackWarningCount(0),
mOutput(output) mOutput(output)
{ {
snprintf(mThreadName, kThreadNameLength, "AudioMmapOut_%X", id); snprintf(mThreadName, kThreadNameLength, "AudioMmapOut_%X", id);
@ -8807,12 +8780,6 @@ AudioFlinger::MmapCaptureThread::MmapCaptureThread(
mChannelCount = audio_channel_count_from_in_mask(mChannelMask); mChannelCount = audio_channel_count_from_in_mask(mChannelMask);
} }
status_t AudioFlinger::MmapCaptureThread::exitStandby()
{
mInput->stream->setGain(1.0f);
return MmapThread::exitStandby();
}
AudioFlinger::AudioStreamIn* AudioFlinger::MmapCaptureThread::clearInput() AudioFlinger::AudioStreamIn* AudioFlinger::MmapCaptureThread::clearInput()
{ {
Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock);
@ -8821,34 +8788,6 @@ AudioFlinger::AudioStreamIn* AudioFlinger::MmapCaptureThread::clearInput()
return input; return input;
} }
void AudioFlinger::MmapCaptureThread::processVolume_l()
{
bool changed = false;
bool silenced = false;
sp<MmapStreamCallback> callback = mCallback.promote();
if (callback == 0) {
if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
ALOGW("Could not set MMAP stream silenced: no onStreamSilenced callback!");
mNoCallbackWarningCount++;
}
}
// After a change occurred in track silenced state, mute capture in audio DSP if at least one
// track is silenced and unmute otherwise
for (size_t i = 0; i < mActiveTracks.size() && !silenced; i++) {
if (!mActiveTracks[i]->getAndSetSilencedNotified_l()) {
changed = true;
silenced = mActiveTracks[i]->isSilenced_l();
}
}
if (changed) {
mInput->stream->setGain(silenced ? 0.0f: 1.0f);
}
}
void AudioFlinger::MmapCaptureThread::updateMetadata_l() void AudioFlinger::MmapCaptureThread::updateMetadata_l()
{ {
if (mInput == nullptr || mInput->stream == nullptr || if (mInput == nullptr || mInput->stream == nullptr ||
@ -8866,15 +8805,4 @@ void AudioFlinger::MmapCaptureThread::updateMetadata_l()
mInput->stream->updateSinkMetadata(metadata); mInput->stream->updateSinkMetadata(metadata);
} }
void AudioFlinger::MmapCaptureThread::setRecordSilenced(uid_t uid, bool silenced)
{
Mutex::Autolock _l(mLock);
for (size_t i = 0; i < mActiveTracks.size() ; i++) {
if (mActiveTracks[i]->uid() == uid) {
mActiveTracks[i]->setSilenced_l(silenced);
broadcast_l();
}
}
}
} // namespace android } // namespace android

@ -1589,7 +1589,6 @@ class MmapThread : public ThreadBase
virtual void threadLoop_exit(); virtual void threadLoop_exit();
virtual void threadLoop_standby(); virtual void threadLoop_standby();
virtual bool shouldStandby_l() { return false; } virtual bool shouldStandby_l() { return false; }
virtual status_t exitStandby();
virtual status_t initCheck() const { return (mHalStream == 0) ? NO_INIT : NO_ERROR; } virtual status_t initCheck() const { return (mHalStream == 0) ? NO_INIT : NO_ERROR; }
virtual size_t frameCount() const { return mFrameCount; } virtual size_t frameCount() const { return mFrameCount; }
@ -1622,9 +1621,6 @@ class MmapThread : public ThreadBase
virtual void invalidateTracks(audio_stream_type_t streamType __unused) {} virtual void invalidateTracks(audio_stream_type_t streamType __unused) {}
// Sets the UID records silence
virtual void setRecordSilenced(uid_t uid __unused, bool silenced __unused) {}
void dump(int fd, const Vector<String16>& args); void dump(int fd, const Vector<String16>& args);
virtual void dumpInternals(int fd, const Vector<String16>& args); virtual void dumpInternals(int fd, const Vector<String16>& args);
void dumpTracks(int fd, const Vector<String16>& args); void dumpTracks(int fd, const Vector<String16>& args);
@ -1641,9 +1637,6 @@ class MmapThread : public ThreadBase
sp<DeviceHalInterface> mHalDevice; sp<DeviceHalInterface> mHalDevice;
AudioHwDevice* const mAudioHwDev; AudioHwDevice* const mAudioHwDev;
ActiveTracks<MmapTrack> mActiveTracks; ActiveTracks<MmapTrack> mActiveTracks;
int32_t mNoCallbackWarningCount;
static constexpr int32_t kMaxNoCallbackWarnings = 5;
}; };
class MmapPlaybackThread : public MmapThread, public VolumeInterface class MmapPlaybackThread : public MmapThread, public VolumeInterface
@ -1677,7 +1670,7 @@ public:
virtual audio_stream_type_t streamType() { return mStreamType; } virtual audio_stream_type_t streamType() { return mStreamType; }
virtual void checkSilentMode_l(); virtual void checkSilentMode_l();
void processVolume_l() override; virtual void processVolume_l();
virtual void dumpInternals(int fd, const Vector<String16>& args); virtual void dumpInternals(int fd, const Vector<String16>& args);
@ -1693,6 +1686,8 @@ protected:
bool mMasterMute; bool mMasterMute;
bool mStreamMute; bool mStreamMute;
float mHalVolFloat; float mHalVolFloat;
int32_t mNoCallbackWarningCount;
static constexpr int32_t kMaxNoCallbackWarnings = 5;
AudioStreamOut* mOutput; AudioStreamOut* mOutput;
}; };
@ -1707,12 +1702,9 @@ public:
AudioStreamIn* clearInput(); AudioStreamIn* clearInput();
status_t exitStandby() override;
virtual bool isOutput() const override { return false; } virtual bool isOutput() const override { return false; }
void updateMetadata_l() override; void updateMetadata_l() override;
void processVolume_l() override;
void setRecordSilenced(uid_t uid, bool silenced) override;
protected: protected:

@ -1945,7 +1945,7 @@ AudioFlinger::MmapThread::MmapTrack::MmapTrack(ThreadBase *thread,
sessionId, uid, false /* isOut */, sessionId, uid, false /* isOut */,
ALLOC_NONE, ALLOC_NONE,
TYPE_DEFAULT, portId), TYPE_DEFAULT, portId),
mPid(pid), mSilenced(false), mSilencedNotified(false) mPid(pid)
{ {
} }

@ -1468,19 +1468,14 @@ status_t AudioPolicyManager::getInputForAttr(const audio_attributes_t *attr,
} }
// For MMAP mode, the first call to getInputForAttr() is made on behalf of audioflinger. // For MMAP mode, the first call to getInputForAttr() is made on behalf of audioflinger.
// The second call is for the first active client and sets the UID. Any further call // The second call is for the first active client and sets the UID. Any further call
// corresponds to a new client and is only permitted from the same UID. // corresponds to a new client and is only permitted from the same UId.
// If the first UID is silenced, allow a new UID connection and replace with new UID
if (audioSession->openCount() == 1) { if (audioSession->openCount() == 1) {
audioSession->setUid(uid); audioSession->setUid(uid);
} else if (audioSession->uid() != uid) { } else if (audioSession->uid() != uid) {
if (!audioSession->isSilenced()) { ALOGW("getInputForAttr() bad uid %d for session %d uid %d",
ALOGW("getInputForAttr() bad uid %d for session %d uid %d", uid, session, audioSession->uid());
uid, session, audioSession->uid()); status = INVALID_OPERATION;
status = INVALID_OPERATION; goto error;
goto error;
}
audioSession->setUid(uid);
audioSession->setSilenced(false);
} }
audioSession->changeOpenCount(1); audioSession->changeOpenCount(1);
*inputType = API_INPUT_LEGACY; *inputType = API_INPUT_LEGACY;

@ -343,9 +343,8 @@ aaudio_result_t AAudioServiceEndpointMMAP::getTimestamp(int64_t *positionFrames,
} }
void AAudioServiceEndpointMMAP::onTearDown(audio_port_handle_t handle __unused) { void AAudioServiceEndpointMMAP::onTearDown() {
ALOGD("%s(%p) called", __func__, this); ALOGD("%s(%p) called", __func__, this);
//TODO: disconnect only stream corresponding to handle received
disconnectRegisteredStreams(); disconnectRegisteredStreams();
}; };

@ -68,7 +68,7 @@ public:
aaudio_result_t getTimestamp(int64_t *positionFrames, int64_t *timeNanos) override; aaudio_result_t getTimestamp(int64_t *positionFrames, int64_t *timeNanos) override;
// -------------- Callback functions for MmapStreamCallback --------------------- // -------------- Callback functions for MmapStreamCallback ---------------------
void onTearDown(audio_port_handle_t handle) override; void onTearDown() override;
void onVolumeChanged(audio_channel_mask_t channels, void onVolumeChanged(audio_channel_mask_t channels,
android::Vector<float> values) override; android::Vector<float> values) override;

Loading…
Cancel
Save