/* 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;
};
/* */
return NULL;
}
- assert( p_resource->p_input );
assert( !p_sout || ( !p_resource->p_sout && !psz_sout ) );
/* Check the validity of the sout */
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 ? */
return NULL;
}
- assert( p_resource->p_input );
if( p_fmt )
{
/* */
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 );
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 )
}
/* */
-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 );
}