예제 #1
0
eMoviePlayer::~eMoviePlayer()
{
	killThreads();
	messages.send(Message::quit);
	if (thread_running())
		kill();
	if (instance == this)
		instance = 0;
	status.ACTIVE = false;
}
예제 #2
0
/*!
 * \brief Run example for a process.
 */
static void runExample(int who)
{
  Who = who;

  randseed();
  randusleep(1000000);
  
  LOGDIAG1("%s: creating shared memory mutex.", WhoName[Who]);

  if( !OptsNoMutex )
  {
    if( shm_mutex_init(ShmKey, &ShmMutex) < 0 )
    {
      LOGERROR("%s: failed to create mutex.", WhoName[Who]);
    }
  }

  if( createThreads() < 0 )
  {
    return;
  }

  switch( Who )
  {
    case WHO_CHILD:
      sleep(3);
      break;
    case WHO_PARENT:
      sleep(4);
      break;
    default:
      break;
  }

  killThreads();

  if( !OptsNoMutex )
  {
    shm_mutex_destroy(&ShmMutex);
  }
}
예제 #3
0
void eMoviePlayer::gotMessage(const Message &msg )
{
	eString mrl;
	eString restmp = "";
	eString command = ""; 

	eDebug("[MOVIEPLAYER] message %d coming in...", msg.type);
	switch (msg.type)
	{
		case Message::start:
		case Message::start2:
		{
			status.STAT = PLAY;
			killThreads();
			if (msg.filename)
			{
				mrl = eString(msg.filename);
				eDebug("[MOVIEPLAYER] mrl = %s", mrl.c_str());
				free((char*)msg.filename);
				
				eDebug("[MOVIEPLAYER] Server IP: %s", server.serverIP.c_str());
				eDebug("[MOVIEPLAYER] Server Port: %d", atoi(server.streamingPort.c_str()));
				
				if (msg.type == Message::start2)
				{
					// stop vlc, just to check whether vlc is up and running
					if (int res = sendRequest2VLC("?control=stop") < 0)
					{
						eDebug("[MOVIEPLAYER] couldn't communicate with vlc, streaming server ip address may be wrong in settings. Errno: %d",res);
						setErrorStatus();
						break;
					}
					usleep(200000);
					// empty vlc's playlist
					if (sendRequest2VLC("?control=empty") < 0)
					{
						setErrorStatus();
						break;
					}
					usleep(200000);
					// vlc: set sout...
					if (sendRequest2VLC("?sout=" + httpEscape(sout(mrl))) < 0)
					{
						setErrorStatus();
						break;
					}
					usleep(200000);
					// vlc: add mrl to playlist
					if (sendRequest2VLC("?control=add&mrl=" + httpEscape(mrl)) < 0)
					{
						setErrorStatus();
						break;
					}
					if(mrl.left(3) != "dvd" && mrl.left(3) != "vcd" )
					{
						usleep(200000);
						// vlc: play (circumvention for vlc deficiency)
						if (sendRequest2VLC("?control=play") < 0)
						{
							setErrorStatus();
							break;
						}
						usleep(200000);
						// vlc: stop (circumvention for vlc deficiency)
						if (sendRequest2VLC("?control=stop") < 0)
						{
							setErrorStatus();
							break;
						}
					}
					usleep(200000);
					// vlc: start playback of first item in playlist
					if (sendRequest2VLC("?control=play") < 0)
					{
						setErrorStatus();
						break;
					}
				}
				usleep(200000);
				// receive and play ts stream
				// initialBuffer = INITIALBUFFER;  // for future for plugin 
				if (playStream(mrl) < 0)
				{
					setErrorStatus();
					break;
				}
			}
			break;
		}
		case Message::pause:
			status.STAT = PAUSE;
			break;
		case Message::play:
			status.STAT = PLAY;
			break;
		case Message::forward:
			break;
		case Message::rewind:
			break;
		case Message::async:
		        status.A_SYNC=false;
			break;
		case Message::subtitles:
		        status.SUBT=false;
			break;
		case Message::nsf:
		        status.NSF=true;
			break;
		case Message::dvbon:
		        status.DVB=false;
			break;
		case Message::dvboff:
		        status.DVB=true;
			break;
		case Message::runplg:
		        status.PLG=true;
			break;
		case Message::endplg:
		        status.PLG=false;
			break;
		case Message::bufsize:
		{
				percBuffer = atoi(msg.filename);
			eDebug("### percBuffer %d", percBuffer);
			initialBuffer = (int)( INITIALBUFFER/100. * percBuffer );
			break;
		}
		case Message::jump:
		{
			int jump = atoi(eString(msg.filename).c_str());
			eDebug("[MOVIEPLAYER] jump: %d seconds", jump);
			break;
		}
		case Message::quit:
		{
			quit(0);
			break;
		}
		default:
			eDebug("unhandled thread message");
	}
	eDebug("[MOVIEPLAYER] message %d handled.", msg.type);
}
예제 #4
0
void eMoviePlayer::control(const char *command, const char *filename)
{
	if (thread_running())
		eDebug("[MOVIEPLAYER] main thread is running.");
	else
		eDebug("[MOVIEPLAYER] main thread is NOT running.");
		
	eString cmd = eString(command);
	
	if (cmd.find("start") != eString::npos)
	{
		mpconfig.load();
		server = mpconfig.getServerConfig();
	}

	cancelBuffering = 0;
	
	eDebug("[MOVIEPLAYER] control: serverIP = %s", server.serverIP.c_str());
	eDebug("[MOVIEPLAYER] control: webifPort = %d", atoi(server.webifPort.c_str()));
	eDebug("[MOVIEPLAYER] control: streamingPort = %d", atoi(server.streamingPort.c_str()));
	
	eDebug("[MOVIEPLAYER] control: command = %s", command);
	if (cmd == "start")
		messages.send(Message(Message::start, filename ? strdup(filename) : 0));
	else
	if (cmd == "start2")
		messages.send(Message(Message::start2, filename ? strdup(filename) : 0));
	else
	if (cmd == "stop" || cmd == "terminate")
	{
		killThreads();
		pthread_mutex_lock(&mutex);
		cancelBuffering = 1;
		pthread_mutex_unlock(&mutex);
		sendRequest2VLC("?control=stop");
		sendRequest2VLC("?control=empty");  // clear playlist

		status.ACTIVE = false;
		status.STAT = STOPPED;
		status.BUFFERFILLED = false;
	}
	else
	if (cmd == "play")
		messages.send(Message(Message::play, 0));
	else 
	if (cmd == "pause")
		messages.send(Message(Message::pause, 0));
	else
	if (cmd == "rewind")
		messages.send(Message(Message::rewind, 0));
	else
	if (cmd == "forward")
		messages.send(Message(Message::forward, 0));
	else
	if (cmd == "async")
		messages.send(Message(Message::async, 0));
	else
	if (cmd == "subtitles")
		messages.send(Message(Message::subtitles, 0));
	else
	if (cmd == "nsf")
		messages.send(Message(Message::nsf, 0));
	else
	if (cmd == "dvbon")
		messages.send(Message(Message::dvbon, 0));
	else
	if (cmd == "dvboff")
		messages.send(Message(Message::dvboff, 0));
	else
	if (cmd == "runplg")
		messages.send(Message(Message::runplg, 0));
	else
	if (cmd == "endplg")
		messages.send(Message(Message::endplg, 0));
	else
	if (cmd == "bufsize")
		messages.send(Message(Message::bufsize, filename ? strdup(filename) : 0));
	else

	if (cmd == "jump")
		messages.send(Message(Message::jump, filename ? strdup(filename) : 0));
}