Mercurial > mplayer.hg
view gui/mplayer/play.c @ 33554:02d94048970e
build: Only compile DLL loader test program under x86_32.
author | diego |
---|---|
date | Sat, 18 Jun 2011 10:33:30 +0000 |
parents | 55b8f5d5df15 |
children | c5a19bbeac2b |
line wrap: on
line source
/* * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with MPlayer; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include <stdlib.h> #include <string.h> #include "play.h" #include "gmplayer.h" #include "gui/app.h" #include "gui/interface.h" #include "gui/skin/font.h" #include "gui/skin/skin.h" #include "gui/wm/wsxdnd.h" #include "widgets.h" #include "config.h" #include "help_mp.h" #include "input/input.h" #include "libmpcodecs/vd.h" #include "libvo/video_out.h" #include "mp_core.h" #include "stream/stream.h" 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 CONFIG_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); } } void mplRelSeek(float sec) { rel_seek_secs = sec; abs_seek_pos = 0; } void mplAbsSeek(float percent) { if (guiIntfStruct.StreamType == STREAMTYPE_STREAM) return; rel_seek_secs = percent / 100.0; abs_seek_pos = 3; } void ChangeSkin(char *name) { int prev, bprev; prev = appMPlayer.menuIsPresent; bprev = appMPlayer.barIsPresent; mainVisible = 0; if (skinRead(name) != 0) { if (skinRead(skinName) != 0) { mainVisible = 1; return; } } // reload menu window if (prev && appMPlayer.menuIsPresent) { free(mplMenuDrawBuffer); mplMenuDrawBuffer = calloc(1, appMPlayer.menu.Bitmap.ImageSize); if (!mplMenuDrawBuffer) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_NEMDB); guiExit(EXIT_ERROR); } wsResizeWindow(&appMPlayer.menuWindow, appMPlayer.menu.width, appMPlayer.menu.height); wsResizeImage(&appMPlayer.menuWindow, appMPlayer.menu.width, appMPlayer.menu.height); wsSetShape(&appMPlayer.menuWindow, appMPlayer.menu.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); 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 free(mplDrawBuffer); mplDrawBuffer = calloc(1, appMPlayer.main.Bitmap.ImageSize); if (!mplDrawBuffer) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_NEMDB); guiExit(EXIT_ERROR); } 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); 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) 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 CONFIG_DVDREAD case STREAMTYPE_DVD: break; #endif #ifdef CONFIG_VCD case STREAMTYPE_VCD: break; #endif default: curr = gtkSet(gtkGetCurrPlItem, 0, NULL); if (curr) { 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 CONFIG_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 CONFIG_VCD case STREAMTYPE_VCD: if (--guiIntfStruct.Track == 0) { guiIntfStruct.Track = 1; stop = 1; } break; #endif default: prev = gtkSet(gtkGetPrevPlItem, 0, NULL); if (prev) { 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 CONFIG_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 CONFIG_VCD case STREAMTYPE_VCD: if (++guiIntfStruct.Track >= guiIntfStruct.VCDTracks) { guiIntfStruct.Track = guiIntfStruct.VCDTracks; if (guiIntfStruct.VCDTracks > 1) guiIntfStruct.Track--; stop = 1; } break; #endif default: next = gtkSet(gtkGetNextPlItem, 0, NULL); if (next) { mplSetFileName(next->path, next->name, STREAMTYPE_FILE); mplGotoTheNext = 0; break; } return; } if (stop) mplEventHandling(evStop, 0); if (guiIntfStruct.Playing == 1) mplEventHandling(evPlay, 0); } void mplStop(void) { mplEventHandling(evStop, 0); }