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

📄 play.c

📁 mplayer播放器的源码
💻 C
字号:
#include <inttypes.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <signal.h>#include "wm/ws.h"#include "wm/wsxdnd.h"#include "../config.h"#include "../help_mp.h"#include "../libvo/x11_common.h"#include "../libvo/video_out.h"#include "../input/input.h"#include "app.h"#include "wm/wskeys.h"#include "interface.h"#include "widgets.h"#include "gmplayer.h"#include "play.h"#include "skin/skin.h"#include "skin/font.h"#include "stream/stream.h"extern float rel_seek_secs;extern int abs_seek_pos;int mplGotoTheNext = 1;void mplFullScreen( void ){ if ( guiIntfStruct.NoWindow && guiIntfStruct.Playing ) return;  if ( ( guiIntfStruct.Playing )&&( appMPlayer.subWindow.isFullScreen ) )   {     appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight;     switch ( appMPlayer.sub.x )     {      case -1: appMPlayer.subWindow.OldX=( wsMaxX / 2 ) - ( appMPlayer.subWindow.OldWidth / 2 ) + wsOrgX; break;      case -2: appMPlayer.subWindow.OldX=wsMaxX - appMPlayer.subWindow.OldWidth + wsOrgX; break;      default: appMPlayer.subWindow.OldX=appMPlayer.sub.x; break;     }    switch ( appMPlayer.sub.y )     {      case -1: appMPlayer.subWindow.OldY=( wsMaxY / 2 ) - ( appMPlayer.subWindow.OldHeight / 2 ) + wsOrgY; break;      case -2: appMPlayer.subWindow.OldY=wsMaxY - appMPlayer.subWindow.OldHeight + wsOrgY; break;      default: appMPlayer.subWindow.OldY=appMPlayer.sub.y; break;     }   }  if ( guiIntfStruct.Playing || gtkShowVideoWindow ) wsFullScreen( &appMPlayer.subWindow );  fullscreen=vo_fs=appMPlayer.subWindow.isFullScreen;  wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen );  if ( appMPlayer.menuIsPresent ) wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen ); if ( guiIntfStruct.Playing ) wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 );  else wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B );}void mplEnd( void ){ plItem * next; if ( !mplGotoTheNext && guiIntfStruct.Playing) { mplGotoTheNext=1; return; } if ( guiIntfStruct.Playing && (next=gtkSet( gtkGetNextPlItem,0,NULL )) && plLastPlayed != next )  {   plLastPlayed=next;   guiSetDF( guiIntfStruct.Filename,next->path,next->name );   guiIntfStruct.StreamType=STREAMTYPE_FILE;   guiIntfStruct.FilenameChanged=guiIntfStruct.NewPlay=1;   gfree( (void **)&guiIntfStruct.AudioFile );   gfree( (void **)&guiIntfStruct.Subtitlename );  }   else    {     if ( guiIntfStruct.FilenameChanged || guiIntfStruct.NewPlay ) return;     guiIntfStruct.TimeSec=0;     guiIntfStruct.Position=0;     guiIntfStruct.AudioType=0;     guiIntfStruct.NoWindow=False;#ifdef USE_DVDREAD     guiIntfStruct.DVD.current_title=1;     guiIntfStruct.DVD.current_chapter=1;     guiIntfStruct.DVD.current_angle=1;#endif     if ( !appMPlayer.subWindow.isFullScreen && gtkShowVideoWindow)      {       wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height );       wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y );      }      else wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow );     guiGetEvent( guiCEvent,guiSetStop );     mplSubRender=1;     wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B );     wsClearWindow( appMPlayer.subWindow );     wsPostRedisplay( &appMPlayer.subWindow );    }}void mplPlay( void ){ if ( ( !guiIntfStruct.Filename )||      ( guiIntfStruct.Filename[0] == 0 )||      ( guiIntfStruct.Playing == 1 ) ) return; if ( guiIntfStruct.Playing == 2 ) { mplPause(); return; } guiGetEvent( guiCEvent,(void *)guiSetPlay ); mplSubRender=0; wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 ); wsClearWindow( appMPlayer.subWindow );}void mplPause( void ){ if ( !guiIntfStruct.Playing ) return; if ( guiIntfStruct.Playing == 1 )  {   mp_cmd_t * cmd = calloc( 1,sizeof( *cmd ) );   cmd->id=MP_CMD_PAUSE;   cmd->name=strdup("pause");   mp_input_queue_cmd(cmd);  } else guiIntfStruct.Playing=1;}void mplState( void ){ if ( ( guiIntfStruct.Playing == 0 )||( guiIntfStruct.Playing == 2 ) )  {   btnModify( evPlaySwitchToPause,btnReleased );   btnModify( evPauseSwitchToPlay,btnDisabled );  }  else   {    btnModify( evPlaySwitchToPause,btnDisabled );    btnModify( evPauseSwitchToPlay,btnReleased );   }}float mplGetPosition( void ){ // return 0.0 ... 100.0 return guiIntfStruct.Position;}void mplRelSeek( float s ){ // -+s rel_seek_secs=s; abs_seek_pos=0;}void mplAbsSeek( float s ){ // 0.0 ... 100.0 if ( guiIntfStruct.StreamType == STREAMTYPE_STREAM ) return; rel_seek_secs=0.01*s; abs_seek_pos=3;}listItems tmpList;void ChangeSkin( char * name ){ int ret; int prev = appMPlayer.menuIsPresent; int bprev = appMPlayer.barIsPresent; mainVisible=0;  appInitStruct( &tmpList ); skinAppMPlayer=&tmpList; fntFreeFont(); ret=skinRead( name ); appInitStruct( &tmpList ); skinAppMPlayer=&appMPlayer; appInitStruct( &appMPlayer ); if ( ret ) name=skinName; if ( skinRead( name ) )  {   mainVisible=1;   return;  }// --- reload menu window if ( prev && appMPlayer.menuIsPresent )  {   if ( mplMenuDrawBuffer ) free( mplMenuDrawBuffer );   if ( ( mplMenuDrawBuffer = calloc( 1,appMPlayer.menuBase.Bitmap.ImageSize ) ) == NULL )    { mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_NEMDB ); return; }   wsResizeWindow( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height );   wsResizeImage( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height );   wsSetShape( &appMPlayer.menuWindow,appMPlayer.menuBase.Mask.Image );   wsVisibleWindow( &appMPlayer.menuWindow,wsHideWindow );  } else { mplMenuInit(); }// --- reload sub window if ( appMPlayer.sub.Bitmap.Image ) wsResizeImage( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Width,appMPlayer.sub.Bitmap.Height ); if ( ( !appMPlayer.subWindow.isFullScreen )&&( !guiIntfStruct.Playing ) )  {   wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height );   wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y );  } if ( appMPlayer.sub.Bitmap.Image ) wsConvert( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Image,appMPlayer.sub.Bitmap.ImageSize ); if ( !guiIntfStruct.Playing )  {   mplSubRender=1;   wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B );   wsClearWindow( appMPlayer.subWindow );   wsPostRedisplay( &appMPlayer.subWindow );  }// --- reload play bar if ( bprev ) wsDestroyWindow( &appMPlayer.barWindow ); mplPBInit();// --- reload main window if ( mplDrawBuffer ) free( mplDrawBuffer ); if ( ( mplDrawBuffer = calloc( 1,appMPlayer.main.Bitmap.ImageSize ) ) == NULL )  { mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_NEMDB ); return; } wsDestroyWindow( &appMPlayer.mainWindow ); wsCreateWindow( &appMPlayer.mainWindow,   appMPlayer.main.x,appMPlayer.main.y,appMPlayer.main.width,appMPlayer.main.height,   wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsShowFrame|wsMaxSize|wsHideWindow,"MPlayer" ); wsCreateImage( &appMPlayer.mainWindow,appMPlayer.main.Bitmap.Width,appMPlayer.main.Bitmap.Height ); wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image ); wsSetIcon( wsDisplay,appMPlayer.mainWindow.WindowID,guiIcon,guiIconMask ); appMPlayer.mainWindow.ReDraw=(void *)mplMainDraw; appMPlayer.mainWindow.MouseHandler=mplMainMouseHandle; appMPlayer.mainWindow.KeyHandler=mplMainKeyHandle; appMPlayer.mainWindow.DandDHandler=mplDandDHandler; wsXDNDMakeAwareness( &appMPlayer.mainWindow ); if ( !appMPlayer.mainDecoration ) wsWindowDecoration( &appMPlayer.mainWindow,0 ); wsVisibleWindow( &appMPlayer.mainWindow,wsShowWindow ); mainVisible=1;// --- btnModify( evSetVolume,guiIntfStruct.Volume ); btnModify( evSetBalance,guiIntfStruct.Balance ); btnModify( evSetMoviePosition,guiIntfStruct.Position ); btnModify( evFullScreen,!appMPlayer.subWindow.isFullScreen ); wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen ); wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen ); }void mplSetFileName( char * dir,char * name,int type ){ if ( !name ) return;  if ( !dir ) guiSetFilename( guiIntfStruct.Filename,name )  else guiSetDF( guiIntfStruct.Filename,dir,name );// filename=guiIntfStruct.Filename; guiIntfStruct.StreamType=type; gfree( (void **)&guiIntfStruct.AudioFile ); 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; int      stop = 0;  if ( guiIntfStruct.Playing == 2 ) return; switch ( guiIntfStruct.StreamType )  {#ifdef USE_DVDREAD   case STREAMTYPE_DVD:	if ( --guiIntfStruct.DVD.current_chapter == 0 )	 {	  guiIntfStruct.DVD.current_chapter=1;	  if ( --guiIntfStruct.DVD.current_title <= 0 ) { guiIntfStruct.DVD.current_title=1; stop=1; }	 }	guiIntfStruct.Track=guiIntfStruct.DVD.current_title;	break;#endif#ifdef HAVE_VCD   case STREAMTYPE_VCD:	if ( --guiIntfStruct.Track == 0 ) { guiIntfStruct.Track=1; stop=1; }	break;#endif   default: 	if ( (prev=gtkSet( gtkGetPrevPlItem,0,NULL)) )	 {	  mplSetFileName( prev->path,prev->name,STREAMTYPE_FILE );	  mplGotoTheNext=0;	  break;	 }	return;  } if ( stop ) mplEventHandling( evStop,0 ); if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 );}void mplNext( void ){ int      stop = 0; plItem * next; if ( guiIntfStruct.Playing == 2 ) return; switch ( guiIntfStruct.StreamType )  {#ifdef USE_DVDREAD   case STREAMTYPE_DVD:	if ( guiIntfStruct.DVD.current_chapter++ == guiIntfStruct.DVD.chapters )	 {	  guiIntfStruct.DVD.current_chapter=1;	  if ( ++guiIntfStruct.DVD.current_title > guiIntfStruct.DVD.titles ) { guiIntfStruct.DVD.current_title=guiIntfStruct.DVD.titles; stop=1; }	 }	guiIntfStruct.Track=guiIntfStruct.DVD.current_title;	break;#endif#ifdef HAVE_VCD   case STREAMTYPE_VCD:	if ( ++guiIntfStruct.Track > guiIntfStruct.VCDTracks ) { guiIntfStruct.Track=guiIntfStruct.VCDTracks; stop=1; }	break;#endif   default:	if ( (next=gtkSet( gtkGetNextPlItem,0,NULL)) ) 	 { 	  mplSetFileName( next->path,next->name,STREAMTYPE_FILE );	  mplGotoTheNext=0;	  break;	 }	return;  } if ( stop ) mplEventHandling( evStop,0 ); if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 );}

⌨️ 快捷键说明

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