diff options
author | Eric Laurent <elaurent@google.com> | 2009-07-09 01:56:20 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2009-07-09 01:56:20 -0700 |
commit | 5964e73774b381748013b91d04dfb6fc60f533ee (patch) | |
tree | 3ed233d830f2d7741411c4984262da5636cf6662 /media | |
parent | c52d55c5404a09a3845a322f50577fc4c125a86d (diff) | |
download | frameworks_base-5964e73774b381748013b91d04dfb6fc60f533ee.zip frameworks_base-5964e73774b381748013b91d04dfb6fc60f533ee.tar.gz frameworks_base-5964e73774b381748013b91d04dfb6fc60f533ee.tar.bz2 |
Fix issue 1946033: dialer deadlocks and/or ANRs when using dialpad in-call
The cause is very likely that the WaveGenerator *lpWaveGen returned by lpToneGen->mWaveGens.valueFor(lFrequency) just before calling lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd) is invalid. The frequency lFrequency is not part of the frequencies in mWaveGens.
This can happen if a different tone is started while the callback function is active: The state is changed to TONE_RESTARTING and the call to prepareWave() at line 1226 will change the tone descriptor pointed to by mpToneDesc as well as the content of mWaveGens. However, mpToneDesc was cached in a local variable lpToneDesc when entering the callback and is not reloaded when exiting prepareWave(). This causes a mismatch between the tone frequencies listed in lpToneDesc and the frequencies present in mWaveGens.
This regression was introduced in change 973 when mpToneDesc was cached in a local variable.
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/ToneGenerator.cpp | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index c22cd53..5435da7 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -1225,6 +1225,8 @@ audioCallback_EndLoop: LOGV("Cbk restarting track\n"); if (lpToneGen->prepareWave()) { lpToneGen->mState = TONE_STARTING; + // must reload lpToneDesc as prepareWave() may change mpToneDesc + lpToneDesc = lpToneGen->mpToneDesc; } else { LOGW("Cbk restarting prepareWave() failed\n"); lpToneGen->mState = TONE_IDLE; |