eMoviePlayer::~eMoviePlayer() { killThreads(); messages.send(Message::quit); if (thread_running()) kill(); if (instance == this) instance = 0; status.ACTIVE = false; }
/*! * \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); } }
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); }
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)); }