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

Commit d931eef4 authored by Eric Laurent's avatar Eric Laurent Committed by Android Git Automerger
Browse files

am e9bd4788: Merge change 26881 into eclair

Merge commit 'e9bd4788d4370714374d833aed1339d17c5ded09' into eclair-plus-aosp

* commit 'e9bd4788d4370714374d833aed1339d17c5ded09':
  Fix issue 2142613: ToneGenerator: short tones sometimes don't play on sholes or over A2DP.
parents 958e2422 824b6a4a
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -167,7 +167,8 @@ private:
        TONE_STARTING,  // ToneGenerator is starting playing
        TONE_STARTING,  // ToneGenerator is starting playing
        TONE_PLAYING,  // ToneGenerator is playing
        TONE_PLAYING,  // ToneGenerator is playing
        TONE_STOPPING,  // ToneGenerator is stoping
        TONE_STOPPING,  // ToneGenerator is stoping
        TONE_RESTARTING  //
        TONE_STOPPED,  // ToneGenerator is stopped: the AudioTrack will be stopped
        TONE_RESTARTING  // A start request was received in active state (playing or stopping)
    };
    };




+19 −8
Original line number Original line Diff line number Diff line
@@ -1066,7 +1066,7 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) {


    if (event != AudioTrack::EVENT_MORE_DATA) return;
    if (event != AudioTrack::EVENT_MORE_DATA) return;


    const AudioTrack::Buffer *buffer = static_cast<const AudioTrack::Buffer *>(info);
    AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info);
    ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user);
    ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user);
    short *lpOut = buffer->i16;
    short *lpOut = buffer->i16;
    unsigned int lNumSmp = buffer->size/sizeof(short);
    unsigned int lNumSmp = buffer->size/sizeof(short);
@@ -1106,14 +1106,14 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) {
            lWaveCmd = WaveGenerator::WAVEGEN_STOP;
            lWaveCmd = WaveGenerator::WAVEGEN_STOP;
            lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
            lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
            break;
            break;
        case TONE_STOPPED:
            LOGV("Stopped Cbk");
            goto audioCallback_EndLoop;
        default:
        default:
            LOGV("Extra Cbk");
            LOGV("Extra Cbk");
            // Force loop exit
            lNumSmp = 0;
            goto audioCallback_EndLoop;
            goto audioCallback_EndLoop;
        }
        }



        // Exit if tone sequence is over
        // Exit if tone sequence is over
        if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 ||
        if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 ||
            lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) {
            lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) {
@@ -1123,7 +1123,7 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) {
            if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
            if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
                goto audioCallback_EndLoop;
                goto audioCallback_EndLoop;
            }
            }
            // fade out before stopping if maximum duraiton reached
            // fade out before stopping if maximum duration reached
            lWaveCmd = WaveGenerator::WAVEGEN_STOP;
            lWaveCmd = WaveGenerator::WAVEGEN_STOP;
            lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
            lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
        }
        }
@@ -1256,20 +1256,31 @@ audioCallback_EndLoop:
            lSignal = true;
            lSignal = true;
            break;
            break;
        case TONE_STOPPING:
        case TONE_STOPPING:
            LOGV("Cbk Stopping\n");
            lpToneGen->mState = TONE_STOPPED;
            // Force loop exit
            lNumSmp = 0;
            break;
        case TONE_STOPPED:
            lpToneGen->mState = TONE_INIT;
            lpToneGen->mState = TONE_INIT;
            LOGV("Cbk Stopping track\n");
            LOGV("Cbk Stopped track\n");
            lSignal = true;
            lpToneGen->mpAudioTrack->stop();
            lpToneGen->mpAudioTrack->stop();

            // Force loop exit
            // Force loop exit
            lNumSmp = 0;
            lNumSmp = 0;
            buffer->size = 0;
            lSignal = true;
            break;
            break;
        case TONE_STARTING:
        case TONE_STARTING:
            LOGV("Cbk starting track\n");
            LOGV("Cbk starting track\n");
            lpToneGen->mState = TONE_PLAYING;
            lpToneGen->mState = TONE_PLAYING;
            lSignal = true;
            lSignal = true;
           break;
           break;
        case TONE_PLAYING:
           break;
        default:
        default:
            // Force loop exit
            lNumSmp = 0;
            buffer->size = 0;
            break;
            break;
        }
        }