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

Commit bc0a8f4a authored by Pavan Chikkala's avatar Pavan Chikkala Committed by Steve Kondik
Browse files

audio: Added fallback mechanism for Tunnel Mode

On L, checkTunnelExceptions always gets stream type as MUSIC
because AudioOutput gets the actual stream only after AudioTrack
is created. AwesomePlayer tries play MP3/AAC ringtones in tunnel
mode due to this reason. Also, AudioOutput fails to set the
actual stream type for tunnel case which results in MUSIC
and RINGTONE getting mixed

Added fallback mechasism for tunnel mode so that ring tones
are rejected by the tunnel player and is switched to
deep buffer mode. Updated stream type for tunnel case in
AudioOutput after AudioTrack is created

CRs-Fixed: 774774

Change-Id: I408441c8c0562ef36beddd4f6efb76752d3fb0a0
parent 96eb1543
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -1656,7 +1656,12 @@ status_t MediaPlayerService::AudioOutput::open(
                             CallbackWrapper,
                             newcbd,
                             0,
                             mSessionId);
                             mSessionId,
                             AudioTrack::TRANSFER_DEFAULT,
                             NULL,
                             -1,
                             -1,
                             mAttributes);
            if ((audioTrack == 0) || (audioTrack->initCheck() != NO_ERROR)) {
                ALOGE("Unable to create audio track");
                delete audioTrack;
@@ -1669,6 +1674,7 @@ status_t MediaPlayerService::AudioOutput::open(
        }
        deleteRecycledTrack();

        mStreamType = audioTrack->streamType();
        ALOGV("setVolume");
        mCallbackData = newcbd;
        audioTrack->setVolume(mLeftVolume, mRightVolume);
+45 −17
Original line number Diff line number Diff line
@@ -704,6 +704,15 @@ void AwesomePlayer::reset_l() {
    delete mAudioPlayer;
    mAudioPlayer = NULL;

#ifdef QCOM_DIRECTTRACK
    if (mIsTunnelAudio) {
        if(mTunnelAliveAP > 0) {
            mTunnelAliveAP--;
            ALOGV("mTunnelAliveAP from reset = %d", mTunnelAliveAP);
        }
    }
    mIsTunnelAudio = false;
#endif
    if (mTextDriver != NULL) {
        delete mTextDriver;
        mTextDriver = NULL;
@@ -1116,7 +1125,11 @@ status_t AwesomePlayer::play_l() {
            status_t err = startAudioPlayer_l(
                    false /* sendErrorNotification */);

#ifndef QCOM_DIRECTTRACK
            if ((err != OK) && mOffloadAudio) {
#else
            if ((err != OK) && (mOffloadAudio || mIsTunnelAudio)) {
#endif
                 err = fallbackToSWDecoder();
            }

@@ -1203,6 +1216,16 @@ status_t AwesomePlayer::fallbackToSWDecoder() {
    }
    mAudioSource.clear();
    modifyFlags((AUDIO_RUNNING | AUDIOPLAYER_STARTED), CLEAR);

#ifdef QCOM_DIRECTTRACK
    if (mIsTunnelAudio) {
        if(mTunnelAliveAP > 0) {
            mTunnelAliveAP--;
            ALOGV("mTunnelAliveAP from fallbackToSWDecoder = %d", mTunnelAliveAP);
        }
        mIsTunnelAudio = false;
    }
#endif
    mOffloadAudio = false;
    mAudioSource = mOmxSource;
    if (mAudioSource != NULL) {
@@ -1310,11 +1333,11 @@ void AwesomePlayer::createAudioPlayer_l()
       (nchannels && (nchannels <= 2)))

    {
        ALOGE("LPAPlayer::getObjectsAlive() %d",LPAPlayer::mObjectsAlive);
        ALOGI("LPAPlayer::getObjectsAlive() %d mDurationUs %lld minDurationForLPA %d",LPAPlayer::mObjectsAlive, mDurationUs, minDurationForLPA);
        if ( mDurationUs > minDurationForLPA
             && (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG) || !strcasecmp(mime,MEDIA_MIMETYPE_AUDIO_AAC))
             && LPAPlayer::mObjectsAlive == 0 && mVideoSource == NULL) {
            ALOGE("LPAPlayer created, LPA MODE detected mime %s duration %lld", mime, mDurationUs);
            ALOGI("LPAPlayer created, LPA MODE detected mime %s duration %lld", mime, mDurationUs);
            bool initCheck =  false;
            mAudioPlayer = new LPAPlayer(mAudioSink, initCheck, this);
            if(!initCheck) {
@@ -1898,29 +1921,29 @@ status_t AwesomePlayer::initAudioDecoder() {

    checkTunnelExceptions();

    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW) ||
             (mIsTunnelAudio
    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
        ALOGD("Set Audio Track as Audio Source");
        mAudioSource = mAudioTrack;
        // For PCM offload fallback
        if (mOffloadAudio) {
            mOmxSource = mAudioSource;
        }
    } else {

        char *matchComponentName = NULL;
        uint32_t flags = 0;
        if (mIsTunnelAudio
#ifdef USE_TUNNEL_MODE
             && (mTunnelAliveAP < TunnelPlayer::getTunnelObjectsAliveMax())
#endif
    )) {
    )   {
        ALOGD("Set Audio Track as Audio Source");
        if(mIsTunnelAudio) {
        mTunnelAliveAP++;
        }


        ALOGV("createAudioPlayer: bypass OMX (raw)");
        mAudioSource = mAudioTrack;
        // For PCM offload fallback
        if (mOffloadAudio) {
            mOmxSource = mAudioSource;
        }
        } else {
        // For LPA Playback use the decoder without OMX layer
        char *matchComponentName = NULL;
        int64_t durationUs;
        uint32_t flags = 0;
        char lpaDecode[128];
        uint32_t minDurationForLPA = LPA_MIN_DURATION_USEC_DEFAULT;
        char minUserDefDuration[PROPERTY_VALUE_MAX];
@@ -1959,10 +1982,15 @@ status_t AwesomePlayer::initAudioDecoder() {
            }
            flags |= OMXCodec::kSoftwareCodecsOnly;
        }
        mAudioSource = OMXCodec::Create(
        }
        mOmxSource = OMXCodec::Create(
                mClient.interface(), mAudioTrack->getFormat(),
                false, // createEncoder
                mAudioTrack, matchComponentName, flags,NULL);

        if(!mIsTunnelAudio) {
           mAudioSource = mOmxSource;
        }
#else
    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
        ALOGV("createAudioPlayer: bypass OMX (raw)");
+7 −0
Original line number Diff line number Diff line
@@ -211,6 +211,12 @@ status_t TunnelPlayer::start(bool sourceAlreadyStarted) {
        flags,
        NULL);

    if(mAudioSink->getAudioStreamType() != AUDIO_STREAM_MUSIC) {
       ALOGV("Tunnel Player is not used for non-music stream");
       mIsAudioRouted = true;
       err = INVALID_OPERATION;
    }

    if (err != OK) {
        if (mFirstBuffer != NULL) {
            mFirstBuffer->release();
@@ -221,6 +227,7 @@ status_t TunnelPlayer::start(bool sourceAlreadyStarted) {
            mSource->stop();
        }


        ALOGE("Opening a routing session failed");
        return err;
    }