Commit 3dcdd8d7 authored by Gildas Bazin's avatar Gildas Bazin

* src/input/control.c: INPUT_ADD/DEL_BOOKMARK also modifies the "bookmarks"...

* src/input/control.c: INPUT_ADD/DEL_BOOKMARK also modifies the "bookmarks" input option so the bookmarks are kept even when the input is stopped.
parent d93ca7c4
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*****************************************************************************/ *****************************************************************************/
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#include <vlc/vlc.h> #include <vlc/vlc.h>
#include <vlc/input.h> #include <vlc/input.h>
...@@ -38,6 +39,8 @@ struct input_thread_sys_t ...@@ -38,6 +39,8 @@ struct input_thread_sys_t
int64_t i_stop_time; int64_t i_stop_time;
}; };
static void UpdateBookmarksOption( input_thread_t * );
/**************************************************************************** /****************************************************************************
* input_Control * input_Control
****************************************************************************/ ****************************************************************************/
...@@ -77,12 +80,34 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -77,12 +80,34 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
psz_value = (char *)va_arg( args, char * ); psz_value = (char *)va_arg( args, char * );
i_ret = VLC_EGENERIC; i_ret = VLC_EGENERIC;
vlc_mutex_lock( &p_input->p_item->lock ); vlc_mutex_lock( &p_input->p_item->lock );
vlc_mutex_unlock( &p_input->p_item->lock ); /* Check if option already exists */
for( i = 0; i < p_input->p_item->i_options; i++ )
{
if( !strncmp( p_input->p_item->ppsz_options[i], psz_option,
strlen( psz_option ) ) &&
p_input->p_item->ppsz_options[i][strlen(psz_option)]
== '=' )
{
free( p_input->p_item->ppsz_options[i] );
break;
}
}
if( i == p_input->p_item->i_options )
{
p_input->p_item->i_options++;
p_input->p_item->ppsz_options =
realloc( p_input->p_item->ppsz_options,
p_input->p_item->i_options * sizeof(char **) );
}
asprintf( &p_input->p_item->ppsz_options[i],
"%s=%s", psz_option, psz_value ) ;
vlc_mutex_unlock( &p_input->p_item->lock );
i_ret = VLC_SUCCESS; i_ret = VLC_SUCCESS;
break; break;
} }
case INPUT_SET_NAME: case INPUT_SET_NAME:
{ {
...@@ -112,38 +137,38 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -112,38 +137,38 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
} }
case INPUT_ADD_INFO: case INPUT_ADD_INFO:
{ {
char *psz_cat = (char *)va_arg( args, char * ); char *psz_cat = (char *)va_arg( args, char * );
char *psz_name = (char *)va_arg( args, char * ); char *psz_name = (char *)va_arg( args, char * );
char *psz_format = (char *)va_arg( args, char * ); char *psz_format = (char *)va_arg( args, char * );
info_category_t *p_cat; info_category_t *p_cat;
info_t *p_info; info_t *p_info;
int i; int i;
i_ret = VLC_EGENERIC; i_ret = VLC_EGENERIC;
vlc_mutex_lock( &p_input->p_item->lock ); vlc_mutex_lock( &p_input->p_item->lock );
for( i = 0; i < p_input->p_item->i_categories; i++ ) for( i = 0; i < p_input->p_item->i_categories; i++ )
{ {
if( !strcmp( p_input->p_item->pp_categories[i]->psz_name, if( !strcmp( p_input->p_item->pp_categories[i]->psz_name,
psz_cat ) ) psz_cat ) )
break; break;
} }
if( i == p_input->p_item->i_categories ) if( i == p_input->p_item->i_categories )
{ {
p_cat = malloc( sizeof( info_category_t ) ); p_cat = malloc( sizeof( info_category_t ) );
if( !p_cat ) break; if( !p_cat ) break;
p_cat->psz_name = strdup( psz_cat ); p_cat->psz_name = strdup( psz_cat );
p_cat->i_infos = 0; p_cat->i_infos = 0;
p_cat->pp_infos = NULL; p_cat->pp_infos = NULL;
INSERT_ELEM( p_input->p_item->pp_categories, INSERT_ELEM( p_input->p_item->pp_categories,
p_input->p_item->i_categories, p_input->p_item->i_categories,
p_input->p_item->i_categories, p_cat ); p_input->p_item->i_categories, p_cat );
} }
p_cat = p_input->p_item->pp_categories[i]; p_cat = p_input->p_item->pp_categories[i];
for( i = 0; i < p_cat->i_infos; i++ ) for( i = 0; i < p_cat->i_infos; i++ )
{ {
...@@ -155,21 +180,21 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -155,21 +180,21 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
} }
} }
if( i == p_cat->i_infos ) if( i == p_cat->i_infos )
{ {
p_info = malloc( sizeof( info_t ) ); p_info = malloc( sizeof( info_t ) );
if( !p_info ) break; if( !p_info ) break;
INSERT_ELEM( p_cat->pp_infos, p_cat->i_infos, INSERT_ELEM( p_cat->pp_infos, p_cat->i_infos,
p_cat->i_infos, p_info ); p_cat->i_infos, p_info );
p_info->psz_name = strdup( psz_name ); p_info->psz_name = strdup( psz_name );
} }
p_info = p_cat->pp_infos[i]; p_info = p_cat->pp_infos[i];
vasprintf( &p_info->psz_value, psz_format, args ); vasprintf( &p_info->psz_value, psz_format, args );
vlc_mutex_unlock( &p_input->p_item->lock ); vlc_mutex_unlock( &p_input->p_item->lock );
i_ret = VLC_SUCCESS; i_ret = VLC_SUCCESS;
/* Notify playlist */ /* Notify playlist */
{ {
...@@ -184,8 +209,8 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -184,8 +209,8 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
} }
} }
break; break;
case INPUT_ADD_BOOKMARK: case INPUT_ADD_BOOKMARK:
p_bkmk = (seekpoint_t *)va_arg( args, seekpoint_t * ); p_bkmk = (seekpoint_t *)va_arg( args, seekpoint_t * );
...@@ -210,6 +235,8 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -210,6 +235,8 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
} }
} }
UpdateBookmarksOption( p_input );
i_ret = VLC_SUCCESS; i_ret = VLC_SUCCESS;
break; break;
...@@ -232,6 +259,9 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -232,6 +259,9 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE, var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE,
&val, &text ); &val, &text );
} }
UpdateBookmarksOption( p_input );
i_ret = VLC_SUCCESS; i_ret = VLC_SUCCESS;
} }
else i_ret = VLC_EGENERIC; else i_ret = VLC_EGENERIC;
...@@ -276,6 +306,9 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -276,6 +306,9 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
} }
var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 ); var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );
} }
UpdateBookmarksOption( p_input );
i_ret = VLC_SUCCESS; i_ret = VLC_SUCCESS;
break; break;
...@@ -361,3 +394,40 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args ) ...@@ -361,3 +394,40 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
return i_ret; return i_ret;
} }
static void UpdateBookmarksOption( input_thread_t *p_input )
{
int i, i_len = 0;
char *psz_value = NULL, *psz_next = NULL;
vlc_mutex_unlock( &p_input->stream.stream_lock );
for( i = 0; i < p_input->i_bookmarks; i++ )
{
asprintf( &psz_value, "{name=%s,bytes="I64Fd",time="I64Fd"}",
p_input->pp_bookmarks[i]->psz_name,
p_input->pp_bookmarks[i]->i_byte_offset,
p_input->pp_bookmarks[i]->i_time_offset/1000000 );
i_len += strlen( psz_value );
free( psz_value );
}
for( i = 0; i < p_input->i_bookmarks; i++ )
{
if( !i ) psz_value = psz_next = malloc( i_len + p_input->i_bookmarks );
sprintf( psz_next, "{name=%s,bytes="I64Fd",time="I64Fd"}",
p_input->pp_bookmarks[i]->psz_name,
p_input->pp_bookmarks[i]->i_byte_offset,
p_input->pp_bookmarks[i]->i_time_offset/1000000 );
psz_next += strlen( psz_next );
if( i < p_input->i_bookmarks - 1)
{
*psz_next = ','; psz_next++;
}
}
input_Control( p_input, INPUT_ADD_OPTION, "bookmarks",
psz_value ? psz_value : "" );
vlc_mutex_lock( &p_input->stream.stream_lock );
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment