diff --git a/src/gui/infoviewer.cpp b/src/gui/infoviewer.cpp index 2f7fbf085..3f0fdb469 100644 --- a/src/gui/infoviewer.cpp +++ b/src/gui/infoviewer.cpp @@ -913,9 +913,12 @@ void CInfoViewer::loop(bool show_dot) res = CNeutrinoApp::getInstance()->handleMsg(msg, data); } +#if 0 else if (CMoviePlayerGui::getInstance().start_timeshift && (msg == NeutrinoMessages::EVT_TIMER)) { CMoviePlayerGui::getInstance().start_timeshift = false; - } else if (CMoviePlayerGui::getInstance().timeshift && ((msg == (neutrino_msg_t) g_settings.mpkey_rewind) || \ + } +#endif + else if (CMoviePlayerGui::getInstance().timeshift && ((msg == (neutrino_msg_t) g_settings.mpkey_rewind) || \ (msg == (neutrino_msg_t) g_settings.mpkey_forward) || \ (msg == (neutrino_msg_t) g_settings.mpkey_pause) || \ (msg == (neutrino_msg_t) g_settings.mpkey_stop) || \ diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index 57a659560..487d18c82 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -4,9 +4,7 @@ Movieplayer (c) 2003, 2004 by gagga Based on code by Dirch, obi and the Metzler Bros. Thanks. - $Id: movieplayer.cpp,v 1.97 2004/07/18 00:54:52 thegoodguy Exp $ - - Homepage: http://www.giggo.de/dbox2/movieplayer.html + Copyright (C) 2011 CoolStream International Ltd License: GPL @@ -29,110 +27,36 @@ #include #endif -#include - #include #include -#include -#include -#include -#include - -#include -#include +#include #include -#include #include #include #include - -#include -#include -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include - -#include #include #include -#include -#include -#include -#include -#include - -#include #include #include #include "libtuxtxt/teletext.h" #include - -//int dvbsub_start(int pid);//??? -//int dvbsub_pause(); //??? //extern CPlugins *g_PluginList; extern cVideo * videoDecoder; extern CRemoteControl *g_RemoteControl; /* neutrino.cpp */ extern CInfoClock *InfoClock; +extern bool has_hdd; -#define MINUTEOFFSET 117*262072 -#define MP_TS_SIZE 262072 // ~0.5 sec - -#ifndef __USE_FILE_OFFSET64 -#error not using 64 bit file offsets -#endif /* __USE_FILE__OFFSET64 */ - - -unsigned short CMoviePlayerGui::g_numpida = 0; -unsigned short CMoviePlayerGui::g_vtype = 0; -unsigned short CMoviePlayerGui::g_vpid = 0; -std::string CMoviePlayerGui::g_language[REC_MAX_APIDS]; - -unsigned short CAPIDSelectExec::g_apids[REC_MAX_APIDS]; -unsigned short CAPIDSelectExec::g_ac3flags[REC_MAX_APIDS]; -unsigned short CAPIDSelectExec::g_currentapid = 0, CAPIDSelectExec::g_currentac3 = 0, CAPIDSelectExec::apidchanged = 0; - -bool get_movie_info_apid_name(int apid, MI_MOVIE_INFO * movie_info, std::string * apidtitle) -{ - if (movie_info == NULL || apidtitle == NULL) - return false; - - for (int i = 0; i < (int)movie_info->audioPids.size(); i++) { - if (movie_info->audioPids[i].epgAudioPid == apid && !movie_info->audioPids[i].epgAudioPidName.empty()) { - *apidtitle = movie_info->audioPids[i].epgAudioPidName; - return true; - } - } - return false; -} - -int CAPIDSelectExec::exec(CMenuTarget * /*parent*/, const std::string & actionKey) -{ - apidchanged = 0; - unsigned int sel = atoi(actionKey.c_str()); - if (g_currentapid != g_apids[sel - 1]) { - g_currentapid = g_apids[sel - 1]; - g_currentac3 = g_ac3flags[sel - 1]; - apidchanged = 1; - printf("[movieplayer] apid changed to %d\n", g_apids[sel - 1]); - } - return menu_return::RETURN_EXIT; -} +#define TIMESHIFT_SECONDS 3 CMoviePlayerGui* CMoviePlayerGui::instance_mp = NULL; -cPlayback *CMoviePlayerGui::playback = NULL; CMoviePlayerGui& CMoviePlayerGui::getInstance() { @@ -141,48 +65,33 @@ CMoviePlayerGui& CMoviePlayerGui::getInstance() instance_mp = new CMoviePlayerGui(); printf("[neutrino CMoviePlayerGui] Instance created...\n"); } - return *instance_mp; } - -void CMoviePlayerGui::Delete() -{ - if ( instance_mp ) - { - delete instance_mp; - printf("[neutrino CMoviePlayerGui] Instance removed...\n"); - } - - instance_mp = NULL; -} CMoviePlayerGui::CMoviePlayerGui() { Init(); } +CMoviePlayerGui::~CMoviePlayerGui() +{ + playback->Close(); + delete moviebrowser; + delete filebrowser; + delete bookmarkmanager; + delete playback; + instance_mp = NULL; +} + void CMoviePlayerGui::Init(void) { - stopped = false; + playing = false; frameBuffer = CFrameBuffer::getInstance(); - if (strlen(g_settings.network_nfs_moviedir) != 0) - Path_local = g_settings.network_nfs_moviedir; - else - Path_local = "/"; - - if (g_settings.filebrowser_denydirectoryleave) - filebrowser = new CFileBrowser(Path_local.c_str()); - else - filebrowser = new CFileBrowser(); - - filebrowser->Multi_Select = false; - filebrowser->Dirs_Selectable = false; - filebrowser->Hide_records = true; playback = new cPlayback(3); moviebrowser = new CMovieBrowser(); - bookmarkmanager = 0; + bookmarkmanager = new CBookmarkManager(); tsfilefilter.addFilter("ts"); tsfilefilter.addFilter("avi"); @@ -199,41 +108,30 @@ void CMoviePlayerGui::Init(void) tsfilefilter.addFilter("mp4"); tsfilefilter.addFilter("mov"); + if (strlen(g_settings.network_nfs_moviedir) != 0) + Path_local = g_settings.network_nfs_moviedir; + else + Path_local = "/"; + + if (g_settings.filebrowser_denydirectoryleave) + filebrowser = new CFileBrowser(Path_local.c_str()); + else + filebrowser = new CFileBrowser(); + filebrowser->Filter = &tsfilefilter; + filebrowser->Hide_records = true; + speed = 1; - //slow = 0; - jumpseconds = 0; - showaudioselectdialog = false; timeshift = 0; - start_timeshift = false; -} - -CMoviePlayerGui::~CMoviePlayerGui() -{ -#if 0 - delete filebrowser; - if (moviebrowser) - delete moviebrowser; - if (bookmarkmanager) - delete bookmarkmanager; - g_Zapit->setStandby(false); - g_Sectionsd->setPauseScanning(false); -#endif - delete playback; -} - -bool CMoviePlayerGui::Playing(void) -{ - return stopped; + numpida = 0; } void CMoviePlayerGui::cutNeutrino() { - if (stopped) + if (playing) return; - stopped = true; - //g_Zapit->setStandby(true); + playing = true; g_Zapit->lockPlayBack(); g_Sectionsd->setPauseScanning(true); @@ -243,41 +141,29 @@ void CMoviePlayerGui::cutNeutrino() void CMoviePlayerGui::restoreNeutrino() { - if (!stopped) + if (!playing) return; - stopped = false; + playing = false; - //g_Zapit->setStandby(false); g_Zapit->unlockPlayBack(); g_Sectionsd->setPauseScanning(false); CNeutrinoApp::getInstance()->handleMsg(NeutrinoMessages::CHANGEMODE, m_LastMode); - //CVFD::getInstance()->showServicename(g_RemoteControl->getCurrentChannelName()); } int CMoviePlayerGui::exec(CMenuTarget * parent, const std::string & actionKey) { printf("[movieplayer] actionKey=%s\n", actionKey.c_str()); - bookmarkmanager = new CBookmarkManager(); - - if (parent) { + if (parent) parent->hide(); - } - bool usedBackground = frameBuffer->getuseBackground(); - if (usedBackground) { - frameBuffer->saveBackgroundImage(); - frameBuffer->Clear(); - } + file_name = ""; + full_name = ""; - startfilename = ""; startposition = 0; - minuteoffset = MINUTEOFFSET; - secondoffset = minuteoffset / 60; - puts("[movieplayer.cpp] executing " MOVIEPLAYER_START_SCRIPT "."); if (system(MOVIEPLAYER_START_SCRIPT) != 0) perror(MOVIEPLAYER_START_SCRIPT " failed"); @@ -291,557 +177,267 @@ int CMoviePlayerGui::exec(CMenuTarget * parent, const std::string & actionKey) else if (actionKey == "fileplayback") { } else if (actionKey == "timeshift") { - cutNeutrino(); timeshift = 1; } else if (actionKey == "ptimeshift") { - cutNeutrino(); timeshift = 2; } else if (actionKey == "rtimeshift") { - cutNeutrino(); timeshift = 3; } -#if 0 +#if 0 // TODO ? else if (actionKey == "bookmarkplayback") { isBookmark = true; - const CBookmark * theBookmark = bookmarkmanager->getBookmark(NULL); - if (theBookmark == NULL) { - bookmarkmanager->flush(); - return menu_return::RETURN_REPAINT; - } - startfilename = theBookmark->getUrl(); - sscanf(theBookmark->getTime(), "%lld", &startposition); } #endif else { - delete bookmarkmanager; return menu_return::RETURN_REPAINT; } - PlayFile(); + while(SelectFile()) { + PlayFile(); + if(timeshift) + break; + } bookmarkmanager->flush(); - // Restore previous background - if (usedBackground) { - frameBuffer->restoreBackgroundImage(); - frameBuffer->useBackground(true); - frameBuffer->paintBackground(); - } - + puts("[movieplayer.cpp] executing " MOVIEPLAYER_END_SCRIPT "."); if (system(MOVIEPLAYER_END_SCRIPT) != 0) perror(MOVIEPLAYER_END_SCRIPT " failed"); - restoreNeutrino(); CVFD::getInstance()->setMode(CVFD::MODE_TVRADIO); - delete bookmarkmanager; - if (timeshift) { - timeshift = 0; + if (timeshift) return menu_return::RETURN_EXIT_ALL; - } + return menu_return::RETURN_REPAINT; } -void CMoviePlayerGui::updateLcd(const std::string & sel_filename) +void CMoviePlayerGui::updateLcd() { char tmp[20]; std::string lcd; + std::string name; + + if (isMovieBrowser && strlen(p_movie_info->epgTitle.c_str()) && strncmp(p_movie_info->epgTitle.c_str(), "not", 3)) + name = p_movie_info->epgTitle; + else + name = file_name; switch (playstate) { - case CMoviePlayerGui::PAUSE: - lcd = "|| "; - break; - case CMoviePlayerGui::REW: - sprintf(tmp, "%dx<< ", speed); - lcd = tmp; - break; - case CMoviePlayerGui::FF: - sprintf(tmp, "%dx>> ", speed); - lcd = tmp; - break; - case CMoviePlayerGui::PLAY: - lcd = "> "; - break; - default: - break; + case CMoviePlayerGui::PAUSE: + lcd = "|| "; + break; + case CMoviePlayerGui::REW: + sprintf(tmp, "%dx<< ", speed); + lcd = tmp; + break; + case CMoviePlayerGui::FF: + sprintf(tmp, "%dx>> ", speed); + lcd = tmp; + break; + case CMoviePlayerGui::PLAY: + lcd = "> "; + break; + default: + break; } - lcd += sel_filename; + lcd += name; + CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); CVFD::getInstance()->showMenuText(0, lcd.c_str(), -1, true); } -void CMoviePlayerGui::fillPids(MI_MOVIE_INFO * p_movie_info) +void CMoviePlayerGui::fillPids() { if(p_movie_info == NULL) return; - g_numpida = 0; CAPIDSelectExec::g_currentapid = 0; + numpida = 0; currentapid = 0; if(!p_movie_info->audioPids.empty()) { - CAPIDSelectExec::g_currentapid = p_movie_info->audioPids[0].epgAudioPid; //FIXME - CAPIDSelectExec::g_currentac3 = p_movie_info->audioPids[0].atype; + currentapid = p_movie_info->audioPids[0].epgAudioPid; + currentac3 = p_movie_info->audioPids[0].atype; } for (int i = 0; i < (int)p_movie_info->audioPids.size(); i++) { - CAPIDSelectExec::g_apids[i] = p_movie_info->audioPids[i].epgAudioPid; - CAPIDSelectExec::g_ac3flags[i] = p_movie_info->audioPids[i].atype; - g_numpida++; + apids[i] = p_movie_info->audioPids[i].epgAudioPid; + ac3flags[i] = p_movie_info->audioPids[i].atype; + numpida++; if (p_movie_info->audioPids[i].selected) { - CAPIDSelectExec::g_currentapid = p_movie_info->audioPids[i].epgAudioPid; //FIXME - CAPIDSelectExec::g_currentac3 = p_movie_info->audioPids[i].atype; + currentapid = p_movie_info->audioPids[i].epgAudioPid; + currentac3 = p_movie_info->audioPids[i].atype; } } - g_vpid = p_movie_info->epgVideoPid; - g_vtype = p_movie_info->VideoType; + vpid = p_movie_info->epgVideoPid; + vtype = p_movie_info->VideoType; } -extern bool has_hdd; -#define TIMESHIFT_SECONDS 3 -void CMoviePlayerGui::PlayFile(void) +bool CMoviePlayerGui::SelectFile() { - bool first_start_timeshift = false; - neutrino_msg_t msg; - neutrino_msg_data_t data; - int position = 0, duration = 0; - bool timeshift_paused = false; + bool ret = false; - std::string sel_filename; - CTimeOSD FileTime; - bool update_lcd = true, open_filebrowser = true, start_play = false, exit = false; - bool timesh = timeshift; - bool was_file = false; - bool time_forced = false; - playstate = CMoviePlayerGui::STOPPED; - bool is_file_player = false; - timeb current_time; - CMovieInfo cMovieInfo; // funktions to save and load movie info - MI_MOVIE_INFO *p_movie_info = NULL; // movie info handle which comes from the MovieBrowser, if not NULL MoviePla yer is able to save new bookmarks - int eof = 0; - std::string rec_filename; + /*clear audiopids */ + for (int i = 0; i < numpida; i++) { + apids[i] = 0; + ac3flags[i] = 0; + language[i].clear(); + } + numpida = 0; currentapid = 0; + is_file_player = false; + p_movie_info = NULL; + + printf("CMoviePlayerGui::SelectFile: isBookmark %d timeshift %d isMovieBrowser %d\n", isBookmark, timeshift, isMovieBrowser); if (has_hdd) system("(rm /hdd/.wakeup; touch /hdd/.wakeup; sync) > /dev/null 2> /dev/null &"); if (timeshift) { t_channel_id live_channel_id = CZapit::getInstance()->GetCurrentChannelID(); p_movie_info = CRecordManager::getInstance()->GetMovieInfo(live_channel_id); - rec_filename = CRecordManager::getInstance()->GetFileName(live_channel_id) + ".ts"; - fillPids(p_movie_info); + full_name = CRecordManager::getInstance()->GetFileName(live_channel_id) + ".ts"; + fillPids(); + ret = true; + } +#if 0 // TODO + else if(isBookmark) { + const CBookmark * theBookmark = bookmarkmanager->getBookmark(NULL); + if (theBookmark == NULL) { + bookmarkmanager->flush(); + return false; + } + full_name = theBookmark->getUrl(); + sscanf(theBookmark->getTime(), "%lld", &startposition); + startposition *= 1000; + ret = true; + } +#endif + else if (isMovieBrowser) { + if (moviebrowser->exec(Path_local.c_str())) { + // get the current path and file name + Path_local = moviebrowser->getCurrentDir(); + CFile *file; + if ((file = moviebrowser->getSelectedFile()) != NULL) { + full_name = file->Name.c_str(); + + // get the movie info handle (to be used for e.g. bookmark handling) + p_movie_info = moviebrowser->getCurrentMovieInfo(); +#if 0 + bool recfile = CRecordManager::getInstance()->RecordingStatus(p_movie_info->epgId) && + CRecordManager::getInstance()->GetFileName(p_movie_info->epgId) == file->Name; +#endif + fillPids(); + // get the start position for the movie + startposition = 1000 * moviebrowser->getCurrentStartPos(); + printf("CMoviePlayerGui::SelectFile: file %s start %d apid %X atype %d vpid %x vtype %d\n", full_name.c_str(), startposition, currentapid, currentac3, vpid, vtype); + + ret = true; + } + } + } + else { // filebrowser + if (filebrowser->exec(Path_local.c_str()) == true) { + Path_local = filebrowser->getCurrentDir(); + CFile *file; + if ((file = filebrowser->getSelectedFile()) != NULL) { + is_file_player = true; + full_name = file->Name.c_str(); + ret = true; + } + } + } + if(ret) { + std::string::size_type pos = full_name.find_last_of('/'); + if(pos != std::string::npos) { + file_name = full_name.substr(pos+1); + std::replace(file_name.begin(), file_name.end(), '_', ' '); + } else + file_name = full_name; + printf("CMoviePlayerGui::SelectFile: full_name [%s] file_name [%s]\n", full_name.c_str(), file_name.c_str()); + } + return ret; +} + +void CMoviePlayerGui::PlayFile(void) +{ + neutrino_msg_t msg; + neutrino_msg_data_t data; + + int position = 0, duration = 0; + bool first_start_timeshift = false; + bool time_forced = false; + bool update_lcd = true; + int eof = 0; + + CTimeOSD FileTime; + + playstate = CMoviePlayerGui::STOPPED; + printf("Startplay at %d seconds\n", startposition/1000); + handleMovieBrowser(CRCInput::RC_nokey, position); + + cutNeutrino(); + playback->Open(is_file_player ? PLAYMODE_FILE : PLAYMODE_TS); + + printf("IS FILE PLAYER: %s\n", is_file_player ? "true": "false" ); + + if(p_movie_info != NULL) + duration = p_movie_info->length * 60 * 1000; + + file_prozent = 0; + if(!playback->Start((char *) full_name.c_str(), vpid, vtype, currentapid, currentac3, duration)) { + playback->Close(); + } else { + playstate = CMoviePlayerGui::PLAY; + CVFD::getInstance()->ShowIcon(VFD_ICON_PLAY, true); + if(timeshift) { + first_start_timeshift = true; + startposition = -1; + int i; + int towait = (timeshift == 1) ? TIMESHIFT_SECONDS+1 : TIMESHIFT_SECONDS; + for(i = 0; i < 500; i++) { + playback->GetPosition(position, duration); + startposition = (duration - position); + + //printf("CMoviePlayerGui::PlayFile: waiting for data, position %d duration %d (%d), start %d\n", position, duration, towait, startposition); + if(startposition > towait*1000) + break; + + usleep(20000); + } + if(timeshift == 3) { + startposition = duration; + } else { + if(g_settings.timeshift_pause) + playstate = CMoviePlayerGui::PAUSE; + if(timeshift == 1) + startposition = 0; + else + startposition = duration - TIMESHIFT_SECONDS*1000; + } + printf("******************* Timeshift %d, position %d, seek to %d seconds\n", timeshift, position, startposition/1000); + } + if(!is_file_player && startposition >= 0)//FIXME no jump for file at start yet + playback->SetPosition(startposition, true); + + /* playback->Start() starts paused */ + if(timeshift == 3) { + playback->SetSpeed(-1); + } else if(!timeshift || !g_settings.timeshift_pause) { + playback->SetSpeed(1); + } } - int width = 280; - int height = 65; - int x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; - //int y = frameBuffer->getScreenY() + (frameBuffer->getScreenHeight() - height) / 2; - int y = frameBuffer->getScreenY() + frameBuffer->getScreenHeight() - height - 20; - - CBox boxposition(x, y, width, height); // window position for the hint boxes - - CTextBox endHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_MOVIEEND), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); - CTextBox comHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_JUMPFORWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); - CTextBox loopHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_JUMPBACKWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); - CTextBox newLoopHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_NEWBOOK_BACKWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); - CTextBox newComHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_NEWBOOK_FORWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); - - bool showEndHintBox = false; // flag to check whether the box shall be painted - bool showComHintBox = false; // flag to check whether the box shall be painted - bool showLoopHintBox = false; // flag to check whether the box shall be painted - int jump_not_until = 0; // any jump shall be avoided until this time (in seconds from moviestart) - MI_BOOKMARK new_bookmark; // used for new movie info bookmarks created from the movieplayer - new_bookmark.pos = 0; // clear , since this is used as flag for bookmark activity - new_bookmark.length = 0; - - // very dirty usage of the menue, but it works and I already spent to much time with it, feel free to make it better ;-) -#define BOOKMARK_START_MENU_MAX_ITEMS 6 - CSelectedMenu cSelectedMenuBookStart[BOOKMARK_START_MENU_MAX_ITEMS]; - - CMenuWidget bookStartMenu(LOCALE_MOVIEBROWSER_BOOK_NEW, NEUTRINO_ICON_STREAMING); - bookStartMenu.addIntroItems(); - bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEPLAYER_HEAD, true, NULL, &cSelectedMenuBookStart[0])); - bookStartMenu.addItem(GenericMenuSeparatorLine); - bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_HEAD, true, NULL, &cSelectedMenuBookStart[1])); - bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_TYPE_FORWARD, true, NULL, &cSelectedMenuBookStart[2])); - bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_TYPE_BACKWARD, true, NULL, &cSelectedMenuBookStart[3])); - bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_MOVIESTART, true, NULL, &cSelectedMenuBookStart[4])); - bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_MOVIEEND, true, NULL, &cSelectedMenuBookStart[5])); - - go_repeat: - do { - - if (exit) { - exit = false; - printf("[movieplayer] stop\n"); - playstate = CMoviePlayerGui::STOPPED; - break; - } - - if (timesh) { - char fname[255]; - - sprintf(fname, "%s", rec_filename.c_str()); - filename = fname; - sel_filename = std::string(rindex(filename, '/') + 1); - printf("Timeshift: %s\n", sel_filename.c_str()); - - update_lcd = true; - start_play = true; - open_filebrowser = false; - isBookmark = false; - timesh = false; - start_timeshift = true; - first_start_timeshift = true; - CVFD::getInstance()->setMode(CVFD::MODE_TVRADIO); - } - - if (isBookmark) { - open_filebrowser = false; - filename = startfilename.c_str(); - sel_filename = startfilename; - update_lcd = true; - start_play = true; - isBookmark = false; - timeshift = false; - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); - } - - if (isMovieBrowser == true) { - // do all moviebrowser stuff here ( like commercial jump ect.) - if (playstate == CMoviePlayerGui::PLAY) { - playback->GetPosition(position, duration); - int play_sec = position / 1000; // get current seconds from moviestart - //TRACE(" %6ds\r\n",play_sec); - - if (play_sec + 10 < jump_not_until || play_sec > jump_not_until + 10) - jump_not_until = 0; // check if !jump is stale (e.g. if user jumped forward or backward) - if (new_bookmark.pos == 0) // do bookmark activities only, if there is no new bookmark started - { - if (p_movie_info != NULL) // process bookmarks if we have any movie info - { - if (p_movie_info->bookmarks.end != 0) { - // *********** Check for stop position ******************************* - if (play_sec >= p_movie_info->bookmarks.end - MOVIE_HINT_BOX_TIMER && play_sec < p_movie_info->bookmarks.end && play_sec > jump_not_until) { - if (showEndHintBox == false) { - endHintBox.paint(); // we are 5 sec before the end postition, show warning - showEndHintBox = true; - TRACE("[mp] user stop in 5 sec...\r\n"); - } - } else { - if (showEndHintBox == true) { - endHintBox.hide(); // if we showed the warning before, hide the box again - showEndHintBox = false; - } - } - - if (play_sec >= p_movie_info->bookmarks.end && play_sec <= p_movie_info->bookmarks.end + 2 && play_sec > jump_not_until) // stop playing - { - // *********** we ARE close behind the stop position, stop playing ******************************* - TRACE("[mp] user stop\r\n"); - playstate = CMoviePlayerGui::STOPPED; - } - } - // ************* Check for bookmark jumps ******************************* - int loop = true; - showLoopHintBox = false; - showComHintBox = false; - for (int book_nr = 0; book_nr < MI_MOVIE_BOOK_USER_MAX && loop == true; book_nr++) { - if (p_movie_info->bookmarks.user[book_nr].pos != 0 && p_movie_info->bookmarks.user[book_nr].length != 0) { - // valid bookmark found, now check if we are close before or after it - if (play_sec >= p_movie_info->bookmarks.user[book_nr].pos - MOVIE_HINT_BOX_TIMER && play_sec < p_movie_info->bookmarks.user[book_nr].pos && play_sec > jump_not_until) { - if (p_movie_info->bookmarks.user[book_nr].length < 0) - showLoopHintBox = true; // we are 5 sec before , show warning - else if (p_movie_info->bookmarks.user[book_nr].length > 0) - showComHintBox = true; // we are 5 sec before, show warning - //else // TODO should we show a plain bookmark infomation as well? - } - - if (play_sec >= p_movie_info->bookmarks.user[book_nr].pos && play_sec <= p_movie_info->bookmarks.user[book_nr].pos + 2 && play_sec > jump_not_until) // - { - //for plain bookmark, the following calc shall result in 0 (no jump) - jumpseconds = p_movie_info->bookmarks.user[book_nr].length; - - // we are close behind the bookmark, do bookmark activity (if any) - if (p_movie_info->bookmarks.user[book_nr].length < 0) { - // if the jump back time is to less, it does sometimes cause problems (it does probably jump only 5 sec which will cause the next jump, and so on) - if (jumpseconds > -15) - jumpseconds = -15; - - jumpseconds = jumpseconds + p_movie_info->bookmarks.user[book_nr].pos; - //playstate = CMoviePlayerGui::JPOS; // bookmark is of type loop, jump backward - playback->SetPosition(jumpseconds * 1000); - } else if (p_movie_info->bookmarks.user[book_nr].length > 0) { - // jump at least 15 seconds - if (jumpseconds < 15) - jumpseconds = 15; - jumpseconds = jumpseconds + p_movie_info->bookmarks.user[book_nr].pos; - - //playstate = CMoviePlayerGui::JPOS; // bookmark is of type loop, jump backward - playback->SetPosition(jumpseconds * 1000); - } - TRACE("[mp] do jump %d sec\r\n", jumpseconds); - update_lcd = true; - loop = false; // do no further bookmark checks - } - } - } - // check if we shall show the commercial warning - if (showComHintBox == true) { - comHintBox.paint(); - TRACE("[mp] com jump in 5 sec...\r\n"); - } else - comHintBox.hide(); - - // check if we shall show the loop warning - if (showLoopHintBox == true) { - loopHintBox.paint(); - TRACE("[mp] loop jump in 5 sec...\r\n"); - } else - loopHintBox.hide(); - } - } - } - } // isMovieBrowser == true - - if (open_filebrowser) { - open_filebrowser = false; - timeshift = false; - FileTime.hide(); - /*clear audipopids */ - for (int i = 0; i < g_numpida; i++) { - CAPIDSelectExec::g_apids[i] = 0; - CAPIDSelectExec::g_ac3flags[i] = 0; - g_language[i].clear(); - } - g_numpida = 0; CAPIDSelectExec::g_currentapid = 0; - - if (isMovieBrowser == true) { - // start the moviebrowser instead of the filebrowser - if (moviebrowser->exec(Path_local.c_str())) { - // get the current path and file name - Path_local = moviebrowser->getCurrentDir(); - CFile *file; - - if ((file = moviebrowser->getSelectedFile()) != NULL) { - CFile::FileType ftype; - ftype = file->getType(); - - is_file_player = false; - filename = file->Name.c_str(); - sel_filename = file->getFileName(); - - // get the movie info handle (to be used for e.g. bookmark handling) - p_movie_info = moviebrowser->getCurrentMovieInfo(); - //bool recfile = CNeutrinoApp::getInstance()->recordingstatus && !strncmp(rec_filename, filename, strlen(rec_filename)); - bool recfile = CRecordManager::getInstance()->RecordingStatus(p_movie_info->epgId) && - CRecordManager::getInstance()->GetFileName(p_movie_info->epgId) == file->Name; - if (!recfile && p_movie_info->length) { - minuteoffset = file->Size / p_movie_info->length; - minuteoffset = (minuteoffset / MP_TS_SIZE) * MP_TS_SIZE; - if (minuteoffset < 5000000 || minuteoffset > 190000000) - minuteoffset = MINUTEOFFSET; - secondoffset = minuteoffset / 60; - } - - fillPids(p_movie_info); - printf("CMoviePlayerGui::PlayFile: file %s apid %X atype %d vpid %x vtype %d\n", filename, CAPIDSelectExec::g_currentapid, CAPIDSelectExec::g_currentac3, g_vpid, g_vtype); - printf("Bytes per minute: %lld\n", minuteoffset); - // get the start position for the movie - startposition = 1000 * moviebrowser->getCurrentStartPos(); - //TRACE("[mp] start pos %llu, %d s Name: %s\r\n", startposition, moviebrowser->getCurrentStartPos(), filename); - - update_lcd = true; - start_play = true; - was_file = true; - } - } else if (playstate == CMoviePlayerGui::STOPPED) { - was_file = false; - break; - } - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); - } else { - filebrowser->Filter = &tsfilefilter; - - if (filebrowser->exec(Path_local.c_str()) == true) { - Path_local = filebrowser->getCurrentDir(); - CFile *file; - if ((file = filebrowser->getSelectedFile()) != NULL) { - - CFile::FileType ftype; - ftype = file->getType(); - - is_file_player = true; - - filename = file->Name.c_str(); - update_lcd = true; - start_play = true; - was_file = true; - sel_filename = filebrowser->getSelectedFile()->getFileName(); - //playstate = CMoviePlayerGui::PLAY; - } - } else if (playstate == CMoviePlayerGui::STOPPED) { - was_file = false; - break; - } - - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); - } - } - + while (playstate >= CMoviePlayerGui::PLAY) + { if (update_lcd) { update_lcd = false; - if (isMovieBrowser && strlen(p_movie_info->epgTitle.c_str()) && strncmp(p_movie_info->epgTitle.c_str(), "not", 3)) - updateLcd(p_movie_info->epgTitle); - else - updateLcd(sel_filename); + updateLcd(); } - - if (showaudioselectdialog) { - CMenuWidget APIDSelector(LOCALE_APIDSELECTOR_HEAD, NEUTRINO_ICON_AUDIO); - APIDSelector.addIntroItems(); - CAPIDSelectExec *APIDChanger = new CAPIDSelectExec; - bool enabled; - bool defpid; - if(is_file_player && !g_numpida){ - playback->FindAllPids(CAPIDSelectExec::g_apids, CAPIDSelectExec::g_ac3flags, &g_numpida, g_language); - } - for (unsigned int count = 0; count < g_numpida; count++) { - bool name_ok = false; - char apidnumber[10]; - sprintf(apidnumber, "%d %X", count + 1, CAPIDSelectExec::g_apids[count]); - enabled = true; - defpid = CAPIDSelectExec::g_currentapid ? (CAPIDSelectExec::g_currentapid == CAPIDSelectExec::g_apids[count]) : (count == 0); - std::string apidtitle = "Stream "; - if(!is_file_player){ - name_ok = get_movie_info_apid_name(CAPIDSelectExec::g_apids[count], p_movie_info, &apidtitle); - } - else if (!g_language[count].empty()){ - apidtitle = g_language[count]; - name_ok = true; - } - if (!name_ok) - apidtitle = "Stream "; - - switch(CAPIDSelectExec::g_ac3flags[count]) - { - case 1: /*AC3,EAC3*/ - if (apidtitle.find("AC3") == std::numeric_limits::max() || is_file_player) - apidtitle.append(" (AC3)"); - break; - case 2: /*teletext*/ - apidtitle.append(" (Teletext)"); - enabled = false; - break; - case 3: /*MP2*/ - apidtitle.append(" (MP2)"); - break; - case 4: /*MP3*/ - apidtitle.append(" (MP3)"); - break; - case 5: /*AAC*/ - apidtitle.append(" (AAC)"); - break; - case 6: /*DTS*/ - apidtitle.append(" (DTS)"); - enabled = false; - break; - case 7: /*MLP*/ - apidtitle.append(" (MLP)"); - break; - default: - break; - } - if (!name_ok) - apidtitle.append(apidnumber); - - APIDSelector.addItem(new CMenuForwarderNonLocalized(apidtitle.c_str(), enabled, NULL, APIDChanger, apidnumber, CRCInput::convertDigitToKey(count + 1)), defpid); - } - - CAPIDSelectExec::apidchanged = 0; - APIDSelector.exec(NULL, ""); - if (CAPIDSelectExec::apidchanged) { - if (CAPIDSelectExec::g_currentapid == 0) { - CAPIDSelectExec::g_currentapid = CAPIDSelectExec::g_apids[0]; - CAPIDSelectExec::g_currentac3 = CAPIDSelectExec::g_ac3flags[0]; - } - playback->SetAPid(CAPIDSelectExec::g_currentapid, CAPIDSelectExec::g_currentac3); - CAPIDSelectExec::apidchanged = 0; - } - delete APIDChanger; - showaudioselectdialog = false; - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); - update_lcd = true; - } - - FileTime.update(position, duration); - - if (start_play) { - printf("Startplay at %d seconds\n", startposition/1000); - start_play = false; - if (playstate >= CMoviePlayerGui::PLAY) { - playstate = CMoviePlayerGui::STOPPED; - playback->Close(); - } - - cutNeutrino(); - playback->Open(is_file_player ? PLAYMODE_FILE : PLAYMODE_TS); - - printf("IS FILE PLAYER: %s\n", is_file_player ? "true": "false" ); - - duration = 0; - if(p_movie_info != NULL) - duration = p_movie_info->length * 60 * 1000; - - if(!playback->Start((char *)filename, g_vpid, g_vtype, CAPIDSelectExec::g_currentapid, CAPIDSelectExec::g_currentac3, duration)) { - playback->Close(); - restoreNeutrino(); - } else { - playstate = CMoviePlayerGui::PLAY; - CVFD::getInstance()->ShowIcon(VFD_ICON_PLAY, true); - if(timeshift) { - timeshift_paused = true; - startposition = -1; - int i; - int towait = (timeshift == 1) ? TIMESHIFT_SECONDS+1 : TIMESHIFT_SECONDS; - for(i = 0; i < 500; i++) { - playback->GetPosition(position, duration); - startposition = (duration - position); - - //printf("CMoviePlayerGui::PlayFile: waiting for data, position %d duration %d (%d), start %d\n", position, duration, towait, startposition); - if(startposition > towait*1000) - break; - //sleep(1); - usleep(20000); - } - if(timeshift == 3) { - startposition = duration; - } else { - if(g_settings.timeshift_pause) - playstate = CMoviePlayerGui::PAUSE; - if(timeshift == 1) - startposition = 0; - else - startposition = duration - TIMESHIFT_SECONDS*1000; - } - printf("******************* Timeshift %d, position %d, seek to %d seconds\n", timeshift, position, startposition/1000); - } - if(!is_file_player && startposition >= 0)//FIXME no jump for file at start yet - playback->SetPosition(startposition, true); - - if(timeshift == 3) { - playback->SetSpeed(-1); - } else if(!timeshift || !g_settings.timeshift_pause) { - playback->SetSpeed(1); - } - } + if (first_start_timeshift) { + callInfoViewer(duration, position); + first_start_timeshift = false; } g_RCInput->getMsg(&msg, &data, 10); // 1 secs.. - if(timeshift && g_settings.timeshift_pause) { - if(!timeshift_paused && !videoDecoder->getBlank()) { - playback->SetSpeed(0); - timeshift_paused = true; - playstate = CMoviePlayerGui::PAUSE; - } - } if ((playstate >= CMoviePlayerGui::PLAY) && (timeshift || (playstate != CMoviePlayerGui::PAUSE))) { if(playback->GetPosition(position, duration)) { if(duration > 100) @@ -852,43 +448,29 @@ void CMoviePlayerGui::PlayFile(void) #endif if (duration - position < 1000 && !timeshift) { - /* 10 seconds after end-of-file, exit */ + /* 10 seconds after end-of-file, stop */ if (++eof > 10) g_RCInput->postMsg((neutrino_msg_t) g_settings.mpkey_stop, 0); } else eof = 0; } + handleMovieBrowser(0, position); + FileTime.update(position, duration); } if (msg == (neutrino_msg_t) g_settings.mpkey_plugin) { //g_PluginList->start_plugin_by_name (g_settings.movieplayer_plugin.c_str (), pidt); } else if (msg == (neutrino_msg_t) g_settings.mpkey_stop) { - //exit play playstate = CMoviePlayerGui::STOPPED; - if (isMovieBrowser == true && p_movie_info != NULL) { - // if we have a movie information, try to save the stop position - ftime(¤t_time); - p_movie_info->dateOfLastPlay = current_time.time; - current_time.time = time(NULL); - p_movie_info->bookmarks.lastPlayStop = position / 1000; - - cMovieInfo.saveMovieInfo(*p_movie_info); - //p_movie_info->fileInfoStale(); //TODO: we might to tell the Moviebrowser that the movie info has changed, but this could cause long reload times when reentering the Moviebrowser - } - - if (!was_file) - exit = true; } else if (msg == (neutrino_msg_t) g_settings.mpkey_play) { - if (playstate >= CMoviePlayerGui::PLAY) { + if (playstate > CMoviePlayerGui::PLAY) { update_lcd = true; playstate = CMoviePlayerGui::PLAY; speed = 1; playback->SetSpeed(speed); if (!timeshift) - callInfoViewer(p_movie_info, duration, position); - } else if (!timeshift) { - open_filebrowser = true; + callInfoViewer(duration, position); } if (time_forced) { time_forced = false; @@ -908,151 +490,36 @@ void CMoviePlayerGui::PlayFile(void) playback->SetSpeed(speed); } if (!timeshift) - callInfoViewer(p_movie_info, duration, position); + callInfoViewer(duration, position); } else if (msg == (neutrino_msg_t) g_settings.mpkey_bookmark) { - // is there already a bookmark activity? - if (isMovieBrowser != true) { - if (bookmarkmanager->getBookmarkCount() < bookmarkmanager->getMaxBookmarkCount()) { - char timerstring[200]; - fprintf(stderr, "fileposition: %lld\n", fullposition); - sprintf(timerstring, "%lld", fullposition); - fprintf(stderr, "timerstring: %s\n", timerstring); - std::string bookmarktime = ""; - bookmarktime.append(timerstring); - fprintf(stderr, "bookmarktime: %s\n", bookmarktime.c_str()); - bookmarkmanager->createBookmark(filename, bookmarktime); - fprintf(stderr, "bookmark done\n"); - } else { - fprintf(stderr, "too many bookmarks\n"); - DisplayErrorMessage(g_Locale->getText(LOCALE_MOVIEPLAYER_TOOMANYBOOKMARKS)); // UTF-8 - } - } else { - int pos_sec = position / 1000; - if (newComHintBox.isPainted() == true) { - // yes, let's get the end pos of the jump forward - new_bookmark.length = pos_sec - new_bookmark.pos; - TRACE("[mp] commercial length: %d\r\n", new_bookmark.length); - if (cMovieInfo.addNewBookmark(p_movie_info, new_bookmark) == true) { - cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ - } - new_bookmark.pos = 0; // clear again, since this is used as flag for bookmark activity - newComHintBox.hide(); - } else if (newLoopHintBox.isPainted() == true) { - // yes, let's get the end pos of the jump backward - new_bookmark.length = new_bookmark.pos - pos_sec; - new_bookmark.pos = pos_sec; - TRACE("[mp] loop length: %d\r\n", new_bookmark.length); - if (cMovieInfo.addNewBookmark(p_movie_info, new_bookmark) == true) { - cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ - jump_not_until = pos_sec + 5; // avoid jumping for this time - } - new_bookmark.pos = 0; // clear again, since this is used as flag for bookmark activity - newLoopHintBox.hide(); - } else { - // no, nothing else to do, we open a new bookmark menu - new_bookmark.name = ""; // use default name - new_bookmark.pos = 0; - new_bookmark.length = 0; - - // next seems return menu_return::RETURN_EXIT, if something selected - bookStartMenu.exec(NULL, "none"); - if (cSelectedMenuBookStart[0].selected == true) { - /* Movieplayer bookmark */ - if (bookmarkmanager->getBookmarkCount() < bookmarkmanager->getMaxBookmarkCount()) { - char timerstring[200]; - fprintf(stderr, "fileposition: %lld\n", fullposition); - sprintf(timerstring, "%lld", fullposition); - fprintf(stderr, "timerstring: %s\n", timerstring); - std::string bookmarktime = ""; - bookmarktime.append(timerstring); - fprintf(stderr, "bookmarktime: %s\n", bookmarktime.c_str()); - bookmarkmanager->createBookmark(filename, bookmarktime); - } else { - fprintf(stderr, "too many bookmarks\n"); - DisplayErrorMessage(g_Locale->getText(LOCALE_MOVIEPLAYER_TOOMANYBOOKMARKS)); // UTF-8 - } - cSelectedMenuBookStart[0].selected = false; // clear for next bookmark menu - } else if (cSelectedMenuBookStart[1].selected == true) { - /* Moviebrowser plain bookmark */ - new_bookmark.pos = pos_sec; - new_bookmark.length = 0; - if (cMovieInfo.addNewBookmark(p_movie_info, new_bookmark) == true) - cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ - new_bookmark.pos = 0; // clear again, since this is used as flag for bookmark activity - cSelectedMenuBookStart[1].selected = false; // clear for next bookmark menu - } else if (cSelectedMenuBookStart[2].selected == true) { - /* Moviebrowser jump forward bookmark */ - new_bookmark.pos = pos_sec; - TRACE("[mp] new bookmark 1. pos: %d\r\n", new_bookmark.pos); - newComHintBox.paint(); - - cSelectedMenuBookStart[2].selected = false; // clear for next bookmark menu - } else if (cSelectedMenuBookStart[3].selected == true) { - /* Moviebrowser jump backward bookmark */ - new_bookmark.pos = pos_sec; - TRACE("[mp] new bookmark 1. pos: %d\r\n", new_bookmark.pos); - newLoopHintBox.paint(); - cSelectedMenuBookStart[3].selected = false; // clear for next bookmark menu - } else if (cSelectedMenuBookStart[4].selected == true) { - /* Moviebrowser movie start bookmark */ - p_movie_info->bookmarks.start = pos_sec; - TRACE("[mp] New movie start pos: %d\r\n", p_movie_info->bookmarks.start); - cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ - cSelectedMenuBookStart[4].selected = false; // clear for next bookmark menu - } else if (cSelectedMenuBookStart[5].selected == true) { - /* Moviebrowser movie end bookmark */ - p_movie_info->bookmarks.end = pos_sec; - TRACE("[mp] New movie end pos: %d\r\n", p_movie_info->bookmarks.start); - cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ - cSelectedMenuBookStart[5].selected = false; // clear for next bookmark menu - } - } - } + handleMovieBrowser((neutrino_msg_t) g_settings.mpkey_bookmark, position); } else if (msg == (neutrino_msg_t) g_settings.mpkey_audio) { - showaudioselectdialog = true; + selectAudioPid(is_file_player); + update_lcd = true; } else if (msg == (neutrino_msg_t) g_settings.mpkey_time) { FileTime.switchMode(position, duration); - } else if (msg == (neutrino_msg_t) g_settings.mpkey_rewind) { // rewind - if (speed >= 0) - speed = -1; - else - speed --; + } else if ((msg == (neutrino_msg_t) g_settings.mpkey_rewind) || + (msg == (neutrino_msg_t) g_settings.mpkey_forward)) { + if (msg == (neutrino_msg_t) g_settings.mpkey_rewind) { + speed = (speed >= 0) ? -1 : speed - 1; + playstate = CMoviePlayerGui::REW; + } else { + speed = (speed <= 0) ? 2 : speed + 1; + playstate = CMoviePlayerGui::FF; + } + /* if paused, playback->SetSpeed() start slow motion */ playback->SetSpeed(speed); - playstate = CMoviePlayerGui::REW; update_lcd = true; if (!timeshift) - callInfoViewer(p_movie_info, duration, position); + callInfoViewer(duration, position); if (!FileTime.IsVisible()) { FileTime.show(position); time_forced = true; } - } else if (msg == (neutrino_msg_t) g_settings.mpkey_forward) { // fast-forward - if (speed <= 0) - speed = 2; - else - speed ++; - - playback->SetSpeed(speed); - - update_lcd = true; - playstate = CMoviePlayerGui::FF; - - if (!timeshift) - callInfoViewer(p_movie_info, duration, position); - - if (!FileTime.IsVisible()) { - FileTime.show(position); - time_forced = true; - } - } else if (msg == CRCInput::RC_help || msg == CRCInput::RC_info) { - callInfoViewer(p_movie_info, duration, position); - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); - update_lcd = true; - //showHelpTS(); } else if (msg == CRCInput::RC_1) { // Jump Backwards 1 minute playback->SetPosition(-60 * 1000); } else if (msg == CRCInput::RC_3) { // Jump Forward 1 minute @@ -1076,82 +543,58 @@ void CMoviePlayerGui::PlayFile(void) } else if (msg == CRCInput::RC_page_down) { playback->SetPosition(-10 * 1000); } else if (msg == CRCInput::RC_0) { // cancel bookmark jump - if (isMovieBrowser == true) { - if (new_bookmark.pos != 0) { - new_bookmark.pos = 0; // stop current bookmark activity, TODO: might bemoved to another key - newLoopHintBox.hide(); // hide hint box if any - newComHintBox.hide(); - } - jump_not_until = (position / 1000) + 10; // avoid bookmark jumping for the next 10 seconds, , TODO: might be moved to another key - } + handleMovieBrowser(CRCInput::RC_0, position); } - else if (msg == CRCInput::RC_sat || msg == CRCInput::RC_favorites) { + else if (msg == CRCInput::RC_timeout) { + // nothing + } else if (msg == CRCInput::RC_sat || msg == CRCInput::RC_favorites) { //FIXME do nothing ? - } - else if(timeshift && (msg == CRCInput::RC_text || msg == CRCInput::RC_epg)) { + } else if (msg == CRCInput::RC_help || msg == CRCInput::RC_info) { + callInfoViewer(duration, position); + update_lcd = true; + //showHelpTS(); + } else if(timeshift && (msg == CRCInput::RC_text || msg == CRCInput::RC_epg || msg == NeutrinoMessages::SHOW_EPG)) { bool restore = FileTime.IsVisible(); FileTime.hide(); if( msg == CRCInput::RC_epg ) g_EventList->exec(CNeutrinoApp::getInstance()->channelList->getActiveChannel_ChannelID(), CNeutrinoApp::getInstance()->channelList->getActiveChannelName()); + else if(msg == NeutrinoMessages::SHOW_EPG) + g_EpgData->show(CNeutrinoApp::getInstance()->channelList->getActiveChannel_ChannelID()); else { if(g_settings.cacheTXT) tuxtxt_stop(); tuxtx_main(g_RCInput->getFileHandle(), g_RemoteControl->current_PIDs.PIDs.vtxtpid, 0, 2); frameBuffer->paintBackground(); } - if(restore) { - FileTime.show(position / 1000); - } - } - else if (msg == CRCInput::RC_timeout) { - // nothing + if(restore) + FileTime.show(position); } else if ( msg == NeutrinoMessages::ANNOUNCE_RECORD || msg == NeutrinoMessages::RECORD_START) { - CNeutrinoApp::getInstance()->handleMsg(msg, data); - } else if (timeshift && msg == NeutrinoMessages::SHOW_EPG ) { - bool restore = FileTime.IsVisible(); - FileTime.hide(); - - g_EpgData->show(CNeutrinoApp::getInstance()->channelList->getActiveChannel_ChannelID()); - - if(restore) { - FileTime.show(position / 1000); - } + CNeutrinoApp::getInstance()->handleMsg(msg, data); } else if ( msg == NeutrinoMessages::ZAPTO || msg == NeutrinoMessages::STANDBY_ON || msg == NeutrinoMessages::SHUTDOWN || msg == NeutrinoMessages::SLEEPTIMER) { // Exit for Record/Zapto Timers - exit = true; + printf("CMoviePlayerGui::PlayFile: ZAPTO etc..\n"); + playstate = CMoviePlayerGui::STOPPED; g_RCInput->postMsg(msg, data); } else { - if (CNeutrinoApp::getInstance()->handleMsg(msg, data) & messages_return::cancel_all) - exit = true; + if (CNeutrinoApp::getInstance()->handleMsg(msg, data) & messages_return::cancel_all) { + printf("CMoviePlayerGui::PlayFile: neutrino handleMsg messages_return::cancel_all\n"); + playstate = CMoviePlayerGui::STOPPED; + } else if ( msg <= CRCInput::RC_MaxRC ) { - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8); update_lcd = true; } } - if (first_start_timeshift) { - callInfoViewer(p_movie_info, duration, position); - first_start_timeshift = false; + if (playstate == CMoviePlayerGui::STOPPED) { + printf("CMoviePlayerGui::PlayFile: exit, isMovieBrowser %d p_movie_info %x\n", isMovieBrowser, (int) p_movie_info); + playstate = CMoviePlayerGui::STOPPED; + handleMovieBrowser((neutrino_msg_t) g_settings.mpkey_stop, position); } - - if (exit) { -printf("CMoviePlayerGui::PlayFile: exit, isMovieBrowser %d p_movie_info %x\n", isMovieBrowser, (int) p_movie_info); - if (isMovieBrowser == true && p_movie_info != NULL) { - // if we have a movie information, try to save the stop position - ftime(¤t_time); - p_movie_info->dateOfLastPlay = current_time.time; - current_time.time = time(NULL); - p_movie_info->bookmarks.lastPlayStop = position / 1000; - - cMovieInfo.saveMovieInfo(*p_movie_info); - //p_movie_info->fileInfoStale(); //TODO: we might to tell the Moviebrowser that the movie info has changed, but this could cause long reload times when reentering the Moviebrowser - } - } - } while (playstate >= CMoviePlayerGui::PLAY); + } FileTime.hide(); @@ -1161,18 +604,13 @@ printf("CMoviePlayerGui::PlayFile: exit, isMovieBrowser %d p_movie_info %x\n", i CVFD::getInstance()->ShowIcon(VFD_ICON_PLAY, false); CVFD::getInstance()->ShowIcon(VFD_ICON_PAUSE, false); - if (was_file) { - restoreNeutrino(); - open_filebrowser = true; - start_play = true; - goto go_repeat; - } + restoreNeutrino(); if (g_settings.mode_clock) InfoClock->StartClock(); } -void CMoviePlayerGui::callInfoViewer(MI_MOVIE_INFO * p_movie_info, const int duration, const int curr_pos) +void CMoviePlayerGui::callInfoViewer(const int duration, const int curr_pos) { if(timeshift) { g_InfoViewer->showTitle(CNeutrinoApp::getInstance()->channelList->getActiveChannelNumber(), @@ -1188,22 +626,354 @@ void CMoviePlayerGui::callInfoViewer(MI_MOVIE_INFO * p_movie_info, const int dur } /* not moviebrowser => use the filename as title */ - char temp_name[255] = { 0 }; - const char *slash = strrchr(filename, '/'); - if (slash) { - slash++; - int len = strlen(slash); - if (len > 254) - len = 254; - for (int i = 0; i < len; i++) { - if (slash[i] == '_') - temp_name[i] = ' '; - else - temp_name[i] = slash[i]; + g_InfoViewer->showMovieTitle(playstate, file_name, "", "", duration, curr_pos); +} + +bool CMoviePlayerGui::getAudioName(int apid, std::string &apidtitle) +{ + if (p_movie_info == NULL) + return false; + + for (int i = 0; i < (int)p_movie_info->audioPids.size(); i++) { + if (p_movie_info->audioPids[i].epgAudioPid == apid && !p_movie_info->audioPids[i].epgAudioPidName.empty()) { + apidtitle = p_movie_info->audioPids[i].epgAudioPidName; + return true; } - temp_name[len] = 0; } - g_InfoViewer->showMovieTitle(playstate, temp_name, "", "", duration, curr_pos); + return false; +} + +void CMoviePlayerGui::selectAudioPid(bool file_player) +{ + CMenuWidget APIDSelector(LOCALE_APIDSELECTOR_HEAD, NEUTRINO_ICON_AUDIO); + APIDSelector.addIntroItems(); + + int select = -1; + CMenuSelectorTarget * selector = new CMenuSelectorTarget(&select); + + if(file_player && !numpida){ + playback->FindAllPids(apids, ac3flags, &numpida, language); + /* fix current pid in case of file play */ + if(numpida) + currentapid = apids[0]; + } + for (unsigned int count = 0; count < numpida; count++) { + bool name_ok = false; + bool enabled = true; + bool defpid = currentapid ? (currentapid == apids[count]) : (count == 0); + std::string apidtitle; + + if(!file_player){ + name_ok = getAudioName(apids[count], apidtitle); + } + else if (!language[count].empty()){ + apidtitle = language[count]; + name_ok = true; + } + if (!name_ok) { + char apidnumber[20]; + sprintf(apidnumber, "Stream %d %X", count + 1, apids[count]); + apidtitle = apidnumber; + } + + switch(ac3flags[count]) + { + case 1: /*AC3,EAC3*/ + if (apidtitle.find("AC3") == std::string::npos || file_player) + apidtitle.append(" (AC3)"); + break; + case 2: /*teletext*/ + apidtitle.append(" (Teletext)"); + enabled = false; + break; + case 3: /*MP2*/ + apidtitle.append("( MP2)"); + break; + case 4: /*MP3*/ + apidtitle.append(" (MP3)"); + break; + case 5: /*AAC*/ + apidtitle.append(" (AAC)"); + break; + case 6: /*DTS*/ + apidtitle.append(" (DTS)"); + enabled = false; + break; + case 7: /*MLP*/ + apidtitle.append(" (MLP)"); + break; + default: + break; + } + char cnt[5]; + sprintf(cnt, "%d", count); + CMenuForwarderNonLocalized * item = new CMenuForwarderNonLocalized(apidtitle.c_str(), enabled, NULL, selector, cnt, CRCInput::convertDigitToKey(count + 1)); + APIDSelector.addItem(item, defpid); + } + + APIDSelector.exec(NULL, ""); + delete selector; + printf("CMoviePlayerGui::selectAudioPid: selected %d (%x) current %x\n", select, (select >= 0) ? apids[select] : -1, currentapid); + if((select >= 0) && (currentapid != apids[select])) { + currentapid = apids[select]; + currentac3 = ac3flags[select]; + playback->SetAPid(currentapid, currentac3); + printf("[movieplayer] apid changed to %d type %d\n", currentapid, currentac3); + } +} + +void CMoviePlayerGui::handleMovieBrowser(neutrino_msg_t msg, int position) +{ + CMovieInfo cMovieInfo; // funktions to save and load movie info + + static int jump_not_until = 0; // any jump shall be avoided until this time (in seconds from moviestart) + static MI_BOOKMARK new_bookmark; // used for new movie info bookmarks created from the movieplayer + + static int width = 280; + static int height = 65; + + static int x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; + static int y = frameBuffer->getScreenY() + frameBuffer->getScreenHeight() - height - 20; + + static CBox boxposition(x, y, width, height); // window position for the hint boxes + + static CTextBox endHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_MOVIEEND), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); + static CTextBox comHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_JUMPFORWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); + static CTextBox loopHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_JUMPBACKWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); + static CTextBox newLoopHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_NEWBOOK_BACKWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); + static CTextBox newComHintBox(g_Locale->getText(LOCALE_MOVIEBROWSER_HINT_NEWBOOK_FORWARD), NULL, CTextBox::CENTER /*CTextBox::AUTO_WIDTH | CTextBox::AUTO_HIGH */ , &boxposition); + + static bool showEndHintBox = false; // flag to check whether the box shall be painted + static bool showComHintBox = false; // flag to check whether the box shall be painted + static bool showLoopHintBox = false; // flag to check whether the box shall be painted + + int play_sec = position / 1000; // get current seconds from moviestart + if(msg == CRCInput::RC_nokey) { + printf("CMoviePlayerGui::handleMovieBrowser: reset vars\n"); + // reset statics + jump_not_until = 0; + showEndHintBox = showComHintBox = showLoopHintBox = false; + new_bookmark.pos = 0; + // move in case osd position changed + int newx = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; + int newy = frameBuffer->getScreenY() + frameBuffer->getScreenHeight() - height - 20; + endHintBox.movePosition(newx, newy); + comHintBox.movePosition(newx, newy); + loopHintBox.movePosition(newx, newy); + newLoopHintBox.movePosition(newx, newy); + newComHintBox.movePosition(newx, newy); + return; + } + else if (msg == (neutrino_msg_t) g_settings.mpkey_stop) { + // if we have a movie information, try to save the stop position + printf("CMoviePlayerGui::handleMovieBrowser: stop, isMovieBrowser %d p_movie_info %x\n", isMovieBrowser, (int) p_movie_info); + if (isMovieBrowser && p_movie_info) { + timeb current_time; + ftime(¤t_time); + p_movie_info->dateOfLastPlay = current_time.time; + current_time.time = time(NULL); + p_movie_info->bookmarks.lastPlayStop = position / 1000; + cMovieInfo.saveMovieInfo(*p_movie_info); + //p_movie_info->fileInfoStale(); //TODO: we might to tell the Moviebrowser that the movie info has changed, but this could cause long reload times when reentering the Moviebrowser + } + } + else if((msg == 0) && isMovieBrowser && (playstate == CMoviePlayerGui::PLAY) && p_movie_info) { + if (play_sec + 10 < jump_not_until || play_sec > jump_not_until + 10) + jump_not_until = 0; // check if !jump is stale (e.g. if user jumped forward or backward) + + // do bookmark activities only, if there is no new bookmark started + if (new_bookmark.pos != 0) + return; +#ifdef DEBUG + //printf("CMoviePlayerGui::handleMovieBrowser: process bookmarks\n"); +#endif + if (p_movie_info->bookmarks.end != 0) { + // *********** Check for stop position ******************************* + if (play_sec >= p_movie_info->bookmarks.end - MOVIE_HINT_BOX_TIMER && play_sec < p_movie_info->bookmarks.end && play_sec > jump_not_until) { + if (showEndHintBox == false) { + endHintBox.paint(); // we are 5 sec before the end postition, show warning + showEndHintBox = true; + TRACE("[mp] user stop in 5 sec...\r\n"); + } + } else { + if (showEndHintBox == true) { + endHintBox.hide(); // if we showed the warning before, hide the box again + showEndHintBox = false; + } + } + + if (play_sec >= p_movie_info->bookmarks.end && play_sec <= p_movie_info->bookmarks.end + 2 && play_sec > jump_not_until) // stop playing + { + // *********** we ARE close behind the stop position, stop playing ******************************* + TRACE("[mp] user stop: play_sec %d bookmarks.end %d jump_not_until %d\n", play_sec, p_movie_info->bookmarks.end, jump_not_until); + playstate = CMoviePlayerGui::STOPPED; + return; + } + } + // ************* Check for bookmark jumps ******************************* + showLoopHintBox = false; + showComHintBox = false; + for (int book_nr = 0; book_nr < MI_MOVIE_BOOK_USER_MAX; book_nr++) { + if (p_movie_info->bookmarks.user[book_nr].pos != 0 && p_movie_info->bookmarks.user[book_nr].length != 0) { + // valid bookmark found, now check if we are close before or after it + if (play_sec >= p_movie_info->bookmarks.user[book_nr].pos - MOVIE_HINT_BOX_TIMER && play_sec < p_movie_info->bookmarks.user[book_nr].pos && play_sec > jump_not_until) { + if (p_movie_info->bookmarks.user[book_nr].length < 0) + showLoopHintBox = true; // we are 5 sec before , show warning + else if (p_movie_info->bookmarks.user[book_nr].length > 0) + showComHintBox = true; // we are 5 sec before, show warning + //else // TODO should we show a plain bookmark infomation as well? + } + + if (play_sec >= p_movie_info->bookmarks.user[book_nr].pos && play_sec <= p_movie_info->bookmarks.user[book_nr].pos + 2 && play_sec > jump_not_until) // + { + //for plain bookmark, the following calc shall result in 0 (no jump) + int jumpseconds = p_movie_info->bookmarks.user[book_nr].length; + + // we are close behind the bookmark, do bookmark activity (if any) + if (p_movie_info->bookmarks.user[book_nr].length < 0) { + // if the jump back time is to less, it does sometimes cause problems (it does probably jump only 5 sec which will cause the next jump, and so on) + if (jumpseconds > -15) + jumpseconds = -15; + + playback->SetPosition(jumpseconds * 1000); + } else if (p_movie_info->bookmarks.user[book_nr].length > 0) { + // jump at least 15 seconds + if (jumpseconds < 15) + jumpseconds = 15; + + playback->SetPosition(jumpseconds * 1000); + } + TRACE("[mp] do jump %d sec\r\n", jumpseconds); + break; // do no further bookmark checks + } + } + } + // check if we shall show the commercial warning + if (showComHintBox == true) { + comHintBox.paint(); + TRACE("[mp] com jump in 5 sec...\r\n"); + } else + comHintBox.hide(); + + // check if we shall show the loop warning + if (showLoopHintBox == true) { + loopHintBox.paint(); + TRACE("[mp] loop jump in 5 sec...\r\n"); + } else + loopHintBox.hide(); + + return; + } else if (msg == CRCInput::RC_0) { // cancel bookmark jump + printf("CMoviePlayerGui::handleMovieBrowser: CRCInput::RC_0\n"); + if (isMovieBrowser == true) { + if (new_bookmark.pos != 0) { + new_bookmark.pos = 0; // stop current bookmark activity, TODO: might bemoved to another key + newLoopHintBox.hide(); // hide hint box if any + newComHintBox.hide(); + } + comHintBox.hide(); + loopHintBox.hide(); + jump_not_until = (position / 1000) + 10; // avoid bookmark jumping for the next 10 seconds, , TODO: might be moved to another key + } + return; + } + else if (msg == (neutrino_msg_t) g_settings.mpkey_bookmark) { + if (newComHintBox.isPainted() == true) { + // yes, let's get the end pos of the jump forward + new_bookmark.length = play_sec - new_bookmark.pos; + TRACE("[mp] commercial length: %d\r\n", new_bookmark.length); + if (cMovieInfo.addNewBookmark(p_movie_info, new_bookmark) == true) { + cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ + } + new_bookmark.pos = 0; // clear again, since this is used as flag for bookmark activity + newComHintBox.hide(); + } else if (newLoopHintBox.isPainted() == true) { + // yes, let's get the end pos of the jump backward + new_bookmark.length = new_bookmark.pos - play_sec; + new_bookmark.pos = play_sec; + TRACE("[mp] loop length: %d\r\n", new_bookmark.length); + if (cMovieInfo.addNewBookmark(p_movie_info, new_bookmark) == true) { + cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ + jump_not_until = play_sec + 5; // avoid jumping for this time + } + new_bookmark.pos = 0; // clear again, since this is used as flag for bookmark activity + newLoopHintBox.hide(); + } else { + // very dirty usage of the menue, but it works and I already spent to much time with it, feel free to make it better ;-) +#define BOOKMARK_START_MENU_MAX_ITEMS 6 + CSelectedMenu cSelectedMenuBookStart[BOOKMARK_START_MENU_MAX_ITEMS]; + + CMenuWidget bookStartMenu(LOCALE_MOVIEBROWSER_BOOK_NEW, NEUTRINO_ICON_STREAMING); + bookStartMenu.addIntroItems(); +#if 0 // not supported, TODO + bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEPLAYER_HEAD, !isMovieBrowser, NULL, &cSelectedMenuBookStart[0])); + bookStartMenu.addItem(GenericMenuSeparatorLine); +#endif + bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_HEAD, isMovieBrowser, NULL, &cSelectedMenuBookStart[1])); + bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_TYPE_FORWARD, isMovieBrowser, NULL, &cSelectedMenuBookStart[2])); + bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_TYPE_BACKWARD, isMovieBrowser, NULL, &cSelectedMenuBookStart[3])); + bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_MOVIESTART, isMovieBrowser, NULL, &cSelectedMenuBookStart[4])); + bookStartMenu.addItem(new CMenuForwarder(LOCALE_MOVIEBROWSER_BOOK_MOVIEEND, isMovieBrowser, NULL, &cSelectedMenuBookStart[5])); + + // no, nothing else to do, we open a new bookmark menu + new_bookmark.name = ""; // use default name + new_bookmark.pos = 0; + new_bookmark.length = 0; + + // next seems return menu_return::RETURN_EXIT, if something selected + bookStartMenu.exec(NULL, "none"); +#if 0 // not supported, TODO + if (cSelectedMenuBookStart[0].selected == true) { + /* Movieplayer bookmark */ + if (bookmarkmanager->getBookmarkCount() < bookmarkmanager->getMaxBookmarkCount()) { + char timerstring[200]; + sprintf(timerstring, "%lld", play_sec); + std::string bookmarktime = timerstring; + fprintf(stderr, "fileposition: %lld timerstring: %s bookmarktime: %s\n", play_sec, timerstring, bookmarktime.c_str()); + bookmarkmanager->createBookmark(full_name, bookmarktime); + } else { + fprintf(stderr, "too many bookmarks\n"); + DisplayErrorMessage(g_Locale->getText(LOCALE_MOVIEPLAYER_TOOMANYBOOKMARKS)); // UTF-8 + } + cSelectedMenuBookStart[0].selected = false; // clear for next bookmark menu + } else +#endif + if (cSelectedMenuBookStart[1].selected == true) { + /* Moviebrowser plain bookmark */ + new_bookmark.pos = play_sec; + new_bookmark.length = 0; + if (cMovieInfo.addNewBookmark(p_movie_info, new_bookmark) == true) + cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ + new_bookmark.pos = 0; // clear again, since this is used as flag for bookmark activity + cSelectedMenuBookStart[1].selected = false; // clear for next bookmark menu + } else if (cSelectedMenuBookStart[2].selected == true) { + /* Moviebrowser jump forward bookmark */ + new_bookmark.pos = play_sec; + TRACE("[mp] new bookmark 1. pos: %d\r\n", new_bookmark.pos); + newComHintBox.paint(); + cSelectedMenuBookStart[2].selected = false; // clear for next bookmark menu + } else if (cSelectedMenuBookStart[3].selected == true) { + /* Moviebrowser jump backward bookmark */ + new_bookmark.pos = play_sec; + TRACE("[mp] new bookmark 1. pos: %d\r\n", new_bookmark.pos); + newLoopHintBox.paint(); + cSelectedMenuBookStart[3].selected = false; // clear for next bookmark menu + } else if (cSelectedMenuBookStart[4].selected == true) { + /* Moviebrowser movie start bookmark */ + p_movie_info->bookmarks.start = play_sec; + TRACE("[mp] New movie start pos: %d\r\n", p_movie_info->bookmarks.start); + cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ + cSelectedMenuBookStart[4].selected = false; // clear for next bookmark menu + } else if (cSelectedMenuBookStart[5].selected == true) { + /* Moviebrowser movie end bookmark */ + p_movie_info->bookmarks.end = play_sec; + TRACE("[mp] New movie end pos: %d\r\n", p_movie_info->bookmarks.start); + cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ + cSelectedMenuBookStart[5].selected = false; // clear for next bookmark menu + } + } + } + return; } void CMoviePlayerGui::showHelpTS() @@ -1221,29 +991,5 @@ void CMoviePlayerGui::showHelpTS() helpbox.addLine(NEUTRINO_ICON_BUTTON_7, g_Locale->getText(LOCALE_MOVIEPLAYER_TSHELP10)); helpbox.addLine(NEUTRINO_ICON_BUTTON_9, g_Locale->getText(LOCALE_MOVIEPLAYER_TSHELP11)); helpbox.addLine(g_Locale->getText(LOCALE_MOVIEPLAYER_TSHELP12)); - helpbox.addLine("Version: $Revision: 1.97 $"); - helpbox.addLine("Movieplayer (c) 2003, 2004 by gagga"); - hide(); - helpbox.show(LOCALE_MESSAGEBOX_INFO); -} - -void CMoviePlayerGui::showHelpVLC() -{ - Helpbox helpbox; - helpbox.addLine(NEUTRINO_ICON_BUTTON_RED, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP1)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_GREEN, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP2)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_YELLOW, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP3)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_BLUE, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP4)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_MENU, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP5)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_1, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP6)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_3, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP7)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_4, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP8)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_6, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP9)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_7, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP10)); - helpbox.addLine(NEUTRINO_ICON_BUTTON_9, g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP11)); - helpbox.addLine(g_Locale->getText(LOCALE_MOVIEPLAYER_VLCHELP12)); - helpbox.addLine("Version: $Revision: 1.97 $"); - helpbox.addLine("Movieplayer (c) 2003, 2004 by gagga"); - hide(); helpbox.show(LOCALE_MESSAGEBOX_INFO); } diff --git a/src/gui/movieplayer.h b/src/gui/movieplayer.h index 146e82b3a..2afd1a8b6 100644 --- a/src/gui/movieplayer.h +++ b/src/gui/movieplayer.h @@ -66,35 +66,40 @@ class CMoviePlayerGui : public CMenuTarget private: CFrameBuffer * frameBuffer; int m_LastMode; - const char *filename; - bool stopped; - CMoviePlayerGui::state playstate; - bool isBookmark; - bool isMovieBrowser; - int speed; - off64_t fullposition; - int startposition; - int jumpseconds; - bool showaudioselectdialog; - off64_t minuteoffset; - off64_t secondoffset; - std::string startfilename; - std::string Path_local; - static unsigned short g_numpida; - static unsigned short g_vtype; - static unsigned short g_vpid; - static std::string g_language[REC_MAX_APIDS]; + std::string full_name; + std::string file_name; + + bool playing; + CMoviePlayerGui::state playstate; + int speed; + int startposition; + + unsigned short numpida; + unsigned short vpid; + unsigned short vtype; + std::string language[REC_MAX_APIDS]; + unsigned short apids[REC_MAX_APIDS]; + unsigned short ac3flags[REC_MAX_APIDS]; + unsigned short currentapid, currentac3; + + /* playback from MB */ + bool isMovieBrowser; + CMovieBrowser* moviebrowser; + MI_MOVIE_INFO * p_movie_info; const static short MOVIE_HINT_BOX_TIMER = 5; // time to show bookmark hints in seconds + /* playback from file */ + bool is_file_player; CFileBrowser * filebrowser; - CMovieBrowser* moviebrowser; - - CBookmarkManager * bookmarkmanager; - CFileFilter tsfilefilter; + std::string Path_local; - static cPlayback *playback; + /* playback from bookmark */ + CBookmarkManager * bookmarkmanager; + bool isBookmark; + + cPlayback *playback; static CMoviePlayerGui* instance_mp; void Init(void); @@ -103,35 +108,27 @@ class CMoviePlayerGui : public CMenuTarget void restoreNeutrino(); void showHelpTS(void); - void showHelpVLC(void); - void callInfoViewer(MI_MOVIE_INFO * p_movie_info, const int duration, const int pos); - void fillPids(MI_MOVIE_INFO * p_movie_info); + void callInfoViewer(const int duration, const int pos); + void fillPids(); + bool getAudioName(int pid, std::string &apidtitle); + void selectAudioPid(bool file_player); + + void handleMovieBrowser(neutrino_msg_t msg, int position = 0); + bool SelectFile(); + void updateLcd(); CMoviePlayerGui(const CMoviePlayerGui&) {}; + CMoviePlayerGui(); public: - CMoviePlayerGui(); ~CMoviePlayerGui(); static CMoviePlayerGui& getInstance(); - static void Delete(); - + int exec(CMenuTarget* parent, const std::string & actionKey); - void updateLcd(const std::string & sel_filename); - bool Playing(); + bool Playing() { return playing; }; int timeshift; - bool start_timeshift; int file_prozent; }; - -class CAPIDSelectExec : public CMenuTarget -{ - public: - int exec(CMenuTarget* parent, const std::string & actionKey); - static unsigned short g_apids[REC_MAX_APIDS]; - static unsigned short g_ac3flags[REC_MAX_APIDS]; - static unsigned short g_currentapid, g_currentac3, apidchanged; -}; - #endif diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 838dcc899..31d8452dc 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -3771,11 +3771,11 @@ void stop_daemons(bool stopall) g_Zapit->shutdown(); pthread_join(zapit_thread, NULL); #endif + delete &CMoviePlayerGui::getInstance(); CZapit::getInstance()->Stop(); printf("zapit shutdown done\n"); CVFD::getInstance()->Clear(); if(stopall) { - CMoviePlayerGui::Delete(); //remove instance if (cpuFreq) cpuFreq->SetCpuFreq(g_settings.cpufreq * 1000 * 1000); if (powerManager) {