📄 nvodwnd.c
字号:
#include"dvbutils.h"
#include"osdcommctrl.h"
#define IDC_SVCLIST 1//参考服务选择框
#define IDC_EVENTLIST 2//节目
#define IDC_TMLIST 3//时间
#define IDC_TEXT 4//节目介绍
static int UpdateEventInfo(HWND hch,SECTIONDB*db,SERVICELOCATOR*sloc)
{
SECTIONDATA*sd;
int secCount=0,evtCount=0;
if((db==NULL)||(sloc==NULL))
return 0;
sd=db->sections;
SendMessage(hch,LB_RESETCONTENT,0,0);
while(sd&&(secCount<2)){
SERVICELOCATOR s;
s.netId=GetEitNetID(sd->Data);
s.tsId=GetEitStreamID(sd->Data);
s.serviceId=GetEitServiceID(sd->Data);
if((s.netId==sloc->netId)&&(s.tsId==sloc->tsId)&&(s.serviceId==sloc->serviceId)){
int i,ec=GetEitEventCount(sd->Data);
for(i=0;i<ec;i++){
DVBEvent evt;
char ename[256];
int idx;
GetEitEvent(sd->Data,&evt,i);
GetShortEventName(&evt,ename,NULL,NULL);
idx=SendMessage(hch,LB_ADDSTRING,0,(LPARAM)ename);
SendMessage(hch,LB_SETITEMDATA,idx,evt.event_id);
PrDbgPrintf("Add NVOD ref Event '%s'\r\n",ename);
}
evtCount+=ec;
secCount++;
}
sd=sd->next;
}
SendMessage(hch,WM_PAINT,0,0);
InvalidateRect(hch,NULL,FALSE);
return evtCount;
}
static int UpdateTimeInfo(HWND hch,SERVICELOCATOR*ref,unsigned short eventId)
{//更新时间表
int i,shiftCount,evtCount=0;
FILETIME ftmNow;
SYSTEMTIME systmNow;
SERVICELOCATOR timeShifts[32];
LockWindowUpdate(hch);
SendMessage(hch,LB_RESETCONTENT,0,0);
shiftCount=GetNvodTimeShiftService(ref,timeShifts);
GetLocalTime(&systmNow);
SystemTimeToFileTime(&systmNow,&ftmNow);
for(i=0;i<shiftCount;i++){
SECTIONDB*db;
SECTIONDATA*sd;
db=LockScheduleDB(timeShifts+i);
if(db==NULL){
TRACE("TIMESHIFT Service%d.%d.%d has no events\r\n",timeShifts[i].netId,
timeShifts[i].tsId,timeShifts[i].serviceId);
RequestEPG(timeShifts+i,0);
continue;
}
sd=db->sections;
while(sd){
int i,ec=GetEitEventCount(sd->Data);
evtCount+=ec;
for(i=0;i<ec;i++){
DVBEvent evt;
unsigned char*des;
FILETIME ftevt;
SYSTEMTIME evtLocalTime;
DWORD durSeconds;
GetEitEvent(sd->Data,&evt,i);
MJDToLocalTime(&evtLocalTime,evt.mjdDate,evt.utcTime);
SystemTimeToFileTime(&evtLocalTime,&ftevt);
durSeconds=UTC2Seconds(evt.duration);
des=FindDescriptor(evt.descriptors,evt.descriptor_loop_length,
TIME_SHIFTED_EVENT_DESCRIPTOR_TAG);
if(des &&ftevt.dwLowDateTime+durSeconds>ftmNow.dwLowDateTime){
unsigned short refServiceId,refEventId;
refServiceId=(des[2]<<8)|des[3];
refEventId=(des[4]<<8)|des[5];
if((refServiceId==ref->serviceId)&&(refEventId==eventId)){
char tstr[256];
int idx;
sprintf(tstr,"%02d/%02d %02d:%02d-%02X:%02X",
evtLocalTime.wMonth,evtLocalTime.wDay,
evtLocalTime.wHour,evtLocalTime.wMinute,
evt.duration>>16,(evt.duration>>8)&0xFF);
idx=SendMessage(hch,LB_ADDSTRING,0,(LPARAM)tstr);
SendMessage(hch,LB_SETITEMDATA,idx,ftevt.dwLowDateTime);
}
}
}
sd=sd->next;
}
UnlockScheduleDB(timeShifts+i);
}
LockWindowUpdate(NULL);
return evtCount;
}
static void OnSvcChange(HWND hWnd)
{
SERVICELOCATOR timeShifts[32];
INT idx=SendMessage(hWnd,LB_GETCURSEL,0,0);
SERVICELOCATOR*sloc=(SERVICELOCATOR*)SendMessage(hWnd,LB_GETITEMDATA,idx,0);
SECTIONDB*db;
int i,sc=GetNvodTimeShiftService(sloc,timeShifts);
PrDbgPrintf("Select NVOD ref Service %d.%d.%d has %d timeshifts\r\n",sloc->netId,
sloc->tsId,sloc->serviceId,sc);
LockDVBSI();
if((db=GetEITPFDB())!=NULL){
HWND hEvt=GetDlgItem(GetParent(hWnd),IDC_EVENTLIST);
if(!UpdateEventInfo(hEvt,db,sloc))
RequestEPG(sloc,REQUEST_EITPF|REQUEST_NOSKIP);
}else
RequestEPG(sloc,REQUEST_EITPF|REQUEST_NOSKIP);
PlayByService(sloc);
for(i=0;i<sc;i++){
SERVICELOCATOR *s=timeShifts+i;
SECTIONDB*db=LockScheduleDB(s);
if(db==NULL){
RequestEPG(s,REQUEST_EITSCH|REQUEST_NOSKIP);
PrDbgPrintf("\t\t%d time shift service=%d.%d.%d\r\n",i,s->netId,s->tsId,s->serviceId);
}
UnlockScheduleDB(s);
}
UnlockDVBSI();
}
static void OnEventChange(HWND hWnd)
{//当选择一个节目的时候列出该节目所有的播出时间
HWND htm =GetDlgItem(GetParent(hWnd),IDC_TMLIST);
HWND hSvc=GetDlgItem(GetParent(hWnd),IDC_SVCLIST);
int idx=SendMessage(hSvc,LB_GETCURSEL,0,0);
SERVICELOCATOR*sRef=(SERVICELOCATOR*)SendMessage(hSvc,LB_GETITEMDATA,idx,0);
unsigned short eventId=SendMessage(hWnd,LB_GETITEMDATA,
SendMessage(hWnd,LB_GETCURSEL,0,0),0);
UpdateTimeInfo(htm,sRef,eventId);//刷新时间列表
}
static LRESULT WINAPI NVODProc(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{
switch(msgID){
case WM_COMMAND:
switch(wParam){
case MAKELONG(IDC_SVCLIST,LBN_SELCHANGE):
OnSvcChange((HWND)lParam); break;
case MAKELONG(IDC_EVENTLIST,LBN_SELCHANGE):
OnEventChange((HWND)lParam); break;
}break;
case WM_COMPAREITEM:
{
//idCtl = wParam;// control identifier
LPCOMPAREITEMSTRUCT lpcis = (LPCOMPAREITEMSTRUCT) lParam; // structure with items
int rc=lpcis->itemData1-lpcis->itemData2;
if(rc==0)return 0;
return rc>0?1:-1;
}
case WM_SCHEDULE:
{
SERVICELOCATOR svr=*((SERVICELOCATOR*)wParam);
HWND hrefSvc=GetDlgItem(hWnd,IDC_SVCLIST);
if(lParam<0x50){
SECTIONDB*db;
int idx=SendMessage(hrefSvc,LB_GETCURSEL,0,0);
if(idx>=0){
HWND hEvt=GetDlgItem(hWnd,IDC_EVENTLIST);
SERVICELOCATOR *s=(SERVICELOCATOR*)SendMessage(hrefSvc,LB_GETITEMDATA,idx,0);
db=GetEITPFDB();
LockDVBSI();
if(SendMessage(hEvt,LB_GETCOUNT,0,0)==0)
UpdateEventInfo(hEvt,db,s);
UnlockDVBSI();
}
}else{
HWND hevt=GetDlgItem(hWnd,IDC_EVENTLIST);
HWND hsvr=GetDlgItem(hWnd,IDC_SVCLIST);
HWND htm=GetDlgItem(hWnd,IDC_TMLIST);
int idxEvt=SendMessage(hevt,LB_GETCURSEL,0,0);
int idxRef=SendMessage(hsvr,LB_GETCURSEL,0,0);
if(idxEvt>=0&&idxRef>=0)
{
SERVICELOCATOR*refSvr=(SERVICELOCATOR*)SendMessage(hsvr,LB_GETITEMDATA,idxRef,0);
unsigned short eventId=(unsigned short)SendMessage(hevt,LB_GETITEMDATA,idxEvt,0);
UpdateTimeInfo(hevt,refSvr,eventId);
}
}
}break;
default:
return DefWindowProc(hWnd,msgID,wParam,lParam);
}
return 0;
}
HWND CreateNvodWnd(void)
{
#define LIST_STYLE WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|WS_BORDER|WS_CHILD|LBS_NOTIFY|LBS_WRAP
#define LABLE_STYLE WS_VISIBLE|WS_CHILD|WS_BORDER|SS_CENTER
int i;
FAVGROUP*grp;
HWND hNvod,hLst,htab=NULL;
hNvod=CreateMainWindow("视频点播",WS_VISIBLE|WS_OVERLAPPEDWINDOW,40,10,600,520,NVODProc);
CreateWindow("Static","节目分类",LABLE_STYLE,5,5,280,25,hNvod,(HMENU)10,NULL,NULL);
CreateWindow("Static","节目列表",LABLE_STYLE,300,5,280,25,hNvod,(HMENU)11,NULL,NULL);
CreateWindow("Listbox",NULL,LIST_STYLE, 5,35,280,220,hNvod,(HMENU)IDC_SVCLIST,NULL,NULL);//,SVCProc
CreateWindow("Listbox",NULL,LIST_STYLE,300,35,280,220,hNvod,(HMENU)IDC_EVENTLIST,NULL,NULL);//EventProc
htab=CreateWindow("tabcontrol",NULL,WS_VISIBLE|WS_CHILD|WS_TABSTOP|TCS_BUTTONS,
5,258,280,26,hNvod,(HMENU)IDC_TMLIST+100,NULL,NULL);
CreateWindow("Listbox",NULL,LIST_STYLE|LBS_SORT,5,286,580,200,hNvod,(HMENU)IDC_TMLIST,NULL,NULL);
/*CreateWindow("Editbox",NULL,WS_VISIBLE|WS_CHILD|WS_BORDER|WS_VSCROLL|ES_MULTILINE,
5,286,580,200,hNvod,(HMENU)IDC_TEXT,NULL,NULL);*/
grp=FindFavGroupByID(GROUP_NVOD);
hLst=GetDlgItem(hNvod,IDC_SVCLIST);
for(i=0;(grp!=NULL)&&(i<grp->serviceCount);i++){
char sname[256];
SERVICELOCATOR*sloc=grp->Services+i;
if(GetServiceType(sloc)==ST_NVODREF){
INT idx;
GetServiceName(sloc,NULL,sname,NULL);
idx=SendMessage(hLst,LB_ADDSTRING,0,(LPARAM)sname);
SendMessage(hLst,LB_SETITEMDATA,idx,(LPARAM)sloc);
}
}
if(htab){
TCITEM itm;
itm.mask=TCIF_TEXT;
itm.pszText="播出时段";
TabCtrl_InsertItem(htab,0,&itm);
itm.pszText="节目介绍";
TabCtrl_InsertItem(htab,1,&itm);
}
return hNvod;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -