Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09971f01 authored by Vlad Popa's avatar Vlad Popa Committed by Android (Google) Code Review
Browse files

Merge "Send playback mute events from audio server"

parents 2edb7c04 e8d9947b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ cc_library_shared {
        "liblog",
        "libbinder",
        "libaudioclient",
        "libaudiomanager",
        "libmedialogservice",
        "libmediametrics",
        "libmediautils",
+25 −5
Original line number Diff line number Diff line
@@ -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"
@@ -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;

@@ -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);
+6 −0
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ class DevicesFactoryHalCallback;
class DevicesFactoryHalInterface;
class EffectsFactoryHalInterface;
class FastMixer;
class IAudioManager;
class PassthruBufferProvider;
class RecordBufferConverter;
class ServerProxy;
@@ -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.
@@ -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
+11 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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


+19 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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
@@ -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()) {
@@ -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