/***************************************************************************** * Close: close the plugin *****************************************************************************/ static void Close( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys = p_filter->p_sys; /* Stop Goom Thread */ vlc_mutex_lock( &p_sys->p_thread->lock ); p_sys->p_thread->b_exit = true; vlc_cond_signal( &p_sys->p_thread->wait ); vlc_mutex_unlock( &p_sys->p_thread->lock ); vlc_join( p_sys->p_thread->thread, NULL ); /* Free data */ aout_filter_RequestVout( p_filter, p_sys->p_thread->p_vout, NULL ); vlc_mutex_destroy( &p_sys->p_thread->lock ); vlc_cond_destroy( &p_sys->p_thread->wait ); while( p_sys->p_thread->i_blocks-- ) { block_Release( p_sys->p_thread->pp_blocks[p_sys->p_thread->i_blocks] ); } free( p_sys->p_thread ); free( p_sys ); }
/***************************************************************************** * Close: close the plugin *****************************************************************************/ static void Close( vlc_object_t *p_this ) { filter_t * p_filter = (filter_t *)p_this; filter_sys_t *p_sys = p_filter->p_sys; int i; if( p_filter->p_sys->p_vout ) { aout_filter_RequestVout( p_filter, p_filter->p_sys->p_vout, 0 ); } /* Free the list */ for( i = 0; i < p_sys->i_effect; i++ ) { #define p_effect p_sys->effect[i] if( !strncmp( p_effect->psz_name, "spectrum", strlen( "spectrum" ) ) ) { spectrum_data *p_data = p_effect->p_data; free( p_data->peaks ); free( p_data->prev_heights ); free( p_data->p_prev_s16_buff ); } if( !strncmp( p_effect->psz_name, "spectrometer", strlen( "spectrometer" ) ) ) { spectrometer_data *p_data = p_effect->p_data; free( p_data->peaks ); free( p_data->p_prev_s16_buff ); } free( p_effect->p_data ); free( p_effect->psz_args ); free( p_effect ); #undef p_effect } free( p_sys->effect ); free( p_filter->p_sys ); }
/***************************************************************************** * Open: open a scope effect plugin *****************************************************************************/ static int Open( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; goom_thread_t *p_thread; video_format_t fmt; /* Allocate structure */ p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); /* Create goom thread */ p_sys->p_thread = p_thread = calloc( 1, sizeof(*p_thread) ); const int width = p_thread->i_width = var_InheritInteger( p_filter, "goom-width" ); const int height = p_thread->i_height = var_InheritInteger( p_filter, "goom-height" ); memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_width = fmt.i_visible_width = width; fmt.i_height = fmt.i_visible_height = height; fmt.i_chroma = VLC_CODEC_RGB32; fmt.i_sar_num = fmt.i_sar_den = 1; p_thread->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt ); if( p_thread->p_vout == NULL ) { msg_Err( p_filter, "no suitable vout module" ); free( p_thread ); free( p_sys ); return VLC_EGENERIC; } p_thread->i_speed = MAX_SPEED - var_InheritInteger( p_filter, "goom-speed" ); if( p_thread->i_speed < 0 ) p_thread->i_speed = 0; vlc_mutex_init( &p_thread->lock ); vlc_cond_init( &p_thread->wait ); p_thread->i_blocks = 0; date_Init( &p_thread->date, p_filter->fmt_in.audio.i_rate, 1 ); date_Set( &p_thread->date, 0 ); p_thread->i_channels = aout_FormatNbChannels( &p_filter->fmt_in.audio ); if( vlc_clone( &p_thread->thread, Thread, p_thread, VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_filter, "cannot lauch goom thread" ); vlc_mutex_destroy( &p_thread->lock ); vlc_cond_destroy( &p_thread->wait ); aout_filter_RequestVout( p_filter, p_thread->p_vout, NULL ); free( p_thread ); free( p_sys ); return VLC_EGENERIC; } p_filter->fmt_in.audio.i_format = VLC_CODEC_FL32; p_filter->fmt_out.audio = p_filter->fmt_in.audio; p_filter->pf_audio_filter = DoWork; return VLC_SUCCESS; }
/***************************************************************************** * Open: open the visualizer *****************************************************************************/ static int Open( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; char *psz_effects, *psz_parser; video_format_t fmt; if( ( p_filter->fmt_in.audio.i_format != VLC_CODEC_FL32 && p_filter->fmt_in.audio.i_format != VLC_CODEC_FI32 ) ) { return VLC_EGENERIC; } p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); if( p_sys == NULL ) return VLC_EGENERIC; p_sys->i_height = var_InheritInteger( p_filter , "effect-height"); p_sys->i_width = var_InheritInteger( p_filter , "effect-width"); if( p_sys->i_height < 400 ) p_sys->i_height = 400; if( p_sys->i_width < 532 ) p_sys->i_width = 532; if( (p_sys->i_height % 2 ) != 0 ) p_sys->i_height--; if( (p_sys->i_width % 2 ) != 0 ) p_sys->i_width--; p_sys->i_effect = 0; p_sys->effect = NULL; /* Parse the effect list */ psz_parser = psz_effects = var_CreateGetString( p_filter, "effect-list" ); var_AddCallback( p_filter, "effect-list", FilterCallback, NULL ); while( psz_parser && *psz_parser != '\0' ) { visual_effect_t *p_effect; int i; p_effect = malloc( sizeof( visual_effect_t ) ); if( !p_effect ) break; p_effect->i_width = p_sys->i_width; p_effect->i_height= p_sys->i_height; p_effect->i_nb_chans = aout_FormatNbChannels( &p_filter->fmt_in.audio); p_effect->i_idx_left = 0; p_effect->i_idx_right = __MIN( 1, p_effect->i_nb_chans-1 ); p_effect->psz_args = NULL; p_effect->p_data = NULL; p_effect->pf_run = NULL; p_effect->psz_name = NULL; for( i = 0; pf_effect_run[i].psz_name != NULL; i++ ) { if( !strncasecmp( psz_parser, pf_effect_run[i].psz_name, strlen( pf_effect_run[i].psz_name ) ) ) { p_effect->pf_run = pf_effect_run[i].pf_run; p_effect->psz_name = pf_effect_run[i].psz_name; break; } } if( p_effect->psz_name ) { psz_parser += strlen( p_effect->psz_name ); if( *psz_parser == '{' ) { char *psz_eoa; psz_parser++; if( ( psz_eoa = strchr( psz_parser, '}') ) == NULL ) { msg_Err( p_filter, "unable to parse effect list. Aborting"); free( p_effect ); break; } p_effect->psz_args = strndup( psz_parser, psz_eoa - psz_parser); } TAB_APPEND( p_sys->i_effect, p_sys->effect, p_effect ); } else { msg_Err( p_filter, "unknown visual effect: %s", psz_parser ); free( p_effect ); } if( strchr( psz_parser, ',' ) ) { psz_parser = strchr( psz_parser, ',' ) + 1; } else if( strchr( psz_parser, ':' ) ) { psz_parser = strchr( psz_parser, ':' ) + 1; } else { break; } } free( psz_effects ); if( !p_sys->i_effect ) { msg_Err( p_filter, "no effects found" ); free( p_sys ); return VLC_EGENERIC; } /* Open the video output */ memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_width = fmt.i_visible_width = p_sys->i_width; fmt.i_height = fmt.i_visible_height = p_sys->i_height; fmt.i_chroma = VLC_CODEC_I420; fmt.i_sar_num = fmt.i_sar_den = 1; p_sys->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt ); if( p_sys->p_vout == NULL ) { msg_Err( p_filter, "no suitable vout module" ); for( int i = 0; i < p_sys->i_effect; i++ ) { free( p_sys->effect[i]->psz_args ); free( p_sys->effect[i] ); } free( p_sys->effect ); free( p_sys ); return VLC_EGENERIC; } p_filter->pf_audio_filter = DoWork; return VLC_SUCCESS; }
/***************************************************************************** * Open: open a scope effect plugin *****************************************************************************/ static int Open( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; goom_thread_t *p_thread; int width, height; video_format_t fmt; if( p_filter->fmt_in.audio.i_format != VLC_CODEC_FL32 || p_filter->fmt_out.audio.i_format != VLC_CODEC_FL32 ) { msg_Warn( p_filter, "bad input or output format" ); return VLC_EGENERIC; } if( !AOUT_FMTS_SIMILAR( &p_filter->fmt_in.audio, &p_filter->fmt_out.audio ) ) { msg_Warn( p_filter, "input and output formats are not similar" ); return VLC_EGENERIC; } p_filter->pf_audio_filter = DoWork; /* Allocate structure */ p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); /* Create goom thread */ p_sys->p_thread = p_thread = vlc_object_create( p_filter, sizeof( goom_thread_t ) ); vlc_object_attach( p_thread, p_this ); width = var_CreateGetInteger( p_thread, "goom-width" ); height = var_CreateGetInteger( p_thread, "goom-height" ); memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_width = fmt.i_visible_width = width; fmt.i_height = fmt.i_visible_height = height; fmt.i_chroma = VLC_CODEC_RGB32; fmt.i_sar_num = fmt.i_sar_den = 1; p_thread->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt ); if( p_thread->p_vout == NULL ) { msg_Err( p_filter, "no suitable vout module" ); vlc_object_release( p_thread ); free( p_sys ); return VLC_EGENERIC; } vlc_mutex_init( &p_thread->lock ); vlc_cond_init( &p_thread->wait ); p_thread->i_blocks = 0; date_Init( &p_thread->date, p_filter->fmt_out.audio.i_rate, 1 ); date_Set( &p_thread->date, 0 ); p_thread->i_channels = aout_FormatNbChannels( &p_filter->fmt_in.audio ); p_thread->psz_title = TitleGet( VLC_OBJECT( p_filter ) ); if( vlc_thread_create( p_thread, Thread, VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_filter, "cannot lauch goom thread" ); vlc_object_release( p_thread->p_vout ); vlc_mutex_destroy( &p_thread->lock ); vlc_cond_destroy( &p_thread->wait ); free( p_thread->psz_title ); vlc_object_release( p_thread ); free( p_sys ); return VLC_EGENERIC; } return VLC_SUCCESS; }