Loading services/audioflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ cc_library_shared { "liblog", "libbinder", "libaudioclient", "libaudiomanager", "libmedialogservice", "libmediametrics", "libmediautils", Loading services/audioflinger/AudioFlinger.cpp +25 −5 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ #include <cutils/properties.h> #include <system/audio.h> #include <audiomanager/AudioManager.h> #include <audiomanager/IAudioManager.h> #include "AudioFlinger.h" #include "NBAIO_Tee.h" Loading Loading @@ -114,11 +114,12 @@ using media::audio::common::AudioMMapPolicyInfo; using media::audio::common::AudioMMapPolicyType; using android::content::AttributionSourceState; static const char kDeadlockedString[] = "AudioFlinger may be deadlocked\n"; static const char kHardwareLockedString[] = "Hardware lock is taken\n"; static const char kClientLockedString[] = "Client lock is taken\n"; static const char kNoEffectsFactory[] = "Effects Factory is absent\n"; static constexpr char kDeadlockedString[] = "AudioFlinger may be deadlocked\n"; static constexpr char kHardwareLockedString[] = "Hardware lock is taken\n"; static constexpr char kClientLockedString[] = "Client lock is taken\n"; static constexpr char kNoEffectsFactory[] = "Effects Factory is absent\n"; static constexpr char kAudioServiceName[] = "audio"; nsecs_t AudioFlinger::mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs; Loading Loading @@ -2722,9 +2723,28 @@ status_t AudioFlinger::systemReady() ThreadBase *thread = (ThreadBase *)mMmapThreads.valueAt(i).get(); thread->systemReady(); } // Java services are ready, so we can create a reference to AudioService getOrCreateAudioManager(); return NO_ERROR; } sp<IAudioManager> AudioFlinger::getOrCreateAudioManager() { if (mAudioManager.load() == nullptr) { // use checkService() to avoid blocking sp<IBinder> binder = defaultServiceManager()->checkService(String16(kAudioServiceName)); if (binder != nullptr) { mAudioManager = interface_cast<IAudioManager>(binder); } else { ALOGE("%s(): binding to audio service failed.", __func__); } } return mAudioManager.load(); } status_t AudioFlinger::getMicrophones(std::vector<media::MicrophoneInfo> *microphones) { AutoMutex lock(mHardwareLock); Loading services/audioflinger/AudioFlinger.h +6 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ class DevicesFactoryHalCallback; class DevicesFactoryHalInterface; class EffectsFactoryHalInterface; class FastMixer; class IAudioManager; class PassthruBufferProvider; class RecordBufferConverter; class ServerProxy; Loading Loading @@ -988,6 +989,8 @@ private: size_t rejectedKVPSize, const String8& rejectedKVPs, uid_t callingUid); sp<IAudioManager> getOrCreateAudioManager(); public: // These methods read variables atomically without mLock, // though the variables are updated with mLock. Loading Loading @@ -1029,6 +1032,9 @@ private: std::vector<media::audio::common::AudioMMapPolicyInfo>> mPolicyInfos; int32_t mAAudioBurstsPerBuffer = 0; int32_t mAAudioHwBurstMinMicros = 0; /** Interface for interacting with the AudioService. */ mediautils::atomic_sp<IAudioManager> mAudioManager; }; #undef INCLUDING_FROM_AUDIOFLINGER_H Loading services/audioflinger/PlaybackTracks.h +11 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,12 @@ public: float getSpeed() const { return mSpeed; } bool isSpatialized() const override { return mIsSpatialized; } /** * Updates the mute state and notifies the audio service. Call this only when holding player * thread lock. */ void processMuteEvent_l(const sp<IAudioManager>& audioManager, mute_state_t muteState); protected: // for numerous friend class PlaybackThread; Loading Loading @@ -354,6 +360,11 @@ private: TeePatches mTeePatches; const float mSpeed; const bool mIsSpatialized; // TODO: replace PersistableBundle with own struct // access these two variables only when holding player thread lock. std::unique_ptr<os::PersistableBundle> mMuteEventExtras; mute_state_t mMuteState; }; // end of Track Loading services/audioflinger/Threads.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <sys/syscall.h> #include <cutils/bitops.h> #include <cutils/properties.h> #include <binder/PersistableBundle.h> #include <media/AudioContainers.h> #include <media/AudioDeviceTypeAddr.h> #include <media/AudioParameter.h> Loading Loading @@ -5375,6 +5376,12 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac volume = masterVolume * mStreamTypes[track->streamType()].volume; } track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(), /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, track->isPlaybackRestricted()}); handleVoipVolume_l(&volume); // cache the combined master volume and stream type volume for fast mixer; this Loading Loading @@ -5539,6 +5546,12 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac v = 0; } track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(), /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, track->isPlaybackRestricted()}); handleVoipVolume_l(&v); if (track->isPausing()) { Loading Loading @@ -6169,6 +6182,12 @@ void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTr right *= v * mMasterBalanceRight; } track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(), /*muteState=*/{mMasterMute, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, track->isPlaybackRestricted()}); if (lastTrack) { track->setFinalVolume((left + right) / 2.f); if (left != mLeftVolFloat || right != mRightVolFloat) { Loading Loading
services/audioflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ cc_library_shared { "liblog", "libbinder", "libaudioclient", "libaudiomanager", "libmedialogservice", "libmediametrics", "libmediautils", Loading
services/audioflinger/AudioFlinger.cpp +25 −5 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ #include <cutils/properties.h> #include <system/audio.h> #include <audiomanager/AudioManager.h> #include <audiomanager/IAudioManager.h> #include "AudioFlinger.h" #include "NBAIO_Tee.h" Loading Loading @@ -114,11 +114,12 @@ using media::audio::common::AudioMMapPolicyInfo; using media::audio::common::AudioMMapPolicyType; using android::content::AttributionSourceState; static const char kDeadlockedString[] = "AudioFlinger may be deadlocked\n"; static const char kHardwareLockedString[] = "Hardware lock is taken\n"; static const char kClientLockedString[] = "Client lock is taken\n"; static const char kNoEffectsFactory[] = "Effects Factory is absent\n"; static constexpr char kDeadlockedString[] = "AudioFlinger may be deadlocked\n"; static constexpr char kHardwareLockedString[] = "Hardware lock is taken\n"; static constexpr char kClientLockedString[] = "Client lock is taken\n"; static constexpr char kNoEffectsFactory[] = "Effects Factory is absent\n"; static constexpr char kAudioServiceName[] = "audio"; nsecs_t AudioFlinger::mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs; Loading Loading @@ -2722,9 +2723,28 @@ status_t AudioFlinger::systemReady() ThreadBase *thread = (ThreadBase *)mMmapThreads.valueAt(i).get(); thread->systemReady(); } // Java services are ready, so we can create a reference to AudioService getOrCreateAudioManager(); return NO_ERROR; } sp<IAudioManager> AudioFlinger::getOrCreateAudioManager() { if (mAudioManager.load() == nullptr) { // use checkService() to avoid blocking sp<IBinder> binder = defaultServiceManager()->checkService(String16(kAudioServiceName)); if (binder != nullptr) { mAudioManager = interface_cast<IAudioManager>(binder); } else { ALOGE("%s(): binding to audio service failed.", __func__); } } return mAudioManager.load(); } status_t AudioFlinger::getMicrophones(std::vector<media::MicrophoneInfo> *microphones) { AutoMutex lock(mHardwareLock); Loading
services/audioflinger/AudioFlinger.h +6 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ class DevicesFactoryHalCallback; class DevicesFactoryHalInterface; class EffectsFactoryHalInterface; class FastMixer; class IAudioManager; class PassthruBufferProvider; class RecordBufferConverter; class ServerProxy; Loading Loading @@ -988,6 +989,8 @@ private: size_t rejectedKVPSize, const String8& rejectedKVPs, uid_t callingUid); sp<IAudioManager> getOrCreateAudioManager(); public: // These methods read variables atomically without mLock, // though the variables are updated with mLock. Loading Loading @@ -1029,6 +1032,9 @@ private: std::vector<media::audio::common::AudioMMapPolicyInfo>> mPolicyInfos; int32_t mAAudioBurstsPerBuffer = 0; int32_t mAAudioHwBurstMinMicros = 0; /** Interface for interacting with the AudioService. */ mediautils::atomic_sp<IAudioManager> mAudioManager; }; #undef INCLUDING_FROM_AUDIOFLINGER_H Loading
services/audioflinger/PlaybackTracks.h +11 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,12 @@ public: float getSpeed() const { return mSpeed; } bool isSpatialized() const override { return mIsSpatialized; } /** * Updates the mute state and notifies the audio service. Call this only when holding player * thread lock. */ void processMuteEvent_l(const sp<IAudioManager>& audioManager, mute_state_t muteState); protected: // for numerous friend class PlaybackThread; Loading Loading @@ -354,6 +360,11 @@ private: TeePatches mTeePatches; const float mSpeed; const bool mIsSpatialized; // TODO: replace PersistableBundle with own struct // access these two variables only when holding player thread lock. std::unique_ptr<os::PersistableBundle> mMuteEventExtras; mute_state_t mMuteState; }; // end of Track Loading
services/audioflinger/Threads.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <sys/syscall.h> #include <cutils/bitops.h> #include <cutils/properties.h> #include <binder/PersistableBundle.h> #include <media/AudioContainers.h> #include <media/AudioDeviceTypeAddr.h> #include <media/AudioParameter.h> Loading Loading @@ -5375,6 +5376,12 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac volume = masterVolume * mStreamTypes[track->streamType()].volume; } track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(), /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, track->isPlaybackRestricted()}); handleVoipVolume_l(&volume); // cache the combined master volume and stream type volume for fast mixer; this Loading Loading @@ -5539,6 +5546,12 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac v = 0; } track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(), /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, track->isPlaybackRestricted()}); handleVoipVolume_l(&v); if (track->isPausing()) { Loading Loading @@ -6169,6 +6182,12 @@ void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTr right *= v * mMasterBalanceRight; } track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(), /*muteState=*/{mMasterMute, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, track->isPlaybackRestricted()}); if (lastTrack) { track->setFinalVolume((left + right) / 2.f); if (left != mLeftVolFloat || right != mRightVolFloat) { Loading