vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Aug 4 16:42:31 2011 +0300| [4cc939684b71ec56a35048c9061915954fbc8076] | committer: Rémi Denis-Courmont
amem: add support for pause/resume and flush/drain > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4cc939684b71ec56a35048c9061915954fbc8076 --- include/vlc/libvlc_media_player.h | 58 ++++++++++++++++++++++++++++++++++-- modules/audio_output/amem.c | 30 ++++++++++++++++++- src/control/media_player.c | 16 +++++++++- src/libvlc.sym | 1 + 4 files changed, 97 insertions(+), 8 deletions(-) diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index 0f24e37..5233ecb 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -476,9 +476,39 @@ typedef void (*libvlc_audio_play_cb)(void *data, const void *samples, unsigned count, int64_t pts); /** + * Callback prototype for audio pause. + * \note The pause callback is never called if the audio is already paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the pause request (should be elapsed already) + */ +typedef void (*libvlc_audio_pause_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio resumption (i.e. restart from pause). + * \note The resume callback is never called if the audio is not paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the resumption request (should be elapsed already) + */ +typedef void (*libvlc_audio_resume_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer flush + * (i.e. discard all pending buffers and stop playback as soon as possible). + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_flush_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer drain + * (i.e. wait for pending buffers to be played). + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_drain_cb)(void *data); + +/** * Callback prototype for audio volume change. * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] - * \param volume linear volume (1. = nominal, 0. = mute) + * \param volume software volume (1. = nominal, 0. = mute) * \param mute muted flag */ typedef void (*libvlc_audio_set_volume_cb)(void *data, @@ -491,17 +521,37 @@ typedef void (*libvlc_audio_set_volume_cb)(void *data, * * \param mp the media player * \param play callback to play audio samples (must not be NULL) - * \param set_volume callback to set audio volume, or NULL for software volume - * \param opaque private pointer for the two callbacks (as first parameter) + * \param pause callback to pause playback (or NULL to ignore) + * \param resume callback to resume playback (or NULL to ignore) + * \param flush callback to flush audio buffers (or NULL to ignore) + * \param drain callback to drain audio buffers (or NULL to ignore) + * \param opaque private pointer for the audio callbacks (as first parameter) * \version LibVLC 1.2.0 or later */ LIBVLC_API void libvlc_audio_set_callbacks( libvlc_media_player_t *mp, libvlc_audio_play_cb play, - libvlc_audio_set_volume_cb set_volume, + libvlc_audio_pause_cb pause, + libvlc_audio_resume_cb resume, + libvlc_audio_flush_cb flush, + libvlc_audio_drain_cb drain, void *opaque ); /** + * Set callbacks and private data for decoded audio. + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param set_volume callback to apply audio volume, + * or NULL to apply volume in software + * \version LibVLC 1.2.0 or later + */ +LIBVLC_API +void libvlc_audio_set_volume_callback( libvlc_media_player_t *mp, + libvlc_audio_set_volume_cb set_volume ); + +/** * Callback prototype to setup the audio playback. * This is called when the media player needs to create a new audio output. * \param opaque pointer to the data pointer passed to diff --git a/modules/audio_output/amem.c b/modules/audio_output/amem.c index ac4a11e..02dc44d 100644 --- a/modules/audio_output/amem.c +++ b/modules/audio_output/amem.c @@ -55,6 +55,10 @@ struct aout_sys_t { void *opaque; void (*play) (void *opaque, const void *data, unsigned count, int64_t pts); + void (*pause) (void *opaque, int64_t pts); + void (*resume) (void *opaque, int64_t pts); + void (*flush) (void *opaque); + void (*drain) (void *opaque); int (*set_volume) (void *opaque, float vol, bool mute); void (*cleanup) (void *opaque); }; @@ -68,6 +72,24 @@ static void Play (audio_output_t *aout, block_t *block) block_Release (block); } +static void Pause (audio_output_t *aout, bool paused, mtime_t date) +{ + aout_sys_t *sys = aout->sys; + void (*cb) (void *, int64_t) = paused ? sys->pause : sys->resume; + + if (cb != NULL) + cb (sys->opaque, date); +} + +static void Flush (audio_output_t *aout, bool wait) +{ + aout_sys_t *sys = aout->sys; + void (*cb) (void *) = wait ? sys->drain : sys->flush; + + if (cb != NULL) + cb (sys->opaque); +} + static int VolumeSet (audio_output_t *aout, float vol, bool mute) { aout_sys_t *sys = aout->sys; @@ -87,6 +109,10 @@ static int Open (vlc_object_t *obj) aout->sys = sys; sys->opaque = var_InheritAddress (obj, "amem-data"); sys->play = var_InheritAddress (obj, "amem-play"); + sys->pause = var_InheritAddress (obj, "amem-pause"); + sys->resume = var_InheritAddress (obj, "amem-resume"); + sys->flush = var_InheritAddress (obj, "amem-flush"); + sys->drain = var_InheritAddress (obj, "amem-drain"); sys->set_volume = var_InheritAddress (obj, "amem-set-volume"); sys->cleanup = NULL; /* defer */ if (sys->play == NULL) @@ -127,8 +153,8 @@ static int Open (vlc_object_t *obj) aout->format.i_rate = rate; aout->pf_play = Play; - aout->pf_pause = NULL; - aout->pf_flush = NULL; + aout->pf_pause = Pause; + aout->pf_flush = Flush; if (sys->set_volume != NULL) aout->pf_volume_set = VolumeSet; else diff --git a/src/control/media_player.c b/src/control/media_player.c index 3521c33..b0942a4 100644 --- a/src/control/media_player.c +++ b/src/control/media_player.c @@ -937,15 +937,27 @@ void *libvlc_media_player_get_hwnd( libvlc_media_player_t *p_mi ) void libvlc_audio_set_callbacks( libvlc_media_player_t *mp, libvlc_audio_play_cb play_cb, - libvlc_audio_set_volume_cb set_volume_cb, + libvlc_audio_pause_cb pause_cb, + libvlc_audio_resume_cb resume_cb, + libvlc_audio_flush_cb flush_cb, + libvlc_audio_drain_cb drain_cb, void *opaque ) { var_SetAddress( mp, "amem-play", play_cb ); - var_SetAddress( mp, "amem-set-volume", set_volume_cb ); + var_SetAddress( mp, "amem-pause", pause_cb ); + var_SetAddress( mp, "amem-resume", resume_cb ); + var_SetAddress( mp, "amem-flush", flush_cb ); + var_SetAddress( mp, "amem-drain", drain_cb ); var_SetAddress( mp, "amem-data", opaque ); var_SetString( mp, "aout", "amem" ); } +void libvlc_audio_set_volume_callback( libvlc_media_player_t *mp, + libvlc_audio_set_volume_cb cb ) +{ + var_SetAddress( mp, "amem-set-volume", cb ); +} + void libvlc_audio_set_format_callbacks( libvlc_media_player_t *mp, libvlc_audio_setup_cb setup, libvlc_audio_cleanup_cb cleanup ) diff --git a/src/libvlc.sym b/src/libvlc.sym index 8e3d835..2c09776 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -28,6 +28,7 @@ libvlc_audio_toggle_mute libvlc_audio_set_format libvlc_audio_set_format_callbacks libvlc_audio_set_callbacks +libvlc_audio_set_volume_callback libvlc_clock libvlc_event_attach libvlc_event_detach _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
