10 #include "interface.h"
11 #include "skin/skin.h"
13 #include "mplayer/gtk/eq.h"
14 #include "mplayer/widgets.h"
15 #include "mplayer/mplayer.h"
16 #include "mplayer/play.h"
18 #include "../mplayer.h"
21 #include "../help_mp.h"
22 #include "../subreader.h"
23 #include "../libvo/x11_common.h"
24 #include "../libvo/video_out.h"
25 #include "../libvo/font_load.h"
26 #include "../libvo/sub.h"
27 #include "../input/input.h"
28 #include "../libao2/audio_out.h"
30 #include "../libao2/audio_plugin.h"
31 #include "../libao2/eq.h"
37 #include "../libmpdemux/stream.h"
38 #include "../libmpdemux/demuxer.h"
39 #include "../libmpdemux/stheader.h"
40 #include "../libmpcodecs/dec_video.h"
42 #include "../m_config.h"
43 #include "../m_option.h"
45 guiInterface_t guiIntfStruct
;
48 char * gstrcat( char ** dest
,char * src
)
52 if ( !src
) return NULL
;
56 tmp
=malloc( strlen( *dest
) + strlen( src
) + 1 );
57 strcpy( tmp
,*dest
); strcat( tmp
,src
); free( *dest
);
60 { tmp
=malloc( strlen( src
) + 1 ); strcpy( tmp
,src
); }
65 int gstrcmp( char * a
,char * b
)
67 if ( !a
&& !b
) return 0;
68 if ( !a
|| !b
) return -1;
72 int gstrncmp( char * a
,char * b
,int size
)
74 if ( !a
&& !b
) return 0;
75 if ( !a
|| !b
) return -1;
76 return strncmp( a
,b
,size
);
79 char * gstrdup( char * str
)
81 if ( !str
) return NULL
;
85 char * gstrchr( char * str
,int c
)
87 if ( !str
) return NULL
;
88 return strchr( str
,c
);
91 void gfree( void ** p
)
93 if ( *p
== NULL
) return;
97 void gset( char ** str
,char * what
)
99 if ( *str
) { if ( !strstr( *str
,what
) ) { gstrcat( str
,"," ); gstrcat( str
,what
); }}
100 else gstrcat( str
,what
);
103 void gaddlist( char *** list
,char * entry
)
109 for ( i
=0;(*list
)[i
];i
++ ) free( (*list
)[i
] );
114 (*list
)[0]=gstrdup( entry
);
119 char * gconvert_uri_to_filename( char * str
)
122 char * out
= strdup( str
);
126 char * charset
= "ISO8859-1";
129 if ( !strchr( str
,'%' ) ) return str
;
132 char * t
= calloc( 1,strlen( out
) );
134 for ( i
=0;i
< (int)strlen( out
);i
++ )
135 if ( out
[i
] != '%' ) t
[c
++]=out
[i
];
138 char tmp
[5] = "0xXX";
139 // if ( out[++i] == '%' ) { t[c++]='%'; continue; };
140 tmp
[2]=out
[++i
]; tmp
[3]=out
[++i
];
141 t
[c
++]=(char)strtol( tmp
,(char **)NULL
,0 );
147 if ( (cs
=getenv( "CHARSET" )) && *cs
) charset
=cs
;
149 inb
=outb
=strlen( out
);
150 tmp
=calloc( 1,outb
+ 1 );
152 d
=iconv_open( charset
,"UTF-8" );
153 if ( (iconv_t
)(-1) == d
) return str
;
154 iconv( d
,&out
,&inb
,&tmp
,&outb
);
165 memset( &guiIntfStruct
,0,sizeof( guiIntfStruct
) );
166 guiIntfStruct
.Balance
=50.0f
;
167 guiIntfStruct
.StreamType
=-1;
169 memset( >kEquChannels
,0,sizeof( gtkEquChannels
) );
171 if ( !gtkAOOSSMixer
) gtkAOOSSMixer
=strdup( PATH_DEV_MIXER
);
172 if ( !gtkAOOSSDevice
) gtkAOOSSDevice
=strdup( PATH_DEV_DSP
);
175 if ( !gtkDXR3Device
) gtkDXR3Device
=strdup( "/dev/em8300-0" );
177 if ( stream_cache_size
!= -1 ) { gtkCacheOn
=1; gtkCacheSize
=stream_cache_size
; }
178 if ( autosync
&& autosync
!= gtkAutoSync
) { gtkAutoSyncOn
=1; gtkAutoSync
=autosync
; }
182 wsXInit( (void *)mDisplay
);
184 skinDirInHome
=get_path("Skin");
185 skinMPlayerDir
=MPLAYER_DATADIR
"/Skin";
186 printf("SKIN dir 1: '%s'\n",skinDirInHome
);
187 printf("SKIN dir 2: '%s'\n",skinMPlayerDir
);
188 if ( !skinName
) skinName
=strdup( "default" );
189 i
= skinRead( skinName
);
190 if ((i
== -1) && strcmp(skinName
,"default"))
192 mp_msg( MSGT_GPLAYER
,MSGL_INFO
,"Selected skin ( %s ) not found, trying 'default'...\n", skinName
);
193 skinName
=strdup( "default" );
194 i
= skinRead( skinName
);
197 case -1: mp_msg( MSGT_GPLAYER
,MSGL_ERR
,MSGTR_SKIN_SKINCFG_SkinNotFound
,skinName
); exit( 0 );
198 case -2: mp_msg( MSGT_GPLAYER
,MSGL_ERR
,MSGTR_SKIN_SKINCFG_SkinCfgReadError
,skinName
); exit( 0 );
200 // --- initialize windows
201 if ( ( mplDrawBuffer
= (unsigned char *)malloc( appMPlayer
.main
.Bitmap
.ImageSize
) ) == NULL
)
203 fprintf( stderr
,MSGTR_NEMDB
);
209 appMPlayer
.main
.x
= gui_main_pos_x
;
210 appMPlayer
.main
.y
= gui_main_pos_y
;
211 appMPlayer
.sub
.x
= gui_sub_pos_x
;
212 appMPlayer
.sub
.y
= gui_sub_pos_y
;
217 appMPlayer
.subWindow
.Parent
=WinID
;
221 if (guiWinID
>=0) appMPlayer
.mainWindow
.Parent
=guiWinID
;
223 wsCreateWindow( &appMPlayer
.subWindow
,
224 appMPlayer
.sub
.x
,appMPlayer
.sub
.y
,appMPlayer
.sub
.width
,appMPlayer
.sub
.height
,
225 wsNoBorder
,wsShowMouseCursor
|wsHandleMouseButton
|wsHandleMouseMove
,wsShowFrame
|wsHideWindow
,"MPlayer - Video" );
227 wsDestroyImage( &appMPlayer
.subWindow
);
228 wsCreateImage( &appMPlayer
.subWindow
,appMPlayer
.sub
.Bitmap
.Width
,appMPlayer
.sub
.Bitmap
.Height
);
229 wsXDNDMakeAwareness(&appMPlayer
.subWindow
);
234 vo_setwindow( appMPlayer
.subWindow
.WindowID
, appMPlayer
.subWindow
.wGC
);
236 // i=wsHideFrame|wsMaxSize|wsHideWindow;
237 // if ( appMPlayer.mainDecoration ) i=wsShowFrame|wsMaxSize|wsHideWindow;
238 i
=wsShowFrame
|wsMaxSize
|wsHideWindow
;
239 wsCreateWindow( &appMPlayer
.mainWindow
,
240 appMPlayer
.main
.x
,appMPlayer
.main
.y
,appMPlayer
.main
.width
,appMPlayer
.main
.height
,
241 wsNoBorder
,wsShowMouseCursor
|wsHandleMouseButton
|wsHandleMouseMove
,i
,"MPlayer" );
243 wsSetShape( &appMPlayer
.mainWindow
,appMPlayer
.main
.Mask
.Image
);
244 wsXDNDMakeAwareness(&appMPlayer
.mainWindow
);
247 mp_msg( MSGT_GPLAYER
,MSGL_DBG2
,"[main] Depth on screen: %d\n",wsDepthOnScreen
);
248 mp_msg( MSGT_GPLAYER
,MSGL_DBG2
,"[main] parent: 0x%x\n",(int)appMPlayer
.mainWindow
.WindowID
);
249 mp_msg( MSGT_GPLAYER
,MSGL_DBG2
,"[main] sub: 0x%x\n",(int)appMPlayer
.subWindow
.WindowID
);
252 appMPlayer
.mainWindow
.ReDraw
=(void *)mplMainDraw
;
253 appMPlayer
.mainWindow
.MouseHandler
=mplMainMouseHandle
;
254 appMPlayer
.mainWindow
.KeyHandler
=mplMainKeyHandle
;
255 appMPlayer
.mainWindow
.DandDHandler
=mplDandDHandler
;
257 appMPlayer
.subWindow
.ReDraw
=(void *)mplSubDraw
;
258 appMPlayer
.subWindow
.MouseHandler
=mplSubMouseHandle
;
259 appMPlayer
.subWindow
.KeyHandler
=mplMainKeyHandle
;
260 appMPlayer
.subWindow
.DandDHandler
=mplDandDHandler
;
262 wsSetBackgroundRGB( &appMPlayer
.subWindow
,appMPlayer
.sub
.R
,appMPlayer
.sub
.G
,appMPlayer
.sub
.B
);
263 wsClearWindow( appMPlayer
.subWindow
);
264 if ( appMPlayer
.sub
.Bitmap
.Image
) wsConvert( &appMPlayer
.subWindow
,appMPlayer
.sub
.Bitmap
.Image
,appMPlayer
.sub
.Bitmap
.ImageSize
);
266 btnModify( evSetVolume
,guiIntfStruct
.Volume
);
267 btnModify( evSetBalance
,guiIntfStruct
.Balance
);
268 btnModify( evSetMoviePosition
,guiIntfStruct
.Position
);
270 wsSetIcon( wsDisplay
,appMPlayer
.mainWindow
.WindowID
,guiIcon
,guiIconMask
);
271 wsSetIcon( wsDisplay
,appMPlayer
.subWindow
.WindowID
,guiIcon
,guiIconMask
);
273 guiIntfStruct
.Playing
=0;
275 if ( !appMPlayer
.mainDecoration
) wsWindowDecoration( &appMPlayer
.mainWindow
,0 );
277 wsVisibleWindow( &appMPlayer
.mainWindow
,wsShowWindow
);
279 wsVisibleWindow( &appMPlayer
.subWindow
,wsShowWindow
);
283 do { XNextEvent( wsDisplay
,&xev
); } while ( xev
.type
!= MapNotify
|| xev
.xmap
.event
!= appMPlayer
.subWindow
.WindowID
);
284 appMPlayer
.subWindow
.Mapped
=wsMapped
;
287 if ( !fullscreen
) fullscreen
=gtkLoadFullscreen
;
291 btnModify( evFullScreen
,btnPressed
);
294 if ( !fullscreen
) fullscreen
=gtkLoadFullscreen
;
295 if ( gtkShowVideoWindow
)
297 wsVisibleWindow( &appMPlayer
.subWindow
,wsShowWindow
);
300 do { XNextEvent( wsDisplay
,&xev
); } while ( xev
.type
!= MapNotify
|| xev
.xmap
.event
!= appMPlayer
.subWindow
.WindowID
);
301 appMPlayer
.subWindow
.Mapped
=wsMapped
;
307 btnModify( evFullScreen
,btnPressed
);
314 wsVisibleWindow( &appMPlayer
.subWindow
,wsShowWindow
);
317 do { XNextEvent( wsDisplay
,&xev
); } while ( xev
.type
!= MapNotify
|| xev
.xmap
.event
!= appMPlayer
.subWindow
.WindowID
);
318 appMPlayer
.subWindow
.Mapped
=wsMapped
;
320 wsVisibleWindow( &appMPlayer
.subWindow
, wsShowWindow
);
323 btnModify( evFullScreen
,btnPressed
);
330 if ( filename
) mplSetFileName( NULL
,filename
,STREAMTYPE_FILE
);
331 if ( plCurrent
&& !filename
) mplSetFileName( plCurrent
->path
,plCurrent
->name
,STREAMTYPE_FILE
);
332 if ( subdata
) guiSetFilename( guiIntfStruct
.Subtitlename
, subdata
->filename
);
333 #if defined( USE_OSD ) || defined( USE_SUB )
341 mp_msg( MSGT_GPLAYER
,MSGL_V
,"[gui] done.\n" );
345 gui_main_pos_x
=appMPlayer
.mainWindow
.X
; gui_main_pos_y
=appMPlayer
.mainWindow
.Y
;
346 gui_sub_pos_x
=appMPlayer
.subWindow
.X
; gui_sub_pos_y
=appMPlayer
.subWindow
.Y
;
366 extern ao_functions_t
* audio_out
;
367 extern vo_functions_t
* video_out
;
368 extern int frame_dropping
;
369 extern int stream_dump_type
;
370 extern int vcd_track
;
371 extern m_obj_settings_t
*vo_plugin_args
;
373 #if defined( USE_OSD ) || defined( USE_SUB )
374 void guiLoadFont( void )
377 load_font_ft(vo_image_width
, vo_image_height
);
382 if ( vo_font
->name
) free( vo_font
->name
);
383 if ( vo_font
->fpath
) free( vo_font
->fpath
);
385 if ( vo_font
->pic_a
[i
] )
387 if ( vo_font
->pic_a
[i
]->bmp
) free( vo_font
->pic_a
[i
]->bmp
);
388 if ( vo_font
->pic_a
[i
]->pal
) free( vo_font
->pic_a
[i
]->pal
);
391 if ( vo_font
->pic_b
[i
] )
393 if ( vo_font
->pic_b
[i
]->bmp
) free( vo_font
->pic_b
[i
]->bmp
);
394 if ( vo_font
->pic_b
[i
]->pal
) free( vo_font
->pic_b
[i
]->pal
);
396 free( vo_font
); vo_font
=NULL
;
400 vo_font
=read_font_desc( font_name
,font_factor
,0 );
401 if ( !vo_font
) mp_msg( MSGT_CPLAYER
,MSGL_ERR
,MSGTR_CantLoadFont
,font_name
);
405 font_name
=gstrdup( get_path( "font/font.desc" ) );
406 vo_font
=read_font_desc( font_name
,font_factor
,0 );
409 gfree( (void **)&font_name
); font_name
=gstrdup(MPLAYER_DATADIR
"/font/font.desc" );
410 vo_font
=read_font_desc( font_name
,font_factor
,0 );
418 extern mp_osd_obj_t
* vo_osd_list
;
420 extern char **sub_name
;
422 void guiLoadSubtitle( char * name
)
424 if ( guiIntfStruct
.Playing
== 0 )
426 guiIntfStruct
.SubtitleChanged
=1; //what is this for? (mw)
431 mp_msg( MSGT_GPLAYER
,MSGL_INFO
,"[gui] Delete subtitles.\n" );
438 mp_osd_obj_t
* osd
= vo_osd_list
;
441 if ( osd
->type
== OSDTYPE_SUBTITLE
) break;
444 if ( osd
&& osd
->flags
&OSDFLAG_VISIBLE
)
446 len
=osd
->stride
* ( osd
->bbox
.y2
- osd
->bbox
.y1
);
447 memset( osd
->bitmap_buffer
,0,len
);
448 memset( osd
->alpha_buffer
,0,len
);
454 mp_msg( MSGT_GPLAYER
,MSGL_INFO
,"[gui] Load subtitle: %s\n",name
);
455 subdata
=sub_read_file( gstrdup( name
), guiIntfStruct
.FPS
);
456 if ( !subdata
) mp_msg( MSGT_GPLAYER
,MSGL_ERR
,MSGTR_CantLoadSub
,name
);
457 sub_name
= (malloc(2 * sizeof(char*))); //when mplayer will be restarted
458 sub_name
[0] = strdup(name
); //sub_name[0] will be read
461 update_set_of_subtitles();
466 static void add_vop( char * str
)
468 mp_msg( MSGT_GPLAYER
,MSGL_STATUS
,"[gui] add video filter: %s\n",str
);
469 if ( vo_plugin_args
)
472 while ( vo_plugin_args
[i
].name
) if ( !gstrcmp( vo_plugin_args
[i
++].name
,str
) ) { i
=-1; break; }
474 { vo_plugin_args
=realloc( vo_plugin_args
,( i
+ 2 ) * sizeof( m_obj_settings_t
) ); vo_plugin_args
[i
].name
=strdup( str
);vo_plugin_args
[i
].attribs
= NULL
; vo_plugin_args
[i
+1].name
=NULL
; }
475 } else { vo_plugin_args
=malloc( 2 * sizeof( m_obj_settings_t
) ); vo_plugin_args
[0].name
=strdup( str
);vo_plugin_args
[0].attribs
= NULL
; vo_plugin_args
[1].name
=NULL
; }
478 static void remove_vop( char * str
)
482 if ( !vo_plugin_args
) return;
484 mp_msg( MSGT_GPLAYER
,MSGL_STATUS
,"[gui] remove video filter: %s\n",str
);
486 while ( vo_plugin_args
[n
++].name
); n
--;
490 while ( vo_plugin_args
[i
].name
) if ( !gstrcmp( vo_plugin_args
[i
++].name
,str
) ) { m
=i
- 1; break; }
494 if ( n
== 1 ) { free( vo_plugin_args
[0].name
);free( vo_plugin_args
[0].attribs
); free( vo_plugin_args
); vo_plugin_args
=NULL
; }
495 else { free( vo_plugin_args
[i
].name
);free( vo_plugin_args
[i
].attribs
); memcpy( &vo_plugin_args
[i
],&vo_plugin_args
[i
+ 1],( n
- i
) * sizeof( m_obj_settings_t
) ); }
500 int guiGetEvent( int type
,char * arg
)
502 stream_t
* stream
= (stream_t
*) arg
;
504 dvd_priv_t
* dvdp
= (dvd_priv_t
*) arg
;
510 guiIntfStruct
.event_struct
=(void *)arg
;
511 wsEvents( wsDisplay
,(XEvent
*)arg
,NULL
);
518 guiIntfStruct
.Playing
=1;
519 // if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow );
522 guiIntfStruct
.Playing
=0;
523 // if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow );
525 case guiSetPause
: guiIntfStruct
.Playing
=2; break;
533 if ( arg
) guiSetFilename( guiIntfStruct
.Filename
,arg
);
535 case guiSetAudioOnly
:
536 guiIntfStruct
.AudioOnly
=(int)arg
;
537 if ( (int)arg
) { guiIntfStruct
.NoWindow
=True
; wsVisibleWindow( &appMPlayer
.subWindow
,wsHideWindow
); }
538 else wsVisibleWindow( &appMPlayer
.subWindow
,wsShowWindow
);
541 guiIntfStruct
.demuxer
=(void *)arg
;
545 if ( !appMPlayer
.subWindow
.isFullScreen
)
547 wsResizeWindow( &appMPlayer
.subWindow
,vo_dwidth
,vo_dheight
);
548 wsMoveWindow( &appMPlayer
.subWindow
,True
,appMPlayer
.sub
.x
,appMPlayer
.sub
.y
);
550 guiIntfStruct
.MovieWidth
=vo_dwidth
;
551 guiIntfStruct
.MovieHeight
=vo_dheight
;
553 wsMoveWindow( &appMPlayer
.mainWindow
,0,0, vo_dheight
);
558 guiIntfStruct
.DVD
.titles
=dvdp
->vmg_file
->tt_srpt
->nr_of_srpts
;
559 guiIntfStruct
.DVD
.chapters
=dvdp
->vmg_file
->tt_srpt
->title
[dvd_title
].nr_of_ptts
;
560 guiIntfStruct
.DVD
.angles
=dvdp
->vmg_file
->tt_srpt
->title
[dvd_title
].nr_of_angles
;
561 guiIntfStruct
.DVD
.nr_of_audio_channels
=dvdp
->nr_of_channels
;
562 memcpy( guiIntfStruct
.DVD
.audio_streams
,dvdp
->audio_streams
,sizeof( dvdp
->audio_streams
) );
563 guiIntfStruct
.DVD
.nr_of_subtitles
=dvdp
->nr_of_subtitles
;
564 memcpy( guiIntfStruct
.DVD
.subtitles
,dvdp
->subtitles
,sizeof( dvdp
->subtitles
) );
565 guiIntfStruct
.DVD
.current_title
=dvd_title
+ 1;
566 guiIntfStruct
.DVD
.current_chapter
=dvd_chapter
+ 1;
567 guiIntfStruct
.DVD
.current_angle
=dvd_angle
+ 1;
568 guiIntfStruct
.Track
=dvd_title
+ 1;
572 guiIntfStruct
.StreamType
=stream
->type
;
573 switch( stream
->type
)
577 guiGetEvent( guiSetDVD
,(char *)stream
->priv
);
587 guiIntfStruct
.VCDTracks
=0;
590 for ( i
=1;i
< 100;i
++ )
591 if ( vcd_seek_to_track( stream
->priv
,i
) < 0 ) break;
592 vcd_seek_to_track( stream
->priv
,vcd_track
);
593 guiIntfStruct
.VCDTracks
=--i
;
601 printf( "cmd: %d\n",(int)arg
);
605 mplEventHandling( evExit
,0 );
607 case MP_CMD_VO_FULLSCREEN
:
608 mplEventHandling( evFullScreen
,0 );
611 mplEventHandling( guiCMDArray
[ (int)arg
- MP_CMD_GUI_EVENTS
- 1 ],0 );
615 mplEventHandling( evRedraw
,0 );
621 mixer_getvolume( &l
,&r
);
622 guiIntfStruct
.Volume
=(r
>l
?r
:l
);
623 if ( r
!= l
) guiIntfStruct
.Balance
=( ( r
- l
) + 100 ) * 0.5f
;
624 else guiIntfStruct
.Balance
=50.0f
;
625 btnModify( evSetVolume
,guiIntfStruct
.Volume
);
626 btnModify( evSetBalance
,guiIntfStruct
.Balance
);
629 case guiSetFileFormat
:
630 guiIntfStruct
.FileFormat
=(int)arg
;
634 guiIntfStruct
.sh_video
=arg
;
637 sh_video_t
* sh
= (sh_video_t
*)arg
;
638 guiIntfStruct
.FPS
=sh
->fps
;
641 if ( guiIntfStruct
.NoWindow
) wsVisibleWindow( &appMPlayer
.subWindow
,wsHideWindow
);
643 if ( guiIntfStruct
.StreamType
== STREAMTYPE_STREAM
) btnSet( evSetMoviePosition
,btnDisabled
);
644 else btnSet( evSetMoviePosition
,btnReleased
);
650 mixer_getvolume( &l
,&r
);
651 guiIntfStruct
.Volume
=(r
>l
?r
:l
);
652 if ( r
!= l
) guiIntfStruct
.Balance
=( ( r
- l
) + 100 ) * 0.5f
;
653 else guiIntfStruct
.Balance
=50.0f
;
654 btnModify( evSetVolume
,guiIntfStruct
.Volume
);
655 btnModify( evSetBalance
,guiIntfStruct
.Balance
);
658 if ( gtkEnableAudioEqualizer
)
665 eq
.channel
=i
; eq
.band
=j
; eq
.gain
=gtkEquChannels
[i
][j
];
666 gtkSet( gtkSetEqualizer
,0,&eq
);
671 if ( video_driver_list
&& !gstrcmp( video_driver_list
[0],"dxr3" ) && guiIntfStruct
.FileFormat
!= DEMUXER_TYPE_MPEG_PS
672 #ifdef USE_LIBAVCODEC
680 gtkMessageBox( GTK_MB_FATAL
,MSGTR_NEEDLAVCFAME
);
681 guiIntfStruct
.Playing
=0;
687 // if ( guiIntfStruct.Playing == 1 && guiIntfStruct.FilenameChanged )
688 if ( guiIntfStruct
.FilenameChanged
)
694 stream_cache_size
=-1;
700 wsPostRedisplay( &appMPlayer
.subWindow
);
702 case guiSetParameters
:
703 guiGetEvent( guiSetDefaults
,NULL
);
704 switch ( guiIntfStruct
.StreamType
)
706 case STREAMTYPE_PLAYLIST
:
712 sprintf( tmp
,"vcd://%d",guiIntfStruct
.Track
+ 1 );
713 guiSetFilename( guiIntfStruct
.Filename
,tmp
);
721 sprintf( tmp
,"dvd://%d",guiIntfStruct
.Title
);
722 guiSetFilename( guiIntfStruct
.Filename
,tmp
);
724 dvd_chapter
=guiIntfStruct
.Chapter
;
725 dvd_angle
=guiIntfStruct
.Angle
;
729 //if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST ) // Does not make problems anymore!
731 if ( guiIntfStruct
.Filename
) filename
=gstrdup( guiIntfStruct
.Filename
);
732 else if ( filename
) guiSetFilename( guiIntfStruct
.Filename
,filename
);
736 if ( !video_driver_list
)
739 while ( video_out_drivers
[i
++] )
740 if ( video_out_drivers
[i
- 1]->control( VOCTRL_GUISUPPORT
,NULL
) == VO_TRUE
)
742 gaddlist( &video_driver_list
,(char *)video_out_drivers
[i
- 1]->info
->short_name
);
747 if ( !video_driver_list
&& !video_driver_list
[0] ) { gtkMessageBox( GTK_MB_FATAL
,MSGTR_IDFGCVD
); exit_player( "gui init" ); }
751 guiIntfStruct
.NoWindow
=False
;
752 while ( video_out_drivers
[i
++] )
753 if ( video_out_drivers
[i
- 1]->control( VOCTRL_GUISUPPORT
,NULL
) == VO_TRUE
)
755 if ( ( video_driver_list
&& !gstrcmp( video_driver_list
[0],(char *)video_out_drivers
[i
- 1]->info
->short_name
) )&&( video_out_drivers
[i
- 1]->control( VOCTRL_GUI_NOWINDOW
,NULL
) == VO_TRUE
) )
756 { guiIntfStruct
.NoWindow
=True
; break; }
761 #ifdef USE_LIBAVCODEC
762 remove_vop( "lavc" );
765 remove_vop( "fame" );
767 if ( video_driver_list
&& !gstrcmp( video_driver_list
[0],"dxr3" ) )
769 if ( ( guiIntfStruct
.StreamType
!= STREAMTYPE_DVD
)&&( guiIntfStruct
.StreamType
!= STREAMTYPE_VCD
) )
771 #ifdef USE_LIBAVCODEC
772 if ( gtkVopLAVC
) add_vop( "lavc" );
775 if ( gtkVopFAME
) add_vop( "fame" );
781 if ( gtkVopPP
) add_vop( "pp" );
782 else remove_vop( "pp" );
785 // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; }
786 if ( gtkAONorm
) gset( &ao_plugin_cfg
.plugin_list
,"volnorm" );
787 if ( gtkEnableAudioEqualizer
) gset( &ao_plugin_cfg
.plugin_list
,"eq" );
788 if ( gtkAOExtraStereo
)
790 gset( &ao_plugin_cfg
.plugin_list
,"extrastereo" );
791 ao_plugin_cfg
.pl_extrastereo_mul
=gtkAOExtraStereoMul
;
794 mixer_device
=gstrdup( gtkAOOSSMixer
);
795 if ( audio_driver_list
&& !gstrncmp( audio_driver_list
[0],"oss",3 ) && gtkAOOSSDevice
)
797 char * tmp
= calloc( 1,strlen( gtkAOOSSDevice
) + 7 );
798 sprintf( tmp
,"oss:%s",gtkAOOSSDevice
);
799 gaddlist( &audio_driver_list
,tmp
);
803 if ( audio_driver_list
&& !gstrncmp( audio_driver_list
[0],"sdl",3 ) && gtkAOSDLDriver
)
805 char * tmp
= calloc( 1,strlen( gtkAOSDLDriver
) + 10 );
806 sprintf( tmp
,"sdl:%s",gtkAOSDLDriver
);
807 gaddlist( &audio_driver_list
,tmp
);
812 //subdata->filename=gstrdup( guiIntfStruct.Subtitlename );
814 if ( gtkSubDumpMPSub
) stream_dump_type
=4;
815 if ( gtkSubDumpSrt
) stream_dump_type
=6;
816 gtkSubDumpMPSub
=gtkSubDumpSrt
=0;
818 #if defined( USE_OSD ) || defined( USE_SUB )
823 if ( gtkCacheOn
) stream_cache_size
=gtkCacheSize
;
824 if ( gtkAutoSyncOn
) autosync
=gtkAutoSync
;
826 if ( guiIntfStruct
.AudioFile
) audio_stream
=gstrdup( guiIntfStruct
.AudioFile
);
827 else if ( guiIntfStruct
.FilenameChanged
) gfree( (void**)&audio_stream
);
830 guiIntfStruct
.DiskChanged
=0;
831 guiIntfStruct
.FilenameChanged
=0;
832 guiIntfStruct
.NewPlay
=0;
839 void guiEventHandling( void )
841 if ( !guiIntfStruct
.Playing
|| guiIntfStruct
.NoWindow
) wsHandleEvents();
847 float gtkEquChannels
[6][10];
849 plItem
* plCurrent
= NULL
;
850 plItem
* plList
= NULL
;
851 plItem
* plLastPlayed
= NULL
;
853 URLItem
*URLList
= NULL
;
855 char *fsHistory
[fsPersistant_MaxPos
] = { NULL
,NULL
,NULL
,NULL
,NULL
};
857 #if defined( MP_DEBUG ) && 0
860 plItem
* next
= plList
;
861 printf( "--- list ---\n" );
862 while( next
|| next
->next
)
864 printf( "item: %s/%s\n",next
->path
,next
->name
);
865 if ( next
->next
) next
=next
->next
; else break;
867 printf( "--- end of list ---\n" );
873 void * gtkSet( int cmd
,float fparam
, void * vparam
)
875 equalizer_t
* eq
= (equalizer_t
*)vparam
;
876 plItem
* item
= (plItem
*)vparam
;
878 URLItem
* url_item
= (URLItem
*)vparam
;
883 // --- handle playlist
884 case gtkAddPlItem
: // add item to playlist
887 plItem
* next
= plList
;
888 while ( next
->next
) { /*printf( "%s\n",next->name );*/ next
=next
->next
; }
889 next
->next
=item
; item
->prev
=next
;
890 } else { item
->prev
=item
->next
=NULL
; plCurrent
=plList
=item
; }
893 case gtkInsertPlItem
: // add item into playlist after current
896 plItem
* curr
= plCurrent
;
897 item
->next
=curr
->next
;
899 item
->next
->prev
=item
;
902 plCurrent
=plCurrent
->next
;
906 return gtkSet(gtkAddPlItem
,0,(void*)item
);
908 case gtkGetNextPlItem
: // get current item from playlist
909 if ( plCurrent
&& plCurrent
->next
)
911 plCurrent
=plCurrent
->next
;
912 /*if ( !plCurrent && plList )
914 plItem * next = plList;
915 while ( next->next ) { if ( !next->next ) break; next=next->next; }
921 case gtkGetPrevPlItem
:
922 if ( plCurrent
&& plCurrent
->prev
)
924 plCurrent
=plCurrent
->prev
;
925 //if ( !plCurrent && plList ) plCurrent=plList;
929 case gtkSetCurrPlItem
: // set current item
932 case gtkGetCurrPlItem
: // get current item
934 case gtkDelCurrPlItem
: // delete current item
936 plItem
* curr
= plCurrent
;
941 curr
->prev
->next
=curr
->next
;
943 curr
->next
->prev
=curr
->prev
;
946 plCurrent
=curr
->next
;
948 if ( curr
->path
) free( curr
->path
);
949 if ( curr
->name
) free( curr
->name
);
952 mplCurr(); // Instead of using mplNext && mplPrev
955 case gtkDelPl
: // delete list
957 plItem
* curr
= plList
;
959 if ( !plList
) return NULL
;
962 if ( curr
->path
) free( curr
->path
);
963 if ( curr
->name
) free( curr
->name
);
971 if ( curr
->path
) free( curr
->path
);
972 if ( curr
->name
) free( curr
->name
);
977 plList
=NULL
; plCurrent
=NULL
;
984 URLItem
* next_url
= URLList
;
986 while ( next_url
->next
)
988 if ( !gstrcmp( next_url
->url
,url_item
->url
) )
993 next_url
=next_url
->next
;
995 if ( ( !is_added
)&&( gstrcmp( next_url
->url
,url_item
->url
) ) ) next_url
->next
=url_item
;
996 } else { url_item
->next
=NULL
; URLList
=url_item
; }
999 #ifndef HAVE_FREETYPE
1000 case gtkSetFontFactor
:
1005 case gtkSetFontOutLine
:
1006 subtitle_font_thickness
=( 8.0f
/ 100.0f
) * fparam
;
1009 case gtkSetFontBlur
:
1010 subtitle_font_radius
=( 8.0f
/ 100.0f
) * fparam
;
1013 case gtkSetFontTextScale
:
1014 text_font_scale_factor
=fparam
;
1017 case gtkSetFontOSDScale
:
1018 osd_font_scale_factor
=fparam
;
1021 case gtkSetFontEncoding
:
1022 gfree( (void **)&subtitle_font_encoding
);
1023 subtitle_font_encoding
=gstrdup( (char *)vparam
);
1026 case gtkSetFontAutoScale
:
1027 subtitle_autoscale
=(int)fparam
;
1032 case gtkSetSubEncoding
:
1033 gfree( (void **)&sub_cp
);
1034 sub_cp
=gstrdup( (char *)vparam
);
1038 case gtkClearStruct
:
1039 if ( (unsigned int)vparam
& guiFilenames
)
1041 gfree( (void **)&guiIntfStruct
.Filename
);
1042 gfree( (void **)&guiIntfStruct
.Subtitlename
);
1043 gfree( (void **)&guiIntfStruct
.AudioFile
);
1044 gtkSet( gtkDelPl
,0,NULL
);
1047 if ( (unsigned int)vparam
& guiDVD
) memset( &guiIntfStruct
.DVD
,0,sizeof( guiDVDStruct
) );
1050 if ( (unsigned int)vparam
& guiVCD
) guiIntfStruct
.VCDTracks
=0;
1053 case gtkSetExtraStereo
:
1054 gtkAOExtraStereoMul
=fparam
;
1055 audio_plugin_extrastereo
.control( AOCONTROL_PLUGIN_ES_SET
,(void *)>kAOExtraStereoMul
);
1060 mp_cmd
=(mp_cmd_t
*)calloc( 1,sizeof( *mp_cmd
) );
1061 mp_cmd
->id
=MP_CMD_PANSCAN
; mp_cmd
->name
=strdup( "panscan" );
1062 mp_cmd
->args
[0].v
.f
=fparam
; mp_cmd
->args
[1].v
.i
=1;
1063 mp_input_queue_cmd( mp_cmd
);
1067 auto_quality
=(int)fparam
;
1069 // --- set equalizers
1070 case gtkSetContrast
:
1071 if ( guiIntfStruct
.sh_video
) set_video_colors( guiIntfStruct
.sh_video
,"contrast",(int)fparam
);
1073 case gtkSetBrightness
:
1074 if ( guiIntfStruct
.sh_video
) set_video_colors( guiIntfStruct
.sh_video
,"brightness",(int)fparam
);
1077 if ( guiIntfStruct
.sh_video
) set_video_colors( guiIntfStruct
.sh_video
,"hue",(int)fparam
);
1079 case gtkSetSaturation
:
1080 if ( guiIntfStruct
.sh_video
) set_video_colors( guiIntfStruct
.sh_video
,"saturation",(int)fparam
);
1082 case gtkSetEqualizer
:
1085 gtkEquChannels
[eq
->channel
][eq
->band
]=eq
->gain
;
1086 audio_plugin_eq
.control( AOCONTROL_PLUGIN_EQ_SET_GAIN
,(void *)eq
);
1090 int i
,j
; equalizer_t tmp
; tmp
.gain
=0.0f
;
1091 memset( gtkEquChannels
,0,sizeof( gtkEquChannels
) );
1093 for ( j
=0;j
<10;j
++ )
1094 { tmp
.channel
=i
; tmp
.band
=j
; audio_plugin_eq
.control( AOCONTROL_PLUGIN_EQ_SET_GAIN
,(void *)&tmp
); }
1101 #define mp_basename(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1))
1103 #include "../playtree.h"
1105 //This function adds/inserts one file into the gui playlist
1107 int import_file_into_gui(char* temp
, int insert
)
1109 char *filename
, *pathname
;
1112 filename
= strdup(mp_basename(temp
));
1113 pathname
= strdup(temp
);
1114 if (strlen(pathname
)-strlen(filename
)>0)
1115 pathname
[strlen(pathname
)-strlen(filename
)-1]='\0'; // We have some path so remove / at end
1117 pathname
[strlen(pathname
)-strlen(filename
)]='\0';
1118 mp_msg(MSGT_PLAYTREE
,MSGL_V
, "Adding filename %s && pathname %s\n",filename
,pathname
); //FIXME: Change to MSGL_DBG2 ?
1119 item
=calloc( 1,sizeof( plItem
) );
1122 item
->name
=filename
;
1123 item
->path
=pathname
;
1125 gtkSet( gtkInsertPlItem
,0,(void*)item
); // Inserts the item after current, and makes current=item
1127 gtkSet( gtkAddPlItem
,0,(void*)item
);
1132 // This function imports the initial playtree (based on cmd-line files) into the gui playlist
1134 // - overwriting gui pl (enqueue=0)
1135 // - appending it to gui pl (enqueue=1)
1137 int import_initial_playtree_into_gui(play_tree_t
* my_playtree
, m_config_t
* config
, int enqueue
)
1139 play_tree_iter_t
* my_pt_iter
=NULL
;
1142 if (!enqueue
) // Delete playlist before "appending"
1143 gtkSet(gtkDelPl
,0,0);
1145 if((my_pt_iter
=pt_iter_create(&my_playtree
,config
)))
1147 while ((filename
=pt_iter_get_next_file(my_pt_iter
))!=NULL
)
1149 if (import_file_into_gui(filename
, 0)) // Add it to end of list
1154 mplCurr(); // Update filename
1158 filename
=guiIntfStruct
.Filename
; // Backward compatibility; if file is specified on commandline,
1159 // gmplayer does directly start in Play-Mode.
1166 // This function imports and inserts an playtree, that is created "on the fly", for example by
1167 // parsing some MOV-Reference-File; or by loading an playlist with "File Open"
1169 // The file which contained the playlist is thereby replaced with it's contents.
1171 int import_playtree_playlist_into_gui(play_tree_t
* my_playtree
, m_config_t
* config
)
1173 play_tree_iter_t
* my_pt_iter
=NULL
;
1175 plItem
* save
=(plItem
*)gtkSet( gtkGetCurrPlItem
, 0, 0); // Save current item
1177 if((my_pt_iter
=pt_iter_create(&my_playtree
,config
)))
1179 while ((filename
=pt_iter_get_next_file(my_pt_iter
))!=NULL
)
1181 if (import_file_into_gui(filename
, 1)) // insert it into the list and set plCurrent=new item
1184 pt_iter_destroy(&my_pt_iter
);
1188 gtkSet(gtkSetCurrPlItem
, 0, (void*)save
);
1190 gtkSet(gtkSetCurrPlItem
, 0, (void*)plList
); // go to head, if plList was empty before
1193 gtkSet(gtkDelCurrPlItem
, 0, 0);
1195 mplCurr(); // Update filename