summaryrefslogtreecommitdiffstats
path: root/playtree.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-14 23:38:49 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-14 23:38:49 +0000
commitef4a38a54e18b59df94dccfd9f819281b88ce579 (patch)
treeebbea287364120a0965869b0061bd2a51665c4f3 /playtree.c
parentef93c933803c01fa778bb1c6397044d9c592f66d (diff)
downloadmpv-ef4a38a54e18b59df94dccfd9f819281b88ce579.tar.bz2
mpv-ef4a38a54e18b59df94dccfd9f819281b88ce579.tar.xz
playtree-based config patch by Alban Bedel <albeu@free.fr>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4157 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'playtree.c')
-rw-r--r--playtree.c150
1 files changed, 110 insertions, 40 deletions
diff --git a/playtree.c b/playtree.c
index 4f1944397d..119f5374e8 100644
--- a/playtree.c
+++ b/playtree.c
@@ -1,9 +1,12 @@
+#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
+#ifdef MP_DEBUG
#include <assert.h>
+#endif
#include "playtree.h"
#include "mp_msg.h"
@@ -22,7 +25,7 @@ void
play_tree_free(play_tree_t* pt, int childs) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
#endif
@@ -52,7 +55,7 @@ void
play_tree_free_list(play_tree_t* pt, int childs) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
#endif
@@ -69,7 +72,7 @@ void
play_tree_append_entry(play_tree_t* pt, play_tree_t* entry) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(entry != NULL);
#endif
@@ -90,7 +93,7 @@ void
play_tree_prepend_entry(play_tree_t* pt, play_tree_t* entry) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(entry != NULL);
#endif
@@ -104,7 +107,7 @@ play_tree_prepend_entry(play_tree_t* pt, play_tree_t* entry) {
iter->prev = entry;
if(entry->parent) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(entry->parent->child == iter);
#endif
entry->parent->child = entry;
@@ -114,7 +117,7 @@ play_tree_prepend_entry(play_tree_t* pt, play_tree_t* entry) {
void
play_tree_insert_entry(play_tree_t* pt, play_tree_t* entry) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(entry != NULL);
#endif
@@ -122,7 +125,7 @@ play_tree_insert_entry(play_tree_t* pt, play_tree_t* entry) {
entry->parent = pt->parent;
entry->prev = pt;
if(pt->next) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt->next->prev == pt);
#endif
entry->next = pt->next;
@@ -136,13 +139,13 @@ play_tree_insert_entry(play_tree_t* pt, play_tree_t* entry) {
void
play_tree_remove(play_tree_t* pt, int free_it,int with_childs) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
#endif
// Middle of list
if(pt->prev && pt->next) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt->prev->next == pt);
assert(pt->next->prev == pt);
#endif
@@ -150,25 +153,25 @@ play_tree_remove(play_tree_t* pt, int free_it,int with_childs) {
pt->next->prev = pt->prev;
} // End of list
else if(pt->prev) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt->prev->next == pt);
#endif
pt->prev->next = NULL;
} // Begining of list
else if(pt->next) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt->next->prev == pt);
#endif
pt->next->prev = NULL;
if(pt->parent) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt->parent->child == pt);
#endif
pt->parent->child = pt->next;
}
} // The only one
else if(pt->parent) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt->parent->child == pt);
#endif
pt->parent->child = NULL;
@@ -184,7 +187,7 @@ void
play_tree_set_child(play_tree_t* pt, play_tree_t* child) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(pt->files == NULL);
#endif
@@ -207,7 +210,7 @@ void
play_tree_set_parent(play_tree_t* pt, play_tree_t* parent) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
#endif
@@ -232,7 +235,7 @@ void
play_tree_add_file(play_tree_t* pt,char* file) {
int n = 0;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(pt->child == NULL);
assert(file != NULL);
@@ -257,7 +260,7 @@ int
play_tree_remove_file(play_tree_t* pt,char* file) {
int n,f = -1;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(file != NULL);
assert(pt->files != NULL);
@@ -271,7 +274,7 @@ play_tree_remove_file(play_tree_t* pt,char* file) {
if(f < 0) // Not found
return 0;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(n > f);
#endif
@@ -292,12 +295,11 @@ play_tree_remove_file(play_tree_t* pt,char* file) {
return 1;
}
-#if 0
void
play_tree_set_param(play_tree_t* pt, char* name, char* val) {
int n = 0,ni = -1;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(name != NULL);
#endif
@@ -325,9 +327,9 @@ play_tree_set_param(play_tree_t* pt, char* name, char* val) {
int
play_tree_unset_param(play_tree_t* pt, char* name) {
- int n,ni = 0;
+ int n,ni = -1;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
assert(name != NULL);
assert(pt->params != NULL);
@@ -341,10 +343,16 @@ play_tree_unset_param(play_tree_t* pt, char* name) {
if(ni < 0)
return 0;
+ if(pt->params[ni].name) free(pt->params[ni].name);
+ if(pt->params[ni].value) free(pt->params[ni].value);
+
if(n > 1) {
memmove(&pt->params[ni],&pt->params[ni+1],(n-ni)*sizeof(play_tree_param_t));
pt->params = (play_tree_param_t*)realloc(pt->params,n*sizeof(play_tree_param_t));
- assert(pt->params != NULL);
+ if(pt->params == NULL) {
+ mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",n*sizeof(play_tree_param_t));
+ return -1;
+ }
} else {
free(pt->params);
pt->params = NULL;
@@ -353,14 +361,53 @@ play_tree_unset_param(play_tree_t* pt, char* name) {
return 1;
}
+static int
+play_tree_iter_push_params(play_tree_iter_t* iter) {
+ int n;
+ play_tree_t* pt;
+#ifdef MP_DEBUG
+ assert(iter != NULL);
+ assert(iter->config != NULL);
+ assert(iter->tree != NULL);
+#endif
+
+ pt = iter->tree;
+
+ if(pt->params == NULL)
+ return 0;
+
+ m_config_push(iter->config);
+ for(n = 0; pt->params[n].name != NULL ; n++) {
+ if(m_config_set_option(iter->config,pt->params[n].name,pt->params[n].value) < 0) {
+ mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Error while setting option '%s' with value '%s'\n",
+ pt->params[n].name,pt->params[n].value);
+ }
+ }
+ //printf("Param pushed\n");
+ return 1;
+}
+
+static void
+play_tree_iter_pop_params(play_tree_iter_t* iter) {
+
+#ifdef MP_DEBUG
+ assert(iter != NULL);
+ assert(iter->config != NULL);
#endif
+ if(iter->tree->params == NULL)
+ return;
+ //printf("Poping params\n");
+ m_config_pop(iter->config);
+}
+
play_tree_iter_t*
-play_tree_iter_new(play_tree_t* pt) {
+play_tree_iter_new(play_tree_t* pt,m_config_t* config) {
play_tree_iter_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
+ assert(config != NULL);
#endif
if( ! play_tree_is_valid(pt))
@@ -370,6 +417,7 @@ play_tree_iter_new(play_tree_t* pt) {
if(! iter) return NULL;
iter->root = pt;
iter->tree = NULL;
+ iter->config = config;
if(pt->parent)
iter->loop = pt->parent->loop;
@@ -380,12 +428,12 @@ play_tree_iter_new(play_tree_t* pt) {
void
play_tree_iter_free(play_tree_iter_t* iter) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter != NULL);
#endif
if(iter->status_stack) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter->stack_size > 0);
#endif
free(iter->status_stack);
@@ -398,9 +446,10 @@ int
play_tree_iter_step(play_tree_iter_t* iter, int d,int with_nodes) {
play_tree_t* pt;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter != NULL);
assert(iter->root != NULL);
+ //printf("PT : Stepping = %d\n",d);
#endif
if(iter->tree == NULL) {
@@ -408,6 +457,11 @@ play_tree_iter_step(play_tree_iter_t* iter, int d,int with_nodes) {
return play_tree_iter_step(iter,0,with_nodes);
}
+ if(iter->config && iter->entry_pushed) {
+ play_tree_iter_pop_params(iter);
+ iter->entry_pushed = 0;
+ }
+
iter->file = 0;
if( d > 0 )
pt = iter->tree->next;
@@ -454,14 +508,17 @@ play_tree_iter_step(play_tree_iter_t* iter, int d,int with_nodes) {
return play_tree_iter_step(iter,d,with_nodes);
}
-#ifdef DEBUG
- assert(iter->tree->files != NULL);
+#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);
return PLAY_TREE_ITER_ENTRY;
@@ -471,7 +528,7 @@ static int
play_tree_is_valid(play_tree_t* pt) {
play_tree_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
#endif
@@ -489,22 +546,22 @@ play_tree_is_valid(play_tree_t* pt) {
int
play_tree_iter_up_step(play_tree_iter_t* iter, int d,int with_nodes) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter != NULL);
assert(iter->tree != NULL);
+ //printf("PT : Go UP\n");
#endif
iter->file = 0;
if(iter->tree->parent == iter->root->parent)
return PLAY_TREE_ITER_END;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter->tree->parent != NULL);
assert(iter->stack_size > 0);
assert(iter->status_stack != NULL);
#endif
-
- // Pop status
+
iter->stack_size--;
iter->loop = iter->status_stack[iter->stack_size];
iter->status_stack = (int*)realloc(iter->status_stack,iter->stack_size*sizeof(int));
@@ -513,20 +570,30 @@ play_tree_iter_up_step(play_tree_iter_t* iter, int d,int with_nodes) {
return PLAY_TREE_ITER_ERROR;
}
iter->tree = iter->tree->parent;
+
+ // Pop subtree params
+ if(iter->config)
+ play_tree_iter_pop_params(iter);
+
return play_tree_iter_step(iter,d,with_nodes);
}
int
play_tree_iter_down_step(play_tree_iter_t* iter, int d,int with_nodes) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter->tree->files == NULL);
assert(iter->tree->child != NULL);
assert(iter->tree->child->parent == iter->tree);
+ //printf("PT : Go DOWN\n");
#endif
iter->file = 0;
- // Push status
+
+ // Push subtree params
+ if(iter->config)
+ play_tree_iter_push_params(iter);
+
iter->stack_size++;
iter->status_stack = (int*)realloc(iter->status_stack,iter->stack_size*sizeof(int));
if(iter->status_stack == NULL) {
@@ -544,13 +611,14 @@ play_tree_iter_down_step(play_tree_iter_t* iter, int d,int with_nodes) {
/*NOTING*/;
iter->tree = pt;
}
+
return play_tree_iter_step(iter,0,with_nodes);
}
char*
play_tree_iter_get_file(play_tree_iter_t* iter, int d) {
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(iter != NULL);
assert(iter->tree->child == NULL);
#endif
@@ -574,7 +642,7 @@ play_tree_t*
play_tree_cleanup(play_tree_t* pt) {
play_tree_t* iter, *tmp, *first;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(pt != NULL);
#endif
@@ -608,7 +676,7 @@ play_tree_iter_t*
play_tree_iter_new_copy(play_tree_iter_t* old) {
play_tree_iter_t* iter;
-#ifdef DEBUG
+#ifdef MP_DEBUG
assert(old != NULL);
#endif
@@ -628,5 +696,7 @@ play_tree_iter_new_copy(play_tree_iter_t* old) {
}
memcpy(iter->status_stack,old->status_stack,iter->stack_size*sizeof(int));
}
+ iter->config = NULL;
+
return iter;
}