add media tab, load files in veejay's working directory

git-svn-id: svn://code.dyne.org/veejay/trunk@1289 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
Niels Elburg
2008-12-30 22:53:23 +00:00
parent 8c7a03abba
commit 3dbadbb351
7 changed files with 215 additions and 1 deletions

View File

@@ -714,6 +714,7 @@ int main(int argc, char **argv)
int sig;
while (veejay_get_state(info) != LAVPLAY_STATE_STOP)
{
usleep( 25000 );

View File

@@ -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,

View File

@@ -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 <list->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;

View File

@@ -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 );

View File

@@ -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,

View File

@@ -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

View File

@@ -22,6 +22,14 @@
#include <stdarg.h>
#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);