diff --git a/veejay-current/veejay-server/veejay/veejay.c b/veejay-current/veejay-server/veejay/veejay.c index af7faeea..c73f546a 100644 --- a/veejay-current/veejay-server/veejay/veejay.c +++ b/veejay-current/veejay-server/veejay/veejay.c @@ -714,6 +714,7 @@ int main(int argc, char **argv) int sig; + while (veejay_get_state(info) != LAVPLAY_STATE_STOP) { usleep( 25000 ); diff --git a/veejay-current/veejay-server/veejay/vims.h b/veejay-current/veejay-server/veejay/vims.h index ac5bb4eb..5ce64a15 100644 --- a/veejay-current/veejay-server/veejay/vims.h +++ b/veejay-current/veejay-server/veejay/vims.h @@ -61,6 +61,7 @@ enum { VIMS_TRACK_LIST = 5, VIMS_SEQUENCE_LIST = 419, VIMS_KEYLIST = 420, + VIMS_WORKINGDIR = 421, VIMS_SET_VOLUME = 300, VIMS_FULLSCREEN = 301, VIMS_SUSPEND = 254, diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c index f1edc032..e7019d01 100644 --- a/veejay-current/veejay-server/veejay/vj-event.c +++ b/veejay-current/veejay-server/veejay/vj-event.c @@ -8153,6 +8153,47 @@ void vj_event_toggle_bw( void *ptr, const char format[], va_list ap ) use_bw_preview_ = 1; } +void vj_event_send_working_dir(void *ptr, const char format[], va_list ap) +{ + veejay_t *v = (veejay_t*)ptr; + int args[2]; + char str[2048]; + P_A(args,str,format,ap); + + + filelist_t *list = find_media_files(v); + if(!list) { + veejay_msg(VEEJAY_MSG_ERROR, "No usable files found."); + sprintf(_s_print_buf, "00000000"); + }else { + + int len = 1; + int i; + for( i = 0; i < list->num_files; i ++ ) { + len += ( list->files[i] == NULL ? 0 : strlen( list->files[i] ) ); + } + + int msg_len = (list->num_files*4) + len - 1; + sprintf(_s_print_buf, "%08d", msg_len ); + + int tlen=0; + for( i = 0; i num_files; i ++ ) { + char tmp[1024]; + if(list->files[i]==NULL) + continue; + tlen = strlen(list->files[i]); +#ifdef STRICT_CHECKING + assert( tlen <= sizeof(tmp)); +#endif + snprintf(tmp,sizeof(tmp), "%04d%s",tlen,list->files[i]); + + strcat( _s_print_buf,tmp); + } + SEND_MSG(v,_s_print_buf); + free_media_files(v,list); + } +} + void vj_event_send_sample_list ( void *ptr, const char format[], va_list ap ) { veejay_t *v = (veejay_t*)ptr; diff --git a/veejay-current/veejay-server/veejay/vj-event.h b/veejay-current/veejay-server/veejay/vj-event.h index dfce36d1..488740fa 100644 --- a/veejay-current/veejay-server/veejay/vj-event.h +++ b/veejay-current/veejay-server/veejay/vj-event.h @@ -170,6 +170,7 @@ void vj_event_disable_audio ( void *ptr, const char format[], va_list ap ); void vj_event_print_info ( void *ptr, const char format[], va_list ap ); void vj_event_send_keylist( void *ptr, const char format[], va_list ap ); void vj_event_send_tag_list ( void *ptr, const char format[], va_list ap ); +void vj_event_send_working_dir(void *ptr, const char format[], va_list ap); void vj_event_send_sample_list ( void *ptr, const char format[], va_list ap ); void vj_event_send_log ( void *ptr, const char format[], va_list ap ); void vj_event_send_chain_list ( void *ptr, const char format[], va_list ap ); diff --git a/veejay-current/veejay-server/veejay/vj-eventman.c b/veejay-current/veejay-server/veejay/vj-eventman.c index 87adcdda..d1bcb77e 100644 --- a/veejay-current/veejay-server/veejay/vj-eventman.c +++ b/veejay-current/veejay-server/veejay/vj-eventman.c @@ -1770,11 +1770,22 @@ void vj_init_vevo_events(void) 0, VIMS_ALLOW_ANY, NULL ); + index_map_[VIMS_WORKINGDIR] = _new_event( + "%d", + VIMS_WORKINGDIR, + "GUI: Get all video files starting in cwd", + vj_event_send_working_dir, + 1, + VIMS_ALLOW_ANY, + "(unused)", + 0, + NULL ); + index_map_[VIMS_SAMPLE_LIST] = _new_event( "%d", VIMS_SAMPLE_LIST, - "GUI: Get a list of all samples (unadvised!)", + "GUI: Get a list of all samples", vj_event_send_sample_list, 1, VIMS_ALLOW_ANY, diff --git a/veejay-current/veejay-server/veejay/vj-misc.c b/veejay-current/veejay-server/veejay/vj-misc.c index e657995a..3b911bea 100644 --- a/veejay-current/veejay-server/veejay/vj-misc.c +++ b/veejay-current/veejay-server/veejay/vj-misc.c @@ -72,6 +72,153 @@ unsigned int vj_get_relative_time() return relative; } +static struct +{ + const char *ext; +} filefilters[] = { + { ".avi" }, + { ".mov" }, + { ".dv" }, + { ".edl" }, + { ".y4m" }, + { NULL} +}; + +static int is_it_usable(const char *file) +{ + int i = 0; + while ( filefilters[i].ext != NULL ) { + if(strcasestr( file, filefilters[i].ext ) ) + return 1; + i++; + } + return 0; +} + +static char *relative_path(filelist_t *filelist, const char *node) +{ + int len = strlen(filelist->working_dir); + if( node + len + 1 ) { + char *tmp = strdup( node + len + 1); + return tmp; + } + return strdup(node); +} + +static int is_usable_file( filelist_t *filelist, const char *node, const char *filename ) +{ + if(!node) + return 0; + + struct stat l; + veejay_memset(&l,0,sizeof(struct stat)); +#ifdef STRICT_CHECKING + assert( filelist != NULL ); + assert( filelist->num_files >= 0 || filelist->num_files < 1024 ); +#endif + if( lstat( node, &l) < 0 ) + return 0; + if( S_ISLNK( l.st_mode )) { + veejay_memset(&l,0,sizeof(struct stat)); + stat(node, &l); + return 1; + } + if( S_ISDIR( l.st_mode ) ) { + return 1; + } + + if( S_ISREG( l.st_mode ) ) { + if( is_it_usable(node)) { + if( filelist->num_files < filelist->max_files-1 ) { + filelist->files[ filelist->num_files ] = + relative_path(filelist,node); + filelist->num_files ++; + } + } + } + return 0; +} + +static int dir_selector( const struct dirent *dir ) +{ + return 1; +} + +static int find_files( filelist_t *filelist, const char *path ) +{ + struct dirent **files; + int N = scandir ( path, &files, dir_selector,alphasort ); + int n; + if( N < 0 ) { + veejay_msg(VEEJAY_MSG_ERROR, "Invalid path %s",path); + return 0; + } + + for( n = 0; n < N; n ++ ) + { + char tmp[2048]; + if( strcmp( files[n]->d_name, "." ) == 0 || + strcmp( files[n]->d_name, ".." ) == 0 ) { + continue; + } + + snprintf(tmp,sizeof(tmp), "%s/%s", path,files[n]->d_name ); + if(is_usable_file( filelist, tmp, files[n]->d_name ) ) { //@recurse + find_files( filelist, tmp ); + } + } + + for( n = 0; n < N; n ++ ) { + if( files[n]) + free(files[n]); + } + free(files); + return 1; +} +void free_media_files( veejay_t *info, filelist_t *fl ) +{ + int n; + for( n = 0; n < fl->num_files ; n ++ ) { + if(fl->files[n] != NULL ) { + free(fl->files[n]); + } + } + free(fl->files); + free(fl->working_dir); + free(fl); + fl = NULL; +} + +filelist_t *find_media_files( veejay_t *info ) +{ + char working_dir[2048]; + + char *wd = getcwd( working_dir, sizeof(working_dir)); + + if( wd == NULL ) { + veejay_msg(0, "Strange, current working directory seems to be invalid?"); + return NULL; + } + + filelist_t *fl = (filelist_t*) vj_malloc(sizeof(filelist_t)); + fl->files = (char**) vj_malloc(sizeof(char*) * 1024 ); //@ 1024 files + fl->max_files = 1024; + fl->num_files = 0; + fl->working_dir = strdup(working_dir); + + int res = find_files( fl, wd ); + + if( res == 0 ) { + veejay_msg(VEEJAY_MSG_DEBUG, "No files found in %s", wd ); + free( fl->files ); + free( fl ); + return NULL; + } + + return fl; +} + + int vj_perform_take_bg(veejay_t *info, VJFrame *frame, int pass) { int n = 0; @@ -501,3 +648,7 @@ int veejay_sprintf( char *s, size_t size, const char *format, ... ) return done; } #endif + + + + diff --git a/veejay-current/veejay-server/veejay/vj-misc.h b/veejay-current/veejay-server/veejay/vj-misc.h index d556d967..e7d5a3f7 100644 --- a/veejay-current/veejay-server/veejay/vj-misc.h +++ b/veejay-current/veejay-server/veejay/vj-misc.h @@ -22,6 +22,14 @@ #include #include "vj-lib.h" +typedef struct +{ + char **files; + char *working_dir; + int num_files; + int max_files; +} filelist_t; + #define VEEJAY_FILE_LIMIT (1048576 * 16000) int available_diskspace(void);