there are two different kind of streams: 1. media files 2. live radio/television The difference cannot reliably be determined by the backend so the application has to tell the frontend. This is the expected behaviour: 1. media files ============== function | prev. state | action | new state ---------+-------------+----------------------------------------------------------------+---------- ctor | | | Loading ---------+-------------+----------------------------------------------------------------+---------- setUrl | Loading | refill buffers | Loading | Stopped | refill buffers | Loading ---------+-------------+----------------------------------------------------------------+---------- play | Loading | continue buffering | Buffering | Stopped | start playing | Playing | Buffering | continue buffering | Buffering | Playing | | Playing | Paused | continue playback | Playing ---------+-------------+----------------------------------------------------------------+---------- pause | Loading | | Loading | Stopped | | Stopped | Buffering | continue buffering | Paused | Playing | pause output and fill buffers to the max | Paused | Paused | | Paused ---------+-------------+----------------------------------------------------------------+---------- stop | Loading | | Loading | Stopped | | Stopped | Buffering | restart buffering from the beginning of the file | Loading | Playing | stop output and refill buffers from the beginning of the file | Loading | Paused | restart buffering from the beginning of the file | Loading events function | prev. state | event | new state ---------+-------------+----------------------------------------------------------------+---------- | Buffering | when the buffers are filled start playing | Playing | Loading | when buffers are filled | Stopped 2. live stream ============== function | prev. state | action | new state ---------+-------------+----------------------------------------------------------------+---------- ctor | | | Loading ---------+-------------+----------------------------------------------------------------+---------- setUrl | Loading | | Stopped | Stopped | | Stopped ---------+-------------+----------------------------------------------------------------+---------- play | Loading | | Error | Stopped | start buffering | Buffering | Buffering | continue buffering | Buffering | Playing | | Playing | Paused | continue playback | Playing ---------+-------------+----------------------------------------------------------------+---------- pause | Loading | | Error | Stopped | | Stopped | Buffering | continue buffering | Paused | Playing | pause output and fill (ring-)buffers to the max | Paused | Paused | | Paused ---------+-------------+----------------------------------------------------------------+---------- stop | Loading | | Error | Stopped | | Stopped | Buffering | clear buffers | Stopped | Playing | stop output and clear buffers | Stopped | Paused | clear buffers | Stopped events function | prev. state | event | new state ---------+-------------+----------------------------------------------------------------+---------- | Buffering | when the buffers are filled start playing | Playing