summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2013-12-07 16:18:25 +0000
committerrandomdan <randomdan@localhost>2013-12-07 16:18:25 +0000
commita9c370ae5d8274dbee0876e988af6c9b44148918 (patch)
tree28d8789db7d15ad45bf41139d6bfe49957fcc70c
parentMove parent object Ids into domain objects, remove all the parent object mess... (diff)
downloadp2pvr-a9c370ae5d8274dbee0876e988af6c9b44148918.tar.bz2
p2pvr-a9c370ae5d8274dbee0876e988af6c9b44148918.tar.xz
p2pvr-a9c370ae5d8274dbee0876e988af6c9b44148918.zip
Set bigger internal buffers for demux
Add some more logging
-rw-r--r--p2pvr/lib/tuner.cpp16
-rw-r--r--p2pvr/lib/tuner.h1
2 files changed, 17 insertions, 0 deletions
diff --git a/p2pvr/lib/tuner.cpp b/p2pvr/lib/tuner.cpp
index 25042ba..b958e31 100644
--- a/p2pvr/lib/tuner.cpp
+++ b/p2pvr/lib/tuner.cpp
@@ -152,6 +152,7 @@ Tuner::SendPID(int pid, const P2PVR::RawDataClientPrx & client, const Ice::Curre
void
Tuner::RequestPID(int pid, int demux)
{
+ setBufferSize(demux, 409600);
struct dmx_sct_filter_params sctFilterParams;
memset(&sctFilterParams, 0, sizeof(dmx_sct_filter_params));
sctFilterParams.pid = pid;
@@ -288,6 +289,7 @@ Tuner::StartSendingTS(const P2PVR::PacketIds & pids, const P2PVR::RawDataClientP
}
}
+ setBufferSize(demux, 4096000);
if (ioctl(demux, DMX_START) < 0) {
backgroundClients.erase(demux);
Logger()->messagebf(LOG_ERR, "%s: DMX_START failed (%d: %s)", __PRETTY_FUNCTION__, errno, strerror(errno));
@@ -299,6 +301,16 @@ Tuner::StartSendingTS(const P2PVR::PacketIds & pids, const P2PVR::RawDataClientP
}
void
+Tuner::setBufferSize(int demux, unsigned long size)
+{
+ if (ioctl(demux, DMX_SET_BUFFER_SIZE, size)) {
+ Logger()->messagebf(LOG_ERR, "%s: DMX_SET_BUFFER_SIZE to %d failed (%d: %s)", __PRETTY_FUNCTION__, size, errno, strerror(errno));
+ throw P2PVR::DeviceError("demux", strerror(errno), errno);
+ }
+ Logger()->messagebf(LOG_DEBUG, "%s: DMX_SET_BUFFER_SIZE to %d", __PRETTY_FUNCTION__, size);
+}
+
+void
Tuner::StopSending(int handle, const Ice::Current &)
{
time(&lastUsedTime);
@@ -332,10 +344,12 @@ Tuner::senderThread()
FD_SET(c.first, &rfds);
}
lock.unlock();
+ time(&lastUsedTime);
struct timeval tv { 2, 0 };
switch (select(n, &rfds, NULL, NULL, &tv)) {
case -1: // error
+ Logger()->messagebf(LOG_DEBUG, "%s: select failed (%d:%s)", __PRETTY_FUNCTION__, errno, strerror(errno));
case 0: // nothing to read, but all is well
break;
default:
@@ -347,6 +361,7 @@ Tuner::senderThread()
P2PVR::Data buf(1 << 16);
int nr = read(c.first, &buf.front(), buf.size());
if (nr < 0) {
+ Logger()->messagebf(LOG_DEBUG, "%s: read failed (%d:%s)", __PRETTY_FUNCTION__, errno, strerror(errno));
close(c.first);
backgroundClients.erase(c.first);
break; // backgroundClients has changed, bailout and start again
@@ -377,6 +392,7 @@ Tuner::senderThread()
return false;
}
catch (...) {
+ Logger()->messagebf(LOG_DEBUG, "%s: Client transmit error", __PRETTY_FUNCTION__);
close(a.get<2>());
std::lock_guard<std::mutex> g(lock);
backgroundClients.erase(a.get<2>());
diff --git a/p2pvr/lib/tuner.h b/p2pvr/lib/tuner.h
index e6cfa80..583b892 100644
--- a/p2pvr/lib/tuner.h
+++ b/p2pvr/lib/tuner.h
@@ -43,6 +43,7 @@ class Tuner : public P2PVR::PrivateTuner {
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;