void CEpg::SetChannel(PVR::CPVRChannelPtr channel) { CSingleLock lock(m_critSection); if (m_pvrChannel != channel) { if (channel) SetName(channel->ChannelName()); m_pvrChannel = channel; for (map<CDateTime, CEpgInfoTagPtr>::iterator it = m_tags.begin(); it != m_tags.end(); it++) it->second->SetPVRChannel(m_pvrChannel); } }
void CEpg::SetChannel(const PVR::CPVRChannelPtr &channel) { CSingleLock lock(m_critSection); if (m_pvrChannel != channel) { if (channel) { SetName(channel->ChannelName()); channel->SetEpgID(m_iEpgID); } m_pvrChannel = channel; for (std::map<CDateTime, CEpgInfoTagPtr>::iterator it = m_tags.begin(); it != m_tags.end(); ++it) it->second->SetPVRChannel(m_pvrChannel); } }
/*! \brief Control player. * \param params The parameters * \details params[0] = Control to execute. * params[1] = "notify" to notify user (optional, certain controls). */ static int PlayerControl(const std::vector<std::string>& params) { g_application.ResetScreenSaver(); g_application.WakeUpScreenSaverAndDPMS(); std::string paramlow(params[0]); StringUtils::ToLower(paramlow); if (paramlow == "play") { // play/pause // either resume playing, or pause if (g_application.GetAppPlayer().IsPlaying()) { if (g_application.GetAppPlayer().GetPlaySpeed() != 1) g_application.GetAppPlayer().SetPlaySpeed(1); else g_application.GetAppPlayer().Pause(); } } else if (paramlow == "stop") { g_application.StopPlaying(); } else if (StringUtils::StartsWithNoCase(params[0], "frameadvance")) { std::string strFrames; if (params[0].size() == 12) CLog::Log(LOGERROR, "PlayerControl(frameadvance(n)) called with no argument"); else if (params[0].size() < 15) // arg must be at least "(N)" CLog::Log(LOGERROR, "PlayerControl(frameadvance(n)) called with invalid argument: \"%s\"", params[0].substr(13).c_str()); else strFrames = params[0].substr(13); StringUtils::TrimRight(strFrames, ")"); float frames = (float) atof(strFrames.c_str()); g_application.GetAppPlayer().FrameAdvance(frames); } else if (paramlow =="rewind" || paramlow == "forward") { if (g_application.GetAppPlayer().IsPlaying() && !g_application.GetAppPlayer().IsPaused()) { float playSpeed = g_application.GetAppPlayer().GetPlaySpeed(); if (paramlow == "rewind" && playSpeed == 1) // Enables Rewinding playSpeed *= -2; else if (paramlow == "rewind" && playSpeed > 1) //goes down a notch if you're FFing playSpeed /= 2; else if (paramlow == "forward" && playSpeed < 1) //goes up a notch if you're RWing { playSpeed /= 2; if (playSpeed == -1) playSpeed = 1; } else playSpeed *= 2; if (playSpeed > 32 || playSpeed < -32) playSpeed = 1; g_application.GetAppPlayer().SetPlaySpeed(playSpeed); } } else if (paramlow =="tempoup" || paramlow == "tempodown") { if (g_application.GetAppPlayer().SupportsTempo() && g_application.GetAppPlayer().IsPlaying() && !g_application.GetAppPlayer().IsPaused()) { float playTempo = g_application.GetAppPlayer().GetPlayTempo(); if (paramlow == "tempodown") playTempo -= 0.1f; else if (paramlow == "tempoup") playTempo += 0.1f; g_application.GetAppPlayer().SetTempo(playTempo); } } else if (paramlow == "next") { g_application.OnAction(CAction(ACTION_NEXT_ITEM)); } else if (paramlow == "previous") { g_application.OnAction(CAction(ACTION_PREV_ITEM)); } else if (paramlow == "bigskipbackward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(false, true); } else if (paramlow == "bigskipforward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(true, true); } else if (paramlow == "smallskipbackward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(false, false); } else if (paramlow == "smallskipforward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(true, false); } else if (StringUtils::StartsWithNoCase(params[0], "seekpercentage")) { std::string offset; if (params[0].size() == 14) CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument"); else if (params[0].size() < 17) // arg must be at least "(N)" CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", params[0].substr(14).c_str()); else { // Don't bother checking the argument: an invalid arg will do seek(0) offset = params[0].substr(15); StringUtils::TrimRight(offset, ")"); float offsetpercent = (float) atof(offset.c_str()); if (offsetpercent < 0 || offsetpercent > 100) CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent); else if (g_application.GetAppPlayer().IsPlaying()) g_application.SeekPercentage(offsetpercent); } } else if (paramlow == "showvideomenu") { if( g_application.GetAppPlayer().IsPlaying() ) g_application.GetAppPlayer().OnAction(CAction(ACTION_SHOW_VIDEOMENU)); } else if (StringUtils::StartsWithNoCase(params[0], "partymode")) { std::string strXspPath; //empty param=music, "music"=music, "video"=video, else xsp path PartyModeContext context = PARTYMODECONTEXT_MUSIC; if (params[0].size() > 9) { if (params[0].size() == 16 && StringUtils::EndsWithNoCase(params[0], "video)")) context = PARTYMODECONTEXT_VIDEO; else if (params[0].size() != 16 || !StringUtils::EndsWithNoCase(params[0], "music)")) { strXspPath = params[0].substr(10); StringUtils::TrimRight(strXspPath, ")"); context = PARTYMODECONTEXT_UNKNOWN; } } if (g_partyModeManager.IsEnabled()) g_partyModeManager.Disable(); else g_partyModeManager.Enable(context, strXspPath); } else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon") { // get current playlist int iPlaylist = CServiceBroker::GetPlaylistPlayer().GetCurrentPlaylist(); // reverse the current setting bool shuffled = CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist); if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff")) return 0; // check to see if we should notify the user bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); CServiceBroker::GetPlaylistPlayer().SetShuffle(iPlaylist, !shuffled, notify); // save settings for now playing windows switch (iPlaylist) { case PLAYLIST_MUSIC: CMediaSettings::GetInstance().SetMusicPlaylistShuffled(CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist)); CServiceBroker::GetSettings().Save(); break; case PLAYLIST_VIDEO: CMediaSettings::GetInstance().SetVideoPlaylistShuffled(CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist)); CServiceBroker::GetSettings().Save(); default: break; } // send message CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist)); CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); } else if (StringUtils::StartsWithNoCase(params[0], "repeat")) { // get current playlist int iPlaylist = CServiceBroker::GetPlaylistPlayer().GetCurrentPlaylist(); PLAYLIST::REPEAT_STATE previous_state = CServiceBroker::GetPlaylistPlayer().GetRepeat(iPlaylist); std::string paramlow(params[0]); StringUtils::ToLower(paramlow); PLAYLIST::REPEAT_STATE state; if (paramlow == "repeatall") state = PLAYLIST::REPEAT_ALL; else if (paramlow == "repeatone") state = PLAYLIST::REPEAT_ONE; else if (paramlow == "repeatoff") state = PLAYLIST::REPEAT_NONE; else if (previous_state == PLAYLIST::REPEAT_NONE) state = PLAYLIST::REPEAT_ALL; else if (previous_state == PLAYLIST::REPEAT_ALL) state = PLAYLIST::REPEAT_ONE; else state = PLAYLIST::REPEAT_NONE; if (state == previous_state) return 0; // check to see if we should notify the user bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); CServiceBroker::GetPlaylistPlayer().SetRepeat(iPlaylist, state, notify); // save settings for now playing windows switch (iPlaylist) { case PLAYLIST_MUSIC: CMediaSettings::GetInstance().SetMusicPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); CServiceBroker::GetSettings().Save(); break; case PLAYLIST_VIDEO: CMediaSettings::GetInstance().SetVideoPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); CServiceBroker::GetSettings().Save(); } // send messages so now playing window can get updated CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_REPEAT, 0, 0, iPlaylist, (int)state); CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); } else if (StringUtils::StartsWithNoCase(params[0], "resumelivetv")) { CFileItem& fileItem(g_application.CurrentFileItem()); PVR::CPVRChannelPtr channel = fileItem.HasPVRRecordingInfoTag() ? fileItem.GetPVRRecordingInfoTag()->Channel() : PVR::CPVRChannelPtr(); if (channel) { CFileItem playItem(channel); if (!g_application.PlayMedia(playItem, "", channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO)) { CLog::Log(LOGERROR, "ResumeLiveTv could not play channel: %s", channel->ChannelName().c_str()); return false; } } } else if (paramlow == "reset") { g_application.OnAction(CAction(ACTION_PLAYER_RESET)); } return 0; }
void CAnnouncementManager::Announce(AnnouncementFlag flag, const char *sender, const char *message, CFileItemPtr item, CVariant &data) { if (!item.get()) { Announce(flag, sender, message, data); return; } // Extract db id of item CVariant object = data.isNull() || data.isObject() ? data : CVariant::VariantTypeObject; std::string type; int id = 0; if(item->HasPVRChannelInfoTag()) { const PVR::CPVRChannelPtr channel(item->GetPVRChannelInfoTag()); id = channel->ChannelID(); type = "channel"; object["item"]["title"] = channel->ChannelName(); object["item"]["channeltype"] = channel->IsRadio() ? "radio" : "tv"; if (data.isMember("player") && data["player"].isMember("playerid")) object["player"]["playerid"] = channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO; } else if (item->HasVideoInfoTag()) { id = item->GetVideoInfoTag()->m_iDbId; // TODO: Can be removed once this is properly handled when starting playback of a file if (id <= 0 && !item->GetPath().empty() && (!item->HasProperty(LOOKUP_PROPERTY) || item->GetProperty(LOOKUP_PROPERTY).asBoolean())) { CVideoDatabase videodatabase; if (videodatabase.Open()) { std::string path = item->GetPath(); std::string videoInfoTagPath(item->GetVideoInfoTag()->m_strFileNameAndPath); if (StringUtils::StartsWith(videoInfoTagPath, "removable://")) path = videoInfoTagPath; if (videodatabase.LoadVideoInfo(path, *item->GetVideoInfoTag(), VideoDbDetailsNone)) id = item->GetVideoInfoTag()->m_iDbId; videodatabase.Close(); } } if (!item->GetVideoInfoTag()->m_type.empty()) type = item->GetVideoInfoTag()->m_type; else CVideoDatabase::VideoContentTypeToString((VIDEODB_CONTENT_TYPE)item->GetVideoContentType(), type); if (id <= 0) { // TODO: Can be removed once this is properly handled when starting playback of a file item->SetProperty(LOOKUP_PROPERTY, false); std::string title = item->GetVideoInfoTag()->m_strTitle; if (title.empty()) title = item->GetLabel(); object["item"]["title"] = title; switch (item->GetVideoContentType()) { case VIDEODB_CONTENT_MOVIES: if (item->GetVideoInfoTag()->m_iYear > 0) object["item"]["year"] = item->GetVideoInfoTag()->m_iYear; break; case VIDEODB_CONTENT_EPISODES: if (item->GetVideoInfoTag()->m_iEpisode >= 0) object["item"]["episode"] = item->GetVideoInfoTag()->m_iEpisode; if (item->GetVideoInfoTag()->m_iSeason >= 0) object["item"]["season"] = item->GetVideoInfoTag()->m_iSeason; if (!item->GetVideoInfoTag()->m_strShowTitle.empty()) object["item"]["showtitle"] = item->GetVideoInfoTag()->m_strShowTitle; break; case VIDEODB_CONTENT_MUSICVIDEOS: if (!item->GetVideoInfoTag()->m_strAlbum.empty()) object["item"]["album"] = item->GetVideoInfoTag()->m_strAlbum; if (!item->GetVideoInfoTag()->m_artist.empty()) object["item"]["artist"] = StringUtils::Join(item->GetVideoInfoTag()->m_artist, " / "); break; } } } else if (item->HasMusicInfoTag()) { id = item->GetMusicInfoTag()->GetDatabaseId(); type = MediaTypeSong; // TODO: Can be removed once this is properly handled when starting playback of a file if (id <= 0 && !item->GetPath().empty() && (!item->HasProperty(LOOKUP_PROPERTY) || item->GetProperty(LOOKUP_PROPERTY).asBoolean())) { CMusicDatabase musicdatabase; if (musicdatabase.Open()) { CSong song; if (musicdatabase.GetSongByFileName(item->GetPath(), song, item->m_lStartOffset)) { item->GetMusicInfoTag()->SetSong(song); id = item->GetMusicInfoTag()->GetDatabaseId(); } musicdatabase.Close(); } } if (id <= 0) { // TODO: Can be removed once this is properly handled when starting playback of a file item->SetProperty(LOOKUP_PROPERTY, false); std::string title = item->GetMusicInfoTag()->GetTitle(); if (title.empty()) title = item->GetLabel(); object["item"]["title"] = title; if (item->GetMusicInfoTag()->GetTrackNumber() > 0) object["item"]["track"] = item->GetMusicInfoTag()->GetTrackNumber(); if (!item->GetMusicInfoTag()->GetAlbum().empty()) object["item"]["album"] = item->GetMusicInfoTag()->GetAlbum(); if (!item->GetMusicInfoTag()->GetArtist().empty()) object["item"]["artist"] = item->GetMusicInfoTag()->GetArtist(); } } else if (item->IsVideo()) { // video item but has no video info tag. type = "movies"; object["item"]["title"] = item->GetLabel(); } else if (item->HasPictureInfoTag()) { type = "picture"; object["item"]["file"] = item->GetPath(); } else type = "unknown"; object["item"]["type"] = type; if (id > 0) object["item"]["id"] = id; Announce(flag, sender, message, object); }