# HG changeset patch # User albeu # Date 1011299068 0 # Node ID fe2c20d52a2510886b455f232728ebe8ccde65f8 # Parent 70888f501b4ac93e34e25f514e134fee6086f9a7 Fixed a few bugs and added support for VCD/DVD/TV in playlist using virtual url like dvd://1 vcd://2 tv://5 diff -r 70888f501b4a -r fe2c20d52a25 cfg-common.h --- a/cfg-common.h Thu Jan 17 19:24:33 2002 +0000 +++ b/cfg-common.h Thu Jan 17 20:24:28 2002 +0000 @@ -8,10 +8,12 @@ #endif #ifdef HAVE_VCD {"vcd", &vcd_track, CONF_TYPE_INT, CONF_RANGE, 1, 99, NULL}, + {"cdrom-device", &cdrom_device, CONF_TYPE_STRING, 0, 0, 0, NULL}, #else {"vcd", "VCD support is NOT available on this system!\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, #endif #ifdef USE_DVDREAD + {"dvd-device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"dvd", &dvd_title, CONF_TYPE_INT, CONF_RANGE, 1, 99, NULL}, {"dvdangle", &dvd_angle, CONF_TYPE_INT, CONF_RANGE, 1, 99, NULL}, {"chapter", &dvd_chapter, CONF_TYPE_INT, CONF_RANGE, 1, 99, NULL}, @@ -115,6 +117,7 @@ extern int vivo_param_width; extern int vivo_param_height; extern int vivo_param_vformat; +extern char *dvd_device, *cdrom_device; struct config vivoopts_conf[]={ {"version", &vivo_param_version, CONF_TYPE_INT, 0, 0, 0, NULL}, diff -r 70888f501b4a -r fe2c20d52a25 cfgparser.c --- a/cfgparser.c Thu Jan 17 19:24:33 2002 +0000 +++ b/cfgparser.c Thu Jan 17 20:24:28 2002 +0000 @@ -300,7 +300,7 @@ mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "read_option: conf=%p opt='%s' param='%s'\n", conf, opt, param); - for(nconf = 0 ; conf_list&& conf_list[nconf] != NULL; nconf++) { + for(nconf = 0 ; conf_list[nconf] != NULL; nconf++) { conf = conf_list[nconf]; for (i = 0; conf[i].name != NULL; i++) { int namelength; @@ -563,7 +563,7 @@ break; } out: - if(config->global == 0 && ! (conf[i].flags & CONF_GLOBAL)) { + if(ret >= 0 && config->global == 0 && ! (conf[i].flags & CONF_GLOBAL)) { play_tree_t* dest = config->last_entry ? config->last_entry : config->last_parent; #ifdef MP_DEBUG assert(dest != NULL); diff -r 70888f501b4a -r fe2c20d52a25 playtree.c --- a/playtree.c Thu Jan 17 19:24:33 2002 +0000 +++ b/playtree.c Thu Jan 17 20:24:28 2002 +0000 @@ -4,6 +4,7 @@ #include #include #include +#include #ifdef MP_DEBUG #include #endif @@ -13,11 +14,15 @@ static int play_tree_is_valid(play_tree_t* pt); +static void +play_tree_iter_set_param(play_tree_iter_t* iter,char* opt,char* val); + play_tree_t* play_tree_new(void) { play_tree_t* r = (play_tree_t*)calloc(1,sizeof(play_tree_t)); if(r == NULL) mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",sizeof(play_tree_t)); + r->entry_type = PLAY_TREE_ENTRY_NODE; return r; } @@ -189,7 +194,7 @@ #ifdef MP_DEBUG assert(pt != NULL); - assert(pt->files == NULL); + assert(pt->entry_type == PLAY_TREE_ENTRY_NODE); #endif for(iter = pt->child ; iter != NULL ; iter = iter->next) @@ -234,6 +239,7 @@ void play_tree_add_file(play_tree_t* pt,char* file) { int n = 0; + char* e; #ifdef MP_DEBUG assert(pt != NULL); @@ -241,6 +247,10 @@ assert(file != NULL); #endif + if(pt->entry_type != PLAY_TREE_ENTRY_NODE && + pt->entry_type != PLAY_TREE_ENTRY_FILE) + return; + if(pt->files) { for(n = 0 ; pt->files[n] != NULL ; n++) /* NOTHING */; @@ -251,9 +261,21 @@ return; } - pt->files[n] = strdup(file); + e = pt->files[n] = strdup(file); pt->files[n+1] = NULL; + if(strncasecmp(e,"vcd://",6) == 0 && strlen(&e[6]) > 0) { + pt->entry_type = PLAY_TREE_ENTRY_VCD; + memmove(e,e + 6,strlen(&e[6])+1); + } else if(strncasecmp(e,"dvd://",6) == 0 && strlen(&e[6]) > 0) { + pt->entry_type = PLAY_TREE_ENTRY_DVD; + memmove(e,&e[6],strlen(&e[6])+1); + } else if(strncasecmp(e,"tv://",5) == 0 && strlen(&e[5]) > 0) { + pt->entry_type = PLAY_TREE_ENTRY_TV; + memmove(e,&e[5],strlen(&e[5])+1); + } else + pt->entry_type = PLAY_TREE_ENTRY_FILE; + } int @@ -263,7 +285,7 @@ #ifdef MP_DEBUG assert(pt != NULL); assert(file != NULL); - assert(pt->files != NULL); + assert(pt->entry_type != PLAY_TREE_ENTRY_NODE); #endif for(n=0 ; pt->files[n] != NULL ; n++) { @@ -383,7 +405,9 @@ pt->params[n].name,pt->params[n].value); } } - //printf("Param pushed\n"); + + if(!pt->child) + iter->entry_pushed = 1; return 1; } @@ -397,7 +421,7 @@ if(iter->tree->params == NULL) return; - //printf("Poping params\n"); + iter->entry_pushed = 0; m_config_pop(iter->config); } @@ -457,12 +481,10 @@ return play_tree_iter_step(iter,0,with_nodes); } - if(iter->config && iter->entry_pushed) { + if(iter->config && iter->entry_pushed) play_tree_iter_pop_params(iter); - iter->entry_pushed = 0; - } - iter->file = 0; + iter->file = -1; if( d > 0 ) pt = iter->tree->next; else if(d < 0) @@ -511,14 +533,15 @@ #ifdef MP_DEBUG assert(pt->files != NULL); #endif - + iter->tree = pt; + for(d = 0 ; iter->tree->files[d] != NULL ; d++) /* NOTHING */; iter->num_files = d; - + if(iter->config) - iter->entry_pushed = play_tree_iter_push_params(iter); + play_tree_iter_push_params(iter); return PLAY_TREE_ITER_ENTRY; @@ -532,8 +555,12 @@ assert(pt != NULL); #endif - if(pt->files != NULL) + if(pt->entry_type != PLAY_TREE_ENTRY_NODE) { +#ifdef MP_DEBUG + assert(pt->child == NULL); +#endif return 1; + } else if (pt->child != NULL) { for(iter = pt->child ; iter != NULL ; iter = iter->next) { if(play_tree_is_valid(iter)) @@ -552,7 +579,7 @@ //printf("PT : Go UP\n"); #endif - iter->file = 0; + iter->file = -1; if(iter->tree->parent == iter->root->parent) return PLAY_TREE_ITER_END; @@ -588,7 +615,7 @@ //printf("PT : Go DOWN\n"); #endif - iter->file = 0; + iter->file = -1; // Push subtree params if(iter->config) @@ -617,7 +644,7 @@ char* play_tree_iter_get_file(play_tree_iter_t* iter, int d) { - + char* entry; #ifdef MP_DEBUG assert(iter != NULL); assert(iter->tree->child == NULL); @@ -626,16 +653,43 @@ if(iter->tree->files == NULL) return NULL; +#ifdef MP_DEBUG + assert(iter->num_files > 0); +#endif + + if(iter->file >= iter->num_files-1 || iter->file < -1) + return NULL; + if(d > 0) { - if(iter->tree->files[iter->file] == NULL) - return NULL; - iter->file++; + if(iter->file >= iter->num_files - 1) + iter->file = 0; + else + iter->file++; } else if(d < 0) { - if(iter->file == 0) - return NULL; - iter->file--; - } - return iter->tree->files[iter->file-1]; + if(iter->file <= 0) + iter->file = iter->num_files - 1; + else + iter->file--; + } + entry = iter->tree->files[iter->file]; + + switch(iter->tree->entry_type) { + case PLAY_TREE_ENTRY_DVD : + play_tree_iter_set_param(iter,"dvd",entry); + break; + case PLAY_TREE_ENTRY_VCD : + play_tree_iter_set_param(iter,"vcd",entry); + break; + case PLAY_TREE_ENTRY_TV : + { + char* val = (char*)malloc(strlen(entry) + 11 + 1); + sprintf(val,"on:channel=%s",entry); + play_tree_iter_set_param(iter,"tv",val); + break; + } + } + + return entry; } play_tree_t* @@ -700,3 +754,27 @@ return iter; } + +static void +play_tree_iter_set_param(play_tree_iter_t* iter,char* opt,char* val) { + int push = 0; + play_tree_t* pt; +#ifdef MP_DEBUG + assert(iter != NULL); + assert(iter->tree != NULL); +#endif + + pt = iter->tree; + + if(iter->tree->params == NULL) + push = 1; + + play_tree_set_param(iter->tree,opt,val); + + if(push) + play_tree_iter_push_params(iter); + else if(iter->config) + m_config_set_option(iter->config,opt,val); + +} + diff -r 70888f501b4a -r fe2c20d52a25 playtree.h --- a/playtree.h Thu Jan 17 19:24:33 2002 +0000 +++ b/playtree.h Thu Jan 17 20:24:28 2002 +0000 @@ -10,6 +10,12 @@ #define PLAY_TREE_ITER_NODE 2 #define PLAY_TREE_ITER_END 3 +#define PLAY_TREE_ENTRY_NODE -1 +#define PLAY_TREE_ENTRY_DVD 0 +#define PLAY_TREE_ENTRY_VCD 1 +#define PLAY_TREE_ENTRY_TV 2 +#define PLAY_TREE_ENTRY_FILE 3 + typedef struct play_tree play_tree_t; typedef struct play_tree_iter play_tree_iter_t; typedef struct play_tree_param play_tree_param_t; @@ -44,6 +50,7 @@ play_tree_param_t* params; int loop; char** files; + int entry_type; }; struct play_tree_iter {