InCallTonePlayer concurrency improvements.
We've seen a number of issues lately where incall tones are not reporting back to CallAudioManager when the tone is no longer playing. This has caused issues with the CallAudioModeStateMachine setting the mode back to NORMAL. To remedy this situation, implemented the following concurrency changes: 1) Removed the use of synchronized(this) as a means of providing a way for a playing tone to be interrupted the InCallTonePlayer#stopTone; replaced this in favor of using a CountDownLatch. 2) Removed synchronization primitives for mState since these are always operations on the main thread. 3) Replaced integer sTonesPlaying with an AtomicInteger; there was no locking on that instance and it was possible for concurrently playing InCallTonePlayer instances to make conflicting updates. Another optimization was moving the state change and media player cleanup from within the media player onCompletion callback into a finally block which takes place after we're done waiting on the playback completion. Test: Performed manual testing on device on a carrier with ringback; verified that ringback plays and stops as expected. Test: Performed manual testing on device by disconneting calls and verifying that the audio mode changes to MODE_NORMAL. Also verified through log inspection that the locks and latches are performing as expected. Test: Wrote new unit tests for InCallTonePlayer to verify that tone interruption results in signaling to CallAudioManager of the tone stop. Fixes: 227404845 Change-Id: Ib90d1015887e0b6580950fff1c223f91e8490fb0
Loading
Please register or sign in to comment