File indexing completed on 2024-04-21 04:53:51

0001 /*
0002     This file is part of the KMPlayer application
0003     SPDX-FileCopyrightText: 2003 Koos Vriezen <koos.vriezen@xs4all.nl>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef _KMPLAYER_TV_SOURCE_H_
0009 #define _KMPLAYER_TV_SOURCE_H_
0010 
0011 #include <QPointer>
0012 #include <QString>
0013 #include <QFrame>
0014 
0015 #include "kmplayer.h"
0016 #include "kmplayerconfig.h"
0017 #include "mediaobject.h"
0018 #include "kmplayer_lists.h"
0019 
0020 const short id_node_tv_document = 40;
0021 const short id_node_tv_device = 41;
0022 const short id_node_tv_input = 42;
0023 const short id_node_tv_channel = 43;
0024 
0025 class KMPlayerPrefSourcePageTV;         // source, TV
0026 class TVDeviceScannerSource;
0027 class KMPlayerTVSource;
0028 class KUrlRequester;
0029 class KMPlayerApp;
0030 class QTabWidget;
0031 class QLineEdit;
0032 class QCheckBox;
0033 class QPushButton;
0034 
0035 
0036 class TVDevicePage : public QFrame
0037 {
0038     Q_OBJECT
0039 public:
0040     TVDevicePage (QWidget *parent, KMPlayer::NodePtr dev);
0041     ~TVDevicePage () override {}
0042 
0043     QLineEdit * name;
0044     KUrlRequester * audiodevice;
0045     QLineEdit * sizewidth;
0046     QLineEdit * sizeheight;
0047     QCheckBox * noplayback;
0048     QTabWidget * inputsTab;
0049     KMPlayer::NodePtrW device_doc;
0050 Q_SIGNALS:
0051     void deleted (TVDevicePage *);
0052 private Q_SLOTS:
0053     void slotDelete ();
0054 };
0055 
0056 class KMPlayerPrefSourcePageTV : public QFrame
0057 {
0058     Q_OBJECT
0059 public:
0060     KMPlayerPrefSourcePageTV (QWidget *parent, KMPlayerTVSource *);
0061     ~KMPlayerPrefSourcePageTV () override {}
0062     QLineEdit * driver;
0063     KUrlRequester * device;
0064     QPushButton * scan;
0065     QTabWidget * notebook;
0066 protected:
0067     void showEvent (QShowEvent *) override;
0068     KMPlayerTVSource * m_tvsource;
0069 };
0070 
0071 class TVNode : public KMPlayer::GenericMrl
0072 {
0073 public:
0074     TVNode (KMPlayer::NodePtr &d, const QString &s, const char * t, short id, const QString &n=QString ());
0075     void setNodeName (const QString &) override;
0076 };
0077 
0078 /*
0079  * Element for channels
0080  */
0081 class TVChannel : public TVNode
0082 {
0083 public:
0084     TVChannel (KMPlayer::NodePtr & d, const QString & n, double f);
0085     TVChannel (KMPlayer::NodePtr & d);
0086     ~TVChannel () override {}
0087     void closed () override;
0088 };
0089 
0090 /*
0091  * Element for inputs
0092  */
0093 class TVInput : public TVNode
0094 {
0095 public:
0096     TVInput (KMPlayer::NodePtr & d, const QString & n, int id);
0097     TVInput (KMPlayer::NodePtr & d);
0098     ~TVInput () override {}
0099     KMPlayer::Node *childFromTag (const QString &) override;
0100     void setNodeName (const QString &) override;
0101     void closed () override;
0102 };
0103 
0104 /*
0105  * Element for TV devices
0106  */
0107 class TVDevice : public TVNode
0108 {
0109 public:
0110     TVDevice (KMPlayer::NodePtr & d, const QString & s);
0111     TVDevice (KMPlayer::NodePtr & d);
0112     ~TVDevice () override;
0113     KMPlayer::Node *childFromTag (const QString &) override;
0114     void closed () override;
0115     void message (KMPlayer::MessageType msg, void *content=nullptr) override;
0116     void *role (KMPlayer::RoleType msg, void *content=nullptr) override;
0117     void setNodeName (const QString &) override;
0118     void updateNodeName ();
0119     void updateDevicePage ();
0120     bool zombie;
0121     QPointer <TVDevicePage> device_page;
0122 };
0123 
0124 class TVDocument : public FileDocument
0125 {
0126     KMPlayerTVSource * m_source;
0127 public:
0128     TVDocument (KMPlayerTVSource *);
0129     KMPlayer::Node *childFromTag (const QString &) override;
0130     void defer () override;
0131     const char * nodeName () const override { return "tvdevices"; }
0132     void message (KMPlayer::MessageType msg, void *content=nullptr) override;
0133 };
0134 
0135 
0136 /*
0137  * Source form scanning TV devices
0138  */
0139 class TVDeviceScannerSource : public KMPlayer::Source, KMPlayer::ProcessUser
0140 {
0141     Q_OBJECT
0142 public:
0143     TVDeviceScannerSource (KMPlayerTVSource * src);
0144     ~TVDeviceScannerSource () override {};
0145     void init () override;
0146     bool processOutput (const QString & line) override;
0147     QString filterOptions () override;
0148     bool hasLength () override;
0149     bool isSeekable () override;
0150     virtual bool scan (const QString & device, const QString & driver);
0151 
0152     void starting (KMPlayer::IProcess *) override {}
0153     void stateChange (KMPlayer::IProcess *, KMPlayer::IProcess::State, KMPlayer::IProcess::State) override;
0154     void processDestroyed (KMPlayer::IProcess *p) override;
0155     KMPlayer::IViewer *viewer () override;
0156     KMPlayer::Mrl *getMrl () override;
0157 
0158     void activate () override;
0159     void deactivate () override;
0160     void play (KMPlayer::Mrl *) override;
0161 public Q_SLOTS:
0162     void scanningFinished ();
0163 Q_SIGNALS:
0164     void scanFinished (TVDevice * tvdevice);
0165 private:
0166     KMPlayerTVSource * m_tvsource;
0167     TVDevice * m_tvdevice;
0168     KMPlayer::IProcess *m_process;
0169     KMPlayer::IViewer *m_viewer;
0170     KMPlayer::Source * m_old_source;
0171     QString m_driver;
0172     QString m_caps;
0173     QRegExp m_nameRegExp;
0174     QRegExp m_sizesRegExp;
0175     QRegExp m_inputRegExp;
0176     QRegExp m_inputRegExpV4l2;
0177 };
0178 
0179 /*
0180  * Source form TV devices, also implementing preference page for it
0181  */
0182 class KMPlayerTVSource : public KMPlayer::Source, public KMPlayer::PreferencesPage
0183 {
0184     Q_OBJECT
0185 public:
0186     KMPlayerTVSource(KMPlayerApp* app);
0187     ~KMPlayerTVSource () override;
0188     QString filterOptions () override;
0189     bool hasLength () override;
0190     bool isSeekable () override;
0191     KMPlayer::NodePtr root () override;
0192     QString prettyName () override;
0193     void write (KSharedConfigPtr) override;
0194     void read (KSharedConfigPtr) override;
0195     void sync (bool) override;
0196     void prefLocation (QString & item, QString & icon, QString & tab) override;
0197     QFrame * prefPage (QWidget * parent) override;
0198     void readXML ();
0199     void setCurrent (KMPlayer::Mrl *) override;
0200     void activate () override;
0201     void deactivate () override;
0202     void play (KMPlayer::Mrl *) override;
0203 public Q_SLOTS:
0204     void menuClicked (int id);
0205 private Q_SLOTS:
0206     void slotScan ();
0207     void slotScanFinished (TVDevice * device);
0208     void slotDeviceDeleted (TVDevicePage *);
0209 private:
0210     void addTVDevicePage (TVDevice * dev, bool show=false);
0211     KMPlayer::NodePtrW m_cur_tvdevice;
0212     KMPlayer::NodePtrW m_cur_tvinput;
0213     KMPlayerApp* m_app;
0214     QMenu * m_channelmenu;
0215     QString tvdriver;
0216     KMPlayerPrefSourcePageTV * m_configpage;
0217     TVDeviceScannerSource * scanner;
0218     int tree_id;
0219     bool config_read; // whether tv.xml is read
0220 };
0221 
0222 #endif //_KMPLAYER_TV_SOURCE_H_