MythTV  master
capture.cpp
Go to the documentation of this file.
1 // Program Name: capture.cpp
3 // Created : Sep. 21, 2011
4 //
5 // Copyright (c) 2011 Robert McNamara <rmcnamara@mythtv.org>
6 //
7 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 2 of the License, or
10 // (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //
25 
26 // Qt
27 #include <QList>
28 #include <QFile>
29 #include <QMutex>
30 
31 // MythTV
32 #include "libmythbase/compat.h"
34 #include "libmythbase/mythdate.h"
35 #include "libmythbase/mythversion.h"
36 #include "libmythtv/cardutil.h"
37 
38 // MythBackend
39 #include "capture.h"
40 #include "serviceUtil.h"
41 
43 //
45 
47  const QString &sCardType )
48 {
50 
51  if (!query.isConnected())
52  throw( QString("Database not open while trying to list "
53  "Capture Cards."));
54 
55  QString str = "SELECT cardid, parentid, videodevice, audiodevice, vbidevice, "
56  "cardtype, defaultinput, audioratelimit, hostname, "
57  "dvb_swfilter, dvb_sat_type, dvb_wait_for_seqstart, "
58  "skipbtaudio, dvb_on_demand, dvb_diseqc_type, "
59  "firewire_speed, firewire_model, firewire_connection, "
60  "signal_timeout, channel_timeout, dvb_tuning_delay, "
61  "contrast, brightness, colour, hue, diseqcid, dvb_eitscan, "
62  "inputname, sourceid, externalcommand, changer_device, "
63  "changer_model, tunechan, startchan, displayname, "
64  "dishnet_eit, recpriority, quicktune, schedorder, "
65  "livetvorder, reclimit, schedgroup "
66  "from capturecard";
67 
68  if (!sHostName.isEmpty())
69  str += " WHERE hostname = :HOSTNAME";
70  else if (!sCardType.isEmpty())
71  str += " WHERE cardtype = :CARDTYPE";
72 
73  if (!sHostName.isEmpty() && !sCardType.isEmpty())
74  str += " AND cardtype = :CARDTYPE";
75 
76  query.prepare(str);
77 
78  if (!sHostName.isEmpty())
79  query.bindValue(":HOSTNAME", sHostName);
80  if (!sCardType.isEmpty())
81  query.bindValue(":CARDTYPE", sCardType);
82 
83  if (!query.exec())
84  {
85  MythDB::DBError("MythAPI::GetCaptureCardList()", query);
86  throw( QString( "Database Error executing query." ));
87  }
88 
89  // ----------------------------------------------------------------------
90  // return the results of the query
91  // ----------------------------------------------------------------------
92 
93  auto* pList = new DTC::CaptureCardList();
94 
95  while (query.next())
96  {
97 
98  DTC::CaptureCard *pCaptureCard = pList->AddNewCaptureCard();
99 
100  pCaptureCard->setCardId ( query.value(0).toInt() );
101  pCaptureCard->setParentId ( query.value(1).toInt() );
102  pCaptureCard->setVideoDevice ( query.value(2).toString() );
103  pCaptureCard->setAudioDevice ( query.value(3).toString() );
104  pCaptureCard->setVBIDevice ( query.value(4).toString() );
105  pCaptureCard->setCardType ( query.value(5).toString() );
106  pCaptureCard->setDefaultInput ( query.value(6).toString() );
107  pCaptureCard->setAudioRateLimit ( query.value(7).toUInt() );
108  pCaptureCard->setHostName ( query.value(8).toString() );
109  pCaptureCard->setDVBSWFilter ( query.value(9).toUInt() );
110  pCaptureCard->setDVBSatType ( query.value(10).toUInt() );
111  pCaptureCard->setDVBWaitForSeqStart( query.value(11).toBool() );
112  pCaptureCard->setSkipBTAudio ( query.value(12).toBool() );
113  pCaptureCard->setDVBOnDemand ( query.value(13).toBool() );
114  pCaptureCard->setDVBDiSEqCType ( query.value(14).toUInt() );
115  pCaptureCard->setFirewireSpeed ( query.value(15).toUInt() );
116  pCaptureCard->setFirewireModel ( query.value(16).toString() );
117  pCaptureCard->setFirewireConnection( query.value(17).toUInt() );
118  pCaptureCard->setSignalTimeout ( query.value(18).toUInt() );
119  pCaptureCard->setChannelTimeout ( query.value(19).toUInt() );
120  pCaptureCard->setDVBTuningDelay ( query.value(20).toUInt() );
121  pCaptureCard->setContrast ( query.value(21).toUInt() );
122  pCaptureCard->setBrightness ( query.value(22).toUInt() );
123  pCaptureCard->setColour ( query.value(23).toUInt() );
124  pCaptureCard->setHue ( query.value(24).toUInt() );
125  pCaptureCard->setDiSEqCId ( query.value(25).toUInt() );
126  pCaptureCard->setDVBEITScan ( query.value(26).toBool() );
127  pCaptureCard->setInputName ( query.value(27).toString() );
128  pCaptureCard->setSourceId ( query.value(28).toInt() );
129  pCaptureCard->setExternalCommand ( query.value(29).toString() );
130  pCaptureCard->setChangerDevice ( query.value(30).toString() );
131  pCaptureCard->setChangerModel ( query.value(31).toString() );
132  pCaptureCard->setTuneChannel ( query.value(32).toString() );
133  pCaptureCard->setStartChannel ( query.value(33).toString() );
134  pCaptureCard->setDisplayName ( query.value(34).toString() );
135  pCaptureCard->setDishnetEit ( query.value(35).toBool() );
136  pCaptureCard->setRecPriority ( query.value(36).toInt() );
137  pCaptureCard->setQuickTune ( query.value(37).toBool() );
138  pCaptureCard->setSchedOrder ( query.value(38).toUInt() );
139  pCaptureCard->setLiveTVOrder ( query.value(39).toUInt() );
140  pCaptureCard->setRecLimit ( query.value(40).toUInt() );
141  pCaptureCard->setSchedGroup ( query.value(41).toBool() );
142  }
143 
144  return pList;
145 }
146 
148 //
150 
152 {
153  if ( nCardId < 1 )
154  throw( QString( "The Card ID is invalid."));
155 
156  MSqlQuery query(MSqlQuery::InitCon());
157 
158  if (!query.isConnected())
159  throw( QString("Database not open while trying to list "
160  "Capture Cards."));
161 
162  QString str = "SELECT cardid, parentid, videodevice, audiodevice, vbidevice, "
163  "cardtype, defaultinput, audioratelimit, hostname, "
164  "dvb_swfilter, dvb_sat_type, dvb_wait_for_seqstart, "
165  "skipbtaudio, dvb_on_demand, dvb_diseqc_type, "
166  "firewire_speed, firewire_model, firewire_connection, "
167  "signal_timeout, channel_timeout, dvb_tuning_delay, "
168  "contrast, brightness, colour, hue, diseqcid, dvb_eitscan, "
169  "inputname, sourceid, externalcommand, changer_device, "
170  "changer_model, tunechan, startchan, displayname, "
171  "dishnet_eit, recpriority, quicktune, schedorder, "
172  "livetvorder, reclimit, schedgroup "
173  "from capturecard WHERE cardid = :CARDID";
174 
175  query.prepare(str);
176  query.bindValue(":CARDID", nCardId);
177 
178  if (!query.exec())
179  {
180  MythDB::DBError("MythAPI::GetCaptureCard()", query);
181  throw( QString( "Database Error executing query." ));
182  }
183 
184  auto* pCaptureCard = new DTC::CaptureCard();
185 
186  if (query.next())
187  {
188  pCaptureCard->setCardId ( query.value(0).toInt() );
189  pCaptureCard->setParentId ( query.value(1).toInt() );
190  pCaptureCard->setVideoDevice ( query.value(2).toString() );
191  pCaptureCard->setAudioDevice ( query.value(3).toString() );
192  pCaptureCard->setVBIDevice ( query.value(4).toString() );
193  pCaptureCard->setCardType ( query.value(5).toString() );
194  pCaptureCard->setDefaultInput ( query.value(6).toString() );
195  pCaptureCard->setAudioRateLimit ( query.value(7).toUInt() );
196  pCaptureCard->setHostName ( query.value(8).toString() );
197  pCaptureCard->setDVBSWFilter ( query.value(9).toUInt() );
198  pCaptureCard->setDVBSatType ( query.value(10).toUInt() );
199  pCaptureCard->setDVBWaitForSeqStart( query.value(11).toBool() );
200  pCaptureCard->setSkipBTAudio ( query.value(12).toBool() );
201  pCaptureCard->setDVBOnDemand ( query.value(13).toBool() );
202  pCaptureCard->setDVBDiSEqCType ( query.value(14).toUInt() );
203  pCaptureCard->setFirewireSpeed ( query.value(15).toUInt() );
204  pCaptureCard->setFirewireModel ( query.value(16).toString() );
205  pCaptureCard->setFirewireConnection( query.value(17).toUInt() );
206  pCaptureCard->setSignalTimeout ( query.value(18).toUInt() );
207  pCaptureCard->setChannelTimeout ( query.value(19).toUInt() );
208  pCaptureCard->setDVBTuningDelay ( query.value(20).toUInt() );
209  pCaptureCard->setContrast ( query.value(21).toUInt() );
210  pCaptureCard->setBrightness ( query.value(22).toUInt() );
211  pCaptureCard->setColour ( query.value(23).toUInt() );
212  pCaptureCard->setHue ( query.value(24).toUInt() );
213  pCaptureCard->setDiSEqCId ( query.value(25).toUInt() );
214  pCaptureCard->setDVBEITScan ( query.value(26).toBool() );
215  pCaptureCard->setInputName ( query.value(27).toString() );
216  pCaptureCard->setSourceId ( query.value(28).toInt() );
217  pCaptureCard->setExternalCommand ( query.value(29).toString() );
218  pCaptureCard->setChangerDevice ( query.value(30).toString() );
219  pCaptureCard->setChangerModel ( query.value(31).toString() );
220  pCaptureCard->setTuneChannel ( query.value(32).toString() );
221  pCaptureCard->setStartChannel ( query.value(33).toString() );
222  pCaptureCard->setDisplayName ( query.value(34).toString() );
223  pCaptureCard->setDishnetEit ( query.value(35).toBool() );
224  pCaptureCard->setRecPriority ( query.value(36).toInt() );
225  pCaptureCard->setQuickTune ( query.value(37).toBool() );
226  pCaptureCard->setSchedOrder ( query.value(38).toUInt() );
227  pCaptureCard->setLiveTVOrder ( query.value(39).toUInt() );
228  pCaptureCard->setRecLimit ( query.value(40).toUInt() );
229  pCaptureCard->setSchedGroup ( query.value(41).toBool() );
230  }
231 
232  return pCaptureCard;
233 }
234 
236 //
238 
239 bool Capture::RemoveCaptureCard( int nCardId )
240 {
241  if ( nCardId < 1 )
242  throw( QString( "The Card ID is invalid."));
243 
244  bool bResult = CardUtil::DeleteInput(nCardId);
245 
246  return bResult;
247 }
248 
250 //
252 
253 int Capture::AddCaptureCard ( const QString &sVideoDevice,
254  const QString &sAudioDevice,
255  const QString &sVBIDevice,
256  const QString &sCardType,
257  const uint nAudioRateLimit,
258  const QString &sHostName,
259  const uint nDVBSWFilter,
260  const uint nDVBSatType,
261  bool bDVBWaitForSeqStart,
262  bool bSkipBTAudio,
263  bool bDVBOnDemand,
264  const uint nDVBDiSEqCType,
265  const uint nFirewireSpeed,
266  const QString &sFirewireModel,
267  const uint nFirewireConnection,
268  const uint nSignalTimeout,
269  const uint nChannelTimeout,
270  const uint nDVBTuningDelay,
271  const uint nContrast,
272  const uint nBrightness,
273  const uint nColour,
274  const uint nHue,
275  const uint nDiSEqCId,
276  bool bDVBEITScan)
277 {
278  if ( sVideoDevice.isEmpty() || sCardType.isEmpty() || sHostName.isEmpty() )
279  throw( QString( "This API requires at least a video device node, a card type, "
280  "and a hostname." ));
281 
282  int nResult = CardUtil::CreateCaptureCard(sVideoDevice, sAudioDevice,
283  sVBIDevice, sCardType, nAudioRateLimit,
284  sHostName, nDVBSWFilter, nDVBSatType, bDVBWaitForSeqStart,
285  bSkipBTAudio, bDVBOnDemand, nDVBDiSEqCType, nFirewireSpeed,
286  sFirewireModel, nFirewireConnection, std::chrono::milliseconds(nSignalTimeout),
287  std::chrono::milliseconds(nChannelTimeout), nDVBTuningDelay, nContrast, nBrightness,
288  nColour, nHue, nDiSEqCId, bDVBEITScan);
289 
290  if ( nResult < 1 )
291  throw( QString( "Unable to create capture device." ));
292 
293  return nResult;
294 }
295 
296 bool Capture::UpdateCaptureCard ( int nCardId,
297  const QString &sSetting,
298  const QString &sValue )
299 {
300  if ( nCardId < 1 || sSetting.isEmpty() || sValue.isEmpty() )
301  throw( QString( "Card ID, Setting Name, and Value are required." ));
302 
303  return set_on_input(sSetting, nCardId, sValue);
304 }
305 
306 // Card Inputs
307 
308 bool Capture::RemoveCardInput( int nCardInputId )
309 {
310  if ( nCardInputId < 1 )
311  throw( QString( "The Input ID is invalid."));
312 
313  bool bResult = CardUtil::DeleteInput(nCardInputId);
314 
315  return bResult;
316 }
317 
318 int Capture::AddCardInput ( const uint nCardId,
319  const uint nSourceId,
320  const QString &sInputName,
321  const QString &sExternalCommand,
322  const QString &sChangerDevice,
323  const QString &sChangerModel,
324  const QString &sHostName,
325  const QString &sTuneChan,
326  const QString &sStartChan,
327  const QString &sDisplayName,
328  bool bDishnetEIT,
329  const uint nRecPriority,
330  const uint nQuicktune,
331  const uint nSchedOrder,
332  const uint nLiveTVOrder)
333 {
334  if ( nCardId < 1 || nSourceId < 1 ||
335  sInputName.isEmpty() || sInputName == "None" )
336  throw( QString( "This API requires at least a card ID, a source ID, "
337  "and an input name." ));
338 
339  if ( !CardUtil::IsUniqueDisplayName(sDisplayName, 0 ))
340  throw QString(" DisplayName is not set or is not unique.");
341 
342  int nResult = CardUtil::CreateCardInput(nCardId, nSourceId, sInputName,
343  sExternalCommand, sChangerDevice, sChangerModel,
344  sHostName, sTuneChan, sStartChan, sDisplayName,
345  bDishnetEIT, nRecPriority, nQuicktune, nSchedOrder,
346  nLiveTVOrder);
347 
348  return nResult;
349 }
350 
351 bool Capture::UpdateCardInput ( int nCardInputId,
352  const QString &sSetting,
353  const QString &sValue )
354 {
355  if ( nCardInputId < 1 || sSetting.isEmpty() || sValue.isEmpty() )
356  throw( QString( "Input ID, Setting Name, and Value are required." ));
357 
358  return set_on_input(sSetting, nCardInputId, sValue);
359 }
serviceUtil.h
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:813
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:127
CardUtil::CreateCardInput
static int CreateCardInput(uint inputid, uint sourceid, const QString &inputname, const QString &externalcommand, const QString &changer_device, const QString &changer_model, const QString &hostname, const QString &tunechan, const QString &startchan, const QString &displayname, bool dishnet_eit, uint recpriority, uint quicktune, uint schedorder, uint livetvorder)
Definition: cardutil.cpp:1963
capture.h
Capture::RemoveCaptureCard
bool RemoveCaptureCard(int CardId) override
Definition: capture.cpp:239
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:204
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:619
set_on_input
bool set_on_input(const QString &to_set, uint inputid, const QString &value)
Definition: cardutil.cpp:1273
CardUtil::IsUniqueDisplayName
static bool IsUniqueDisplayName(const QString &name, uint exclude_inputid)
Definition: cardutil.cpp:1896
DTC::CaptureCardList
Definition: captureCardList.h:24
Capture::AddCaptureCard
int AddCaptureCard(const QString &VideoDevice, const QString &AudioDevice, const QString &VBIDevice, const QString &CardType, uint AudioRateLimit, const QString &HostName, uint DVBSWFilter, uint DVBSatType, bool DVBWaitForSeqStart, bool SkipBTAudio, bool DVBOnDemand, uint DVBDiSEqCType, uint FirewireSpeed, const QString &FirewireModel, uint FirewireConnection, uint SignalTimeout, uint ChannelTimeout, uint DVBTuningDelay, uint Contrast, uint Brightness, uint Colour, uint Hue, uint DiSEqCId, bool DVBEITScan) override
Definition: capture.cpp:253
mythdate.h
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:551
compat.h
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
Capture::AddCardInput
int AddCardInput(uint CardId, uint SourceId, const QString &InputName, const QString &ExternalCommand, const QString &ChangerDevice, const QString &ChangerModel, const QString &HostName, const QString &TuneChan, const QString &StartChan, const QString &DisplayName, bool DishnetEIT, uint RecPriority, uint Quicktune, uint SchedOrder, uint LiveTVOrder) override
Definition: capture.cpp:318
MSqlQuery::isConnected
bool isConnected(void) const
Only updated once during object creation.
Definition: mythdbcon.h:137
uint
unsigned int uint
Definition: compat.h:81
Capture::UpdateCaptureCard
bool UpdateCaptureCard(int CardId, const QString &Setting, const QString &Value) override
Definition: capture.cpp:296
Capture::UpdateCardInput
bool UpdateCardInput(int CardInputId, const QString &Setting, const QString &Value) override
Definition: capture.cpp:351
Capture::RemoveCardInput
bool RemoveCardInput(int CardInputId) override
Definition: capture.cpp:308
mythcorecontext.h
cardutil.h
CardUtil::CreateCaptureCard
static int CreateCaptureCard(const QString &videodevice, const QString &audiodevice, const QString &vbidevice, const QString &inputtype, uint audioratelimit, const QString &hostname, uint dvb_swfilter, uint dvb_sat_type, bool dvb_wait_for_seqstart, bool skipbtaudio, bool dvb_on_demand, uint dvb_diseqc_type, uint firewire_speed, const QString &firewire_model, uint firewire_connection, std::chrono::milliseconds signal_timeout, std::chrono::milliseconds channel_timeout, uint dvb_tuning_delay, uint contrast, uint brightness, uint colour, uint hue, uint diseqcid, bool dvb_eitscan)
Definition: cardutil.cpp:2670
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:889
DTC::CaptureCard
Definition: captureCard.h:24
Capture::GetCaptureCard
DTC::CaptureCard * GetCaptureCard(int CardId) override
Definition: capture.cpp:151
Capture::GetCaptureCardList
DTC::CaptureCardList * GetCaptureCardList(const QString &HostName, const QString &CardType) override
Definition: capture.cpp:46
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:838
CardUtil::DeleteInput
static bool DeleteInput(uint inputid)
Definition: cardutil.cpp:2809