# include "config.h"
#endif
+#include <assert.h>
+
#include <vlc_common.h>
#include <stdio.h>
#include <vlc_input.h>
#include <vlc_vout.h> /* for vout_Request */
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#endif
#include <vlc_aout.h>
#include <libvlc.h>
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->mixer_format.i_rate );
+ p_input->mixer.begin = NULL;
/* */
if( p_request_vout )
}
/* 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->mixer_format;
chain_output_format.i_rate = p_input->input.i_rate;
aout_FormatPrepare( &chain_output_format );
var_Change( p_aout, "visual", VLC_VAR_ADDCHOICE, &val, &text );
}
- /* Look for galaktos plugin */
- if( module_exists( "galaktos" ) )
- {
- val.psz_string = (char*)"galaktos"; text.psz_string = (char*)"GaLaktos";
- var_Change( p_aout, "visual", VLC_VAR_ADDCHOICE, &val, &text );
- }
-
/* Look for libprojectM plugin */
if( module_exists( "projectm" ) )
{
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];
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 );
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;
}
}
/* Prepare hints for the buffer allocator. */
- p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP;
+ p_input->input_alloc.b_alloc = true;
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->mixer_format ) )
{
chain_output_format.i_rate = (__MAX(p_input->input.i_rate,
- p_aout->mixer.mixer.i_rate)
+ p_aout->mixer_format.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->mixer_format.i_rate )
{
/* Just in case... */
chain_output_format.i_rate++;
if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_resamplers,
&p_input->i_nb_resamplers,
&chain_output_format,
- &p_aout->mixer.mixer ) < 0 )
+ &p_aout->mixer_format ) < 0 )
{
inputFailure( p_aout, p_input, "couldn't set a resampler pipeline");
return -1;
aout_FiltersHintBuffers( p_aout, p_input->pp_resamplers,
p_input->i_nb_resamplers,
&p_input->input_alloc );
- p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP;
+ p_input->input_alloc.b_alloc = true;
/* Setup the initial rate of the resampler */
p_input->pp_resamplers[0]->input.i_rate = p_input->input.i_rate;
}
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];
- /* FIXME: suspicious access to psz_object_name */
-#warning Is this right?
- if( strcmp( "scaletempo",
- vlc_internals(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];
aout_FiltersHintBuffers( p_aout, p_input->pp_filters,
p_input->i_nb_filters,
&p_input->input_alloc );
- p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP;
+ p_input->input_alloc.b_alloc = true;
/* i_bytes_per_sec is still == -1 if no filters */
p_input->input_alloc.i_bytes_per_sec = __MAX(
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;
}
/* 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->mixer_format.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;
* 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() )
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" );
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" );
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;
}
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" );
{
ChangeFiltersString( p_aout, "audio-visual", "goom", false );
ChangeFiltersString( p_aout, "audio-visual", "visual", false );
- ChangeFiltersString( p_aout, "audio-visual", "galaktos", false );
ChangeFiltersString( p_aout, "audio-visual", "projectm", false );
}
else
{
ChangeFiltersString( p_aout, "audio-visual", "visual", false );
ChangeFiltersString( p_aout, "audio-visual", "goom", true );
- ChangeFiltersString( p_aout, "audio-visual", "galaktos", false );
ChangeFiltersString( p_aout, "audio-visual", "projectm", false );
}
- else if( !strcmp( "galaktos", psz_mode ) )
- {
- ChangeFiltersString( p_aout, "audio-visual", "visual", false );
- ChangeFiltersString( p_aout, "audio-visual", "goom", false );
- ChangeFiltersString( p_aout, "audio-visual", "galaktos", true );
- }
else if( !strcmp( "projectm", psz_mode ) )
{
ChangeFiltersString( p_aout, "audio-visual", "visual", false );
ChangeFiltersString( p_aout, "audio-visual", "goom", false );
- ChangeFiltersString( p_aout, "audio-visual", "galaktos", false );
ChangeFiltersString( p_aout, "audio-visual", "projectm", true );
}
else
ChangeFiltersString( p_aout, "audio-visual", "goom", false );
ChangeFiltersString( p_aout, "audio-visual", "visual", true );
- ChangeFiltersString( p_aout, "audio-visual", "galaktos", false );
ChangeFiltersString( p_aout, "audio-visual", "projectm", false );
}
}
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;
int i_use;
float f_gain;
- p_input->f_multiplier = 1.0;
+ p_input->mixer.multiplier = 1.0;
if( !psz_replay_gain )
return;
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 );