static aout_instance_t *AllocateAout( input_resource_t *p_resource ) { aout_instance_t *p_aout; if( unlikely(p_resource->b_aout_busy) ) { msg_Dbg( p_resource->p_parent, "creating 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_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, "recycling audio output" ); p_resource->b_aout_busy = true; vlc_object_hold( p_aout ); return p_aout; }
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 ) { msg_Dbg( p_resource->p_parent, "releasing aout" ); 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 ); 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" ); } if( !p_aout ) return NULL; vlc_object_hold( p_aout ); return p_aout; } }
/* Audio output */ audio_output_t *input_resource_GetAout( input_resource_t *p_resource ) { audio_output_t *p_aout; vlc_mutex_lock( &p_resource->lock_hold ); p_aout = p_resource->p_aout; if( p_aout == NULL || p_resource->b_aout_busy ) { msg_Dbg( p_resource->p_parent, "creating audio output" ); vlc_mutex_unlock( &p_resource->lock_hold ); p_aout = aout_New( p_resource->p_parent ); if( p_aout == NULL ) return NULL; /* failed */ vlc_mutex_lock( &p_resource->lock_hold ); if( p_resource->p_aout == NULL ) p_resource->p_aout = p_aout; } else msg_Dbg( p_resource->p_parent, "reusing audio output" ); if( p_resource->p_aout == p_aout ) { assert( !p_resource->b_aout_busy ); p_resource->b_aout_busy = true; } vlc_mutex_unlock( &p_resource->lock_hold ); return p_aout; }
aout_input_t * __aout_DecNew( vlc_object_t * p_this, aout_instance_t ** pp_aout, audio_sample_format_t * p_format ) { if ( *pp_aout == NULL ) { /* Create an audio output if there is none. */ *pp_aout = vlc_object_find( p_this, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( *pp_aout == NULL ) { msg_Dbg( p_this, "no aout present, spawning one" ); *pp_aout = aout_New( p_this ); /* Everything failed, I'm a loser, I just wanna die */ if( *pp_aout == NULL ) { return NULL; } vlc_object_attach( *pp_aout, p_this->p_vlc ); } else { vlc_object_release( *pp_aout ); } } return DecNew( p_this, *pp_aout, p_format ); }