diff options
Diffstat (limited to 'media/libmedia/ToneGenerator.cpp')
-rw-r--r-- | media/libmedia/ToneGenerator.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index d36bec9..3729eb3 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -879,6 +879,7 @@ ToneGenerator::~ToneGenerator() { //////////////////////////////////////////////////////////////////////////////// bool ToneGenerator::startTone(int toneType, int durationMs) { bool lResult = false; + status_t lStatus; if ((toneType < 0) || (toneType >= NUM_TONES)) return lResult; @@ -898,15 +899,16 @@ bool ToneGenerator::startTone(int toneType, int durationMs) { toneType = getToneForRegion(toneType); mpNewToneDesc = &sToneDescriptors[toneType]; - if (durationMs == -1) { - mMaxSmp = TONEGEN_INF; - } else { - if (durationMs > (int)(TONEGEN_INF / mSamplingRate)) { - mMaxSmp = (durationMs / 1000) * mSamplingRate; - } else { - mMaxSmp = (durationMs * mSamplingRate) / 1000; + mDurationMs = durationMs; + + if (mState == TONE_STOPPED) { + LOGV("Start waiting for previous tone to stop"); + lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); + if (lStatus != NO_ERROR) { + LOGE("--- start wait for stop timed out, status %d", lStatus); + mState = TONE_IDLE; + return lResult; } - LOGV("startTone, duration limited to %d ms", durationMs); } if (mState == TONE_INIT) { @@ -919,7 +921,7 @@ bool ToneGenerator::startTone(int toneType, int durationMs) { mLock.lock(); if (mState == TONE_STARTING) { LOGV("Wait for start callback"); - status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); + lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); if (lStatus != NO_ERROR) { LOGE("--- Immediate start timed out, status %d", lStatus); mState = TONE_IDLE; @@ -931,9 +933,8 @@ bool ToneGenerator::startTone(int toneType, int durationMs) { } } else { LOGV("Delayed start\n"); - mState = TONE_RESTARTING; - status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); + lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); if (lStatus == NO_ERROR) { if (mState != TONE_IDLE) { lResult = true; @@ -1316,6 +1317,17 @@ bool ToneGenerator::prepareWave() { mpToneDesc = mpNewToneDesc; + if (mDurationMs == -1) { + mMaxSmp = TONEGEN_INF; + } else { + if (mDurationMs > (int)(TONEGEN_INF / mSamplingRate)) { + mMaxSmp = (mDurationMs / 1000) * mSamplingRate; + } else { + mMaxSmp = (mDurationMs * mSamplingRate) / 1000; + } + LOGV("prepareWave, duration limited to %d ms", mDurationMs); + } + while (mpToneDesc->segments[segmentIdx].duration) { // Get total number of sine waves: needed to adapt sine wave gain. unsigned int lNumWaves = numWaves(segmentIdx); |