]> git.sesse.net Git - vlc/commitdiff
aout: second guess whether the video output should be recycled
authorRémi Denis-Courmont <remi@remlab.net>
Fri, 26 Apr 2013 15:52:14 +0000 (18:52 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Fri, 26 Apr 2013 16:00:32 +0000 (19:00 +0300)
This restores the brittle logic from VLC version 2.0.x (fixes #8499).
I strongly suspect there are some false positives left, which would
lead to ghost video outputs.

src/audio_output/aout_internal.h
src/audio_output/dec.c
src/audio_output/filters.c

index 040cae4f2f56b409e86d033d91518d39675977e2..af9613e3bc631e292fc6545a4c59297fc5892c31 100644 (file)
@@ -82,7 +82,6 @@ typedef struct
     audio_sample_format_t mixer_format;
 
     aout_request_vout_t request_vout;
-    bool recycle_vout;
 
     atomic_uint buffers_lost;
     atomic_uchar restart;
index e5e3a43c64f6ed146f1f16a510f802c796c78026..3fd0cff705f3bb8f03b8e4dd0969b2799c462e3a 100644 (file)
@@ -160,6 +160,9 @@ static int aout_CheckReady (audio_output_t *aout)
                 owner->mixer_format.i_format = 0;
             }
         }
+        /* TODO: This would be a good time to call clean up any video output
+         * left over by an audio visualization:
+        input_resource_TerminatVout(MAGIC HERE); */
     }
     return (owner->mixer_format.i_format) ? 0 : -1;
 }
index 5cd43d5a00eba28e56a66fd2cdccf7b43f63b1b4..1ceb1f1cf006e75cd0413511a2238ecf85cd4503 100644 (file)
@@ -336,11 +336,12 @@ vout_thread_t *aout_filter_RequestVout (filter_t *filter, vout_thread_t *vout,
      * If you want to use visualization filters from another place, you will
      * need to add a new pf_aout_request_vout callback or store a pointer
      * to aout_request_vout_t inside filter_t (i.e. a level of indirection). */
-    aout_owner_t *owner = aout_owner ((audio_output_t *)filter->p_parent);
     const aout_request_vout_t *req = (void *)filter->p_owner;
+    char *visual = var_InheritString (filter->p_parent, "audio-visual");
+    bool recycle = (visual != NULL) && strcasecmp(visual, "none");
+    free (visual);
 
-    return req->pf_request_vout (req->p_private, vout, fmt,
-                                 owner->recycle_vout);
+    return req->pf_request_vout (req->p_private, vout, fmt, recycle);
 }
 
 static int AppendFilter(vlc_object_t *obj, const char *type, const char *name,
@@ -398,8 +399,6 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout,
     filters->resampling = 0;
     filters->count = 0;
 
-    aout_owner_t *owner = aout_owner (aout);
-
     /* Prepare format structure */
     aout_FormatPrint (aout, "input", infmt);
     audio_sample_format_t input_format = *infmt;
@@ -446,7 +445,6 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout,
     }
 
     char *visual = var_InheritString (aout, "audio-visual");
-    owner->recycle_vout = visual != NULL;
     if (visual != NULL && strcasecmp (visual, "none"))
     {
         AppendFilter(VLC_OBJECT(aout), "visualization", visual, filters,
@@ -492,23 +490,12 @@ error:
  */
 void aout_FiltersDelete (audio_output_t *aout, aout_filters_t *filters)
 {
-    aout_owner_t *owner = aout_owner (aout);
-
     if (filters->resampler != NULL)
         aout_FiltersPipelineDestroy (&filters->resampler, 1);
     aout_FiltersPipelineDestroy (filters->tab, filters->count);
     var_DelCallback (aout, "equalizer", EqualizerCallback, NULL);
     var_DelCallback (aout, "visual", VisualizationCallback, NULL);
 
-    /* XXX We need to update recycle_vout before calling
-     * aout_FiltersPipelineDestroy().
-     * FIXME There may be a race condition if audio-visual is updated between
-     * aout_FiltersDestroy() and the next aout_FiltersNew().
-     */
-    char *visual = var_InheritString (aout, "audio-visual");
-    owner->recycle_vout = (visual != NULL) && *visual;
-    free (visual);
-
     free (filters);
 }