1 #include <lib/base/ebase.h>
2 #include <lib/base/eerror.h>
3 #include <lib/base/init_num.h>
4 #include <lib/base/init.h>
5 #include <lib/base/nconfig.h>
6 #include <lib/base/object.h>
7 #include <lib/dvb/decoder.h>
8 #include <lib/service/servicehdmi.h>
9 #include <lib/service/service.h>
13 #define HDMI_IN_REC_ENCODER_INDEX 0
14 #define HDMI_IN_REC_DECODER_INDEX 2
16 eServiceFactoryHDMI::eServiceFactoryHDMI()
18 ePtr<eServiceCenter> sc;
20 eServiceCenter::getPrivInstance(sc);
23 std::list<std::string> extensions;
24 sc->addServiceFactory(eServiceFactoryHDMI::id, this, extensions);
27 m_service_info = new eStaticServiceHDMIInfo();
30 eServiceFactoryHDMI::~eServiceFactoryHDMI()
32 ePtr<eServiceCenter> sc;
34 eServiceCenter::getPrivInstance(sc);
37 sc->removeServiceFactory(eServiceFactoryHDMI::id);
41 DEFINE_REF(eServiceFactoryHDMI)
43 RESULT eServiceFactoryHDMI::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
45 ptr = new eServiceHDMI(ref);
49 RESULT eServiceFactoryHDMI::record(const eServiceReference &ref, ePtr<iRecordableService> &ptr)
51 ePtr<eNavigation> nav_instance;
52 getNavInstance(nav_instance);
53 ptr = new eServiceHDMIRecord(ref, nav_instance);
57 RESULT eServiceFactoryHDMI::list(const eServiceReference &, ePtr<iListableService> &ptr)
63 RESULT eServiceFactoryHDMI::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
69 RESULT eServiceFactoryHDMI::offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr)
75 void eServiceFactoryHDMI::getNavInstance(ePtr<eNavigation> &nav_instance)
79 ePtr<iServiceHandler> service_center;
80 eServiceCenter::getInstance(service_center);
81 m_nav_instance = new eNavigation(service_center, HDMI_IN_REC_DECODER_INDEX);
83 nav_instance = m_nav_instance;
86 DEFINE_REF(eStaticServiceHDMIInfo)
88 eStaticServiceHDMIInfo::eStaticServiceHDMIInfo()
92 RESULT eStaticServiceHDMIInfo::getName(const eServiceReference &ref, std::string &name)
94 if (ref.name.length())
105 int eStaticServiceHDMIInfo::getLength(const eServiceReference &ref)
110 int eStaticServiceHDMIInfo::getInfo(const eServiceReference &ref, int w)
112 return iServiceInformation::resNA;
115 long long eStaticServiceHDMIInfo::getFileSize(const eServiceReference &ref)
120 eServiceHDMI::eServiceHDMI(eServiceReference ref)
121 : m_ref(ref), m_decoder_index(0)
126 eServiceHDMI::~eServiceHDMI()
130 DEFINE_REF(eServiceHDMI);
132 RESULT eServiceHDMI::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
134 connection = new eConnection((iPlayableService*)this, m_event.connect(event));
138 RESULT eServiceHDMI::start()
140 m_decoder = new eTSMPEGDecoder(NULL, m_decoder_index);
141 m_decoder->setVideoPID(1, 0);
142 m_decoder->setAudioPID(1, 0);
144 m_event(this, evStart);
148 RESULT eServiceHDMI::stop()
151 m_event(this, evStopped);
155 RESULT eServiceHDMI::setTarget(int target)
157 m_decoder_index = target;
161 RESULT eServiceHDMI::info(ePtr<iServiceInformation> &i)
167 RESULT eServiceHDMI::getName(std::string &name)
169 if (m_ref.name.length())
180 int eServiceHDMI::getInfo(int w)
185 std::string eServiceHDMI::getInfoString(int w)
190 PyObject* eServiceHDMI::getInfoObject(int w)
195 DEFINE_REF(eServiceHDMIRecord);
197 eServiceHDMIRecord::eServiceHDMIRecord(const eServiceReference &ref, ePtr<eNavigation> &nav_instance)
205 m_nav_instance = nav_instance;
208 RESULT eServiceHDMIRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id, const char *name, const char *descr, const char *tags)
210 m_filename = filename;
212 if (m_state == stateIdle)
219 RESULT eServiceHDMIRecord::prepareStreaming()
224 RESULT eServiceHDMIRecord::start(bool simulate)
226 m_simulate = simulate;
227 m_event((iRecordableService*)this, evStart);
231 RESULT eServiceHDMIRecord::stop()
234 eDebug("[eServiceHDMIRecord] stop recording!");
235 if (m_state == stateRecording)
240 m_thread->stopSaveMetaInformation();
242 if (m_target_fd >= 0)
244 ::close(m_target_fd);
248 m_state = statePrepared;
249 } else if (!m_simulate)
250 eDebug("[eServiceHDMIRecord] (was not recording)");
251 if (m_state == statePrepared)
255 m_nav_instance->stopService();
256 if (m_encoder_fd >= 0)
258 ::close(m_encoder_fd);
263 m_event((iRecordableService*)this, evRecordStopped);
267 int eServiceHDMIRecord::doPrepare()
269 if (!m_simulate && m_encoder_fd < 0)
271 if (m_nav_instance->playService(m_ref) >= 0)
274 snprintf(filename, sizeof(filename), "/dev/encoder%d", HDMI_IN_REC_ENCODER_INDEX);
275 m_encoder_fd = open(filename, O_RDONLY);
277 if (m_encoder_fd < 0)
280 m_state = statePrepared;
284 int eServiceHDMIRecord::doRecord()
286 int err = doPrepare();
289 m_error = errTuneFailed;
290 m_event((iRecordableService*)this, evRecordFailed);
294 if (!m_thread && !m_simulate)
296 eDebug("[eServiceHDMIRecord] Recording to %s...", m_filename.c_str());
297 ::remove(m_filename.c_str());
298 int fd = ::open(m_filename.c_str(), O_WRONLY | O_CREAT | O_LARGEFILE | O_CLOEXEC, 0666);
301 eDebug("[eServiceHDMIRecord] can't open recording file: %m");
302 m_error = errOpenRecordFile;
303 m_event((iRecordableService*)this, evRecordFailed);
304 return errOpenRecordFile;
307 m_thread = new eDVBRecordFileThread();
311 eDebug("[eServiceHDMIRecord] start recording...");
313 if (m_state != stateRecording)
315 if (m_thread && m_encoder_fd >= 0)
317 m_thread->startSaveMetaInformation(m_filename);
318 m_thread->start(m_encoder_fd, m_target_fd);
320 m_state = stateRecording;
324 m_event((iRecordableService*)this, evRecordRunning);
328 RESULT eServiceHDMIRecord::stream(ePtr<iStreamableService> &ptr)
334 RESULT eServiceHDMIRecord::subServices(ePtr<iSubserviceList> &ptr)
340 RESULT eServiceHDMIRecord::frontendInfo(ePtr<iFrontendInformation> &ptr)
346 RESULT eServiceHDMIRecord::connectEvent(const Slot2<void,iRecordableService*,int> &event, ePtr<eConnection> &connection)
348 connection = new eConnection((iRecordableService*)this, m_event.connect(event));
352 eAutoInitPtr<eServiceFactoryHDMI> init_eServiceFactoryHDMI(eAutoInitNumbers::service + 1, "eServiceFactoryHDMI");