⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nvodwnd.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 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 + -