1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#ifndef P2PVR_TUNER_H
#define P2PVR_TUNER_H
#include <p2pvr.h>
#include <boost/filesystem/path.hpp>
#include "frontend.h"
#include <map>
#include <thread>
#include <mutex>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/tuple/tuple.hpp>
class Tuner : public P2PVR::PrivateTuner {
public:
Tuner(const boost::filesystem::path & deviceFrontend);
~Tuner();
void TuneTo(const DVBSI::DeliveryPtr &, const Ice::Current&);
int GetStatus(const Ice::Current&);
std::string Device() const;
void ScanAndSendNetworkInformation(const P2PVR::RawDataClientPrx & client, const Ice::Current&);
void SendNetworkInformation(const P2PVR::RawDataClientPrx & client, const Ice::Current&);
void SendBouquetAssociations(const P2PVR::RawDataClientPrx & client, const Ice::Current&);
void SendServiceDescriptions(const P2PVR::RawDataClientPrx & client, const Ice::Current&);
void SendProgramMap(Ice::Int pid, const P2PVR::RawDataClientPrx & client, const Ice::Current&);
void SendProgramAssociationTable(const P2PVR::RawDataClientPrx & client, const Ice::Current&);
void SendEventInformation(const P2PVR::RawDataClientPrx & client, const Ice::Current&);
int StartSendingTS(const P2PVR::PacketIds & pids, const P2PVR::RawDataClientPrx & client, const Ice::Current &);
int StartSendingSection(Ice::Int pid, const P2PVR::RawDataClientPrx & client, const Ice::Current &);
void StopSending(int handle, const Ice::Current &);
Ice::Long GetLastUsedTime(const Ice::Current&);
private:
static bool crc32(const P2PVR::Data &);
int OpenDemux() const;
uint64_t SendPID(int pid, const P2PVR::RawDataClientPrx & client, const Ice::Current &) const;
static void RequestPID(int pid, int fd);
uint64_t ReadDemuxAndSend(int fd, const P2PVR::RawDataClientPrx & client) const;
static bool IsValidSection(const P2PVR::Data &);
void startSenderThread();
void senderThread();
static void setBufferSize(int fd, unsigned long bytes);
const boost::filesystem::path deviceFrontend;
const boost::filesystem::path deviceRoot;
const int timeout;
typedef boost::function<bool(const P2PVR::Data &)> PacketCheckFunction;
typedef boost::tuple<P2PVR::RawDataClientPrx, PacketCheckFunction> BackgroundClient;
typedef std::map<int, BackgroundClient> BackgroundClients;
BackgroundClients backgroundClients;
std::thread * backgroundThread;
std::mutex lock;
mutable time_t lastUsedTime;
FrontendPtr frontend;
};
#endif
|