mirror of
https://github.com/mpv-player/mpv.git
synced 2024-09-20 12:02:23 +02:00
- It adds an option enqueue/noenqueue, so users can choose if they want to
have playlist overwritten by files on commandline or just enqueue them at the end ... - Playtree is finally cleared, as such gui has total control! - Autoplay if files are available on commandline and -enqueue is not set! - Fallback on Playlists finally does work with Gui and even with streaming Playlists! [ Before gui was broken as mplayer.c:playtree tried to have control] patch by Fabian Franz <FabianFranz@gmx.de> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9292 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
f7b66d5568
commit
6b5dc1e612
156
Gui/interface.c
156
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;
|
||||
if ( !plCurrent && plList )
|
||||
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 )
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -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];
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 );
|
||||
|
@ -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},
|
||||
|
39
mplayer.c
39
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;
|
||||
|
Loading…
Reference in New Issue
Block a user