*****************************************************************************/
static void vlm_Destructor( vlm_t *p_vlm );
-static int Manage( vlc_object_t * );
+static void* Manage( void * );
static int vlm_MediaVodControl( void *, vod_media_t *, const char *, int, va_list );
/*****************************************************************************
p_vlm = *pp_vlm;
if( p_vlm )
{ /* VLM already exists */
- vlc_object_yield( p_vlm );
+ vlc_object_hold( p_vlm );
vlc_mutex_unlock( lockval.p_address );
return p_vlm;
}
p_vlm->p_vod = NULL;
vlc_object_attach( p_vlm, p_this->p_libvlc );
- if( vlc_thread_create( p_vlm, "vlm thread",
- Manage, VLC_THREAD_PRIORITY_LOW, false ) )
+ if( vlc_clone( &p_vlm->thread, Manage, p_vlm, VLC_THREAD_PRIORITY_LOW ) )
{
vlc_mutex_destroy( &p_vlm->lock );
vlc_object_release( p_vlm );
char *psz_buffer = NULL;
msg_Dbg( p_this, "loading VLM configuration" );
- if( asprintf(&psz_buffer, "load %s", psz_vlmconf ) == -1 )
- psz_buffer = NULL;
- if( psz_buffer )
+ if( asprintf(&psz_buffer, "load %s", psz_vlmconf ) != -1 )
{
- msg_Dbg( p_this, psz_buffer );
+ msg_Dbg( p_this, "%s", psz_buffer );
if( vlm_ExecuteCommand( p_vlm, psz_buffer, &p_message ) )
msg_Warn( p_this, "error while loading the configuration file" );
- vlm_MessageDelete(p_message);
- free(psz_buffer);
+ vlm_MessageDelete( p_message );
+ free( psz_buffer );
}
}
- free(psz_vlmconf);
+ free( psz_vlmconf );
vlc_object_set_destructor( p_vlm, (vlc_destructor_t)vlm_Destructor );
*pp_vlm = p_vlm; /* for future reference */
vlm_ControlInternal( p_vlm, VLM_CLEAR_SCHEDULES );
TAB_CLEAN( p_vlm->schedule, p_vlm->schedule );
+ vlc_object_kill( p_vlm );
+ /*vlc_cancel( p_vlm->thread ); */
+ vlc_join( p_vlm->thread, NULL );
vlc_mutex_destroy( &p_vlm->lock );
}
int64_t vlm_Date(void)
{
-#ifdef WIN32
+#if defined (WIN32) && !defined (UNDER_CE)
struct timeb tm;
ftime( &tm );
return ((int64_t)tm.time) * 1000000 + ((int64_t)tm.millitm) * 1000;
/*****************************************************************************
* Manage:
*****************************************************************************/
-static int Manage( vlc_object_t* p_object )
+static void* Manage( void* p_object )
{
vlm_t *vlm = (vlm_t*)p_object;
int i, j;
mtime_t i_lastcheck;
mtime_t i_time;
+ int canc = vlc_savecancel ();
i_lastcheck = vlm_Date();
while( !vlm->b_die )
msleep( 100000 );
}
- return VLC_SUCCESS;
+ vlc_restorecancel (canc);
+ return NULL;
}
/* New API
int i;
vlc_gc_decref( p_media->vod.p_item );
- p_media->vod.p_item = input_ItemNew( p_vlm, p_cfg->ppsz_input[0],
+ p_media->vod.p_item = input_item_New( p_vlm, p_cfg->ppsz_input[0],
p_cfg->psz_name );
if( p_cfg->psz_output )
else
psz_output = strdup( "#description" );
- if( psz_output && asprintf( &psz_dup, "sout=%s", psz_output) != -1 )
+ if( psz_output && asprintf( &psz_dup, "sout=%s", psz_output ) != -1 )
{
- input_ItemAddOption( p_media->vod.p_item, psz_dup );
- free( psz_output );
+ input_item_AddOption( p_media->vod.p_item, psz_dup );
free( psz_dup );
}
+ free( psz_output );
+
for( i = 0; i < p_cfg->i_option; i++ )
- input_ItemAddOption( p_media->vod.p_item,
- p_cfg->ppsz_option[i] );
+ input_item_AddOption( p_media->vod.p_item,
+ p_cfg->ppsz_option[i] );
- asprintf( &psz_header, _("Media: %s"), p_cfg->psz_name );
+ if( asprintf( &psz_header, _("Media: %s"), p_cfg->psz_name ) == -1 )
+ psz_header = NULL;
if( (p_input = input_CreateThreadExtended( p_vlm, p_media->vod.p_item, psz_header, NULL ) ) )
{
msleep( 100000 );
input_StopThread( p_input );
+ vlc_thread_join( p_input );
vlc_object_release( p_input );
}
free( psz_header );
p_vlm->p_vod = vlc_custom_create( VLC_OBJECT(p_vlm), sizeof( vod_t ),
VLC_OBJECT_GENERIC, "vod server" );
vlc_object_attach( p_vlm->p_vod, p_vlm );
- p_vlm->p_vod->p_module = module_Need( p_vlm->p_vod, "vod server", 0, 0 );
+ p_vlm->p_vod->p_module = module_need( p_vlm->p_vod, "vod server", NULL, false );
if( !p_vlm->p_vod->p_module )
{
msg_Err( p_vlm, "cannot find vod server" );
vlc_object_detach( p_vlm->p_vod );
vlc_object_release( p_vlm->p_vod );
- p_vlm->p_vod = 0;
+ p_vlm->p_vod = NULL;
return VLC_EGENERIC;
}
p_vlm->p_vod->pf_media_control = vlm_MediaVodControl;
}
- p_media = malloc( sizeof( vlm_media_sys_t ) );
+ p_media = calloc( 1, sizeof( vlm_media_sys_t ) );
if( !p_media )
return VLC_ENOMEM;
- memset( p_media, 0, sizeof(vlm_media_sys_t) );
if( p_cfg->b_vod )
p_vlm->i_vod++;
p_media->cfg.id = p_vlm->i_id++;
/* FIXME do we do something here if enabled is true ? */
- p_media->vod.p_item = input_ItemNew( p_vlm, NULL, NULL );
+ p_media->vod.p_item = input_item_New( p_vlm, NULL, NULL );
p_media->vod.p_media = NULL;
TAB_INIT( p_media->i_instance, p_media->instance );
/* Check if we need to unload the VOD server */
if( p_vlm->p_vod && p_vlm->i_vod <= 0 )
{
- module_Unneed( p_vlm->p_vod, p_vlm->p_vod->p_module );
+ module_unneed( p_vlm->p_vod, p_vlm->p_vod->p_module );
vlc_object_detach( p_vlm->p_vod );
vlc_object_release( p_vlm->p_vod );
p_vlm->p_vod = NULL;
}
static vlm_media_instance_sys_t *vlm_MediaInstanceNew( vlm_t *p_vlm, const char *psz_name )
{
- vlm_media_instance_sys_t *p_instance = malloc( sizeof(vlm_media_instance_sys_t) );
+ vlm_media_instance_sys_t *p_instance = calloc( 1, sizeof(vlm_media_instance_sys_t) );
if( !p_instance )
return NULL;
- memset( p_instance, 0, sizeof(vlm_media_instance_sys_t) );
-
p_instance->psz_name = NULL;
if( psz_name )
p_instance->psz_name = strdup( psz_name );
- p_instance->p_item = input_ItemNew( p_vlm, NULL, NULL );
+ p_instance->p_item = input_item_New( p_vlm, NULL, NULL );
p_instance->i_index = 0;
p_instance->b_sout_keep = false;
}
static void vlm_MediaInstanceDelete( vlm_media_instance_sys_t *p_instance )
{
- if( p_instance->p_input )
+ input_thread_t *p_input = p_instance->p_input;
+ if( p_input )
{
- input_StopThread( p_instance->p_input );
- p_instance->p_sout = input_DetachSout( p_instance->p_input );
- vlc_object_release( p_instance->p_input );
+ input_StopThread( p_input );
+ vlc_thread_join( p_input );
+ p_instance->p_sout = input_DetachSout( p_input );
+ vlc_object_release( p_input );
}
if( p_instance->p_sout )
sout_DeleteInstance( p_instance->p_sout );
if( p_cfg->psz_output != NULL || psz_vod_output != NULL )
{
char *psz_buffer;
- asprintf( &psz_buffer, "sout=%s%s%s",
+ if( asprintf( &psz_buffer, "sout=%s%s%s",
p_cfg->psz_output ? p_cfg->psz_output : "",
(p_cfg->psz_output && psz_vod_output) ? ":" : psz_vod_output ? "#" : "",
- psz_vod_output ? psz_vod_output : "" );
- input_ItemAddOption( p_instance->p_item, psz_buffer );
- free( psz_buffer );
+ psz_vod_output ? psz_vod_output : "" ) != -1 )
+ {
+ input_item_AddOption( p_instance->p_item, psz_buffer );
+ free( psz_buffer );
+ }
}
for( i = 0; i < p_cfg->i_option; i++ )
else if( !strcmp( p_cfg->ppsz_option[i], "nosout-keep" ) || !strcmp( p_cfg->ppsz_option[i], "no-sout-keep" ) )
p_instance->b_sout_keep = false;
else
- input_ItemAddOption( p_instance->p_item, p_cfg->ppsz_option[i] );
+ input_item_AddOption( p_instance->p_item, p_cfg->ppsz_option[i] );
}
TAB_APPEND( p_media->i_instance, p_media->instance, p_instance );
}
/* Stop old instance */
- if( p_instance->p_input )
+ input_thread_t *p_input = p_instance->p_input;
+ if( p_input )
{
if( p_instance->i_index == i_input_index &&
- !p_instance->p_input->b_eof && !p_instance->p_input->b_error )
+ !p_input->b_eof && !p_input->b_error )
{
- if( var_GetInteger( p_instance->p_input, "state" ) == PAUSE_S )
- var_SetInteger( p_instance->p_input, "state", PLAYING_S );
+ if( var_GetInteger( p_input, "state" ) == PAUSE_S )
+ var_SetInteger( p_input, "state", PLAYING_S );
return VLC_SUCCESS;
}
- input_StopThread( p_instance->p_input );
- p_instance->p_sout = input_DetachSout( p_instance->p_input );
- vlc_object_release( p_instance->p_input );
+ input_StopThread( p_input );
+ vlc_thread_join( p_input );
+ p_instance->p_sout = input_DetachSout( p_input );
+ vlc_object_release( p_input );
if( !p_instance->b_sout_keep && p_instance->p_sout )
{
sout_DeleteInstance( p_instance->p_sout );
p_instance->i_index = i_input_index;
input_item_SetURI( p_instance->p_item, p_media->cfg.ppsz_input[p_instance->i_index] ) ;
- asprintf( &psz_log, _("Media: %s"), p_media->cfg.psz_name );
- p_instance->p_input = input_CreateThreadExtended( p_vlm, p_instance->p_item, psz_log, p_instance->p_sout );
- if( !p_instance->p_input )
+ if( asprintf( &psz_log, _("Media: %s"), p_media->cfg.psz_name ) != -1 )
{
- TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance );
- vlm_MediaInstanceDelete( p_instance );
+ p_instance->p_input = input_CreateThreadExtended( p_vlm, p_instance->p_item, psz_log, p_instance->p_sout );
+ if( !p_instance->p_input )
+ {
+ TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance );
+ vlm_MediaInstanceDelete( p_instance );
+ }
+ free( psz_log );
}
- free( psz_log );
return VLC_SUCCESS;
}
return i_result;
}
+