]> git.sesse.net Git - vlc/blobdiff - src/input/resource.c
Add LGPL license
[vlc] / src / input / resource.c
index f683e61b3679d7c3b8b5c276075236ee6f522e4e..794cef8727977af03d1abacfd05a7399e48696d2 100644 (file)
@@ -67,10 +67,12 @@ struct input_resource_t
     /* You need lock+lock_hold to write to the following variables and
      * only lock or lock_hold to read them */
 
-    int             i_vout;
     vout_thread_t   **pp_vout;
+    int             i_vout;
 
-    aout_instance_t *p_aout;
+    /* TODO? track more than one audio output (like video outputs) */
+    bool            b_aout_busy;
+    audio_output_t *p_aout;
 };
 
 /* */
@@ -95,7 +97,6 @@ static sout_instance_t *RequestSout( input_resource_t *p_resource,
         return NULL;
     }
 
-    assert( p_resource->p_input );
     assert( !p_sout || ( !p_resource->p_sout && !psz_sout ) );
 
     /* Check the validity of the sout */
@@ -149,7 +150,8 @@ static void DestroyVout( input_resource_t *p_resource )
 static void DisplayVoutTitle( input_resource_t *p_resource,
                               vout_thread_t *p_vout )
 {
-    assert( p_resource->p_input );
+    if( p_resource->p_input == NULL )
+        return;
 
     /* TODO display the title only one time for the same input ? */
 
@@ -206,7 +208,6 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
         return NULL;
     }
 
-    assert( p_resource->p_input );
     if( p_fmt )
     {
         /* */
@@ -327,48 +328,77 @@ exit:
 static void DestroyAout( input_resource_t *p_resource )
 {
     if( p_resource->p_aout )
-        vlc_object_release( p_resource->p_aout );
-    p_resource->p_aout = NULL;
+    {
+        aout_Destroy( p_resource->p_aout );
+        p_resource->p_aout = NULL;
+    }
 }
-static aout_instance_t *RequestAout( input_resource_t *p_resource, aout_instance_t *p_aout )
-{
-    vlc_assert_locked( &p_resource->lock );
-    assert( p_resource->p_input );
 
-    if( p_aout )
+static void ReleaseAout( input_resource_t *p_resource,
+                         audio_output_t *p_aout )
+{
+    if( likely(p_aout == p_resource->p_aout) )
     {
-        msg_Dbg( p_resource->p_parent, "releasing aout" );
+        assert( p_resource->b_aout_busy );
+        p_resource->b_aout_busy = false;
+        msg_Dbg( p_resource->p_parent, "releasing audio output" );
         vlc_object_release( p_aout );
-        return NULL;
     }
     else
     {
-        p_aout = p_resource->p_aout;
-        if( !p_aout )
-        {
-            msg_Dbg( p_resource->p_parent, "creating aout" );
-            p_aout = aout_New( p_resource->p_parent );
+        msg_Dbg( p_resource->p_parent, "destroying extra audio output" );
+        aout_Destroy( p_aout );
+    }
+}
 
-            vlc_mutex_lock( &p_resource->lock_hold );
-            p_resource->p_aout = p_aout;
-            vlc_mutex_unlock( &p_resource->lock_hold );
-        }
-        else
-        {
-            msg_Dbg( p_resource->p_parent, "reusing aout" );
-        }
+static audio_output_t *AllocateAout( input_resource_t *p_resource )
+{
+    audio_output_t *p_aout;
 
-        if( !p_aout )
+    if( unlikely(p_resource->b_aout_busy) )
+    {
+        msg_Dbg( p_resource->p_parent, "creating extra audio output" );
+        return aout_New( p_resource->p_parent );
+    }
+
+    p_aout = p_resource->p_aout;
+    if( p_aout == NULL )
+    {
+        msg_Dbg( p_resource->p_parent, "creating audio output" );
+        p_aout = aout_New( p_resource->p_parent );
+        if( unlikely(p_aout == NULL) )
             return NULL;
-        vlc_object_hold( p_aout );
-        return p_aout;
+
+        vlc_mutex_lock( &p_resource->lock_hold );
+        assert( p_resource->p_aout == NULL );
+        p_resource->p_aout = p_aout;
+        vlc_mutex_unlock( &p_resource->lock_hold );
     }
+    else
+        msg_Dbg( p_resource->p_parent, "recycling audio output" );
+
+    p_resource->b_aout_busy = true;
+    vlc_object_hold( p_aout );
+    return p_aout;
 }
-static aout_instance_t *HoldAout( input_resource_t *p_resource )
+
+static audio_output_t *RequestAout( input_resource_t *p_resource, audio_output_t *p_aout )
+{
+    vlc_assert_locked( &p_resource->lock );
+
+    if( p_aout )
+    {
+        ReleaseAout( p_resource, p_aout );
+        return NULL;
+    }
+    return AllocateAout( p_resource );
+}
+
+static audio_output_t *HoldAout( input_resource_t *p_resource )
 {
     vlc_mutex_lock( &p_resource->lock_hold );
 
-    aout_instance_t *p_aout = p_resource->p_aout;
+    audio_output_t *p_aout = p_resource->p_aout;
     if( p_aout )
         vlc_object_hold( p_aout );
 
@@ -376,17 +406,18 @@ static aout_instance_t *HoldAout( input_resource_t *p_resource )
 
     return p_aout;
 }
+
 static void TerminateAout( input_resource_t *p_resource )
 {
     vlc_mutex_lock( &p_resource->lock_hold );
 
-    aout_instance_t *p_aout = p_resource->p_aout;
+    audio_output_t *p_aout = p_resource->p_aout;
     p_resource->p_aout = NULL;
 
     vlc_mutex_unlock( &p_resource->lock_hold );
 
     if( p_aout )
-        vlc_object_release( p_aout );
+        aout_Destroy( p_aout );
 }
 
 static void Destructor( gc_object_t *p_gc )
@@ -477,15 +508,15 @@ bool input_resource_HasVout( input_resource_t *p_resource )
 }
 
 /* */
-aout_instance_t *input_resource_RequestAout( input_resource_t *p_resource, aout_instance_t *p_aout )
+audio_output_t *input_resource_RequestAout( input_resource_t *p_resource, audio_output_t *p_aout )
 {
     vlc_mutex_lock( &p_resource->lock );
-    aout_instance_t *p_ret = RequestAout( p_resource, p_aout );
+    audio_output_t *p_ret = RequestAout( p_resource, p_aout );
     vlc_mutex_unlock( &p_resource->lock );
 
     return p_ret;
 }
-aout_instance_t *input_resource_HoldAout( input_resource_t *p_resource )
+audio_output_t *input_resource_HoldAout( input_resource_t *p_resource )
 {
     return HoldAout( p_resource );
 }