mirror of
https://github.com/androidx/media.git
synced 2025-05-03 21:57:46 +08:00

We currently block the loading thread until the calculated load time has past and then unblock again by a message sent from the playback thread. However, because the loading thread itself is not using a Looper and runs freely, we don't control when the short calculations on the loader thread that determine how long we have to wait are happening, and we also don't control how long it takes to start and stop this thread. To solve these problems and to make the playback deterministic we can 1. Send a message on the playback thread to block until the loader thread has started. 2. Block the playback thread whenever a loading thread is doing its short calculation of wait times. The playback thread knows when it can continue because loading either enter a new waiting state for a simulated load time or loading is finished completely. 3. Also wait on the playback thread until the loader has shut down. As this is waiting for a message on the playback thread, we can achieve this by sending messages to ourselves at the current time until the loader is shut down. All 3 steps together ensure that the loading thread interaction is compeltely deterministic when simulating bandwidth profiles with the BandwidthProfileDataSource. As we need to notify the source before and after the load started/finished, we also need a small wrapper for the chunk source when running the playback. PiperOrigin-RevId: 355810408