Support fast channel change.
[vuplus_dvbapp] / lib / dvb / fccdecoder.cpp
diff --git a/lib/dvb/fccdecoder.cpp b/lib/dvb/fccdecoder.cpp
new file mode 100644 (file)
index 0000000..c408c1a
--- /dev/null
@@ -0,0 +1,75 @@
+#include <lib/dvb/fccdecoder.h>
+#include <lib/base/eerror.h>
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+bool eFCCDecoder::isDestroyed = false;
+eFCCDecoder::eFCCDecoder()
+{
+       int index = 0;
+
+       eDebug("[eFCCDecoder] scanning for FCC device files..");
+       while(1)
+       {
+               struct stat s;
+               char filename[128];
+               sprintf(filename, "/dev/fcc%d", index);
+               if (stat(filename, &s))
+                       break;
+
+               eDebug("[eFCCDecoder] %s found..", filename);
+               m_fccs.push_back(-1);
+               index++;
+       }
+}
+
+eFCCDecoder::~eFCCDecoder()
+{
+       isDestroyed = true;
+}
+
+int eFCCDecoder::allocateFcc()
+{
+       int fccFd = -1;
+       for(unsigned int i = 0; i < m_fccs.size(); i++)
+       {
+               if (m_fccs[i]== -1)
+               {
+                       char filename[128];
+                       sprintf(filename, "/dev/fcc%d", i);
+
+                       fccFd = ::open(filename, O_RDWR);
+                       if (fccFd < 0)
+                               eDebug("[eFCCDecoder] open %s failed!", filename);
+
+                       else
+                               eDebug("[eFCCDecoder] alloc %s", filename);
+
+                       m_fccs[i] = fccFd;
+                       break;
+               }
+       }
+
+       return fccFd;
+}
+
+void eFCCDecoder::freeFcc(int fccFd)
+{
+       if (fccFd < 0)
+               return;
+
+       for(unsigned int i = 0; i < m_fccs.size(); i++)
+       {
+               if (m_fccs[i]== fccFd)
+               {
+                       m_fccs[i] = -1;
+                       eDebug("[eFCCDecoder] close /dev/fcc%d", i);
+                       ::close(fccFd);
+                       break;
+               }
+       }
+}
+