⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playtree.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
      return NULL;  }  iter->root = pt;  iter->tree = NULL;  iter->config = config;   if(pt->parent)    iter->loop = pt->parent->loop;  return iter;}voidplay_tree_iter_free(play_tree_iter_t* iter) {#ifdef MP_DEBUG  assert(iter != NULL);#endif  if(iter->status_stack) {#ifdef MP_DEBUG    assert(iter->stack_size > 0);#endif    free(iter->status_stack);  }  free(iter);}static play_tree_t*play_tree_rnd_step(play_tree_t* pt) {  int count = 0;  int r;  play_tree_t *i,*head;  // Count how many free choice we have  for(i = pt ; i->prev ; i = i->prev)    if(!(i->flags & PLAY_TREE_RND_PLAYED)) count++;  head = i;  if(!(i->flags & PLAY_TREE_RND_PLAYED)) count++;  for(i = pt->next ; i ; i = i->next)    if(!(i->flags & PLAY_TREE_RND_PLAYED)) count++;  if(!count) return NULL;    r = (int)((float)(count) * rand() / (RAND_MAX + 1.0));  for(i = head ; i  ; i=i->next) {    if(!(i->flags & PLAY_TREE_RND_PLAYED)) r--;    if(r < 0) return i;  }  mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Random stepping error\n");  return NULL;}intplay_tree_iter_step(play_tree_iter_t* iter, int d,int with_nodes) {  play_tree_t* pt;  if ( !iter ) return PLAY_TREE_ITER_ENTRY;  if ( !iter->root ) return PLAY_TREE_ITER_ENTRY;  #ifdef MP_DEBUG  assert(iter != NULL);  assert(iter->root != NULL);  //printf("PT : Stepping = %d\n",d);#endif  if(iter->tree == NULL) {    iter->tree = iter->root;    return play_tree_iter_step(iter,0,with_nodes);  }  if(iter->config && iter->entry_pushed > 0) {    iter->entry_pushed = 0;    m_config_pop(iter->config);  }  if(iter->tree->parent && (iter->tree->parent->flags & PLAY_TREE_RND))    iter->mode = PLAY_TREE_ITER_RND;  else    iter->mode = PLAY_TREE_ITER_NORMAL;  iter->file = -1;  if(iter->mode == PLAY_TREE_ITER_RND)    pt = play_tree_rnd_step(iter->tree);  else if( d > 0 ) {    int i;    pt = iter->tree;    for(i = d ; i > 0 && pt ; i--)      pt = pt->next;    d = i ? i : 1;  } else if(d < 0) {    int i;    pt = iter->tree;    for(i = d ; i < 0 && pt ; i++)      pt = pt->prev;    d = i ? i : -1;  } else    pt = iter->tree;    if(pt == NULL) { // No next    // Must we loop?    if (iter->mode == PLAY_TREE_ITER_RND) {      if (iter->root->loop == 0)        return PLAY_TREE_ITER_END;      play_tree_unset_flag(iter->root, PLAY_TREE_RND_PLAYED, -1);      if (iter->root->loop > 0) iter->root->loop--;      // try again      return play_tree_iter_step(iter, 0, with_nodes);    } else    if(iter->tree->parent && iter->tree->parent->loop != 0 && ((d > 0 && iter->loop != 0) || ( d < 0 && (iter->loop < 0 || iter->loop < iter->tree->parent->loop) ) ) ) {       if(d > 0) { // Go back to the first one	for(pt = iter->tree ; pt->prev != NULL; pt = pt->prev)	  /* NOTHNG */;	if(iter->loop > 0) iter->loop--;      } else if( d < 0 ) { // Or the last one	for(pt = iter->tree ; pt->next != NULL; pt = pt->next)	  /* NOTHNG */;	if(iter->loop >= 0 && iter->loop < iter->tree->parent->loop) iter->loop++;      }      iter->tree = pt;      return play_tree_iter_step(iter,0,with_nodes);    }    // Go up one level    return play_tree_iter_up_step(iter,d,with_nodes);  }  // Is there any valid childs ?  if(pt->child && play_tree_is_valid(pt->child)) {    iter->tree = pt;    if(with_nodes) { // Stop on the node            return PLAY_TREE_ITER_NODE;    } else      // Or follow it      return play_tree_iter_down_step(iter,d,with_nodes);  }  // Is it a valid enty ?  if(! play_tree_is_valid(pt)) {    if(d == 0) { // Can this happen ? FF: Yes!      mp_msg(MSGT_PLAYTREE,MSGL_ERR,"What to do now ???? Infinite loop if we continue\n");      return PLAY_TREE_ITER_ERROR;    } // Not a valid entry : go to next one    return play_tree_iter_step(iter,d,with_nodes);  }#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) {    play_tree_iter_push_params(iter);    iter->entry_pushed = 1;    if(iter->mode == PLAY_TREE_ITER_RND)      pt->flags |= PLAY_TREE_RND_PLAYED;  }  return PLAY_TREE_ITER_ENTRY;}static intplay_tree_is_valid(play_tree_t* pt) {  play_tree_t* iter;#ifdef MP_DEBUG  assert(pt != NULL);#endif  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))	return 1;    }  }  return 0;}intplay_tree_iter_up_step(play_tree_iter_t* iter, int d,int with_nodes) {#ifdef MP_DEBUG  assert(iter != NULL);  assert(iter->tree != NULL);  //printf("PT : Go UP\n");#endif    iter->file = -1;  if(iter->tree->parent == iter->root->parent)    return PLAY_TREE_ITER_END;#ifdef MP_DEBUG  assert(iter->tree->parent != NULL);  assert(iter->stack_size > 0);  assert(iter->status_stack != NULL);#endif  iter->stack_size--;  iter->loop = iter->status_stack[iter->stack_size];  if(iter->stack_size > 0)    iter->status_stack = (int*)realloc(iter->status_stack,iter->stack_size*sizeof(int));  else {    free(iter->status_stack);    iter->status_stack = NULL;  }  if(iter->stack_size > 0 && iter->status_stack == NULL) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",iter->stack_size*sizeof(char*));    return PLAY_TREE_ITER_ERROR;  }  iter->tree = iter->tree->parent;  // Pop subtree params  if(iter->config) {    m_config_pop(iter->config);    if(iter->mode == PLAY_TREE_ITER_RND)      iter->tree->flags |= PLAY_TREE_RND_PLAYED;  }  return play_tree_iter_step(iter,d,with_nodes);}  intplay_tree_iter_down_step(play_tree_iter_t* iter, int d,int with_nodes) {#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 = -1;  //  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) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",iter->stack_size*sizeof(int));    return PLAY_TREE_ITER_ERROR;  }  iter->status_stack[iter->stack_size-1] = iter->loop;  // Set new status  iter->loop = iter->tree->loop-1;  if(d >= 0)    iter->tree = iter->tree->child;  else {    play_tree_t* pt;    for(pt = iter->tree->child ; pt->next != NULL ; pt = pt->next)      /*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) {  char* entry;#ifdef MP_DEBUG  assert(iter != NULL);  assert(iter->tree->child == NULL);#endif  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->file >= iter->num_files - 1)      iter->file = 0;    else      iter->file++;  } else if(d < 0) {    if(iter->file <= 0)      iter->file = iter->num_files - 1;    else      iter->file--;  }  return iter->tree->files[iter->file];}play_tree_t*play_tree_cleanup(play_tree_t* pt) {  play_tree_t* iter, *tmp, *first;#ifdef MP_DEBUG  assert(pt != NULL);#endif  if( ! play_tree_is_valid(pt)) {    play_tree_remove(pt,1,1);    return NULL;  }  first = pt->child;  for(iter = pt->child ; iter != NULL ; ) {    tmp = iter;    iter = iter->next;    if(! play_tree_is_valid(tmp)) {      play_tree_remove(tmp,1,1);      if(tmp == first) first = iter;    }  }  for(iter = first ; iter != NULL ; ) {    tmp = iter;    iter = iter->next;    play_tree_cleanup(tmp);  }      return pt;}play_tree_iter_t*play_tree_iter_new_copy(play_tree_iter_t* old) {  play_tree_iter_t* iter;#ifdef MP_DEBUG  assert(old != NULL);#endif  iter = (play_tree_iter_t*)malloc(sizeof(play_tree_iter_t));  if(iter == NULL) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",sizeof(play_tree_iter_t));    return NULL;  };  memcpy(iter,old,sizeof(play_tree_iter_t));  if(old->status_stack) {    iter->status_stack = (int*)malloc(old->stack_size * sizeof(int));    if(iter->status_stack == NULL) {      mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",old->stack_size * sizeof(int));      free(iter);      return NULL;    }    memcpy(iter->status_stack,old->status_stack,iter->stack_size*sizeof(int));  }  iter->config = NULL;  return iter;}// HIGH Level API, by Fabian Franz (mplayer@fabian-franz.de)//play_tree_iter_t* pt_iter_create(play_tree_t** ppt, m_config_t* config){  play_tree_iter_t* r=NULL;#ifdef MP_DEBUG  assert(*ppt!=NULL);#endif    *ppt=play_tree_cleanup(*ppt);    if(*ppt) {    r = play_tree_iter_new(*ppt,config);    if (r && play_tree_iter_step(r,0,0) != PLAY_TREE_ITER_ENTRY)     {      play_tree_iter_free(r);      r = NULL;    }  }  return r;}void pt_iter_destroy(play_tree_iter_t** iter){  if (iter && *iter)  {    free(*iter);    iter=NULL;  }}char* pt_iter_get_file(play_tree_iter_t* iter, int d){  int i=0;  char* r;  if (iter==NULL)    return NULL;    r = play_tree_iter_get_file(iter,d);    while (!r && d!=0)  {    if (play_tree_iter_step(iter,d,0) != PLAY_TREE_ITER_ENTRY)        break;    r=play_tree_iter_get_file(iter,d);    i++;  }  return r;}void pt_iter_insert_entry(play_tree_iter_t* iter, play_tree_t* entry){  play_tree_t *pt = iter->tree;#ifdef MP_DEBUG  assert(pt!=NULL);  assert(entry!=NULL);  assert(entry!=pt);#endif  play_tree_insert_entry(pt, entry);  play_tree_set_params_from(entry,pt);}void pt_iter_replace_entry(play_tree_iter_t* iter, play_tree_t* entry){  play_tree_t *pt = iter->tree;  pt_iter_insert_entry(iter, entry);  play_tree_remove(pt, 1, 1);  iter->tree=entry;}//Add a new file as a new entryvoid pt_add_file(play_tree_t** ppt, char* filename){  play_tree_t *pt = *ppt, *entry = play_tree_new();#ifdef MP_DEBUG  assert(entry!=NULL);#endif   play_tree_add_file(entry, filename);  if (pt)    play_tree_append_entry(pt, entry);  else  {    pt=entry;    *ppt=pt;  }  play_tree_set_params_from(entry,pt);}void pt_add_gui_file(play_tree_t** ppt, char* path, char* file){  char* wholename = malloc(strlen(path)+strlen(file)+2);  if (wholename)  {    strcpy(wholename, path);    strcat(wholename, "/");    strcat(wholename, file);    pt_add_file(ppt, wholename);    free(wholename); // As pt_add_file strdups it anyway!  }}void pt_iter_goto_head(play_tree_iter_t* iter){  iter->tree=iter->root;  play_tree_iter_step(iter, 0, 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -