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

Commit e41dd756 authored by The Android Open Source Project's avatar The Android Open Source Project
Browse files

auto import from //branches/cupcake/...@127436

parent 5f78a48b
Loading
Loading
Loading
Loading
+71 −9
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ AudioFlinger::AudioFlinger()
        mA2dpOutput(0), mOutput(0), mRequestedOutput(0), mAudioRecordThread(0),
        mSampleRate(0), mFrameCount(0), mChannelCount(0), mFormat(0), mMixBuffer(0),
        mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mStandby(false),
        mInWrite(false)
        mInWrite(false), mA2dpDisableCount(0), mA2dpSuppressed(false)
{
    mHardwareStatus = AUDIO_HW_IDLE;
    mAudioHardware = AudioHardwareInterface::create();
@@ -205,6 +205,27 @@ size_t AudioFlinger::getOutputFrameCount(AudioStreamOut* output)
    return output->bufferSize() / output->channelCount() / sizeof(int16_t);
}

#ifdef WITH_A2DP
bool AudioFlinger::streamDisablesA2dp(int streamType)
{
    return (streamType == AudioTrack::SYSTEM ||
            streamType == AudioTrack::RING ||
            streamType == AudioTrack::ALARM ||
            streamType == AudioTrack::NOTIFICATION);
}

void AudioFlinger::setA2dpEnabled(bool enable)
{
    if (enable) {
        LOGD("set output to A2DP\n");
        setOutput(mA2dpOutput);
    } else {
        LOGD("set output to hardware audio\n");
        setOutput(mHardwareOutput);
    }
}
#endif // WITH_A2DP

status_t AudioFlinger::dumpClients(int fd, const Vector<String16>& args)
{
    const size_t SIZE = 256;
@@ -457,7 +478,7 @@ bool AudioFlinger::threadLoop()
            if (UNLIKELY(count)) {
                for (size_t i=0 ; i<count ; i++) {
                    const sp<Track>& track = tracksToRemove[i];
                    mActiveTracks.remove(track);
                    removeActiveTrack(track);
                    if (track->isTerminated()) {
                        mTracks.remove(track);
                        mAudioMixer->deleteTrackName(track->mName);
@@ -653,13 +674,16 @@ status_t AudioFlinger::setRouting(int mode, uint32_t routes, uint32_t mask)
    LOGD("setRouting %d %d %d\n", mode, routes, mask);
    if (mode == AudioSystem::MODE_NORMAL && 
            (mask & AudioSystem::ROUTE_BLUETOOTH_A2DP)) {
        AutoMutex lock(&mLock);

        bool enableA2dp = false;
        if (routes & AudioSystem::ROUTE_BLUETOOTH_A2DP) {
            LOGD("set output to A2DP\n");
            setOutput(mA2dpOutput);
        } else {
            LOGD("set output to hardware audio\n");
            setOutput(mHardwareOutput);
            if (mA2dpDisableCount > 0)
                mA2dpSuppressed = true;
            else
                enableA2dp = true;
        }
        setA2dpEnabled(enableA2dp);
        LOGD("setOutput done\n");
    }
#endif
@@ -875,7 +899,7 @@ status_t AudioFlinger::addTrack(const sp<Track>& track)
        // effectively get the latency it requested.
        track->mFillingUpStatus = Track::FS_FILLING;
        track->mResetDone = false;
        mActiveTracks.add(track);
        addActiveTrack(track);
        return NO_ERROR;
    }
    return ALREADY_EXISTS;
@@ -897,7 +921,7 @@ void AudioFlinger::remove_track_l(wp<Track> track, int name)
        t->reset();
    }
    audioMixer()->deleteTrackName(name);
    mActiveTracks.remove(track);
    removeActiveTrack(track);
    mWaitWorkCV.broadcast();
}

@@ -918,6 +942,44 @@ void AudioFlinger::destroyTrack(const sp<Track>& track)
    }
}

void AudioFlinger::addActiveTrack(const wp<Track>& t)
{
    mActiveTracks.add(t);

#ifdef WITH_A2DP
    // disable A2DP for certain stream types
    sp<Track> track = t.promote();
    if (streamDisablesA2dp(track->type())) {
        if (mA2dpDisableCount++ == 0 && isA2dpEnabled()) {
            setA2dpEnabled(false);
            mA2dpSuppressed = true;
            LOGD("mA2dpSuppressed = true\n");
        }
        LOGD("mA2dpDisableCount incremented to %d\n", mA2dpDisableCount);
    }
#endif
}

void AudioFlinger::removeActiveTrack(const wp<Track>& t)
{
    mActiveTracks.remove(t);
#ifdef WITH_A2DP
    // disable A2DP for certain stream types
    sp<Track> track = t.promote();
    if (streamDisablesA2dp(track->type())) {
        if (mA2dpDisableCount > 0) {
            mA2dpDisableCount--;
            if (mA2dpDisableCount == 0 && mA2dpSuppressed) {
                setA2dpEnabled(true);
                mA2dpSuppressed = false;
            }
            LOGD("mA2dpDisableCount decremented to %d\n", mA2dpDisableCount);
        } else
            LOGE("mA2dpDisableCount is already zero");
    }
#endif
}

// ----------------------------------------------------------------------------

AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid)
+13 −0
Original line number Diff line number Diff line
@@ -153,6 +153,15 @@ private:
    void                    doSetOutput(AudioStreamOut* output);
    size_t                  getOutputFrameCount(AudioStreamOut* output);

#ifdef WITH_A2DP
    static bool             streamDisablesA2dp(int streamType);
    inline bool             isA2dpEnabled() const {
                                return (mRequestedOutput == mA2dpOutput ||
                                        (mOutput && mOutput == mA2dpOutput));
                            }
    void                    setA2dpEnabled(bool enable);
#endif

    // Internal dump utilites.
    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
    status_t dumpClients(int fd, const Vector<String16>& args);
@@ -371,6 +380,8 @@ private:
                void        removeTrack(wp<Track> track, int name);
                void        remove_track_l(wp<Track> track, int name);
                void        destroyTrack(const sp<Track>& track);
                void        addActiveTrack(const wp<Track>& track);
                void        removeActiveTrack(const wp<Track>& track);

                AudioMixer* audioMixer() {
                    return mAudioMixer;
@@ -481,6 +492,8 @@ private:
                int                                 mNumDelayedWrites;
                bool                                mStandby;
                bool                                mInWrite;
                int                                 mA2dpDisableCount;
                bool                                mA2dpSuppressed;
};

// ----------------------------------------------------------------------------