[vlc-devel] [PATCH] aout: modify module API: make modules non-blocking

Thomas Guillem thomas at gllm.fr
Tue Mar 12 11:53:23 CET 2019


I reject myself this API changes since It will work only with PulseAudio, that has a way to report more_data and drain from its own thread. The new API need to handle other main modules too. I think the best way to pace the play() from other modules is to return a vlc_tick_t from this function, that will tell the core to wait for a given time.

By the way, all major plugins (PulseAudio, AudioTrack, auhal(macOS/iOS), and wasapi) can't handle drain (it never worked for PulseAudio). Therefore, I propose to handle the drain from the core, by default, using the time_get() delay.

And then come other modules I never tested like OSS, that are fully synchronous and blocking. 
 
On Mon, Mar 11, 2019, at 13:56, Thomas Guillem wrote:
> I propose this new API. It is still WIP, I need to modify the core and modules
> to make sure it is possible.
> ---
>  include/vlc_aout.h | 48 +++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 41 insertions(+), 7 deletions(-)
> 
> diff --git a/include/vlc_aout.h b/include/vlc_aout.h
> index a4ae6bc498..a42121ad65 100644
> --- a/include/vlc_aout.h
> +++ b/include/vlc_aout.h
> @@ -112,6 +112,8 @@
>  #include <vlc_block.h>
>  
>  struct vlc_audio_output_events {
> +    void (*more_data_report)(audio_output_t *);
> +    void (*drain_report)(audio_output_t *);
>      void (*timing_report)(audio_output_t *, vlc_tick_t system_now, 
> vlc_tick_t pts);
>      void (*volume_report)(audio_output_t *, float);
>      void (*mute_report)(audio_output_t *, bool);
> @@ -134,6 +136,9 @@ struct vlc_audio_output_events {
>   * The audio output is always created in stopped state and is always 
> destroyed
>   * in that state also. It is moved from stopped to playing state by 
> start(),
>   * and from playing or paused states back to stopped state by stop().
> + *
> + * \note every callback implementations must be NON-BLOCKING
> + * TODO: Make all aout modules non-blocking for 4.0
>   **/
>  struct audio_output
>  {
> @@ -186,12 +191,18 @@ struct audio_output
>        * \note This callback cannot be called in stopped state.
>        */
>  
> -    void (*play)(audio_output_t *, block_t *block, vlc_tick_t date);
> +    block_t *(*play)(audio_output_t *, block_t *block, vlc_tick_t date);
>      /**< Queues a block of samples for playback (mandatory, cannot be NULL).
> +      *
> +      * As the play implementation must be non-blocking, the implementation is
> +      * allowed to return prematurely if the audio buffer is full. In that
> +      * case, the implementation must call aout_MoreDataReport() when data can
> +      * be written again.
>        *
>        * \param block block of audio samples
>        * \param date intended system time to render the first sample
> -      *
> +      * \return the same block with modified offset in case of incomplete
> +      * playback (cf. description)
>        * \note This callback cannot be called in stopped state.
>        */
>  
> @@ -212,15 +223,18 @@ struct audio_output
>        * \note This callback cannot be called in stopped state.
>        */
>  
> -    void (*flush)( audio_output_t *, bool wait);
> +    void (*flush)( audio_output_t *);
>      /**< Flushes or drains the playback buffers (mandatory, cannot be NULL).
> -      *
> -      * \param wait true to wait for playback of pending buffers (drain),
> -      *             false to discard pending buffers (flush)
>        *
>        * \note This callback cannot be called in stopped state.
>        */
>  
> +    bool (*drain)(audio_output_t *);
> +    /**< Drain pending buffers asynchronously
> +      *
> +      * \return true if drained, false if the end of the drain will be reported
> +      * asynchronously via aout_DrainReport() */
> +
>      int (*volume_set)(audio_output_t *, float volume);
>      /**< Changes playback volume (optional, may be NULL).
>        *
> @@ -376,6 +390,26 @@ VLC_API char *aout_DeviceGet (audio_output_t *);
>  VLC_API int aout_DeviceSet (audio_output_t *, const char *);
>  VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***);
>  
> +/**
> + * Report that the stream need more data
> + *
> + * \note Must be called only after an incomplete aout->play.
> + */
> +static inline void aout_MoreDataReport(audio_output_t *aout)
> +{
> +   aout->events->more_data_report(aout);
> +}
> +
> +/**
> + * Report that the drain is finished
> + *
> + * \note must be called only after aout->drain returning false.
> + */
> +static inline void aout_DrainReport(audio_output_t *aout)
> +{
> +    aout->events->drain_report(aout);
> +}
> +
>  /**
>   * Report change of configured audio volume to the core and UI.
>   */
> @@ -456,7 +490,7 @@ static inline void aout_PauseDefault(audio_output_t 
> *aout, bool paused,
>                                       vlc_tick_t date)
>  {
>      if (paused && aout->flush != NULL)
> -        aout->flush(aout, false);
> +        aout->flush(aout);
>      (void) date;
>  }
>  
> -- 
> 2.20.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list