summaryrefslogtreecommitdiff
path: root/player.c
diff options
context:
space:
mode:
authorchriszero <zerov83@gmail.com>2015-01-11 15:14:03 +0100
committerchriszero <zerov83@gmail.com>2015-01-11 15:14:03 +0100
commit508ba3458094f0c30b278cc05abc626b6f3940e0 (patch)
tree12592e3fb841f80ad1c61d07b3f9242ad94d2cbe /player.c
parenta9dd0c6a322f139e03a0ba4570e2a78508ddd6c3 (diff)
downloadvdr-plugin-plex-508ba3458094f0c30b278cc05abc626b6f3940e0.tar.gz
vdr-plugin-plex-508ba3458094f0c30b278cc05abc626b6f3940e0.tar.bz2
Removed Mplayer support.
Added HLS Streaming Player for directly play in VDR
Diffstat (limited to 'player.c')
-rw-r--r--player.c984
1 files changed, 0 insertions, 984 deletions
diff --git a/player.c b/player.c
deleted file mode 100644
index 56cb827..0000000
--- a/player.c
+++ /dev/null
@@ -1,984 +0,0 @@
-///
-/// @file player.c @brief A play plugin for VDR.
-///
-/// Copyright (c) 2012, 2013 by Johns. All Rights Reserved.
-///
-/// Contributor(s): Dennis Bendlin
-///
-/// License: AGPLv3
-///
-/// This program is free software: you can redistribute it and/or modify
-/// it under the terms of the GNU Affero General Public License as
-/// published by the Free Software Foundation, either version 3 of the
-/// License.
-///
-/// This program 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 Affero General Public License for more details.
-///
-/// $Id: 23f35b1a9358694e2b022aed1eff081887bc3f16 $
-//////////////////////////////////////////////////////////////////////////////
-
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <poll.h>
-#include <pthread.h>
-
-#include <libintl.h>
-#define _(str) gettext(str) ///< gettext shortcut
-#define _N(str) str ///< gettext_noop shortcut
-
-#include "player.h"
-#include "video.h"
-#include "misc.h"
-
-//////////////////////////////////////////////////////////////////////////////
-
-const char *ConfigBrowserRoot = "/"; ///< browser starting point
-
-static char ConfigOsdOverlay; ///< show osd overlay
-static char ConfigUseSlave; ///< external player use slave mode
-static char ConfigFullscreen; ///< external player uses fullscreen
-static char *ConfigVideoOut; ///< video out device
-static char *ConfigAudioOut; ///< audio out device
-static char *ConfigAudioMixer; ///< audio mixer device
-static char *ConfigMixerChannel; ///< audio mixer channel
-static const char *ConfigMplayer = "/usr/bin/mplayer"; ///< mplayer executable
-static const char *ConfigMplayerArguments; ///< extra mplayer arguments
-static const char *ConfigX11Display = ":0.0"; ///< x11 display
-
- /// DVD-Drive for mplayer
-static const char *ConfigMplayerDevice = "/dev/dvd";
-static uint32_t ConfigColorKey = 0x00020507; ///< color key
-
-//////////////////////////////////////////////////////////////////////////////
-// Osd
-//////////////////////////////////////////////////////////////////////////////
-
-/**
-** Open OSD.
-*/
-void OsdOpen(void)
-{
- Debug(3, "plex: %s\n", __FUNCTION__);
-
- VideoWindowShow();
-}
-
-/**
-** Close OSD.
-*/
-void OsdClose(void)
-{
- Debug(3, "plex: %s\n", __FUNCTION__);
-
- VideoWindowHide();
- VideoWindowClear();
-}
-
-/**
-** Clear OSD.
-*/
-void OsdClear(void)
-{
- Debug(3, "plex: %s\n", __FUNCTION__);
-
- VideoWindowClear();
-}
-
-/**
-** Get OSD size and aspect.
-**
-** @param width[OUT] width of OSD
-** @param height[OUT] height of OSD
-** @param aspect[OUT] aspect ratio (4/3, 16/9, ...) of OSD
-*/
-void GetOsdSize(int *width, int *height, double *aspect)
-{
- VideoGetOsdSize(width, height);
- *aspect = 16.0 / 9.0 / (double)*width * (double)*height;
-}
-
-/**
-** Draw osd pixmap
-*/
-void OsdDrawARGB(int x, int y, int w, int h, const uint8_t * argb)
-{
- Debug(3, "plex: %s %d,%d %d,%d\n", __FUNCTION__, x, y, w, h);
-
- VideoDrawARGB(x, y, w, h, argb);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// External player
-//////////////////////////////////////////////////////////////////////////////
-
-static pid_t PlayerPid; ///< player pid
-static pthread_t PlayerThread; ///< player decode thread
-
-static char PlayerPipeBuf[4096]; ///< pipe buffer
-static int PlayerPipeCnt; ///< pipe buffer count
-static int PlayerPipeIdx; ///< pipe buffer index
-static int PlayerPipeOut[2]; ///< player write pipe
-static int PlayerPipeIn[2]; ///< player read pipe
-
-static int PlayerVolume = -1; ///< volume 0 - 100
-
-char PlayerDvdNav; ///< dvdnav active
-char PlayerPaused; ///< player paused
-char PlayerSpeed; ///< player playback speed
-int PlayerCurrent; ///< current postion in seconds
-int PlayerTotal; ///< total length in seconds
-char PlayerTitle[256]; ///< title from meta data
-char PlayerFilename[256]; ///< filename
-
-//////////////////////////////////////////////////////////////////////////////
-// Slave
-//////////////////////////////////////////////////////////////////////////////
-
-/**
-** Parse player output.
-**
-** @param data line pointer (\0 terminated)
-** @param size line length
-*/
-static void PlayerParseLine(const char *data, int size)
-{
- Debug(4, "play/parse: |%.*s|\n", size, data);
- (void)size;
-
- // data is \0 terminated
- if (!strncasecmp(data, "DVDNAV_TITLE_IS_MENU", 20)) {
- PlayerDvdNav = 1;
- } else if (!strncasecmp(data, "DVDNAV_TITLE_IS_MOVIE", 21)) {
- PlayerDvdNav = 2;
- } else if (!strncasecmp(data, "ID_DVD_VOLUME_ID=", 17)) {
- Debug(3, "DVD_VOLUME = %s\n", data + 17);
- } else if (!strncasecmp(data, "ID_AID_", 7)) {
- char lang[64];
- int aid;
-
- if (sscanf(data, "ID_AID_%d_LANG=%s", &aid, lang) == 2) {
- Debug(3, "AID(%d) = %s\n", aid, lang);
- }
- } else if (!strncasecmp(data, "ID_SID_", 7)) {
- char lang[64];
- int sid;
-
- if (sscanf(data, "ID_SID_%d_LANG=%s", &sid, lang) == 2) {
- Debug(3, "SID(%d) = %s\n", sid, lang);
- }
- } else if (!strncasecmp(data, "ANS_META_TITLE=", 14)) {
- if (sscanf(data, "ANS_META_TITLE='%[^\t\n]", PlayerTitle) == 1) {
- PlayerTitle[strlen(PlayerTitle) - 1] = 0;
- Debug(3, "PlayerTitle= %s\n", PlayerTitle);
- }
- } else if (!strncasecmp(data, "ANS_FILENAME=", 12)) {
- if (sscanf(data, "ANS_FILENAME='%[^\t\n]", PlayerFilename) == 1) {
- PlayerFilename[strlen(PlayerFilename) - 1] = 0;
- Debug(3, "PlayerFilename= %s\n", PlayerFilename);
- }
- } else if (!strncasecmp(data, "ANS_LENGTH=", 10)) {
- if (sscanf(data, "ANS_LENGTH=%d", &PlayerTotal) == 1) {
- Debug(3, "PlayerTotal=%d\n", PlayerTotal);
- }
- } else if (!strncasecmp(data, "ANS_TIME_POSITION=", 17)) {
- if (sscanf(data, "ANS_TIME_POSITION=%d", &PlayerCurrent) == 1) {
- Debug(3, "PlayerCurrent=%d\n", PlayerCurrent);
- }
- }
-}
-
-/**
-** Poll input pipe.
-*/
-static void PlayerPollPipe(void)
-{
- struct pollfd poll_fds[1];
- int n;
- int i;
- int l;
-
- // check if something to read
- poll_fds[0].fd = PlayerPipeOut[0];
- poll_fds[0].events = POLLIN;
-
- switch (poll(poll_fds, 1, 0)) {
- case 0: // timeout
- return;
- case -1: // error
- Error(_("play/player: poll failed: %s\n"), strerror(errno));
- return;
- default: // ready
- break;
- }
-
- // fill buffer
- if ((n = read(PlayerPipeOut[0], PlayerPipeBuf + PlayerPipeCnt,
- sizeof(PlayerPipeBuf) - PlayerPipeCnt)) < 0) {
- Error(_("play/player: read failed: %s\n"), strerror(errno));
- return;
- }
-
- PlayerPipeCnt += n;
- l = 0;
- for (i = PlayerPipeIdx; i < PlayerPipeCnt; ++i) {
- if (PlayerPipeBuf[i] == '\n') {
- PlayerPipeBuf[i] = '\0';
- PlayerParseLine(PlayerPipeBuf + PlayerPipeIdx, i - PlayerPipeIdx);
- PlayerPipeIdx = i + 1;
- l = PlayerPipeIdx;
- }
- }
-
- if (l) { // remove consumed bytes
- if (PlayerPipeCnt - l) {
- memmove(PlayerPipeBuf, PlayerPipeBuf + l, PlayerPipeCnt - l);
- }
- PlayerPipeCnt -= l;
- PlayerPipeIdx -= l;
- } else if (PlayerPipeCnt == sizeof(PlayerPipeBuf)) {
- // no '\n' in buffer use it as single line
- PlayerPipeBuf[sizeof(PlayerPipeBuf) - 1] = '\0';
- PlayerParseLine(PlayerPipeBuf + PlayerPipeIdx, PlayerPipeCnt);
- PlayerPipeIdx = 0;
- PlayerPipeCnt = 0;
- }
-}
-
-#define MPLAYER_MAX_ARGS 64 ///< number of arguments supported
-
-/**
-** Execute external player.
-**
-** @param filename path and name of file to play
-*/
-static void PlayerExec(const char *filename)
-{
- const char *args[MPLAYER_MAX_ARGS];
- int argn;
- char wid_buf[32];
- char volume_buf[32];
- int i;
-
- if (ConfigUseSlave) { // connect pipe to stdin/stdout
- dup2(PlayerPipeIn[0], STDIN_FILENO);
- close(PlayerPipeIn[0]);
- close(PlayerPipeIn[1]);
- close(PlayerPipeOut[0]);
- dup2(PlayerPipeOut[1], STDOUT_FILENO);
- dup2(PlayerPipeOut[1], STDERR_FILENO);
- close(PlayerPipeOut[1]);
- }
- // close all file handles
- for (i = getdtablesize() - 1; i > STDERR_FILENO; i--) {
- close(i);
- }
-
- // export DISPLAY=
-
- args[0] = ConfigMplayer;
- args[1] = "-quiet";
- args[2] = "-msglevel";
- // FIXME: play with the options
-#ifdef DEBUG
- args[3] = "all=6:global=4:cplayer=4:identify=4";
-#else
- args[3] = "all=2:global=4:cplayer=2:identify=4";
-#endif
- if (ConfigOsdOverlay) {
- args[4] = "-noontop";
- } else {
- args[4] = "-ontop";
- }
- args[5] = "-noborder";
- if (ConfigDisableRemote) {
- args[6] = "-lirc";
- } else {
- args[6] = "-nolirc";
- }
- args[7] = "-nojoystick"; // disable all unwanted inputs
- args[8] = "-noar";
- args[9] = "-nomouseinput";
- args[10] = "-nograbpointer";
- args[11] = "-noconsolecontrols";
- args[12] = "-fixed-vo";
- args[13] = "-sid"; // subtitle selection
- args[14] = "0";
- args[15] = "-slang";
- args[16] = "de,en"; // FIXME: use VDR config
- args[17] = "-alang";
- args[18] = "de,en"; // FIXME: use VDR config
- argn = 19;
- if (ConfigMplayerDevice) { // dvd-device
- args[argn++] = "-dvd-device";
- args[argn++] = ConfigMplayerDevice;
- }
- if (!strncasecmp(filename, "cdda://", 7)) {
- args[argn++] = "-cache"; // cdrom needs cache
- args[argn++] = "1000";
- } else {
- args[argn++] = "-nocache"; // dvdnav needs nocache
- }
- if (ConfigUseSlave) {
- args[argn++] = "-slave";
- //args[argn++] = "-idle";
- }
- if (ConfigOsdOverlay) { // no mplayer osd with overlay
- args[argn++] = "-osdlevel";
- args[argn++] = "0";
- }
- if (ConfigFullscreen) {
- args[argn++] = "-fs";
- args[argn++] = "-zoom";
- } else {
- args[argn++] = "-nofs";
- }
- if (VideoGetPlayWindow()) {
- snprintf(wid_buf, sizeof(wid_buf), "%d", VideoGetPlayWindow());
- args[argn++] = "-wid";
- args[argn++] = wid_buf;
- }
- if (ConfigVideoOut) {
- args[argn++] = "-vo";
- args[argn++] = ConfigVideoOut;
- // add options based on selected video out
- if (!strncmp(ConfigVideoOut, "vdpau", 5)) {
- args[argn++] = "-vc";
- args[argn++] =
- "ffmpeg12vdpau,ffwmv3vdpau,ffvc1vdpau,ffh264vdpau,ffodivxvdpau,";
- } else if (!strncmp(ConfigVideoOut, "vaapi", 5)) {
- args[argn++] = "-va";
- args[argn++] = "vaapi";
- }
- }
- if (ConfigAudioOut) {
- args[argn++] = "-ao";
- args[argn++] = ConfigAudioOut;
- // FIXME: -ac hwac3,hwdts,hwmpa,
- }
- if (ConfigAudioMixer) {
- args[argn++] = "-mixer";
- args[argn++] = ConfigAudioMixer;
- }
- if (ConfigMixerChannel) {
- args[argn++] = "-mixer-channel";
- args[argn++] = ConfigMixerChannel;
- }
- if (ConfigX11Display) {
- args[argn++] = "-display";
- args[argn++] = ConfigX11Display;
- }
- if (PlayerVolume != -1) {
- // FIXME: here could be a problem with LANG
- snprintf(volume_buf, sizeof(volume_buf), "%.2f",
- (PlayerVolume * 100.0) / 255);
- args[argn++] = "-volume";
- args[argn++] = volume_buf;
- }
- // split X server arguments string into words
- if (ConfigMplayerArguments) {
- const char *sval;
- char *buf;
- char *s;
-
- sval = ConfigMplayerArguments;
-#ifndef __FreeBSD__
- s = buf = strdupa(sval);
-#else
- s = buf = alloca(strlen(sval) + 1);
- strcpy(buf, sval);
-#endif
- while ((sval = strsep(&s, " \t"))) {
- args[argn++] = sval;
-
- if (argn == MPLAYER_MAX_ARGS - 3) { // argument overflow
- Error(_("play: too many arguments for mplayer\n"));
- // argn = 1;
- break;
- }
- }
- }
- args[argn++] = "--";
- args[argn++] = filename;
- args[argn] = NULL;
-#ifdef DEBUG
- if (argn + 1 >= (int)(sizeof(args) / sizeof(*args))) {
- Debug(3, "play: too many arguments %d\n", argn);
- }
- for (i = 0; i < argn; ++i) {
- Debug(3, "%s", args[i]);
- }
-#endif
-
- execvp(args[0], (char *const *)args);
-
- // shouldn't be reached
- Error(_("play: execvp of '%s' failed: %s\n"), args[0], strerror(errno));
- exit(-1);
-}
-
-/**
-** Execute external player.
-**
-** @param filename path and name of file to play
-*/
-static void PlayerForkAndExec(const char *filename)
-{
- pid_t pid;
-
- if (ConfigUseSlave) {
- if (pipe(PlayerPipeIn)) {
- Error(_("play: pipe failed: %s\n"), strerror(errno));
- return;
- }
- if (pipe(PlayerPipeOut)) {
- Error(_("play: pipe failed: %s\n"), strerror(errno));
- return;
- }
- }
-
- if ((pid = fork()) == -1) {
- Error(_("play: fork failed: %s\n"), strerror(errno));
- return;
- }
- if (!pid) { // child
- PlayerExec(filename);
- return;
- }
- PlayerPid = pid; // parent
- setpgid(pid, 0);
-
- if (ConfigUseSlave) {
- close(PlayerPipeIn[0]);
- close(PlayerPipeOut[1]);
- }
-
- Debug(3, "play: child pid=%d\n", pid);
-}
-
-/**
-** Close pipes.
-*/
-static void PlayerClosePipes(void)
-{
- if (ConfigUseSlave) {
- if (PlayerPipeIn[0] != -1) {
- close(PlayerPipeIn[0]);
- }
- if (PlayerPipeOut[1] != -1) {
- close(PlayerPipeOut[1]);
- }
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Thread
-//////////////////////////////////////////////////////////////////////////////
-
-/**
-** External player handler thread.
-**
-** @param dummy dummy pointer
-*/
-static void *PlayerHandlerThread(void *dummy)
-{
- Debug(3, "play: player thread started\n");
-
- // Need: thread for video poll: while (PlayerIsRunning())
- for (;;) {
- if (ConfigUseSlave && PlayerIsRunning()) {
- PlayerPollPipe();
- // FIXME: wait only if pipe not ready
- }
- if (ConfigOsdOverlay) {
- VideoPollEvents(10);
- } else {
- usleep(10 * 1000);
- }
- }
-
- Debug(3, "play: player thread stopped\n");
- PlayerThread = 0;
-
- return dummy;
-}
-
-/**
-** Initialize player threads.
-*/
-static void PlayerThreadInit(void)
-{
- pthread_create(&PlayerThread, NULL, PlayerHandlerThread, NULL);
- //pthread_setname_np(PlayerThread, "play player");
-}
-
-/**
-** Exit and cleanup player threads.
-*/
-static void PlayerThreadExit(void)
-{
- if (PlayerThread) {
- void *retval;
-
- Debug(3, "play: player thread canceled\n");
- if (pthread_cancel(PlayerThread)) {
- Error(_("play: can't queue cancel player thread\n"));
- }
- if (pthread_join(PlayerThread, &retval) || retval != PTHREAD_CANCELED) {
- Error(_("play: can't cancel player thread\n"));
- }
- PlayerThread = 0;
- }
-}
-
-/**
-** Send command to player.
-**
-** @param formst printf format string
-*/
-static void SendCommand(const char *format, ...)
-{
- va_list va;
- char buf[256];
- int n;
-
- if (!PlayerPid) {
- return;
- }
- if (PlayerPipeIn[1] == -1) {
- Error(_("play: no pipe to send command available\n"));
- return;
- }
- va_start(va, format);
- n = vsnprintf(buf, sizeof(buf), format, va);
- va_end(va);
-
- Debug(3, "play: send '%.*s'\n", n - 1, buf);
-
- // FIXME: poll pipe if ready
- if (write(PlayerPipeIn[1], buf, n) != n) {
- fprintf(stderr, "play: write failed\n");
- }
-}
-
-/**
-** Send player quit.
-*/
-void PlayerSendQuit(void)
-{
- if (ConfigUseSlave) {
- SendCommand("quit\n");
- }
-}
-
-/**
-** Send player pause.
-*/
-void PlayerSendPause(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pause\n");
- }
-}
-
-/**
-** Send player speed_set.
-**
-** @param speed mplayer speed
-*/
-void PlayerSendSetSpeed(int speed)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep speed_set %d\n", speed);
- }
-}
-
-/**
-** Send player seek.
-**
-** @param seconds seek in seconds relative to current position
-*/
-void PlayerSendSeek(int seconds)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep seek %+d 0\n", seconds);
- }
-}
-
-/**
-** Send player volume.
-*/
-void PlayerSendVolume(void)
-{
- if (ConfigUseSlave) {
- // FIXME: %.2f could have a problem with LANG
- SendCommand("pausing_keep volume %.2f 1\n",
- (PlayerVolume * 100.0) / 255);
- }
-}
-
-/**
-** Send switch audio track.
-*/
-void PlayerSendSwitchAudio(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep switch_audio\n");
- }
-}
-
-/**
-** Send select subtitle.
-*/
-void PlayerSendSubSelect(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep sub_select\n");
- }
-}
-
-/**
-** Send up for dvdnav.
-*/
-void PlayerSendDvdNavUp(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav up\n");
- }
-}
-
-/**
-** Send down for dvdnav.
-*/
-void PlayerSendDvdNavDown(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav down\n");
- }
-}
-
-/**
-** Send left for dvdnav.
-*/
-void PlayerSendDvdNavLeft(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav left\n");
- }
-}
-
-/**
-** Send right for dvdnav.
-*/
-void PlayerSendDvdNavRight(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav right\n");
- }
-}
-
-/**
-** Send select for dvdnav.
-*/
-void PlayerSendDvdNavSelect(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav select\n");
- }
-}
-
-/**
-** Send prev for dvdnav.
-*/
-void PlayerSendDvdNavPrev(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav prev\n");
- }
-}
-
-/**
-** Send menu for dvdnav.
-*/
-void PlayerSendDvdNavMenu(void)
-{
- if (ConfigUseSlave) {
- SendCommand("pausing_keep dvdnav menu\n");
- }
-}
-
-/**
-** Get length in seconds.
-*/
-void PlayerGetLength(void)
-{
- if (ConfigUseSlave) {
- SendCommand("get_time_length\n");
- }
-}
-
-/**
-** Get current position in seconds.
-*/
-void PlayerGetCurrentPosition(void)
-{
- if (ConfigUseSlave) {
- SendCommand("get_time_pos\n");
- }
-}
-
-/**
-** Get title from meta data.
-*/
-void PlayerGetMetaTitle(void)
-{
- if (ConfigUseSlave) {
- SendCommand("get_meta_title\n");
- }
-}
-
-/**
-** Get filename.
-*/
-void PlayerGetFilename(void)
-{
- if (ConfigUseSlave) {
- SendCommand("get_file_name\n");
- }
-}
-
-/**
-** Start external player.
-**
-** @param filename path and name of file to play
-*/
-void PlayerStart(const char *filename)
-{
- PlayerPipeCnt = 0; // reset to defaults
- PlayerPipeIdx = 0;
-
- PlayerPipeIn[0] = -1;
- PlayerPipeIn[1] = -1;
- PlayerPipeOut[0] = -1;
- PlayerPipeOut[1] = -1;
- PlayerPid = 0;
-
- PlayerPaused = 0;
- PlayerSpeed = 1;
-
- PlayerDvdNav = 0;
-
- if (ConfigOsdOverlay) { // overlay wanted
- VideoSetColorKey(ConfigColorKey);
- VideoInit(ConfigX11Display);
- EnableDummyDevice();
- }
- PlayerForkAndExec(filename);
-
- if (ConfigOsdOverlay || ConfigUseSlave) {
- PlayerThreadInit();
- }
-}
-
-/**
-** Stop external player.
-*/
-void PlayerStop(void)
-{
- PlayerThreadExit();
-
- //
- // stop mplayer, if it is still running.
- //
- if (PlayerIsRunning()) {
- int waittime;
- int timeout;
-
- waittime = 0;
- timeout = 500; // 0.5s
-
- kill(PlayerPid, SIGTERM);
- // wait for player finishing, with timeout
- while (PlayerIsRunning() && waittime++ < timeout) {
- usleep(1 * 1000);
- }
- if (PlayerIsRunning()) { // still running
- waittime = 0;
- timeout = 500; // 0.5s
-
- kill(PlayerPid, SIGKILL);
- // wait for player finishing, with timeout
- while (PlayerIsRunning() && waittime++ < timeout) {
- usleep(1 * 1000);
- }
- if (PlayerIsRunning()) {
- Error(_("play: can't stop player\n"));
- }
- }
- }
- PlayerPid = 0;
- PlayerClosePipes();
-
- if (ConfigOsdOverlay) {
- DisableDummyDevice();
- VideoExit();
- }
-}
-
-/**
-** Is external player still running?
-*/
-int PlayerIsRunning(void)
-{
- pid_t wpid;
- int status;
-
- if (!PlayerPid) { // no player
- return 0;
- }
-
- wpid = waitpid(PlayerPid, &status, WNOHANG);
- if (wpid <= 0) {
- return 1;
- }
- if (WIFEXITED(status)) {
- Debug(3, "play: player exited (%d)\n", WEXITSTATUS(status));
- }
- if (WIFSIGNALED(status)) {
- Debug(3, "play: player killed (%d)\n", WTERMSIG(status));
- }
- PlayerPid = 0;
- return 0;
-}
-
-/**
-** Set player volume.
-**
-** @param volume new volume (0..255)
-*/
-void PlayerSetVolume(int volume)
-{
- Debug(3, "player: set volume=%d\n", volume);
-
- if (PlayerVolume != volume) {
- PlayerVolume = volume;
- if (PlayerPid) {
- PlayerSendVolume();
- }
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Device/Plugin C part
-//////////////////////////////////////////////////////////////////////////////
-
-/**
-** Return command line help string.
-*/
-const char *CommandLineHelp(void)
-{
- return " -% device\tmplayer dvd device\n"
- " -/\t/dir\tbrowser root directory\n"
- " -a audio\tmplayer -ao (alsa:device=hw=0.0) overwrites mplayer.conf\n"
- " -d display\tX11 display (default :0.0) overwrites $DISPLAY\n"
- " -f\t\tmplayer fullscreen playback\n"
- " -g geometry\tx11 window geometry wxh+x+y\n"
- " -k colorkey\tvideo color key (default=0x020507, mplayer2=0x76B901)\n"
- " -m mplayer\tfilename of mplayer executable\n"
- " -M args\targuments for mplayer\n"
- " -o\t\tosd overlay experiments\n" " -s\t\tmplayer slave mode\n"
- " -v video\tmplayer -vo (vdpau:deint=4:hqscaling=1) overwrites mplayer.conf\n";
-}
-
-/**
-** Process the command line arguments.
-**
-** @param argc number of arguments
-** @param argv arguments vector
-*/
-int ProcessArgs(int argc, char *const argv[])
-{
- const char *s;
-
- //
- // Parse arguments.
- //
-#ifdef __FreeBSD__
- if (!strcmp(*argv, "play")) {
- ++argv;
- --argc;
- }
-#endif
- if ((s = getenv("DISPLAY"))) {
- ConfigX11Display = s;
- }
-
- for (;;) {
- switch (getopt(argc, argv, "-%:/:a:b:d:fg:k:m:M:osv:")) {
- case '%': // dvd-device
- ConfigMplayerDevice = optarg;
- continue;
- case '/': // browser root
- ConfigBrowserRoot = optarg;
- continue;
- case 'a': // audio out
- ConfigAudioOut = optarg;
- continue;
- case 'd': // display x11
- ConfigX11Display = optarg;
- continue;
- case 'f': // fullscreen mode
- ConfigFullscreen = 1;
- continue;
- case 'g': // geometry
- VideoSetGeometry(optarg);
- continue;
- case 'k': // color key
- ConfigColorKey = strtol(optarg, NULL, 0);
- continue;
- case 'm': // mplayer executable
- ConfigMplayer = optarg;
- continue;
- case 'M': // mplayer extra arguments
- ConfigMplayerArguments = optarg;
- continue;
- case 'o': // osd / overlay
- ConfigOsdOverlay = 1;
- continue;
- case 's': // slave mode
- ConfigUseSlave = 1;
- continue;
- case 'v': // video out
- ConfigVideoOut = optarg;
- continue;
- case EOF:
- break;
- case '-':
- fprintf(stderr, _("We need no long options\n"));
- return 0;
- case ':':
- fprintf(stderr, _("Missing argument for option '%c'\n"),
- optopt);
- return 0;
- default:
- fprintf(stderr, _("Unkown option '%c'\n"), optopt);
- return 0;
- }
- break;
- }
- while (optind < argc) {
- fprintf(stderr, _("Unhandled argument '%s'\n"), argv[optind++]);
- }
-
- return 1;
-}