1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "DVDMessageQueue.h"
12 #include "FileItem.h"
13 #include "IVideoPlayer.h"
14 #include "threads/Thread.h"
15 #include "utils/Stopwatch.h"
16 
17 #include <deque>
18 #include <memory>
19 
20 class CDVDStreamInfo;
21 
22 namespace PVR
23 {
24 class CPVRChannel;
25 class CPVRRadioRDSInfoTag;
26 }
27 
28 /// --- CDVDRadioRDSData ------------------------------------------------------------
29 
30 #define UECP_DATA_START               0xFE    /*!< A data record starts with the start byte */
31 #define UECP_DATA_STOP                0xFF    /*!< A data record stops with the stop byte */
32 #define UECP_SIZE_MAX                 263     /*!< The Max possible size of a UECP packet
33                                                    max. 255(MSG)+4(ADD/SQC/MFL)+2(CRC)+2(Start/Stop) of RDS-data */
34 #define RT_MEL                        65
35 #define MAX_RTPC                      50
36 #define MAX_RADIOTEXT_LISTSIZE        6
37 
38 class CDVDRadioRDSData : public CThread, public IDVDStreamPlayer
39 {
40 public:
41   explicit CDVDRadioRDSData(CProcessInfo &processInfo);
42   ~CDVDRadioRDSData() override;
43 
44   bool CheckStream(CDVDStreamInfo &hints);
45   bool OpenStream(CDVDStreamInfo hints) override;
46   void CloseStream(bool bWaitForBuffers) override;
47   void Flush();
48 
49   // waits until all available data has been rendered
WaitForBuffers()50   void WaitForBuffers() { m_messageQueue.WaitUntilEmpty(); }
AcceptsData()51   bool AcceptsData() const override { return !m_messageQueue.IsFull(); }
52   void SendMessage(CDVDMsg* pMsg, int priority = 0) override { if(m_messageQueue.IsInited()) m_messageQueue.Put(pMsg, priority); }
FlushMessages()53   void FlushMessages() override { m_messageQueue.Flush(); }
IsInited()54   bool IsInited() const override { return true; }
IsStalled()55   bool IsStalled() const override { return true; }
56 
57   std::string GetRadioText(unsigned int line);
58 
59 protected:
60   void OnExit() override;
61   void Process() override;
62 
63 private:
64   void ResetRDSCache();
65   void ProcessUECP(const unsigned char *Data, unsigned int Length);
66 
67   inline unsigned int DecodePI(uint8_t *msgElement);
68   inline unsigned int DecodePS(uint8_t *msgElement);
69   inline unsigned int DecodeDI(uint8_t *msgElement);
70   inline unsigned int DecodeTA_TP(uint8_t *msgElement);
71   inline unsigned int DecodeMS(uint8_t *msgElement);
72   inline unsigned int DecodePTY(uint8_t *msgElement);
73   inline unsigned int DecodePTYN(uint8_t *msgElement);
74   inline unsigned int DecodeRT(uint8_t *msgElement, unsigned int len);
75   inline unsigned int DecodeRTC(uint8_t *msgElement);
76   inline unsigned int DecodeODA(uint8_t *msgElement, unsigned int len);
77   inline unsigned int DecodeRTPlus(uint8_t *msgElement, unsigned int len);
78   inline unsigned int DecodeTMC(uint8_t *msgElement, unsigned int len);
79   inline unsigned int DecodeEPPTransmitterInfo(uint8_t *msgElement);
80   inline unsigned int DecodeSlowLabelingCodes(uint8_t *msgElement);
81   inline unsigned int DecodeDABDynLabelCmd(uint8_t *msgElement, unsigned int len);
82   inline unsigned int DecodeDABDynLabelMsg(uint8_t *msgElement, unsigned int len);
83   inline unsigned int DecodeAF(uint8_t *msgElement, unsigned int len);
84   inline unsigned int DecodeEonAF(uint8_t *msgElement, unsigned int len);
85   inline unsigned int DecodeTDC(uint8_t *msgElement, unsigned int len);
86 
87   void SendTMCSignal(unsigned int flags, uint8_t *data);
88   void SetRadioStyle(const std::string& genre);
89 
90   std::shared_ptr<PVR::CPVRRadioRDSInfoTag> m_currentInfoTag;
91   std::shared_ptr<PVR::CPVRChannel> m_currentChannel;
92   bool                        m_currentFileUpdate;
93   int                         m_speed;
94   CCriticalSection            m_critSection;
95   CDVDMessageQueue            m_messageQueue;
96 
97   uint8_t                     m_UECPData[UECP_SIZE_MAX+1];
98   unsigned int                m_UECPDataIndex;
99   bool                        m_UECPDataStart;
100   bool                        m_UECPDatabStuff;
101   bool                        m_UECPDataDeadBreak;
102 
103   bool                        m_RDS_IsRBDS;
104   bool                        m_RDS_SlowLabelingCodesPresent;
105 
106   uint16_t                    m_PI_Current;
107   unsigned int                m_PI_CountryCode;
108   unsigned int                m_PI_ProgramType;
109   unsigned int                m_PI_ProgramReferenceNumber;
110 
111   unsigned int                m_EPP_TM_INFO_ExtendedCountryCode;
112 
113   #define PS_TEXT_ENTRIES     12
114   bool                        m_PS_Present;
115   int                         m_PS_Index;
116   char                        m_PS_Text[PS_TEXT_ENTRIES][9];
117 
118   bool                        m_DI_IsStereo;
119   bool                        m_DI_ArtificialHead;
120   bool                        m_DI_Compressed;
121   bool                        m_DI_DynamicPTY;
122 
123   bool                        m_TA_TP_TrafficAdvisory;
124   float                       m_TA_TP_TrafficVolume;
125 
126   bool                        m_MS_SpeechActive;
127 
128   int                         m_PTY;
129   char                        m_PTYN[9];
130   bool                        m_PTYN_Present;
131 
132   bool                        m_RT_Present;
133   std::deque<std::string>     m_RT;
134   int                         m_RT_Index;
135   int                         m_RT_MaxSize;
136   bool                        m_RT_NewItem;
137   char                        m_RT_Text[6][RT_MEL+1];
138 
139   bool                        m_RTPlus_Present;
140   uint8_t                     m_RTPlus_WorkText[RT_MEL+1];
141   bool                        m_RTPlus_TToggle;
142   int                         m_RTPlus_iDiffs;
143   CStopWatch                  m_RTPlus_iTime;
144   bool                        m_RTPlus_GenrePresent;
145   char                        m_RTPlus_Temptext[RT_MEL];
146   bool                        m_RTPlus_Show;
147   char                        m_RTPlus_Title[RT_MEL];
148   char                        m_RTPlus_Artist[RT_MEL];
149   int                         m_RTPlus_iToggle;
150   unsigned int                m_RTPlus_ItemToggle;
151   time_t                      m_RTPlus_Starttime;
152 
153   CDateTime                   m_RTC_DateTime;                 ///< From RDS transmitted date / time data
154 
155   uint8_t                     m_TMC_LastData[5];
156 };
157