[vlc-devel] [RFC PATCH 1/2] aout: make the play() API non blocking

Thomas Guillem thomas at gllm.fr
Tue Mar 12 20:55:39 CET 2019



On Tue, Mar 12, 2019, at 19:01, Rémi Denis-Courmont wrote:
> Le tiistaina 12. maaliskuuta 2019, 19.18.42 EET Thomas Guillem a écrit :
> > TODO: implement it on all modules.
> > ---
> >  include/vlc_aout.h                      | 33 +++++++++++++++++++++++--
> >  modules/audio_output/adummy.c           |  3 ++-
> >  modules/audio_output/alsa.c             |  6 ++---
> >  modules/audio_output/amem.c             |  3 ++-
> >  modules/audio_output/audiotrack.c       |  6 ++---
> >  modules/audio_output/audiounit_ios.m    |  7 ++++--
> >  modules/audio_output/coreaudio_common.c |  7 +++---
> >  modules/audio_output/coreaudio_common.h |  2 +-
> >  modules/audio_output/directsound.c      | 21 ++++++++++------
> >  modules/audio_output/file.c             |  5 ++--
> >  modules/audio_output/jack.c             |  5 ++--
> >  modules/audio_output/kai.c              |  5 ++--
> >  modules/audio_output/mmdevice.c         |  5 ++--
> >  modules/audio_output/mmdevice.h         |  5 ++--
> >  modules/audio_output/opensles_android.c |  3 ++-
> >  modules/audio_output/oss.c              |  5 ++--
> >  modules/audio_output/pulse.c            |  3 ++-
> >  modules/audio_output/sndio.c            |  5 ++--
> >  modules/audio_output/wasapi.c           |  5 ++--
> >  modules/audio_output/waveout.c          |  7 +++---
> >  modules/audio_output/winstore.c         |  6 +++--
> >  src/audio_output/aout_internal.h        |  1 +
> >  src/audio_output/dec.c                  | 27 +++++++++++++++++++-
> >  src/audio_output/output.c               |  1 +
> >  24 files changed, 128 insertions(+), 48 deletions(-)
> > 
> > diff --git a/include/vlc_aout.h b/include/vlc_aout.h
> > index 4441a42a82..770c2b7025 100644
> > --- a/include/vlc_aout.h
> > +++ b/include/vlc_aout.h
> > @@ -112,6 +112,7 @@
> >  #include <vlc_block.h>
> > 
> >  struct vlc_audio_output_events {
> > +    void (*more_data_report)(audio_output_t *);
> 
> That's room/space in the buffer, not data.
> The usually word is underflow. But if you confuse it with underrun, then 
> {write,buffer}_{space,room} also works.
> 
> >      void (*drained_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);
> > @@ -123,6 +124,7 @@ struct vlc_audio_output_events {
> >      int (*gain_request)(audio_output_t *, float);
> >  };
> > 
> > +
> >  /** Audio output object
> >   *
> >   * The audio output object is the abstraction for rendering decoded
> > @@ -187,11 +189,27 @@ struct audio_output
> >        * \note This callback cannot be called in stopped state.
> >        */
> > 
> > -    void (*play)(audio_output_t *, block_t *block, vlc_tick_t date);
> > +#define AOUT_PLAY_WAIT_REPORT (-1)
> > +#define AOUT_PLAY_DONE (0)
> 
> Mismatched type/rank.
> 
> > +    vlc_tick_t (*play)(audio_output_t *, block_t *block, vlc_tick_t date);
> >      /**< Queues a block of samples for playback (mandatory, cannot be
> > NULL). *
> > -      * \param block block of audio samples
> > +      * As the play implementation must be non-blocking, the implementation
> > is +      * allowed to return prematurely if is internal buffer is full. In
> > that +      * case, the implementation must modify the block offset since
> > the same +      * block will be given in a successive call and return one
> > of the 3 +      * possibles values:
> > +      * AOUT_PLAY_DONE: the block is fully written
> > +      * AOUT_PLAY_WAIT_REPORT: aout_MoreDataReport() must be called
> > +      * asynchronously from the implementation to notify the core that new
> > data +      * can be written.
> > +      * > 0: The core will wait for that positive delay before calling
> > play() +      * again.
> > +      *
> > +      * \param block block of audio samples, must be released when
> > returning +      * AOUT_PLAY_DONE
> >        * \param date intended system time to render the first sample
> > +      * \return AOUT_PLAY_WAIT_REPORT, AOUT_PLAY_DONE or a positive delay
> 
> You can just invoke the callback inline instead of AOUT_PLAY_DONE, and use a 
> helper to arm a timer for the positive delay case. Then you don't need three 
> different ways to handle congestion control.
> 
> But TBH, I don't really see the point in doing this *now*. As long as the 
> input takes care of pacing, the problem of blocking play is negligible. That 
> should be fixed in VLC 5.0 timeline.

Yes I know. I wanted to have a good view on all our aout plugins and our internal code. I guess this will need a post 4.0 workshop. 

> 
> -- 
> 雷米‧德尼-库尔蒙
> http://www.remlab.net/
> 
> 
> 
> _______________________________________________
> 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