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