summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--tv_input.cpp45
-rw-r--r--tvapi/android/Android.mk2
-rw-r--r--tvapi/android/include/ITv.h100
-rw-r--r--tvapi/android/include/ITvClient.h58
-rw-r--r--tvapi/android/include/ITvService.h68
-rw-r--r--tvapi/android/include/Tv.h161
-rw-r--r--tvapi/android/include/tvcmd.h1188
-rw-r--r--tvapi/android/jni/Android.mk132
-rw-r--r--tvapi/android/jni/android_amlogic_tv.cpp911
-rw-r--r--tvapi/android/jni/cfbc_jni.cpp214
-rw-r--r--tvapi/android/jni/cfbc_test.cpp86
-rw-r--r--tvapi/android/libtvbinder/Android.mk48
-rw-r--r--tvapi/android/libtvbinder/ITv.cpp289
-rw-r--r--tvapi/android/libtvbinder/ITvClient.cpp117
-rw-r--r--tvapi/android/libtvbinder/ITvService.cpp101
-rw-r--r--tvapi/android/libtvbinder/Tv.cpp378
-rw-r--r--tvapi/android/tvserver/Android.mk162
-rw-r--r--tvapi/android/tvserver/TvService.cpp8755
-rw-r--r--tvapi/android/tvserver/TvService.h164
-rw-r--r--tvapi/android/tvserver/main.cpp46
-rwxr-xr-x[-rw-r--r--]tvapi/build/include/.gitignore0
-rw-r--r--tvapi/docs/tv.uml12156
-rw-r--r--tvapi/libtv/Android.mk3
-rw-r--r--tvapi/libtv/audio/audio_alsa.cpp2426
-rw-r--r--tvapi/libtv/audio/audio_alsa.h261
-rw-r--r--tvapi/libtv/audio/audio_android.cpp2070
-rw-r--r--tvapi/libtv/audio/audio_android.h157
-rw-r--r--tvapi/libtv/audio/audio_android_effect.cpp1182
-rw-r--r--tvapi/libtv/audio/audio_android_effect.h131
-rw-r--r--tvapi/libtv/audio/audio_api.cpp4940
-rw-r--r--tvapi/libtv/audio/audio_api.h647
-rw-r--r--tvapi/libtv/audio/audio_effect.cpp456
-rw-r--r--tvapi/libtv/audio/audio_effect.h63
-rw-r--r--tvapi/libtv/include/amstream.h526
-rw-r--r--tvapi/libtv/include/amvecm.h136
-rw-r--r--tvapi/libtv/include/cm.h306
-rw-r--r--tvapi/libtv/include/hdmirx_cec.h508
-rw-r--r--tvapi/libtv/include/ve.h438
-rw-r--r--tvapi/libtv/tv/AutoBackLight.cpp426
-rw-r--r--tvapi/libtv/tv/AutoBackLight.h47
-rw-r--r--tvapi/libtv/tv/CAv.cpp484
-rw-r--r--tvapi/libtv/tv/CAv.h194
-rw-r--r--tvapi/libtv/tv/CFbcCommunication.cpp2326
-rw-r--r--tvapi/libtv/tv/CFbcCommunication.h680
-rw-r--r--tvapi/libtv/tv/CFrontEnd.cpp838
-rw-r--r--tvapi/libtv/tv/CFrontEnd.h227
-rw-r--r--tvapi/libtv/tv/CTv.cpp10755
-rw-r--r--tvapi/libtv/tv/CTv.h1269
-rw-r--r--tvapi/libtv/tv/CTvBooking.cpp324
-rw-r--r--tvapi/libtv/tv/CTvBooking.h167
-rw-r--r--tvapi/libtv/tv/CTvDmx.cpp8
-rw-r--r--tvapi/libtv/tv/CTvDmx.h15
-rw-r--r--tvapi/libtv/tv/CTvEpg.cpp260
-rw-r--r--tvapi/libtv/tv/CTvEpg.h280
-rw-r--r--tvapi/libtv/tv/CTvEv.cpp2
-rw-r--r--tvapi/libtv/tv/CTvEv.h314
-rw-r--r--tvapi/libtv/tv/CTvLog.h8
-rw-r--r--tvapi/libtv/tv/CTvRecord.cpp552
-rw-r--r--tvapi/libtv/tv/CTvRecord.h93
-rw-r--r--tvapi/libtv/tv/CTvSatellite.h43
-rw-r--r--tvapi/libtv/tv/CTvScanner.cpp1417
-rw-r--r--tvapi/libtv/tv/CTvScanner.h319
-rw-r--r--tvapi/libtv/tv/CTvScreenCapture.cpp1060
-rw-r--r--tvapi/libtv/tv/CTvScreenCapture.h351
-rw-r--r--tvapi/libtv/tv/CTvSubtitle.cpp272
-rw-r--r--tvapi/libtv/tv/CTvSubtitle.h469
-rw-r--r--tvapi/libtv/tv/CTvTime.h137
-rw-r--r--tvapi/libtv/tv/CTvVchipCheck.cpp250
-rw-r--r--tvapi/libtv/tv/CTvVchipCheck.h43
-rw-r--r--tvapi/libtv/tv/CUpgradeFBC.cpp974
-rw-r--r--tvapi/libtv/tv/CUpgradeFBC.h284
-rw-r--r--tvapi/libtv/tvconfig/CIniFile.cpp706
-rw-r--r--tvapi/libtv/tvconfig/CIniFile.h79
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.conf58
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.cpp106
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.h40
-rw-r--r--tvapi/libtv/tvdb/CTvChannel.cpp694
-rw-r--r--tvapi/libtv/tvdb/CTvChannel.h575
-rw-r--r--tvapi/libtv/tvdb/CTvDatabase.cpp300
-rw-r--r--tvapi/libtv/tvdb/CTvDatabase.h190
-rw-r--r--tvapi/libtv/tvdb/CTvDimension.cpp714
-rw-r--r--tvapi/libtv/tvdb/CTvDimension.h196
-rw-r--r--tvapi/libtv/tvdb/CTvEvent.cpp482
-rw-r--r--tvapi/libtv/tvdb/CTvEvent.h171
-rw-r--r--tvapi/libtv/tvdb/CTvGroup.cpp88
-rw-r--r--tvapi/libtv/tvdb/CTvGroup.h61
-rw-r--r--tvapi/libtv/tvdb/CTvProgram.cpp1766
-rw-r--r--tvapi/libtv/tvdb/CTvProgram.h1065
-rw-r--r--tvapi/libtv/tvdb/CTvRegion.cpp366
-rw-r--r--tvapi/libtv/tvdb/CTvRegion.h85
-rw-r--r--tvapi/libtv/tvin/CHDMIRxCEC.cpp830
-rw-r--r--tvapi/libtv/tvin/CSourceConnectDetect.cpp448
-rw-r--r--tvapi/libtv/tvin/CTvin.cpp4240
-rw-r--r--tvapi/libtv/tvin/CTvin.h2222
-rw-r--r--tvapi/libtv/tvsetting/CBlobDevice.cpp54
-rw-r--r--tvapi/libtv/tvsetting/CBlobDevice.h101
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp706
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceE2prom.h153
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceFile.cpp160
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceFile.h53
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceRam.cpp258
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceRam.h75
-rw-r--r--tvapi/libtv/tvsetting/CTvSetting.cpp4424
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingCfg.h742
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp38
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingDeviceFactory.h11
-rw-r--r--tvapi/libtv/tvsetting/TvKeyData.cpp2784
-rw-r--r--tvapi/libtv/tvsetting/audio_cfg.cpp3706
-rw-r--r--tvapi/libtv/tvsetting/audio_cfg.h338
-rw-r--r--tvapi/libtv/tvutils/CCondition.h87
-rw-r--r--tvapi/libtv/tvutils/CFile.cpp250
-rw-r--r--tvapi/libtv/tvutils/CFile.h53
-rw-r--r--tvapi/libtv/tvutils/CHdmiCecCmd.cpp6
-rw-r--r--tvapi/libtv/tvutils/CHdmiCecCmd.h9
-rw-r--r--tvapi/libtv/tvutils/CMsgQueue.cpp144
-rw-r--r--tvapi/libtv/tvutils/CMsgQueue.h44
-rw-r--r--tvapi/libtv/tvutils/CMutex.h116
-rw-r--r--tvapi/libtv/tvutils/CSerialCommunication.cpp118
-rw-r--r--tvapi/libtv/tvutils/CSerialCommunication.h98
-rw-r--r--tvapi/libtv/tvutils/CSerialPort.cpp568
-rw-r--r--tvapi/libtv/tvutils/CSerialPort.h45
-rw-r--r--tvapi/libtv/tvutils/CSqlite.cpp126
-rw-r--r--tvapi/libtv/tvutils/CSqlite.h292
-rw-r--r--tvapi/libtv/tvutils/CThread.cpp212
-rw-r--r--tvapi/libtv/tvutils/CThread.h79
-rw-r--r--tvapi/libtv/tvutils/CTvInput.cpp196
-rw-r--r--tvapi/libtv/tvutils/CTvInput.h49
-rw-r--r--tvapi/libtv/tvutils/serial_base.cpp560
-rw-r--r--tvapi/libtv/tvutils/serial_base.h34
-rw-r--r--tvapi/libtv/tvutils/serial_operate.cpp336
-rw-r--r--tvapi/libtv/tvutils/serial_operate.h72
-rw-r--r--tvapi/libtv/tvutils/tvutils.cpp3822
-rw-r--r--tvapi/libtv/tvutils/tvutils.h238
-rw-r--r--tvapi/libtv/tvutils/zepoll.cpp66
-rw-r--r--tvapi/libtv/tvutils/zepoll.h57
-rw-r--r--tvapi/libtv/version/version.cpp188
-rw-r--r--tvapi/libtv/version/version.h22
-rw-r--r--tvapi/libtv/vpp/CPQdb.cpp3183
-rw-r--r--tvapi/libtv/vpp/CPQdb.h321
-rw-r--r--tvapi/libtv/vpp/CVpp.cpp4772
-rw-r--r--tvapi/libtv/vpp/CVpp.h683
-rw-r--r--tvapi/libtv/vpp/pqdata.cpp216
-rw-r--r--tvapi/tvtests/Android.mk98
-rw-r--r--tvapi/tvtests/android_tvtest.cpp30
-rw-r--r--tvapi/tvtests/comm_test.cpp42
-rw-r--r--tvapi/tvtests/ssm_test.cpp420
-rw-r--r--tvapi/tvtests/tvconfig_test.cpp854
147 files changed, 55964 insertions, 55946 deletions
diff --git a/tvapi/libtv/tv/CTvRecord.cpp b/tvapi/libtv/tv/CTvRecord.cpp
index 564f4f3..b43970f 100644
--- a/tvapi/libtv/tv/CTvRecord.cpp
+++ b/tvapi/libtv/tv/CTvRecord.cpp
@@ -1,276 +1,276 @@
-#include <string.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <am_debug.h>
-#include <am_dmx.h>
-#include <am_av.h>
-
-#include <am_misc.h>
-
-#include <am_fend.h>
-#include <am_dvr.h>
-#include <errno.h>
-#include "CTvProgram.h"
-#include "../tvconfig/tvconfig.h"
-#include "CTvRecord.h"
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-#define LOG_TAG "CTvRecord"
-
-#define FEND_DEV_NO 0
-#define DVR_DEV_NO 0
-#define DVR_BUF_SIZE 1024*1024
-#define DVR_DEV_COUNT (2)
-
-typedef struct {
- int id;
- char file_name[256];
- pthread_t thread;
- int running;
- int fd;
-} DVRData;
-
-static DVRData data_threads[DVR_DEV_COUNT];
-int pvr_init = 0;
-CTvRecord::CTvRecord()
-{
- AM_DVR_OpenPara_t dpara;
- memset(&dpara, 0, sizeof(dpara));
- AM_DVR_Open(DVR_DEV_NO, &dpara);
- data_threads[DVR_DEV_NO].id = 0;
- data_threads[DVR_DEV_NO].fd = -1;
- data_threads[DVR_DEV_NO].running = 0;
-
- AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
- AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
-
- memset(filename, 0, sizeof(filename));
- progid = 0xFFFF;
- vpid = 0x1fff;
- apid = 0x1fff;
-}
-CTvRecord::~CTvRecord()
-{
- AM_DVR_Close(DVR_DEV_NO);
-
-}
-void CTvRecord::dvr_init(void)
-{
- AM_DVR_OpenPara_t para;
- char buf[32];
-
- if (pvr_init)
- return;
-
- memset(&para, 0, sizeof(para));
- LOGD("%s,%d", "TV", __LINE__);
-
- AM_DVR_Open(DVR_DEV_NO, &para);
- AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
- AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
-
- snprintf(buf, sizeof(buf), "%d", (512 * 1024));
- AM_FileEcho("/sys/class/dmx/asyncfifo_len", buf);
-
- pvr_init = 1;
-}
-
-char *CTvRecord::GetRecordFileName()
-{
- return filename;
-}
-void CTvRecord::SetRecordFileName(char *name)
-{
- strcpy(filename, name);
-}
-void CTvRecord::SetCurRecProgramId(int id)
-{
- progid = id;
-}
-
-int CTvRecord::dvr_data_write(int fd, uint8_t *buf, int size)
-{
- int ret;
- int left = size;
- uint8_t *p = buf;
- LOGD("%s,%d", "TV", __LINE__);
-
- while (left > 0) {
- ret = write(fd, p, left);
- if (ret == -1) {
- if (errno != EINTR) {
- LOGD("Write DVR data failed: %s", strerror(errno));
- break;
- }
- ret = 0;
- }
-
- left -= ret;
- p += ret;
- }
-
- return (size - left);
-}
-void *CTvRecord::dvr_data_thread(void *arg)
-{
- DVRData *dd = (DVRData *)arg;
- int cnt;
- uint8_t buf[256 * 1024];
-
- LOGD("Data thread for DVR%d start ,record file will save to '%s'", dd->id, dd->file_name);
- LOGD("%s,%d", "TV", __LINE__);
-
- while (dd->running) {
- cnt = AM_DVR_Read(dd->id, buf, sizeof(buf), 1000);
- if (cnt <= 0) {
- LOGD("No data available from DVR%d", dd->id);
- usleep(200 * 1000);
- continue;
- }
- //AM_DEBUG(1, "read from DVR%d return %d bytes", dd->id, cnt);
- if (dd->fd != -1) {
- dvr_data_write(dd->fd, buf, cnt);
- }
- }
-
- if (dd->fd != -1) {
- close(dd->fd);
- dd->fd = -1;
- }
- LOGD("Data thread for DVR%d now exit", dd->id);
-
- return NULL;
-}
-
-void CTvRecord::start_data_thread(int dev_no)
-{
- DVRData *dd = &data_threads[dev_no];
-
- if (dd->running)
- return;
- LOGD("%s,%d,dev=%d", "TV", __LINE__, dev_no);
- dd->fd = open(dd->file_name, O_TRUNC | O_WRONLY | O_CREAT, 0666);
- if (dd->fd == -1) {
- LOGD("Cannot open record file '%s' for DVR%d, %s", dd->file_name, dd->id, strerror(errno));
- return;
- }
- dd->running = 1;
- pthread_create(&dd->thread, NULL, dvr_data_thread, dd);
-}
-void CTvRecord::get_cur_program_pid(int progId)
-{
- CTvProgram prog;
- int aindex;
- CTvProgram::Audio *pA;
- CTvProgram::Video *pV;
- int ret = CTvProgram::selectByID(progId, prog);
- if (ret != 0) return;
-
- LOGD("%s,%d", "TV", __LINE__);
- pV = prog.getVideo();
- if (pV != NULL) {
- setvpid(pV->getPID());
- }
-
- aindex = prog.getCurrAudioTrackIndex();
- if (-1 == aindex) { //db is default
- aindex = prog.getCurrentAudio(String8("eng"));
- if (aindex >= 0) {
- prog.setCurrAudioTrackIndex(progId, aindex);
- }
- }
-
- if (aindex >= 0) {
- pA = prog.getAudio(aindex);
- if (pA != NULL) {
- setapid(pA->getPID());
- }
- }
-
-}
-int CTvRecord::start_dvr()
-{
- AM_DVR_StartRecPara_t spara;
- int pid_cnt;
- int pids[2];
-
- /**仅测试最多8个PID*/
- get_cur_program_pid(progid);
- pids[0] = getvpid();
- pids[1] = getapid();
-
- strcpy(data_threads[DVR_DEV_NO].file_name, GetRecordFileName());
- LOGD("%s,%d", "TV", __LINE__);
- //sprintf(data_threads[DVR_DEV_NO].file_name,"%s","/storage/external_storage/sda4/testdvr.ts");
- spara.pid_count = 2;
- memcpy(&spara.pids, pids, sizeof(pids));
-
- if (AM_DVR_StartRecord(DVR_DEV_NO, &spara) == AM_SUCCESS) {
- start_data_thread(DVR_DEV_NO);
- }
-
- return 0;
-}
-void CTvRecord::stop_data_thread(int dev_no)
-{
- DVRData *dd = &data_threads[dev_no];
- LOGD("%s,%d", "TV", __LINE__);
-
- if (! dd->running)
- return;
- dd->running = 0;
- pthread_join(dd->thread, NULL);
- LOGD("Data thread for DVR%d has exit", dd->id);
-}
-
-
-void CTvRecord::StartRecord(int id)
-{
- AM_DVR_OpenPara_t dpara;
- fe_status_t status;
- char buf[32];
-
- AM_FEND_GetStatus(FEND_DEV_NO, &status);
-
- if (status & FE_HAS_LOCK) {
- LOGD("locked\n");
- } else {
- LOGD("unlocked\n");
- return ;
- }
- SetCurRecProgramId(id);
- start_dvr();
-
- return;
-}
-void CTvRecord::StopRecord()
-{
- int i = 0;
- LOGD("stop record for %d", DVR_DEV_NO);
- AM_DVR_StopRecord(DVR_DEV_NO);
-
- //for (i=0; i< DVR_DEV_COUNT; i++)
- {
- if (data_threads[DVR_DEV_NO].running)
- stop_data_thread(DVR_DEV_NO);
- //LOGD("Closing DMX%d...", i);
- }
-
-
-}
-void CTvRecord::SetRecCurTsOrCurProgram(int sel)
-{
- int i = 0;
- char buf[50];
- memset(buf, 0, sizeof(buf));
- for (; i < 3; i++) {
- snprintf(buf, sizeof(buf), "/sys/class/stb/dvr%d_mode", i);
- if (sel)
- AM_FileEcho(buf, "ts");
- else
- AM_FileEcho(buf, "pid");
- }
-}
-
+#include <string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <am_debug.h>
+#include <am_dmx.h>
+#include <am_av.h>
+
+#include <am_misc.h>
+
+#include <am_fend.h>
+#include <am_dvr.h>
+#include <errno.h>
+#include "CTvProgram.h"
+#include "../tvconfig/tvconfig.h"
+#include "CTvRecord.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "CTvRecord"
+
+#define FEND_DEV_NO 0
+#define DVR_DEV_NO 0
+#define DVR_BUF_SIZE 1024*1024
+#define DVR_DEV_COUNT (2)
+
+typedef struct {
+ int id;
+ char file_name[256];
+ pthread_t thread;
+ int running;
+ int fd;
+} DVRData;
+
+static DVRData data_threads[DVR_DEV_COUNT];
+int pvr_init = 0;
+CTvRecord::CTvRecord()
+{
+ AM_DVR_OpenPara_t dpara;
+ memset(&dpara, 0, sizeof(dpara));
+ AM_DVR_Open(DVR_DEV_NO, &dpara);
+ data_threads[DVR_DEV_NO].id = 0;
+ data_threads[DVR_DEV_NO].fd = -1;
+ data_threads[DVR_DEV_NO].running = 0;
+
+ AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
+ AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
+
+ memset(filename, 0, sizeof(filename));
+ progid = 0xFFFF;
+ vpid = 0x1fff;
+ apid = 0x1fff;
+}
+CTvRecord::~CTvRecord()
+{
+ AM_DVR_Close(DVR_DEV_NO);
+
+}
+void CTvRecord::dvr_init(void)
+{
+ AM_DVR_OpenPara_t para;
+ char buf[32];
+
+ if(pvr_init)
+ return;
+
+ memset(&para, 0, sizeof(para));
+ LOGD("%s,%d", "TV", __LINE__);
+
+ AM_DVR_Open(DVR_DEV_NO, &para);
+ AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
+ AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
+
+ snprintf(buf, sizeof(buf), "%d", (512 * 1024));
+ AM_FileEcho("/sys/class/dmx/asyncfifo_len", buf);
+
+ pvr_init = 1;
+}
+
+char *CTvRecord::GetRecordFileName()
+{
+ return filename;
+}
+void CTvRecord::SetRecordFileName(char *name)
+{
+ strcpy(filename, name);
+}
+void CTvRecord::SetCurRecProgramId(int id)
+{
+ progid = id;
+}
+
+int CTvRecord::dvr_data_write(int fd, uint8_t *buf, int size)
+{
+ int ret;
+ int left = size;
+ uint8_t *p = buf;
+ LOGD("%s,%d", "TV", __LINE__);
+
+ while (left > 0) {
+ ret = write(fd, p, left);
+ if (ret == -1) {
+ if (errno != EINTR) {
+ LOGD("Write DVR data failed: %s", strerror(errno));
+ break;
+ }
+ ret = 0;
+ }
+
+ left -= ret;
+ p += ret;
+ }
+
+ return (size - left);
+}
+void *CTvRecord::dvr_data_thread(void *arg)
+{
+ DVRData *dd = (DVRData *)arg;
+ int cnt;
+ uint8_t buf[256 * 1024];
+
+ LOGD("Data thread for DVR%d start ,record file will save to '%s'", dd->id, dd->file_name);
+ LOGD("%s,%d", "TV", __LINE__);
+
+ while (dd->running) {
+ cnt = AM_DVR_Read(dd->id, buf, sizeof(buf), 1000);
+ if (cnt <= 0) {
+ LOGD("No data available from DVR%d", dd->id);
+ usleep(200 * 1000);
+ continue;
+ }
+ //AM_DEBUG(1, "read from DVR%d return %d bytes", dd->id, cnt);
+ if (dd->fd != -1) {
+ dvr_data_write(dd->fd, buf, cnt);
+ }
+ }
+
+ if (dd->fd != -1) {
+ close(dd->fd);
+ dd->fd = -1;
+ }
+ LOGD("Data thread for DVR%d now exit", dd->id);
+
+ return NULL;
+}
+
+void CTvRecord::start_data_thread(int dev_no)
+{
+ DVRData *dd = &data_threads[dev_no];
+
+ if (dd->running)
+ return;
+ LOGD("%s,%d,dev=%d", "TV", __LINE__, dev_no);
+ dd->fd = open(dd->file_name, O_TRUNC | O_WRONLY | O_CREAT, 0666);
+ if (dd->fd == -1) {
+ LOGD("Cannot open record file '%s' for DVR%d, %s", dd->file_name, dd->id, strerror(errno));
+ return;
+ }
+ dd->running = 1;
+ pthread_create(&dd->thread, NULL, dvr_data_thread, dd);
+}
+void CTvRecord::get_cur_program_pid(int progId)
+{
+ CTvProgram prog;
+ int aindex;
+ CTvProgram::Audio *pA;
+ CTvProgram::Video *pV;
+ int ret = CTvProgram::selectByID(progId, prog);
+ if(ret != 0) return;
+
+ LOGD("%s,%d", "TV", __LINE__);
+ pV = prog.getVideo();
+ if(pV != NULL) {
+ setvpid(pV->getPID());
+ }
+
+ aindex = prog.getCurrAudioTrackIndex();
+ if(-1 == aindex) { //db is default
+ aindex = prog.getCurrentAudio(String8("eng"));
+ if(aindex >= 0) {
+ prog.setCurrAudioTrackIndex(progId, aindex);
+ }
+ }
+
+ if(aindex >= 0) {
+ pA = prog.getAudio(aindex);
+ if(pA != NULL) {
+ setapid(pA->getPID());
+ }
+ }
+
+}
+int CTvRecord::start_dvr()
+{
+ AM_DVR_StartRecPara_t spara;
+ int pid_cnt;
+ int pids[2];
+
+ /**仅测试最多8个PID*/
+ get_cur_program_pid(progid);
+ pids[0] = getvpid();
+ pids[1] = getapid();
+
+ strcpy(data_threads[DVR_DEV_NO].file_name, GetRecordFileName());
+ LOGD("%s,%d", "TV", __LINE__);
+ //sprintf(data_threads[DVR_DEV_NO].file_name,"%s","/storage/external_storage/sda4/testdvr.ts");
+ spara.pid_count = 2;
+ memcpy(&spara.pids, pids, sizeof(pids));
+
+ if (AM_DVR_StartRecord(DVR_DEV_NO, &spara) == AM_SUCCESS) {
+ start_data_thread(DVR_DEV_NO);
+ }
+
+ return 0;
+}
+void CTvRecord::stop_data_thread(int dev_no)
+{
+ DVRData *dd = &data_threads[dev_no];
+ LOGD("%s,%d", "TV", __LINE__);
+
+ if (! dd->running)
+ return;
+ dd->running = 0;
+ pthread_join(dd->thread, NULL);
+ LOGD("Data thread for DVR%d has exit", dd->id);
+}
+
+
+void CTvRecord::StartRecord(int id)
+{
+ AM_DVR_OpenPara_t dpara;
+ fe_status_t status;
+ char buf[32];
+
+ AM_FEND_GetStatus(FEND_DEV_NO, &status);
+
+ if(status & FE_HAS_LOCK) {
+ LOGD("locked\n");
+ } else {
+ LOGD("unlocked\n");
+ return ;
+ }
+ SetCurRecProgramId(id);
+ start_dvr();
+
+ return;
+}
+void CTvRecord::StopRecord()
+{
+ int i = 0;
+ LOGD("stop record for %d", DVR_DEV_NO);
+ AM_DVR_StopRecord(DVR_DEV_NO);
+
+ //for (i=0; i< DVR_DEV_COUNT; i++)
+ {
+ if (data_threads[DVR_DEV_NO].running)
+ stop_data_thread(DVR_DEV_NO);
+ //LOGD("Closing DMX%d...", i);
+ }
+
+
+}
+void CTvRecord::SetRecCurTsOrCurProgram(int sel)
+{
+ int i = 0;
+ char buf[50];
+ memset(buf, 0, sizeof(buf));
+ for(; i < 3; i++) {
+ snprintf(buf, sizeof(buf), "/sys/class/stb/dvr%d_mode", i);
+ if(sel)
+ AM_FileEcho(buf, "ts");
+ else
+ AM_FileEcho(buf, "pid");
+ }
+}
+