[vlc-commits] aout: match module life cycle to the object life cycle

Rémi Denis-Courmont git at videolan.org
Wed Oct 31 21:41:24 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Oct 31 22:22:14 2012 +0200| [10dd2acc08ada7d9027bc1aff493f69c39c4a62a] | committer: Rémi Denis-Courmont

aout: match module life cycle to the object life cycle

In other words, keep the module loaded whenever the aout exists.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=10dd2acc08ada7d9027bc1aff493f69c39c4a62a
---

 src/audio_output/common.c |   73 +++++++++++++++++++++++++++++++++++++++------
 src/audio_output/dec.c    |    9 ++----
 src/audio_output/output.c |   69 ++----------------------------------------
 3 files changed, 69 insertions(+), 82 deletions(-)

diff --git a/src/audio_output/common.c b/src/audio_output/common.c
index 216a667..51e8518 100644
--- a/src/audio_output/common.c
+++ b/src/audio_output/common.c
@@ -55,6 +55,41 @@ static int var_Copy (vlc_object_t *src, const char *name, vlc_value_t prev,
     return var_Set (dst, name, value);
 }
 
+/**
+ * Supply or update the current custom ("hardware") volume.
+ * @note This only makes sense after calling aout_VolumeHardInit().
+ * @param volume current custom volume
+ *
+ * @warning The caller (i.e. the audio output plug-in) is responsible for
+ * interlocking and synchronizing call to this function and to the
+ * audio_output_t.volume_set callback. This ensures that VLC gets correct
+ * volume information (possibly with a latency).
+ */
+static void aout_VolumeNotify (audio_output_t *aout, float volume)
+{
+    var_SetFloat (aout, "volume", volume);
+}
+
+static void aout_MuteNotify (audio_output_t *aout, bool mute)
+{
+    var_SetBool (aout, "mute", mute);
+}
+
+static void aout_PolicyNotify (audio_output_t *aout, bool cork)
+{
+    (cork ? var_IncInteger : var_DecInteger) (aout->p_parent, "corks");
+}
+
+static int aout_GainNotify (audio_output_t *aout, float gain)
+{
+    aout_owner_t *owner = aout_owner (aout);
+
+    aout_assert_locked (aout);
+    aout_volume_SetVolume (owner->volume, gain);
+    /* XXX: ideally, return -1 if format cannot be amplified */
+    return 0;
+}
+
 #undef aout_New
 /*****************************************************************************
  * aout_New: initialize aout structure
@@ -70,12 +105,33 @@ audio_output_t *aout_New( vlc_object_t * p_parent )
     aout_owner_t *owner = aout_owner (aout);
 
     vlc_mutex_init (&owner->lock);
-    owner->module = NULL;
+    vlc_object_set_destructor (aout, aout_Destructor);
+
     owner->input = NULL;
 
+    /* Audio output module callbacks */
+    var_Create (aout, "volume", VLC_VAR_FLOAT);
+    var_AddCallback (aout, "volume", var_Copy, p_parent);
+    var_Create (aout, "mute", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
+    var_AddCallback (aout, "mute", var_Copy, p_parent);
+
+    aout->event.volume_report = aout_VolumeNotify;
+    aout->event.mute_report = aout_MuteNotify;
+    aout->event.policy_report = aout_PolicyNotify;
+    aout->event.gain_request = aout_GainNotify;
+
+    /* Audio output module initialization */
+    aout->start = NULL;
+    aout->stop = NULL;
     aout->volume_set = NULL;
     aout->mute_set = NULL;
-    vlc_object_set_destructor (aout, aout_Destructor);
+    owner->module = module_need (aout, "audio output", "$aout", false);
+    if (owner->module == NULL)
+    {
+        msg_Err (aout, "no suitable audio output module");
+        vlc_object_release (aout);
+        return NULL;
+    }
 
     /*
      * Persistent audio output variables
@@ -84,11 +140,6 @@ audio_output_t *aout_New( vlc_object_t * p_parent )
     module_config_t *cfg;
     char *str;
 
-    var_Create (aout, "volume", VLC_VAR_FLOAT);
-    var_AddCallback (aout, "volume", var_Copy, p_parent);
-    var_Create (aout, "mute", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
-    var_AddCallback (aout, "mute", var_Copy, p_parent);
-
     /* Visualizations */
     var_Create (aout, "visual", VLC_VAR_STRING | VLC_VAR_HASCHOICE);
     text.psz_string = _("Visualizations");
@@ -161,7 +212,6 @@ audio_output_t *aout_New( vlc_object_t * p_parent )
     text.psz_string = _("Audio visualizations");
     var_Change (aout, "audio-visual", VLC_VAR_SETTEXT, &text, NULL);
 
-
     /* Replay gain */
     var_Create (aout, "audio-replay-gain-mode",
                 VLC_VAR_STRING | VLC_VAR_DOINHERIT );
@@ -184,7 +234,12 @@ void aout_Destroy (audio_output_t *aout)
 {
     aout_owner_t *owner = aout_owner (aout);
 
-    assert (owner->module == NULL);
+    aout_lock (aout);
+    module_unneed (aout, owner->module);
+    /* Protect against late call from intf.c */
+    aout->volume_set = NULL;
+    aout->mute_set = NULL;
+    aout_unlock (aout);
 
     var_DelCallback (aout, "mute", var_Copy, aout->p_parent);
     var_SetFloat (aout, "volume", -1.f);
diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index fbfe69f..92e4fdf 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -71,7 +71,6 @@ int aout_DecNew( audio_output_t *p_aout,
 
     /* TODO: reduce lock scope depending on decoder's real need */
     aout_lock( p_aout );
-    assert (owner->module == NULL);
 
     /* Create the audio output stream */
     var_Destroy( p_aout, "audio-device" );
@@ -117,11 +116,9 @@ void aout_DecDelete (audio_output_t *p_aout)
         aout_InputDelete (p_aout, input);
     owner->input = NULL;
 
-    if (likely(owner->module != NULL))
-    {
-        aout_OutputDelete( p_aout );
-        aout_volume_Delete (owner->volume);
-    }
+    aout_OutputDelete( p_aout );
+    aout_volume_Delete (owner->volume);
+
     var_Destroy( p_aout, "audio-device" );
     var_Destroy( p_aout, "stereo-mode" );
 
diff --git a/src/audio_output/output.c b/src/audio_output/output.c
index dd48fde..2b82fea 100644
--- a/src/audio_output/output.c
+++ b/src/audio_output/output.c
@@ -25,52 +25,13 @@
 # include "config.h"
 #endif
 
-#include <math.h>
-
 #include <vlc_common.h>
 #include <vlc_aout.h>
-#include <vlc_aout_intf.h>
 #include <vlc_cpu.h>
-#include <vlc_modules.h>
 
 #include "libvlc.h"
 #include "aout_internal.h"
 
-/**
- * Supply or update the current custom ("hardware") volume.
- * @note This only makes sense after calling aout_VolumeHardInit().
- * @param volume current custom volume
- *
- * @warning The caller (i.e. the audio output plug-in) is responsible for
- * interlocking and synchronizing call to this function and to the
- * audio_output_t.volume_set callback. This ensures that VLC gets correct
- * volume information (possibly with a latency).
- */
-static void aout_OutputVolumeReport (audio_output_t *aout, float volume)
-{
-    var_SetFloat (aout, "volume", volume);
-}
-
-static void aout_OutputMuteReport (audio_output_t *aout, bool mute)
-{
-    var_SetBool (aout, "mute", mute);
-}
-
-static void aout_OutputPolicyReport (audio_output_t *aout, bool cork)
-{
-    (cork ? var_IncInteger : var_DecInteger) (aout->p_parent, "corks");
-}
-
-static int aout_OutputGainRequest (audio_output_t *aout, float gain)
-{
-    aout_owner_t *owner = aout_owner (aout);
-
-    aout_assert_locked (aout);
-    aout_volume_SetVolume (owner->volume, gain);
-    /* XXX: ideally, return -1 if format cannot be amplified */
-    return 0;
-}
-
 /*****************************************************************************
  * aout_OutputNew : allocate a new output and rework the filter pipeline
  *****************************************************************************
@@ -85,24 +46,9 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
 
     aout_assert_locked (aout);
 
-    aout->event.volume_report = aout_OutputVolumeReport;
-    aout->event.mute_report = aout_OutputMuteReport;
-    aout->event.policy_report = aout_OutputPolicyReport;
-    aout->event.gain_request = aout_OutputGainRequest;
-
-    /* Find the best output plug-in. */
-    owner->module = module_need (aout, "audio output", "$aout", false);
-    if (owner->module == NULL)
-    {
-        msg_Err (aout, "no suitable audio output module");
-        return -1;
-    }
-
     if (aout->start (aout, &fmt))
     {
         msg_Err (aout, "module not functional");
-        module_unneed (aout, owner->module);
-        owner->module = NULL;
         return -1;
     }
 
@@ -195,8 +141,7 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
                                     &owner->mixer_format, &fmt) < 0)
     {
         msg_Err (aout, "couldn't create audio output pipeline");
-        module_unneed (aout, owner->module);
-        owner->module = NULL;
+        aout_OutputDelete (aout);
         return -1;
     }
     return 0;
@@ -211,16 +156,9 @@ void aout_OutputDelete (audio_output_t *aout)
 
     aout_assert_locked (aout);
 
-    if (owner->module == NULL)
-        return;
-
     var_DelCallback (aout, "stereo-mode", aout_ChannelsRestart, NULL);
     if (aout->stop != NULL)
         aout->stop (aout);
-    module_unneed (aout, owner->module);
-    aout->volume_set = NULL;
-    aout->mute_set = NULL;
-    owner->module = NULL;
     aout_FiltersDestroyPipeline (owner->filters, owner->nb_filters);
 }
 
@@ -243,10 +181,7 @@ void aout_OutputPlay (audio_output_t *aout, block_t *block)
         return;
     }
 
-    if (likely(owner->module != NULL))
-        aout->play (aout, block, &drift);
-    else
-        block_Release (block);
+    aout->play (aout, block, &drift);
 /**
  * Notifies the audio input of the drift from the requested audio
  * playback timestamp (@ref block_t.i_pts) to the anticipated playback time



More information about the vlc-commits mailing list