mirror of
https://github.com/androidx/media.git
synced 2025-05-09 08:30:43 +08:00

We currently wait until a previous AudioTrack from the same DefaultAudioSink is released on a background thread before attempting to initialize a new AudioTrack. This is done to avoid issues where the releasing track blocks some shared audio memory, preventing a new track from being created. The current solution has two main shortcomings: - In most cases, the system can easily handle multiple AudioTracks and waiting for the release just causes unnecessary delays (e.g. when seeking). - It only waits for a previous track from the same DefaultAudioSink, not accounting for any other tracks that may be in the process of being released from other players. To improve on both shortcomings, we can (1) move the check for "is releasing tracks and thus may block shared memory" to the static release infrastructure to be shared across all player instances. (2) optimistically create a new AudioTrack immediately without waiting for the previous one to be fully released. (3) extend the existing retry logic that already retries failed attempts for 100ms to only start the timer when ongoing releases are done. This ensures we really waited until we have all shared resources we can get before giving up completely. This also acts as a replacement for change (2) to handle situations where creating a second track is genuinely not possible. Also increase threshold to 200ms as the new unit test is falky on a real device with just 100ms (highlighting that the device needed more than 100ms to clean up internal resources). PiperOrigin-RevId: 654053123