织梦CMS - 轻松建站从此开始!

罗索

关于多媒体时钟

落鹤生 发布于 2009-12-27 21:46 点击:次 
在音视频相关的开发中经常会有一些超高精确度计时的需求,如:音频、视频的采集,音频、视频的播放等等,而在Windows下普通的Timer的精确度实在是不感恭维,这个时候多媒体时钟就派上了用场,以下是一个我摘的简单的例子。
TAG:

下面是论坛里关于多媒体时钟的一些帖子,摘录在此,以方便使用:

摘自:http://topic.csdn.net/u/20081104/17/035AD681-FEE4-43AB-9B97-456AF6296B6E.html

使用多媒体定时器timeSetEvent()函数,该函数定时精度为ms级。利用该函数可以实现周期性的函数调用。如示例工程中的Timer6和Timer6_1。函数的原型如下:

MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )

该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回NULL。函数的参数说明如下:

uDelay:以毫秒指定事件的周期。

Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。

 LpTimeProc:指向一个回调函数。

DwUser:存放用户提供的回调数据。

FuEvent:指定定时器事件类型:

TIME_ONESHOT:uDelay毫秒后只产生一次事件

TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。

UINT CRealTimeDlg::TimerScanStart(LPTIMECALLBACK fptc,int TimeCycle,BOOL bTime_OneShot)
{
UINT TimeID = 0;
TIMECAPS tc;
if(::timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR)
{
DWORD wAccuracy;
wAccuracy=min(max(tc.wPeriodMin,TIMER_ACCURACY),tc.wPeriodMax);
if(timeBeginPeriod(wAccuracy) == TIMERR_NOERROR )
{
// 参数 TIME_PERIODIC: 周期执行
if(TimeCycle >= wAccuracy && TimeCycle <= tc.wPeriodMax)
{
if(bTime_OneShot)
{//只执行一次
TimeID = ::timeSetEvent(TimeCycle,wAccuracy,fptc,(DWORD)this,TIME_ONESHOT);
}
else
{//周期执行
TimeID = ::timeSetEvent(TimeCycle,wAccuracy,fptc,(DWORD)this,TIME_PERIODIC);
}
}
timeEndPeriod(wAccuracy);
}

}
return TimeID ;
}

(落鹤生)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8191.html]
本文出处:CSDN.NET 作者:落鹤生
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容