📄 xp_osi_cchan.c
字号:
/*----------------------------------------------------------------------------+| This source code has been made available to you by IBM on an AS-IS| basis. Anyone receiving this source is licensed under IBM| copyrights to use it in any way he or she deems fit, including| copying it, modifying it, compiling it, and redistributing it either| with or without modifications. No license under IBM patents or| patent applications is to be implied by the copyright license.|| Any user of this software should understand that IBM cannot provide| technical support for this software and will not be responsible for| any consequences resulting from the use of this software.|| Any person who transfers this source code or any derivative work| must include the IBM copyright notice, this paragraph, and the| preceding two paragraphs in the transferred software.|| COPYRIGHT I B M CORPORATION 1998| LICENSED MATERIAL - PROGRAM PROPERTY OF I B M+----------------------------------------------------------------------------*//*----------------------------------------------------------------------------+|| Author : Ian Govett and Paul Gramann| Component : xp| File : xp_cchan.c| Purpose : Channel change functions.| Changes :| Date By Comments| --------- --- ------------------------------------------------------| 27-Apr-98 Created| 22-Jun-99 PAG Added stat and clear stat commands| 01-Feb-00 RLB Removed printf's from pes_error.| 02-Jun-01 TJC Substituted "demux_" calls for "xp_" calls.| 04-Jun-01 TJC Moved from "menus" to "xp" folder.| 30-Sep-01 LGH ported to Linux| 10-Jan-02 LGH Added xp_osi_sync_stop when pcr = 0x1fff+----------------------------------------------------------------------------*//* The necessary header files */#include <linux/config.h>#include <linux/version.h>#ifdef MODVERSIONS#include <linux/modversions.h>#endif#define __NO_VERSION__#include <linux/module.h>#include <linux/kernel.h>#include <linux/types.h>#include <vid/vid_types.h>#include "xp_osi_global.h"#include "xp_atom_reg.h"GLOBAL_RESOURCES *pGlobal=NULL;extern XP_STC_NOTIFY_FN stc_notify_fn;SEMAPHORE_T sema;void hardware_cchan (USHORT audio_pid,USHORT video_pid,USHORT pcr_pid);void hardware_audio_cchan(USHORT audio_pid);void hardware_video_cchan(USHORT video_pid);void hardware_pcr_cchan(USHORT pcr_pid);extern void vid_atom_set_sfm(vidsfm_t sfm);/*----------------------------------------------------------------------------+| XXXX XX XX XXXXXX XXXXXXX XXXXXX XX XX XX XXXX| XX XXX XX X XX X XX X XX XX XXX XX XXXX XX| XX XXXX XX XX XX X XX XX XXXX XX XX XX XX| XX XX XXXX XX XXXX XXXXX XX XXXX XX XX XX| XX XX XXX XX XX X XX XX XX XXX XXXXXX XX| XX XX XX XX XX X XX XX XX XX XX XX XX XX| XXXX XX XX XXXX XXXXXXX XXX XX XX XX XX XX XXXXXXX+----------------------------------------------------------------------------*//*----------------------------------------------------------------------------+| hardware_cchan+----------------------------------------------------------------------------*/void hardware_cchan (USHORT audio_pid, USHORT video_pid, USHORT pcr_pid){ if(pGlobal == NULL) return; hardware_audio_cchan(audio_pid); hardware_video_cchan(video_pid); hardware_pcr_cchan(pcr_pid); return;}void hardware_audio_cchan(USHORT audio_pid){ if(pGlobal == NULL) return; pGlobal->ChanChanInfo.xp_cchan_audchan_pending = 1; pGlobal->ChanChanInfo.xp_cchan_audpid = audio_pid; xp_osi_channel_set_pid(pGlobal,XP_CHANNEL_CC_AUDIO, audio_pid); return;}void hardware_video_cchan(USHORT video_pid){ if(pGlobal == NULL) return; pGlobal->ChanChanInfo.xp_cchan_vidchan_pending = 1; pGlobal->ChanChanInfo.xp_cchan_vidpid = video_pid; vid_atom_set_sfm(VID_SFM_FIRST_ONLY); xp_osi_channel_set_pid(pGlobal,XP_CHANNEL_CC_VIDEO, video_pid); return;}void hardware_pcr_cchan(USHORT pcr_pid){ if(pGlobal == NULL) return; if(stc_notify_fn != NULL) (*stc_notify_fn)(pGlobal,STC_REMOVED); pGlobal->ChanChanInfo.xp_cchan_pcrpid = pcr_pid; xp_osi_clk_set_pid(pGlobal,pcr_pid); return;}/*----------------------------------------------------------------------------+| aud_cc_done+----------------------------------------------------------------------------*/void aud_cc_done(){ /*-------------------------------------------------------------------------+ | Disable Audio Synchronization +-------------------------------------------------------------------------*/ if(pGlobal == NULL) return; xp_atom_disable_aud_sync(); /*-------------------------------------------------------------------------+ | Complete Pending Channel Change and Force Audio STC Update +-------------------------------------------------------------------------*/ pGlobal->ChanChanInfo.xp_cchan_audchan_pending = 0; if ((pGlobal->ChanChanInfo.xp_cchan_vidchan_pending==0) && (pGlobal->ChanChanInfo.xp_cchan_next!=0)) { if(pGlobal->ChanChanInfo.xp_cchan_next_audpid != 0x1fff) { hardware_audio_cchan(pGlobal->ChanChanInfo.xp_cchan_next_audpid); pGlobal->ChanChanInfo.xp_cchan_next_audpid = 0x1fff; } if(pGlobal->ChanChanInfo.xp_cchan_next_vidpid != 0x1fff) { hardware_video_cchan(pGlobal->ChanChanInfo.xp_cchan_next_vidpid); pGlobal->ChanChanInfo.xp_cchan_next_vidpid = 0x1fff; } if(pGlobal->ChanChanInfo.xp_cchan_next_pcrpid != 0x1fff) { hardware_pcr_cchan(pGlobal->ChanChanInfo.xp_cchan_next_pcrpid); pGlobal->ChanChanInfo.xp_cchan_next_pcrpid = 0x1fff; } pGlobal->ChanChanInfo.xp_cchan_next=0; } xp_osi_pcr_sync();}/*----------------------------------------------------------------------------+| vid_cc_done+----------------------------------------------------------------------------*/void vid_cc_done(){ if(pGlobal == NULL) return; /*-------------------------------------------------------------------------+ | Disable Video Synchronization +-------------------------------------------------------------------------*/ xp_atom_disable_vid_sync(); /*-------------------------------------------------------------------------+ | Complete Pending Channel Change +-------------------------------------------------------------------------*/ pGlobal->ChanChanInfo.xp_cchan_vidchan_pending = 0; if ((pGlobal->ChanChanInfo.xp_cchan_audchan_pending!=0) && (xp_atom_a_hw_cc_inprogress()==0)) { pGlobal->ChanChanInfo.xp_cchan_audchan_pending=0; } if ((pGlobal->ChanChanInfo.xp_cchan_audchan_pending==0) && (pGlobal->ChanChanInfo.xp_cchan_next!=0)) { if(pGlobal->ChanChanInfo.xp_cchan_next_audpid != 0x1fff) { hardware_audio_cchan(pGlobal->ChanChanInfo.xp_cchan_next_audpid); pGlobal->ChanChanInfo.xp_cchan_next_audpid = 0x1fff; } if(pGlobal->ChanChanInfo.xp_cchan_next_vidpid != 0x1fff) { hardware_video_cchan(pGlobal->ChanChanInfo.xp_cchan_next_vidpid); pGlobal->ChanChanInfo.xp_cchan_next_vidpid = 0x1fff; } if(pGlobal->ChanChanInfo.xp_cchan_next_pcrpid != 0x1fff) { hardware_pcr_cchan(pGlobal->ChanChanInfo.xp_cchan_next_pcrpid); pGlobal->ChanChanInfo.xp_cchan_next_pcrpid = 0x1fff; } pGlobal->ChanChanInfo.xp_cchan_next=0; } /*-------------------------------------------------------------------------+ | Unmute if Necessary and Force Video STC Update +-------------------------------------------------------------------------*/ xp_osi_pcr_sync();}/*----------------------------------------------------------------------------+| trans_aud_cc_done+----------------------------------------------------------------------------*/static void trans_aud_cc_done(GLOBAL_RESOURCES *pGlobal0, SHORT wChannelId, ULONG ulInterrupt){ if(pGlobal0 == NULL || pGlobal0->uDeviceIndex != 0) return ; pGlobal->ChanChanInfo.xp_cchan_audsig++;}/*----------------------------------------------------------------------------+| trans_vid_cc_done+----------------------------------------------------------------------------*/static void trans_vid_cc_done(GLOBAL_RESOURCES *pGlobal0, SHORT wChannelId, ULONG ulInterrupt){ if(pGlobal0 == NULL || pGlobal0->uDeviceIndex != 0) return; pGlobal->ChanChanInfo.xp_cchan_vidsig++;}/*----------------------------------------------------------------------------+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -