diff --git a/mythtv/libs/libmythtv/channelbase.cpp b/mythtv/libs/libmythtv/channelbase.cpp
index bbb7f8e..241beeb 100644
|
a
|
b
|
bool ChannelBase::InitializeInputs(void)
|
| 927 | 927 | m_allchannels.insert(m_allchannels.end(), |
| 928 | 928 | channels.begin(), channels.end()); |
| 929 | 929 | } |
| 930 | | ChannelUtil::SortChannels(m_allchannels, order); |
| 931 | | ChannelUtil::EliminateDuplicateChanNum(m_allchannels); |
| | 930 | ChannelUtil::SortChannels(m_allchannels, order, true); |
| 932 | 931 | |
| 933 | 932 | m_currentInputID = GetDefaultInput(cardid); |
| 934 | 933 | |
diff --git a/mythtv/libs/libmythtv/channelutil.cpp b/mythtv/libs/libmythtv/channelutil.cpp
index 42d62a8..de85d8c 100644
|
a
|
b
|
bool ChannelUtil::GetExtendedChannelData(
|
| 1965 | 1965 | dvb_transportid, dvb_networkid, dtv_si_std); |
| 1966 | 1966 | } |
| 1967 | 1967 | |
| 1968 | | DBChanList ChannelUtil::GetChannels(uint sourceid, bool vis_only, QString grp, int changrpid) |
| | 1968 | DBChanList ChannelUtil::GetChannels( |
| | 1969 | uint sourceid, bool vis_only, QString grp, uint changrpid) |
| 1969 | 1970 | { |
| 1970 | 1971 | DBChanList list; |
| 1971 | 1972 | |
| … |
… |
DBChanList ChannelUtil::GetChannels(uint sourceid, bool vis_only, QString grp, i
|
| 1974 | 1975 | QString qstr = |
| 1975 | 1976 | "SELECT channum, callsign, channel.chanid, " |
| 1976 | 1977 | " atsc_major_chan, atsc_minor_chan, " |
| 1977 | | " name, icon, mplexid, visible " |
| 1978 | | "FROM channel "; |
| | 1978 | " name, icon, mplexid, visible, " |
| | 1979 | " channel.sourceid, cardinput.cardid, channelgroup.grpid " |
| | 1980 | "FROM channel " |
| | 1981 | "LEFT JOIN channelgroup ON channel.chanid = channelgroup.chanid " |
| | 1982 | "JOIN cardinput ON cardinput.sourceid = channel.sourceid " |
| | 1983 | "JOIN capturecard ON cardinput.cardid = capturecard.cardid "; |
| 1979 | 1984 | |
| 1980 | | // Select only channels from the specified channel group |
| 1981 | | if (changrpid > -1) |
| 1982 | | qstr += QString(",channelgroup "); |
| | 1985 | QString cond = " WHERE "; |
| 1983 | 1986 | |
| 1984 | 1987 | if (sourceid) |
| 1985 | | qstr += QString("WHERE sourceid='%1' ").arg(sourceid); |
| 1986 | | else |
| 1987 | | qstr += ",cardinput,capturecard " |
| 1988 | | "WHERE cardinput.sourceid = channel.sourceid AND " |
| 1989 | | " cardinput.cardid = capturecard.cardid "; |
| | 1988 | { |
| | 1989 | qstr += QString("WHERE channel.sourceid='%1' ").arg(sourceid); |
| | 1990 | cond = " AND "; |
| | 1991 | } |
| 1990 | 1992 | |
| 1991 | | if (changrpid > -1) |
| | 1993 | // Select only channels from the specified channel group |
| | 1994 | if (changrpid > 0) |
| 1992 | 1995 | { |
| 1993 | | qstr += QString("AND channel.chanid = channelgroup.chanid " |
| 1994 | | "AND channelgroup.grpid ='%1' ").arg(changrpid); |
| | 1996 | qstr += QString("%1 channelgroup.grpid = '%2' ") |
| | 1997 | .arg(cond).arg(changrpid); |
| | 1998 | cond = " AND "; |
| 1995 | 1999 | } |
| 1996 | 2000 | |
| 1997 | 2001 | if (vis_only) |
| 1998 | | qstr += "AND visible=1 "; |
| | 2002 | { |
| | 2003 | qstr += QString("%1 visible=1 ").arg(cond); |
| | 2004 | cond = " AND "; |
| | 2005 | } |
| 1999 | 2006 | |
| 2000 | 2007 | if (!grp.isEmpty()) |
| 2001 | | qstr += QString("GROUP BY %1 ").arg(grp); |
| | 2008 | qstr += QString(" GROUP BY %1 ").arg(grp); |
| 2002 | 2009 | |
| 2003 | 2010 | query.prepare(qstr); |
| 2004 | | if (!query.exec() || !query.isActive()) |
| | 2011 | if (!query.exec()) |
| 2005 | 2012 | { |
| 2006 | | MythDB::DBError("get channels -- sourceid", query); |
| | 2013 | MythDB::DBError("ChannelUtil::GetChannels()", query); |
| 2007 | 2014 | return list; |
| 2008 | 2015 | } |
| 2009 | 2016 | |
| … |
… |
DBChanList ChannelUtil::GetChannels(uint sourceid, bool vis_only, QString grp, i
|
| 2021 | 2028 | query.value(7).toUInt(), /* mplexid */ |
| 2022 | 2029 | query.value(8).toBool(), /* visible */ |
| 2023 | 2030 | query.value(5).toString(), /* name */ |
| 2024 | | query.value(6).toString()); /* icon */ |
| | 2031 | query.value(6).toString(), /* icon */ |
| | 2032 | query.value(9).toUInt(), /* sourceid */ |
| | 2033 | query.value(11).toUInt(), /* cardid */ |
| | 2034 | query.value(10).toUInt()); /* grpid */ |
| 2025 | 2035 | |
| 2026 | 2036 | list.push_back(chan); |
| 2027 | 2037 | } |
| … |
… |
void ChannelUtil::SortChannels(DBChanList &list, const QString &order,
|
| 2189 | 2199 | } |
| 2190 | 2200 | } |
| 2191 | 2201 | |
| 2192 | | void ChannelUtil::EliminateDuplicateChanNum(DBChanList &list) |
| 2193 | | { |
| 2194 | | typedef std::set<QString> seen_set; |
| 2195 | | seen_set seen; |
| 2196 | | |
| 2197 | | DBChanList::iterator it = list.begin(); |
| 2198 | | |
| 2199 | | while (it != list.end()) |
| 2200 | | { |
| 2201 | | QString tmp = it->channum; tmp.detach(); |
| 2202 | | std::pair<seen_set::iterator, bool> insret = seen.insert(tmp); |
| 2203 | | if (insret.second) |
| 2204 | | ++it; |
| 2205 | | else |
| 2206 | | it = list.erase(it); |
| 2207 | | } |
| 2208 | | } |
| 2209 | | |
| 2210 | 2202 | uint ChannelUtil::GetNextChannel( |
| 2211 | 2203 | const DBChanList &sorted, |
| 2212 | 2204 | uint old_chanid, |
| 2213 | 2205 | uint mplexid_restriction, |
| 2214 | | int direction) |
| | 2206 | int direction, |
| | 2207 | bool skip_non_visible, |
| | 2208 | bool skip_same_channum_and_callsign) |
| 2215 | 2209 | { |
| | 2210 | // TODO implement skip_same_channum_and_callsign |
| | 2211 | |
| 2216 | 2212 | DBChanList::const_iterator it = |
| 2217 | 2213 | find(sorted.begin(), sorted.end(), old_chanid); |
| 2218 | 2214 | |
| … |
… |
uint ChannelUtil::GetNextChannel(
|
| 2223 | 2219 | return 0; // no channels.. |
| 2224 | 2220 | |
| 2225 | 2221 | DBChanList::const_iterator start = it; |
| 2226 | | bool skip_non_visible = true; // TODO make DB selectable |
| 2227 | 2222 | |
| 2228 | 2223 | if (CHANNEL_DIRECTION_DOWN == direction) |
| 2229 | 2224 | { |
diff --git a/mythtv/libs/libmythtv/channelutil.h b/mythtv/libs/libmythtv/channelutil.h
index 7e044b9..62283ea 100644
|
a
|
b
|
class MTV_PUBLIC ChannelUtil
|
| 182 | 182 | static QString GetVideoFilters(uint sourceid, const QString &channum) |
| 183 | 183 | { return GetChannelValueStr("videofilters", sourceid, channum); } |
| 184 | 184 | |
| 185 | | static DBChanList GetChannels(uint srcid, bool vis_only, |
| 186 | | QString grp = "", int changrpid = -1); |
| | 185 | static DBChanList GetChannels( |
| | 186 | uint sourceid, bool visible_only, |
| | 187 | QString group_by = "", uint channel_groupid = 0); |
| 187 | 188 | static vector<uint> GetChanIDs(int sourceid = -1); |
| 188 | 189 | static uint GetChannelCount(int sourceid = -1); |
| 189 | 190 | static void SortChannels(DBChanList &list, const QString &order, |
| 190 | 191 | bool eliminate_duplicates = false); |
| 191 | | static void EliminateDuplicateChanNum(DBChanList &list); |
| 192 | 192 | |
| 193 | | static uint GetNextChannel(const DBChanList &sorted, |
| 194 | | uint old_chanid, |
| 195 | | uint mplexid_restriction, |
| 196 | | int direction); |
| | 193 | static uint GetNextChannel(const DBChanList &sorted, |
| | 194 | uint old_chanid, |
| | 195 | uint mplexid_restriction, |
| | 196 | int direction, |
| | 197 | bool skip_non_visible = true, |
| | 198 | bool skip_same_channum_and_callsign = false); |
| 197 | 199 | |
| 198 | 200 | static QString GetChannelValueStr(const QString &channel_field, |
| 199 | 201 | uint sourceid, |
diff --git a/mythtv/libs/libmythtv/dbchannelinfo.cpp b/mythtv/libs/libmythtv/dbchannelinfo.cpp
index 81c2e7a..a22d802 100644
|
a
|
b
|
DBChannel::DBChannel(
|
| 24 | 24 | const QString &_channum, const QString &_callsign, |
| 25 | 25 | uint _chanid, uint _major_chan, uint _minor_chan, |
| 26 | 26 | uint _mplexid, bool _visible, |
| 27 | | const QString &_name, const QString &_icon) : |
| | 27 | const QString &_name, const QString &_icon, |
| | 28 | uint _sourceid, uint _cardid, uint _grpid) : |
| 28 | 29 | channum(_channum), |
| 29 | | callsign(_callsign), chanid(_chanid), |
| | 30 | callsign(_callsign), |
| | 31 | name(_name), icon((_icon == "none") ? QString() : _icon), |
| | 32 | chanid(_chanid), |
| 30 | 33 | major_chan(_major_chan), minor_chan(_minor_chan), |
| 31 | | mplexid(_mplexid), visible(_visible), |
| 32 | | name(_name), icon(_icon) |
| | 34 | mplexid((_mplexid == 32767) ? 0 : _mplexid), |
| | 35 | sourceid(_sourceid), cardid(_cardid), grpid(_grpid), |
| | 36 | visible(_visible) |
| 33 | 37 | { |
| 34 | | channum.detach(); |
| 35 | | callsign.detach(); |
| 36 | | name.detach(); |
| 37 | | icon.detach(); |
| 38 | | mplexid = (mplexid == 32767) ? 0 : mplexid; |
| 39 | | icon = (icon == "none") ? QString::null : icon; |
| 40 | 38 | } |
| 41 | 39 | |
| 42 | 40 | DBChannel &DBChannel::operator=(const DBChannel &other) |
| 43 | 41 | { |
| 44 | | channum = other.channum; channum.detach(); |
| 45 | | callsign = other.callsign; callsign.detach(); |
| | 42 | channum = other.channum; |
| | 43 | callsign = other.callsign; |
| | 44 | name = other.name; |
| | 45 | icon = other.icon; |
| 46 | 46 | chanid = other.chanid; |
| 47 | 47 | major_chan = other.major_chan; |
| 48 | 48 | minor_chan = other.minor_chan; |
| 49 | 49 | mplexid = (other.mplexid == 32767) ? 0 : other.mplexid; |
| | 50 | sourceid = other.sourceid; |
| | 51 | cardid = other.cardid; |
| | 52 | grpid = other.grpid; |
| 50 | 53 | visible = other.visible; |
| 51 | | name = other.name; name.detach(); |
| 52 | | icon = other.icon; icon.detach(); |
| 53 | 54 | |
| 54 | 55 | return *this; |
| 55 | 56 | } |
diff --git a/mythtv/libs/libmythtv/dbchannelinfo.h b/mythtv/libs/libmythtv/dbchannelinfo.h
index 38b6d23..c22e973 100644
|
a
|
b
|
class MTV_PUBLIC DBChannel
|
| 25 | 25 | DBChannel(const QString &_channum, const QString &_callsign, |
| 26 | 26 | uint _chanid, uint _major_chan, uint _minor_chan, |
| 27 | 27 | uint _mplexid, bool _visible, |
| 28 | | const QString &_name, const QString &_icon); |
| | 28 | const QString &_name, const QString &_icon, |
| | 29 | uint _sourceid, uint _cardid, uint _grpid); |
| 29 | 30 | DBChannel& operator=(const DBChannel&); |
| 30 | 31 | |
| 31 | 32 | bool operator == (uint _chanid) const |
| … |
… |
class MTV_PUBLIC DBChannel
|
| 34 | 35 | public: |
| 35 | 36 | QString channum; |
| 36 | 37 | QString callsign; |
| | 38 | QString name; |
| | 39 | QString icon; |
| 37 | 40 | uint chanid; |
| 38 | 41 | uint major_chan; |
| 39 | 42 | uint minor_chan; |
| 40 | 43 | uint mplexid; |
| | 44 | uint sourceid; |
| | 45 | uint cardid; |
| | 46 | uint grpid; |
| 41 | 47 | bool visible; |
| 42 | | QString name; |
| 43 | | QString icon; |
| 44 | 48 | }; |
| 45 | 49 | typedef vector<DBChannel> DBChanList; |
| 46 | 50 | |
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index 25ff274..efb80bd 100644
|
a
|
b
|
bool TV::CommitQueuedInput(PlayerContext *ctx)
|
| 6493 | 6493 | QString chaninput = GetQueuedInput(); |
| 6494 | 6494 | if (browsehelper->IsBrowsing()) |
| 6495 | 6495 | { |
| | 6496 | uint sourceid = 0; |
| | 6497 | ctx->LockPlayingInfo(__FILE__, __LINE__); |
| | 6498 | if (ctx->playingInfo) |
| | 6499 | sourceid = ctx->playingInfo->GetSourceID(); |
| | 6500 | ctx->UnlockPlayingInfo(__FILE__, __LINE__); |
| | 6501 | |
| 6496 | 6502 | commited = true; |
| 6497 | 6503 | if (channum.isEmpty()) |
| 6498 | 6504 | channum = browsehelper->GetBrowsedInfo().m_channum; |
| 6499 | | |
| 6500 | | if ((ctx->recorder && ctx->recorder->CheckChannel(channum)) || |
| 6501 | | (db_browse_all_tuners && |
| 6502 | | browsehelper->BrowseAllGetChanId(channum))) |
| 6503 | | { |
| | 6505 | uint chanid = browsehelper->GetChanId( |
| | 6506 | channum, ctx->GetCardID(), sourceid); |
| | 6507 | if (chanid) |
| 6504 | 6508 | browsehelper->BrowseChannel(ctx, channum); |
| 6505 | | } |
| | 6509 | |
| 6506 | 6510 | HideOSDWindow(ctx, "osd_input"); |
| 6507 | 6511 | } |
| 6508 | 6512 | else if (GetQueuedChanID() || !channum.isEmpty()) |
| … |
… |
void TV::ChangeChannel(PlayerContext *ctx, int direction)
|
| 6534 | 6538 | return; |
| 6535 | 6539 | } |
| 6536 | 6540 | // Collect channel info |
| 6537 | | const ProgramInfo pginfo(*ctx->playingInfo); |
| 6538 | | old_chanid = pginfo.GetChanID(); |
| | 6541 | old_chanid = ctx->playingInfo->GetChanID(); |
| 6539 | 6542 | ctx->UnlockPlayingInfo(__FILE__, __LINE__); |
| 6540 | 6543 | } |
| 6541 | 6544 | |
diff --git a/mythtv/libs/libmythtv/tvbrowsehelper.cpp b/mythtv/libs/libmythtv/tvbrowsehelper.cpp
index d08db85..204547f 100644
|
a
|
b
|
|
| 7 | 7 | #include "remoteencoder.h" |
| 8 | 8 | #include "recordinginfo.h" |
| 9 | 9 | #include "mythplayer.h" |
| | 10 | #include "cardutil.h" |
| 10 | 11 | #include "tv_play.h" |
| 11 | 12 | |
| | 13 | #define LOC QString("BH: ") |
| | 14 | #define LOC_WARN QString("BH Warning: ") |
| | 15 | #define LOC_ERR QString("BH Error: ") |
| | 16 | |
| 12 | 17 | #define GetPlayer(X,Y) GetPlayerHaveLock(X, Y, __FILE__ , __LINE__) |
| 13 | 18 | #define GetOSDLock(X) GetOSDL(X, __FILE__, __LINE__) |
| 14 | 19 | |
| … |
… |
TVBrowseHelper::TVBrowseHelper(
|
| 40 | 45 | m_chanid(0), |
| 41 | 46 | m_run(true) |
| 42 | 47 | { |
| 43 | | if (db_browse_all_tuners) |
| | 48 | db_all_channels = ChannelUtil::GetChannels( |
| | 49 | 0, true, "channum, callsign"); |
| | 50 | ChannelUtil::SortChannels( |
| | 51 | db_all_channels, db_channel_ordering, false); |
| | 52 | |
| | 53 | DBChanList::const_iterator it = db_all_channels.begin(); |
| | 54 | for (; it != db_all_channels.end(); ++it) |
| 44 | 55 | { |
| 45 | | db_browse_all_channels = ChannelUtil::GetChannels( |
| 46 | | 0, true, "channum, callsign"); |
| 47 | | ChannelUtil::SortChannels( |
| 48 | | db_browse_all_channels, db_channel_ordering, true); |
| | 56 | db_chanid_to_channum[(*it).chanid] = (*it).channum; |
| | 57 | db_channum_to_chanids.insert((*it).channum,(*it).chanid); |
| 49 | 58 | } |
| 50 | 59 | |
| | 60 | db_all_visible_channels = ChannelUtil::GetChannels( |
| | 61 | 0, true, "channum, callsign"); |
| | 62 | ChannelUtil::SortChannels( |
| | 63 | db_all_visible_channels, db_channel_ordering, false); |
| | 64 | |
| 51 | 65 | start(); |
| 52 | 66 | } |
| 53 | 67 | |
| … |
… |
TVBrowseHelper::TVBrowseHelper(
|
| 56 | 70 | /// \note This may only be called from the UI thread. |
| 57 | 71 | bool TVBrowseHelper::BrowseStart(PlayerContext *ctx, bool skip_browse) |
| 58 | 72 | { |
| 59 | | VERBOSE(VB_IMPORTANT, "BrowseStart()"); |
| | 73 | VERBOSE(VB_IMPORTANT, QString("BrowseStart(%1skip)") |
| | 74 | .arg(skip_browse?"":"no ")); |
| 60 | 75 | |
| 61 | 76 | if (!gCoreContext->IsUIThread()) |
| 62 | 77 | return false; |
| … |
… |
bool TVBrowseHelper::BrowseStart(PlayerContext *ctx, bool skip_browse)
|
| 79 | 94 | ctx->LockPlayingInfo(__FILE__, __LINE__); |
| 80 | 95 | if (ctx->playingInfo) |
| 81 | 96 | { |
| 82 | | m_ctx = ctx; |
| 83 | | BrowseInfo bi(BROWSE_SAME, |
| 84 | | ctx->playingInfo->GetChanNum(), |
| 85 | | ctx->playingInfo->GetChanID(), |
| 86 | | ctx->playingInfo->GetScheduledStartTime(ISODate)); |
| | 97 | m_ctx = ctx; |
| | 98 | m_channum = ctx->playingInfo->GetChanNum(); |
| | 99 | m_chanid = ctx->playingInfo->GetChanID(); |
| | 100 | m_starttime = ctx->playingInfo->GetScheduledStartTime(ISODate); |
| 87 | 101 | ctx->UnlockPlayingInfo(__FILE__, __LINE__); |
| 88 | 102 | |
| 89 | 103 | if (!skip_browse) |
| 90 | 104 | { |
| | 105 | BrowseInfo bi(BROWSE_SAME, m_channum, m_chanid, m_starttime); |
| 91 | 106 | locker.unlock(); |
| 92 | 107 | BrowseDispInfo(ctx, bi); |
| 93 | 108 | } |
| … |
… |
void TVBrowseHelper::BrowseEnd(PlayerContext *ctx, bool change_channel)
|
| 146 | 161 | |
| 147 | 162 | void TVBrowseHelper::BrowseDispInfo(PlayerContext *ctx, BrowseInfo &bi) |
| 148 | 163 | { |
| 149 | | VERBOSE(VB_IMPORTANT, "BrowseDispInfo()"); |
| | 164 | VERBOSE(VB_IMPORTANT, QString("BrowseDispInfo(..%1)") |
| | 165 | .arg(bi.toString())); |
| 150 | 166 | |
| 151 | 167 | if (!gCoreContext->IsUIThread()) |
| 152 | 168 | return; |
| … |
… |
void TVBrowseHelper::BrowseDispInfo(PlayerContext *ctx, BrowseInfo &bi)
|
| 171 | 187 | m_wait.wakeAll(); |
| 172 | 188 | } |
| 173 | 189 | |
| | 190 | void TVBrowseHelper::BrowseChannel(PlayerContext *ctx, const QString &channum) |
| | 191 | { |
| | 192 | VERBOSE(VB_IMPORTANT, QString("BrowseChannel(.. %1)").arg(channum)); |
| | 193 | |
| | 194 | if (!gCoreContext->IsUIThread()) |
| | 195 | return; |
| | 196 | |
| | 197 | if (db_browse_all_tuners) |
| | 198 | { |
| | 199 | BrowseInfo bi(channum, 0); |
| | 200 | BrowseDispInfo(ctx, bi); |
| | 201 | return; |
| | 202 | } |
| | 203 | |
| | 204 | if (!ctx->recorder || !ctx->last_cardid) |
| | 205 | return; |
| | 206 | |
| | 207 | QString inputname = ctx->recorder->GetInput(); |
| | 208 | uint inputid = CardUtil::GetInputID(ctx->last_cardid, inputname); |
| | 209 | uint sourceid = CardUtil::GetSourceID(inputid); |
| | 210 | if (sourceid) |
| | 211 | { |
| | 212 | BrowseInfo bi(channum, sourceid); |
| | 213 | BrowseDispInfo(ctx, bi); |
| | 214 | } |
| | 215 | } |
| | 216 | |
| 174 | 217 | BrowseInfo TVBrowseHelper::GetBrowsedInfo(void) const |
| 175 | 218 | { |
| 176 | 219 | QMutexLocker locker(&m_lock); |
| … |
… |
bool TVBrowseHelper::IsBrowsing(void) const
|
| 195 | 238 | return m_ctx != NULL; |
| 196 | 239 | } |
| 197 | 240 | |
| 198 | | /// Returns chanid of random channel with with matching channum |
| 199 | | uint TVBrowseHelper::BrowseAllGetChanId(const QString &channum) const |
| | 241 | /** \brief Returns a chanid for the channum, or 0 if none is available. |
| | 242 | * |
| | 243 | * This will prefer a given sourceid first, and then a given card id, |
| | 244 | * but if one or the other can not be satisfied but db_browse_all_tuners |
| | 245 | * is set then it will look to see if the chanid is available on any |
| | 246 | * tuner. |
| | 247 | */ |
| | 248 | uint TVBrowseHelper::GetChanId( |
| | 249 | const QString &channum, uint pref_cardid, uint pref_sourceid) const |
| 200 | 250 | { |
| 201 | | DBChanList::const_iterator it = db_browse_all_channels.begin(); |
| 202 | | for (; it != db_browse_all_channels.end(); ++it) |
| | 251 | if (pref_sourceid) |
| 203 | 252 | { |
| 204 | | if ((*it).channum == channum) |
| 205 | | return (*it).chanid; |
| | 253 | DBChanList::const_iterator it = db_all_channels.begin(); |
| | 254 | for (; it != db_all_channels.end(); ++it) |
| | 255 | { |
| | 256 | if ((*it).sourceid == pref_sourceid && (*it).channum == channum) |
| | 257 | return (*it).chanid; |
| | 258 | } |
| 206 | 259 | } |
| | 260 | |
| | 261 | if (pref_cardid) |
| | 262 | { |
| | 263 | DBChanList::const_iterator it = db_all_channels.begin(); |
| | 264 | for (; it != db_all_channels.end(); ++it) |
| | 265 | { |
| | 266 | if ((*it).cardid == pref_cardid && (*it).channum == channum) |
| | 267 | return (*it).chanid; |
| | 268 | } |
| | 269 | } |
| | 270 | |
| | 271 | if (db_browse_all_tuners) |
| | 272 | { |
| | 273 | DBChanList::const_iterator it = db_all_channels.begin(); |
| | 274 | for (; it != db_all_channels.end(); ++it) |
| | 275 | { |
| | 276 | if ((*it).channum == channum) |
| | 277 | return (*it).chanid; |
| | 278 | } |
| | 279 | } |
| | 280 | |
| 207 | 281 | return 0; |
| 208 | 282 | } |
| 209 | 283 | |
| … |
… |
void TVBrowseHelper::GetNextProgramDB(
|
| 279 | 353 | { |
| 280 | 354 | uint chanid = infoMap["chanid"].toUInt(); |
| 281 | 355 | if (!chanid) |
| 282 | | chanid = BrowseAllGetChanId(infoMap["channum"]); |
| | 356 | { |
| | 357 | VERBOSE(VB_IMPORTANT, LOC_ERR + |
| | 358 | "GetNextProgramDB() requires a chanid"); |
| | 359 | return; |
| | 360 | } |
| 283 | 361 | |
| 284 | 362 | int chandir = -1; |
| 285 | 363 | switch (direction) |
| … |
… |
void TVBrowseHelper::GetNextProgramDB(
|
| 288 | 366 | case BROWSE_DOWN: chandir = CHANNEL_DIRECTION_DOWN; break; |
| 289 | 367 | case BROWSE_FAVORITE: chandir = CHANNEL_DIRECTION_FAVORITE; break; |
| 290 | 368 | } |
| 291 | | if (direction != BROWSE_INVALID) |
| | 369 | if (chandir != -1) |
| 292 | 370 | { |
| 293 | 371 | chanid = ChannelUtil::GetNextChannel( |
| 294 | | db_browse_all_channels, chanid, 0, chandir); |
| | 372 | db_all_visible_channels, chanid, 0 /*mplexid_restriction*/, |
| | 373 | chandir, true /*skip non visible*/, true /*skip same callsign*/); |
| 295 | 374 | } |
| 296 | 375 | |
| 297 | | infoMap["chanid"] = QString::number(chanid); |
| 298 | | |
| 299 | | DBChanList::const_iterator it = db_browse_all_channels.begin(); |
| 300 | | for (; it != db_browse_all_channels.end(); ++it) |
| 301 | | { |
| 302 | | if ((*it).chanid == chanid) |
| 303 | | { |
| 304 | | QString tmp = (*it).channum; |
| 305 | | tmp.detach(); |
| 306 | | infoMap["channum"] = tmp; |
| 307 | | break; |
| 308 | | } |
| 309 | | } |
| | 376 | infoMap["chanid"] = QString::number(chanid); |
| | 377 | infoMap["channum"] = db_chanid_to_channum[chanid]; |
| 310 | 378 | |
| 311 | 379 | QDateTime nowtime = QDateTime::currentDateTime(); |
| 312 | 380 | QDateTime latesttime = nowtime.addSecs(6*60*60); |
| … |
… |
void TVBrowseHelper::run()
|
| 370 | 438 | |
| 371 | 439 | PlayerContext *ctx = m_ctx; |
| 372 | 440 | |
| | 441 | vector<uint> chanids; |
| 373 | 442 | if (BROWSE_SAME == bi.m_dir) |
| 374 | 443 | { |
| 375 | 444 | m_channum = bi.m_channum; |
| 376 | 445 | m_chanid = bi.m_chanid; |
| 377 | 446 | m_starttime = bi.m_starttime; |
| | 447 | if (!m_chanid) |
| | 448 | { |
| | 449 | |
| | 450 | // TODO When channum is given and not chanid, |
| | 451 | // we want to check all channels available to |
| | 452 | // us with that channum.. |
| | 453 | } |
| 378 | 454 | } |
| 379 | 455 | |
| 380 | 456 | BrowseDirection direction = bi.m_dir; |
| … |
… |
void TVBrowseHelper::run()
|
| 444 | 520 | } |
| 445 | 521 | else |
| 446 | 522 | { |
| | 523 | // TODO handle browse_same... |
| | 524 | uint orig_chanid = infoMap["chanid"].toUInt(); |
| 447 | 525 | GetNextProgramDB(direction, infoMap); |
| 448 | 526 | while (!m_tv->IsTunable(ctx, infoMap["chanid"].toUInt()) && |
| 449 | | (infoMap["channum"] != m_channum)) |
| | 527 | (infoMap["chanid"].toUInt() != orig_chanid)) |
| 450 | 528 | { |
| 451 | 529 | GetNextProgramDB(direction, infoMap); |
| 452 | 530 | } |
diff --git a/mythtv/libs/libmythtv/tvbrowsehelper.h b/mythtv/libs/libmythtv/tvbrowsehelper.h
index 0ab6b38..8cb3a0c 100644
|
a
|
b
|
|
| 4 | 4 | #define _TV_BROWSE_HELPER_H_ |
| 5 | 5 | |
| 6 | 6 | #include <QWaitCondition> |
| | 7 | #include <QMultiMap> |
| 7 | 8 | #include <QThread> |
| 8 | 9 | #include <QString> |
| | 10 | #include <QHash> |
| 9 | 11 | |
| 10 | 12 | #include "dbchannelinfo.h" // for DBChanList |
| 11 | 13 | #include "programtypes.h" // for InfoMap |
| … |
… |
class BrowseInfo
|
| 19 | 21 | { |
| 20 | 22 | public: |
| 21 | 23 | BrowseInfo(BrowseDirection dir) : |
| 22 | | m_dir(dir), m_chanid(0) |
| | 24 | m_dir(dir), m_chanid(0), m_sourceid(0) |
| 23 | 25 | { |
| 24 | 26 | } |
| 25 | 27 | BrowseInfo(BrowseDirection dir, |
| 26 | 28 | const QString &channum, |
| 27 | 29 | uint chanid, |
| 28 | 30 | const QString &starttime) : |
| 29 | | m_dir(dir), m_channum(channum), |
| 30 | | m_chanid(0), m_starttime(starttime) |
| | 31 | m_dir(dir), m_channum(channum), |
| | 32 | m_chanid(chanid), m_starttime(starttime), |
| | 33 | m_sourceid(0) |
| | 34 | { |
| | 35 | } |
| | 36 | BrowseInfo(const QString &channum, |
| | 37 | uint sourceid) : |
| | 38 | m_dir(BROWSE_SAME), m_channum(channum), |
| | 39 | m_chanid(0), m_sourceid(sourceid) |
| 31 | 40 | { |
| 32 | 41 | } |
| 33 | 42 | |
| | 43 | QString toString() const |
| | 44 | { |
| | 45 | return QString("%1;%2;%3;%4;%5") |
| | 46 | .arg(BROWSE_SAME==m_dir?"SAME": |
| | 47 | BROWSE_UP ==m_dir?"UP": |
| | 48 | BROWSE_DOWN==m_dir?"DOWN": |
| | 49 | QString::number(m_dir)) |
| | 50 | .arg(m_channum) |
| | 51 | .arg(m_chanid) |
| | 52 | .arg(m_starttime) |
| | 53 | .arg(m_sourceid); |
| | 54 | } |
| | 55 | |
| 34 | 56 | BrowseDirection m_dir; |
| 35 | 57 | QString m_channum; |
| 36 | 58 | uint m_chanid; |
| 37 | 59 | QString m_starttime; |
| | 60 | uint m_sourceid; |
| 38 | 61 | }; |
| 39 | 62 | |
| 40 | 63 | |
| … |
… |
class TVBrowseHelper : public QThread
|
| 82 | 105 | BrowseDispInfo(ctx, bi); |
| 83 | 106 | } |
| 84 | 107 | |
| 85 | | void BrowseChannel(PlayerContext *ctx, const QString &channum) |
| 86 | | { |
| 87 | | BrowseInfo bi(BROWSE_SAME, channum, 0, ""); |
| 88 | | BrowseDispInfo(ctx, bi); |
| 89 | | } |
| | 108 | void BrowseChannel(PlayerContext *ctx, const QString &channum); |
| 90 | 109 | |
| 91 | 110 | BrowseInfo GetBrowsedInfo(void) const; |
| 92 | 111 | bool IsBrowsing(void) const; |
| 93 | | uint BrowseAllGetChanId(const QString &channum) const; |
| | 112 | uint GetChanId(const QString &channum, |
| | 113 | uint pref_cardid, uint pref_sourceid) const; |
| 94 | 114 | |
| 95 | 115 | protected: |
| 96 | 116 | void GetNextProgram(BrowseDirection direction, InfoMap &infoMap) const; |
| … |
… |
class TVBrowseHelper : public QThread
|
| 99 | 119 | virtual void run(); |
| 100 | 120 | |
| 101 | 121 | TV *m_tv; |
| 102 | | DBChanList db_browse_all_channels; |
| | 122 | DBChanList db_all_channels; |
| | 123 | DBChanList db_all_visible_channels; |
| 103 | 124 | QString db_time_format; |
| 104 | 125 | QString db_short_date_format; |
| 105 | 126 | uint db_browse_max_forward; |
| 106 | 127 | bool db_browse_all_tuners; |
| 107 | 128 | bool db_use_channel_groups; |
| | 129 | QHash<uint,QString> db_chanid_to_channum; |
| | 130 | QMultiMap<QString,uint> db_channum_to_chanids; |
| 108 | 131 | |
| 109 | 132 | mutable QMutex m_lock; // protects variables below |
| 110 | 133 | PlayerContext *m_ctx; |
diff --git a/mythtv/programs/mythfrontend/guidegrid.cpp b/mythtv/programs/mythfrontend/guidegrid.cpp
index 458ce40..e86ad5d 100644
|
a
|
b
|
void GuideGrid::RunProgramGuide(uint chanid, const QString &channum,
|
| 172 | 172 | changrpid = gCoreContext->GetNumSetting("ChannelGroupDefault", -1); |
| 173 | 173 | |
| 174 | 174 | // check there are some channels setup |
| 175 | | DBChanList channels = ChannelUtil::GetChannels(0, true, "", changrpid); |
| | 175 | DBChanList channels = ChannelUtil::GetChannels( |
| | 176 | 0, true, "", (changrpid<0) ? 0 : changrpid); |
| 176 | 177 | if (!channels.size()) |
| 177 | 178 | { |
| 178 | 179 | QString message; |
| … |
… |
void GuideGrid::fillChannelInfos(bool gotostartchannel)
|
| 832 | 833 | m_channelInfoIdx.clear(); |
| 833 | 834 | m_currentStartChannel = 0; |
| 834 | 835 | |
| 835 | | DBChanList channels = ChannelUtil::GetChannels(0, true, "", m_changrpid); |
| | 836 | DBChanList channels = ChannelUtil::GetChannels( |
| | 837 | 0, true, "", (m_changrpid < 0) ? 0 : m_changrpid); |
| 836 | 838 | ChannelUtil::SortChannels(channels, m_channelOrdering, false); |
| 837 | 839 | |
| 838 | 840 | typedef vector<uint> uint_list_t; |