X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Finput.c;h=627ec926a7efb515e02a9610b0dd8db17ced7d01;hb=e5fc0bfd325a887982dbb83a65b00ca129c1c590;hp=a76e10bfd731daf075c2154f7d4c672a018aa481;hpb=472aec28c6f5a147aacc3e16dd15640c94789586;p=vlc diff --git a/src/audio_output/input.c b/src/audio_output/input.c index a76e10bfd7..627ec926a7 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -83,8 +83,8 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ p_input->i_nb_resamplers = p_input->i_nb_filters = 0; /* Prepare FIFO. */ - aout_FifoInit( p_aout, &p_input->fifo, p_aout->mixer.mixer.i_rate ); - p_input->p_first_byte_to_mix = NULL; + aout_FifoInit( p_aout, &p_input->mixer.fifo, p_aout->p_mixer->fmt.i_rate ); + p_input->mixer.begin = NULL; /* */ if( p_request_vout ) @@ -98,10 +98,8 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ } /* Prepare format structure */ - memcpy( &chain_input_format, &p_input->input, - sizeof(audio_sample_format_t) ); - memcpy( &chain_output_format, &p_aout->mixer.mixer, - sizeof(audio_sample_format_t) ); + chain_input_format = p_input->input; + chain_output_format = p_aout->p_mixer->fmt; chain_output_format.i_rate = p_input->input.i_rate; aout_FormatPrepare( &chain_output_format ); @@ -247,9 +245,11 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ p_input->b_recycle_vout = psz_visual && *psz_visual; /* parse user filter lists */ + char *const ppsz_array[] = { psz_scaletempo, psz_filters, psz_visual }; + p_input->p_playback_rate_filter = NULL; + for( i_visual = 0; i_visual < 3 && !AOUT_FMT_NON_LINEAR(&chain_output_format); i_visual++ ) { - char *ppsz_array[] = { psz_scaletempo, psz_filters, psz_visual }; char *psz_next = NULL; char *psz_parser = ppsz_array[i_visual]; @@ -291,6 +291,7 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ continue; } + vlc_object_set_name( p_filter, psz_parser ); vlc_object_attach( p_filter , p_aout ); p_filter->request_vout.pf_request_vout = RequestVoutFromFilter; @@ -300,26 +301,21 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ p_filter->p_owner->p_aout = p_aout; p_filter->p_owner->p_input = p_input; + /* request format */ + memcpy( &p_filter->input, &chain_output_format, + sizeof(audio_sample_format_t) ); + memcpy( &p_filter->output, &chain_output_format, + sizeof(audio_sample_format_t) ); + + /* try to find the requested filter */ if( i_visual == 2 ) /* this can only be a visualization module */ { - /* request format */ - memcpy( &p_filter->input, &chain_output_format, - sizeof(audio_sample_format_t) ); - memcpy( &p_filter->output, &chain_output_format, - sizeof(audio_sample_format_t) ); - p_filter->p_module = module_need( p_filter, "visualization", psz_parser, true ); } else /* this can be a audio filter module as well as a visualization module */ { - /* request format */ - memcpy( &p_filter->input, &chain_input_format, - sizeof(audio_sample_format_t) ); - memcpy( &p_filter->output, &chain_output_format, - sizeof(audio_sample_format_t) ); - p_filter->p_module = module_need( p_filter, "audio filter", psz_parser, true ); @@ -392,6 +388,9 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ memcpy( &chain_input_format, &p_filter->output, sizeof( audio_sample_format_t ) ); + if( i_visual == 0 ) /* scaletempo */ + p_input->p_playback_rate_filter = p_filter; + /* next filter if any */ psz_parser = psz_next; } @@ -418,12 +417,12 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ p_input->input_alloc.i_bytes_per_sec = -1; /* Create resamplers. */ - if ( !AOUT_FMT_NON_LINEAR( &p_aout->mixer.mixer ) ) + if ( !AOUT_FMT_NON_LINEAR( &p_aout->p_mixer->fmt ) ) { chain_output_format.i_rate = (__MAX(p_input->input.i_rate, - p_aout->mixer.mixer.i_rate) + p_aout->p_mixer->fmt.i_rate) * (100 + AOUT_MAX_RESAMPLING)) / 100; - if ( chain_output_format.i_rate == p_aout->mixer.mixer.i_rate ) + if ( chain_output_format.i_rate == p_aout->p_mixer->fmt.i_rate ) { /* Just in case... */ chain_output_format.i_rate++; @@ -431,7 +430,7 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_resamplers, &p_input->i_nb_resamplers, &chain_output_format, - &p_aout->mixer.mixer ) < 0 ) + &p_aout->p_mixer->fmt ) < 0 ) { inputFailure( p_aout, p_input, "couldn't set a resampler pipeline"); return -1; @@ -447,16 +446,6 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_ } p_input->i_resampling_type = AOUT_RESAMPLING_NONE; - p_input->p_playback_rate_filter = NULL; - for( int i = 0; i < p_input->i_nb_filters; i++ ) - { - aout_filter_t *p_filter = p_input->pp_filters[i]; - if( strcmp( "scaletempo", p_filter->psz_object_name ) == 0 ) - { - p_input->p_playback_rate_filter = p_filter; - break; - } - } if( ! p_input->p_playback_rate_filter && p_input->i_nb_resamplers > 0 ) { p_input->p_playback_rate_filter = p_input->pp_resamplers[0]; @@ -509,7 +498,7 @@ int aout_InputDelete( aout_instance_t * p_aout, aout_input_t * p_input ) aout_FiltersDestroyPipeline( p_aout, p_input->pp_resamplers, p_input->i_nb_resamplers ); p_input->i_nb_resamplers = 0; - aout_FifoDestroy( p_aout, &p_input->fifo ); + aout_FifoDestroy( p_aout, &p_input->mixer.fifo ); return 0; } @@ -539,18 +528,18 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, /* A little trick to avoid loosing our input fifo and properties */ - p_first_byte_to_mix = p_input->p_first_byte_to_mix; - fifo = p_input->fifo; + p_first_byte_to_mix = p_input->mixer.begin; + fifo = p_input->mixer.fifo; b_paused = p_input->b_paused; i_pause_date = p_input->i_pause_date; - aout_FifoInit( p_aout, &p_input->fifo, p_aout->mixer.mixer.i_rate ); + aout_FifoInit( p_aout, &p_input->mixer.fifo, p_aout->p_mixer->fmt.i_rate ); aout_InputDelete( p_aout, p_input ); aout_InputNew( p_aout, p_input, &p_input->request_vout ); - p_input->p_first_byte_to_mix = p_first_byte_to_mix; - p_input->fifo = fifo; + p_input->mixer.begin = p_first_byte_to_mix; + p_input->mixer.fifo = fifo; p_input->b_paused = b_paused; p_input->i_pause_date = i_pause_date; @@ -600,7 +589,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, * this. We'll deal with that when pushing the buffer, and compensate * with the next incoming buffer. */ aout_lock_input_fifos( p_aout ); - start_date = aout_FifoNextStart( p_aout, &p_input->fifo ); + start_date = aout_FifoNextStart( p_aout, &p_input->mixer.fifo ); aout_unlock_input_fifos( p_aout ); if ( start_date != 0 && start_date < mdate() ) @@ -611,8 +600,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, msg_Warn( p_aout, "computed PTS is out of range (%"PRId64"), " "clearing out", mdate() - start_date ); aout_lock_input_fifos( p_aout ); - aout_FifoSet( p_aout, &p_input->fifo, 0 ); - p_input->p_first_byte_to_mix = NULL; + aout_FifoSet( p_aout, &p_input->mixer.fifo, 0 ); + p_input->mixer.begin = NULL; aout_unlock_input_fifos( p_aout ); if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE ) msg_Warn( p_aout, "timing screwed, stopping resampling" ); @@ -641,8 +630,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, msg_Warn( p_aout, "audio drift is too big (%"PRId64"), clearing out", start_date - p_buffer->start_date ); aout_lock_input_fifos( p_aout ); - aout_FifoSet( p_aout, &p_input->fifo, 0 ); - p_input->p_first_byte_to_mix = NULL; + aout_FifoSet( p_aout, &p_input->mixer.fifo, 0 ); + p_input->mixer.begin = NULL; aout_unlock_input_fifos( p_aout ); if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE ) msg_Warn( p_aout, "timing screwed, stopping resampling" ); @@ -769,7 +758,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, p_buffer->start_date = start_date; aout_lock_input_fifos( p_aout ); - aout_FifoPush( p_aout, &p_input->fifo, p_buffer ); + aout_FifoPush( p_aout, &p_input->mixer.fifo, p_buffer ); aout_unlock_input_fifos( p_aout ); return 0; } @@ -789,7 +778,7 @@ static void inputFailure( aout_instance_t * p_aout, aout_input_t * p_input, p_input->i_nb_filters ); aout_FiltersDestroyPipeline( p_aout, p_input->pp_resamplers, p_input->i_nb_resamplers ); - aout_FifoDestroy( p_aout, &p_input->fifo ); + aout_FifoDestroy( p_aout, &p_input->mixer.fifo ); var_Destroy( p_aout, "visual" ); var_Destroy( p_aout, "equalizer" ); var_Destroy( p_aout, "audio-filter" ); @@ -943,7 +932,8 @@ static int ReplayGainCallback( vlc_object_t *p_this, char const *psz_cmd, ReplayGainSelect( p_aout, p_aout->pp_inputs[i] ); /* Restart the mixer (a trivial mixer may be in use) */ - aout_MixerMultiplierSet( p_aout, p_aout->mixer.f_multiplier ); + if( p_aout->p_mixer ) + aout_MixerMultiplierSet( p_aout, p_aout->mixer_multiplier ); aout_unlock_mixer( p_aout ); return VLC_SUCCESS; @@ -957,7 +947,7 @@ static void ReplayGainSelect( aout_instance_t *p_aout, aout_input_t *p_input ) int i_use; float f_gain; - p_input->f_multiplier = 1.0; + p_input->mixer.multiplier = 1.0; if( !psz_replay_gain ) return; @@ -988,14 +978,14 @@ static void ReplayGainSelect( aout_instance_t *p_aout, aout_input_t *p_input ) f_gain = var_GetFloat( p_aout, "audio-replay-gain-default" ); else f_gain = 0.0; - p_input->f_multiplier = pow( 10.0, f_gain / 20.0 ); + p_input->mixer.multiplier = pow( 10.0, f_gain / 20.0 ); /* */ if( p_input->replay_gain.pb_peak[i_use] && var_GetBool( p_aout, "audio-replay-gain-peak-protection" ) && - p_input->replay_gain.pf_peak[i_use] * p_input->f_multiplier > 1.0 ) + p_input->replay_gain.pf_peak[i_use] * p_input->mixer.multiplier > 1.0 ) { - p_input->f_multiplier = 1.0f / p_input->replay_gain.pf_peak[i_use]; + p_input->mixer.multiplier = 1.0f / p_input->replay_gain.pf_peak[i_use]; } free( psz_replay_gain );