summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Gui/interface.c156
-rw-r--r--Gui/interface.h3
-rw-r--r--Gui/mplayer/play.c32
-rw-r--r--Gui/mplayer/play.h1
-rw-r--r--cfg-mplayer.h3
-rw-r--r--mplayer.c39
6 files changed, 225 insertions, 9 deletions
diff --git a/Gui/interface.c b/Gui/interface.c
index ab9bc5f1a2..79bf6e1027 100644
--- a/Gui/interface.c
+++ b/Gui/interface.c
@@ -670,7 +670,7 @@ int guiGetEvent( int type,char * arg )
break;
#endif
}
- if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST )
+ //if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST ) // Does not make problems anymore!
{
if ( guiIntfStruct.Filename ) filename=gstrdup( guiIntfStruct.Filename );
else if ( filename ) guiSetFilename( guiIntfStruct.Filename,filename );
@@ -834,29 +834,68 @@ void * gtkSet( int cmd,float fparam, void * vparam )
} else { item->prev=item->next=NULL; plCurrent=plList=item; }
list();
return NULL;
- case gtkGetNextPlItem: // get current item from playlist
+ case gtkInsertPlItem: // add item into playlist after current
if ( plCurrent )
{
+ plItem * curr = plCurrent;
+ item->next=curr->next;
+ if (item->next)
+ item->next->prev=item;
+ item->prev=curr;
+ curr->next=item;
+ plCurrent=plCurrent->next;
+ return plCurrent;
+ }
+ else
+ return gtkSet(gtkAddPlItem,0,(void*)item);
+ return NULL;
+ case gtkGetNextPlItem: // get current item from playlist
+ if ( plCurrent && plCurrent->next)
+ {
plCurrent=plCurrent->next;
- if ( !plCurrent && plList )
+ /*if ( !plCurrent && plList )
{
plItem * next = plList;
while ( next->next ) { if ( !next->next ) break; next=next->next; }
plCurrent=next;
- }
+ }*/
return plCurrent;
}
return NULL;
case gtkGetPrevPlItem:
- if ( plCurrent )
+ if ( plCurrent && plCurrent->prev)
{
plCurrent=plCurrent->prev;
- if ( !plCurrent && plList ) plCurrent=plList;
+ //if ( !plCurrent && plList ) plCurrent=plList;
return plCurrent;
}
return NULL;
+ case gtkSetCurrPlItem: // set current item
+ plCurrent=item;
+ return plCurrent;
case gtkGetCurrPlItem: // get current item
return plCurrent;
+ case gtkDelCurrPlItem: // delete current item
+ {
+ plItem * curr = plCurrent;
+
+ if (!curr)
+ return NULL;
+ if (curr->prev)
+ curr->prev->next=curr->next;
+ if (curr->next)
+ curr->next->prev=curr->prev;
+ if (curr==plList)
+ plList=curr->next;
+ plCurrent=curr->next;
+ // Free it
+ if ( curr->path ) free( curr->path );
+ if ( curr->name ) free( curr->name );
+ free( curr );
+ }
+ mplCurr(); // Instead of using mplNext && mplPrev
+
+ return plCurrent;
case gtkDelPl: // delete list
{
plItem * curr = plList;
@@ -1002,3 +1041,108 @@ void * gtkSet( int cmd,float fparam, void * vparam )
}
return NULL;
}
+
+#define mp_basename(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1))
+
+#include "../playtree.h"
+
+//This function adds/inserts one file into the gui playlist
+
+int import_file_into_gui(char* temp, int insert)
+{
+ char *filename, *pathname;
+ plItem * item;
+
+ filename = strdup(mp_basename(temp));
+ pathname = strdup(temp);
+ if (strlen(pathname)-strlen(filename)>0)
+ pathname[strlen(pathname)-strlen(filename)-1]='\0'; // We have some path so remove / at end
+ else
+ pathname[strlen(pathname)-strlen(filename)]='\0';
+ mp_msg(MSGT_PLAYTREE,MSGL_V, "Adding filename %s && pathname %s\n",filename,pathname); //FIXME: Change to MSGL_DBG2 ?
+ item=calloc( 1,sizeof( plItem ) );
+ if (!item)
+ return 0;
+ item->name=filename;
+ item->path=pathname;
+ if (insert)
+ gtkSet( gtkInsertPlItem,0,(void*)item ); // Inserts the item after current, and makes current=item
+ else
+ gtkSet( gtkAddPlItem,0,(void*)item );
+ return 1;
+}
+
+#ifdef NEW_CONFIG
+ #include "../m_option.h"
+ #include "../m_config.h"
+#else
+ #include "../cfgparser.h"
+#endif
+
+// This function imports the initial playtree (based on cmd-line files) into the gui playlist
+// by either:
+// - overwriting gui pl (enqueue=0)
+// - appending it to gui pl (enqueue=1)
+
+int import_initial_playtree_into_gui(play_tree_t* my_playtree, m_config_t* config, int enqueue)
+{
+ play_tree_iter_t* my_pt_iter=NULL;
+ int result=0;
+
+ if (!enqueue) // Delete playlist before "appending"
+ gtkSet(gtkDelPl,0,0);
+
+ if((my_pt_iter=pt_iter_create(&my_playtree,config)))
+ {
+ while ((filename=pt_iter_get_next_file(my_pt_iter))!=NULL)
+ {
+ if (import_file_into_gui(filename, 0)) // Add it to end of list
+ result=1;
+ }
+ }
+
+ mplCurr(); // Update filename
+
+ if (!enqueue)
+ filename=guiIntfStruct.Filename; // Backward compatibility; if file is specified on commandline,
+ // gmplayer does directly start in Play-Mode.
+ else
+ filename=NULL;
+
+ return result;
+}
+
+// This function imports and inserts an playtree, that is created "on the fly", for example by
+// parsing some MOV-Reference-File; or by loading an playlist with "File Open"
+//
+// The file which contained the playlist is thereby replaced with it's contents.
+
+int import_playtree_playlist_into_gui(play_tree_t* my_playtree, m_config_t* config)
+{
+ play_tree_iter_t* my_pt_iter=NULL;
+ int result=0;
+ plItem * save=(plItem*)gtkSet( gtkGetCurrPlItem, 0, 0); // Save current item
+
+ if((my_pt_iter=pt_iter_create(&my_playtree,config)))
+ {
+ while ((filename=pt_iter_get_next_file(my_pt_iter))!=NULL)
+ {
+ if (import_file_into_gui(filename, 1)) // insert it into the list and set plCurrent=new item
+ result=1;
+ }
+ pt_iter_destroy(&my_pt_iter);
+ }
+
+ if (save)
+ gtkSet(gtkSetCurrPlItem, 0, (void*)save);
+ else
+ gtkSet(gtkSetCurrPlItem, 0, (void*)plList); // go to head, if plList was empty before
+
+ if (save && result)
+ gtkSet(gtkDelCurrPlItem, 0, 0);
+
+ mplCurr(); // Update filename
+ filename=NULL;
+
+ return result;
+}
diff --git a/Gui/interface.h b/Gui/interface.h
index b2be1f8b82..3d3ceb99a0 100644
--- a/Gui/interface.h
+++ b/Gui/interface.h
@@ -196,6 +196,9 @@ extern char * fsHistory[fsPersistant_MaxPos];
#define gtkSetFontEncoding 20
#define gtkSetFontAutoScale 21
#define gtkSetSubEncoding 22
+#define gtkDelCurrPlItem 23
+#define gtkInsertPlItem 24
+#define gtkSetCurrPlItem 25
extern float gtkEquChannels[6][10];
diff --git a/Gui/mplayer/play.c b/Gui/mplayer/play.c
index f7ad980432..147674bba0 100644
--- a/Gui/mplayer/play.c
+++ b/Gui/mplayer/play.c
@@ -69,7 +69,7 @@ void mplEnd( void )
{
plItem * next;
- if ( !mplGotoTheNext ) { mplGotoTheNext=1; return; }
+ if ( !mplGotoTheNext && guiIntfStruct.Playing) { mplGotoTheNext=1; return; }
if ( guiIntfStruct.Playing && (next=gtkSet( gtkGetNextPlItem,0,NULL )) && plLastPlayed != next )
{
@@ -268,6 +268,36 @@ void mplSetFileName( char * dir,char * name,int type )
gfree( (void **)&guiIntfStruct.Subtitlename );
}
+void mplCurr( void )
+{
+ plItem * curr;
+ int stop = 0;
+
+ if ( guiIntfStruct.Playing == 2 ) return;
+ switch ( guiIntfStruct.StreamType )
+ {
+#ifdef USE_DVDREAD
+ case STREAMTYPE_DVD:
+ break;
+#endif
+#ifdef HAVE_VCD
+ case STREAMTYPE_VCD:
+ break;
+#endif
+ default:
+ if ( (curr=gtkSet( gtkGetCurrPlItem,0,NULL)) )
+ {
+ mplSetFileName( curr->path,curr->name,STREAMTYPE_FILE );
+ mplGotoTheNext=0;
+ break;
+ }
+ return;
+ }
+ if ( stop ) mplEventHandling( evStop,0 );
+ if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 );
+}
+
+
void mplPrev( void )
{
plItem * prev;
diff --git a/Gui/mplayer/play.h b/Gui/mplayer/play.h
index 9b1dd25e9e..b7c3c58a3b 100644
--- a/Gui/mplayer/play.h
+++ b/Gui/mplayer/play.h
@@ -13,6 +13,7 @@ extern void mplPause( void );
extern void mplState( void );
extern void mplPrev( void );
extern void mplNext( void );
+extern void mplCurr( void );
extern void mplIncAudioBufDelay( void );
extern void mplDecAudioBufDelay( void );
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index 45a6ccb522..d70bcc40a0 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -106,6 +106,7 @@ extern int rtspStreamOverTCP;
#ifdef HAVE_NEW_GUI
extern char * skinName;
+extern int enqueue;
#endif
#ifdef HAVE_ODIVX_POSTPROCESS
@@ -395,6 +396,8 @@ static config_t mplayer_opts[]={
#ifdef HAVE_NEW_GUI
{"skin", &skinName, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL},
+ {"enqueue", &enqueue, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+ {"noenqueue", &enqueue, CONF_TYPE_FLAG, 0, 0, 0, NULL},
#endif
{"noloop", &loop_times, CONF_TYPE_FLAG, 0, 0, -1, NULL},
diff --git a/mplayer.c b/mplayer.c
index 3fbc60e3a4..c20cc0bfce 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -181,6 +181,11 @@ static int output_quality=0;
float playback_speed=1.0;
int use_gui=0;
+
+#ifdef HAVE_NEW_GUI
+int enqueue=0;
+#endif
+
#define MAX_OSD_LEVEL 3
int osd_level=1;
@@ -577,6 +582,15 @@ static int libmpdemux_was_interrupted(int eof) {
int playtree_add_playlist(play_tree_t* entry)
{
+#ifdef HAVE_NEW_GUI
+ if (use_gui) {
+ if (entry) {
+ import_playtree_playlist_into_gui(entry, mconfig);
+ play_tree_free_list(entry,1);
+ }
+ } else
+#endif
+ {
if(!entry) {
entry = playtree_iter->tree;
if(play_tree_iter_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY) {
@@ -597,6 +611,7 @@ int playtree_add_playlist(play_tree_t* entry)
return PT_NEXT_ENTRY;
}
play_tree_remove(entry,1,1);
+ }
return PT_NEXT_SRC;
}
@@ -743,6 +758,13 @@ int gui_no_filename=0;
mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_GuiNeedsX);
use_gui=0;
}
+ if (use_gui && playtree_iter){
+ // Remove Playtree and Playtree-Iter from memory as its not used by gui
+ play_tree_iter_free(playtree_iter);
+ playtree_iter=NULL;
+ // Import initital playtree into gui
+ import_initial_playtree_into_gui(playtree, mconfig, enqueue);
+ }
#endif
if(vo_plugin_args && vo_plugin_args[0] && strcmp(vo_plugin_args[0],"help")==0){
@@ -2303,7 +2325,19 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still)
int n = cmd->args[0].v.i == 0 ? 1 : cmd->args[0].v.i;
int force = cmd->args[1].v.i;
- if(!force) {
+#ifdef HAVE_NEW_GUI
+ if (use_gui) {
+ int i=0;
+ if (n>0)
+ for (i=0;i<n;i++)
+ mplNext();
+ else
+ for (i=0;i<-1*n;i++)
+ mplPrev();
+ } else
+#endif
+ {
+ if(!force && playtree_iter) {
play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter);
if(play_tree_iter_step(i,n,0) == PLAY_TREE_ITER_ENTRY)
@@ -2313,12 +2347,13 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still)
eof = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY;
if(eof)
play_tree_step = n;
+ }
} break;
case MP_CMD_PLAY_TREE_UP_STEP : {
int n = cmd->args[0].v.i > 0 ? 1 : -1;
int force = cmd->args[1].v.i;
- if(!force) {
+ if(!force && playtree_iter) {
play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter);
if(play_tree_iter_up_step(i,n,0) == PLAY_TREE_ITER_ENTRY)
eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV;