DSound中音频与时间的转换
来源:互联网 发布:centos 安装ssh服务 编辑:程序博客网 时间:2024/06/05 05:55
在DSound播放文件的同时,我们维系了一个变量来递增显示当前播放的时间,下面讲其中几个比较重要的函数
这里一般情况下都会是p<curPos,那么offsetbuf,就是描述一个buf的偏移量,不断的累加,cycleDif是一个描述偏移次数的东东,这个函数下来,改变得有三个offsetBuf、cycleDif和curPos,这个curPos描述的相对与当前Buf的位置。那理论上,我们播放一个bufSize的时候就要调用这个函数一次在什么地方时候时候调用。
我们可以看到这个函数在,音乐播放的While循环里面调用过,这样我们就想通了。
好,这个修改的只是Buf的位置,如何转换成时间呢?
其中UNITS为10^7,(curPos+offsetBuf)/bufFormat.Format.nAvgBytesPerSec这个返回的是秒为单位,乘以UNITS之后,精度变为10^-7s了,前面好像说过IRef实现的函数可以为空,这句话不完全正确,函数为空只是针对于那些需要同步的函数如GetAdviceTime这类函数,但是里面的一个最基本的GetTime还是要做的,因为Graph要知道当前的播放进度就是通过这个函数,这个函数必须的实现,为了实现这个函数,我们首先写了这个函数:
这都是时间相关的函数,可以参考一下。
下面有两个相对的函数;
返回的分别是空闲和已读的字节数。
- HRESULT CScopeFilter::getCurPos()
- {
- if(!buffer) return DSERR_UNINITIALIZED;
- clockLock.Lock();
- DWORD p;
- HRESULT hr= buffer->GetCurrentPosition(&p,0);
- if(hr==DS_OK){
- static DWORD pp,cnt; ///实际情况在播放的时候不可能p==pp
- if(p==pp){
- if(playing && ++cnt>9){
- stop();
- play();
- cnt=0;
- }
- }else{
- cnt=0;
- pp=p;
- }
- if(p<curPos){
- //因为在播放音乐的时候是一个一个Buff来播放的,获得Buff的位置p,那么证明我们的curPos
- //存储的只是上一帧的位置,需要加上这一帧的大小
- offsetBuf+=bufSize;
- //并且我们的buff个数也要加一
- cycleDif++;
- }
- //注意这里的CurPos永远都是相对于Buff
- //buff在一个接一个播放的,因而curPos都在变
- //但是相对于文件来说,我们播放了多长时间了,就要参考GetPrivateTime函数
- //看他们之间的关系
- curPos=p;
- }
- clockLock.Unlock();
- return hr;
- }
我们可以看到这个函数在,音乐播放的While循环里面调用过,这样我们就想通了。
好,这个修改的只是Buf的位置,如何转换成时间呢?
- REFERENCE_TIME CScopeFilter::GetPrivateTime()
- {
- HRESULT hr= getCurPos();
- if(hr==DS_OK){
- clockLock.Lock();
- REFERENCE_TIME result= UNITS*(curPos+offsetBuf)/bufFormat.Format.nAvgBytesPerSec;
- clockLock.Unlock();
- return result;
- }
- return 0;
- }
- REFERENCE_TIME CScopeFilter::getWriteTime()
- {
- clockLock.Lock();
- REFERENCE_TIME result= UNITS*(offsetBuf+(writePos+(1-cycleDif)*bufSize))/bufFormat.Format.nAvgBytesPerSec;
- clockLock.Unlock();
- return result;
- }
- STDMETHODIMP CScopeFilter::GetTime(REFERENCE_TIME *pTime)
- {
- CheckPointer(pTime,E_POINTER);
- *pTime= GetPrivateTime();
- if(*pTime<beginTime) *pTime=beginTime;
- return S_OK;
- }
- int CScopeFilter::msToB(int ms)
- {
- return MulDiv(ms, bufFormat.Format.nSamplesPerSec, 1000)*bufFormat.Format.nBlockAlign;
- }
下面有两个相对的函数;
- int CScopeFilter::getFree()
- {
- clockLock.Lock();
- int result= int(curPos-writePos)+cycleDif*bufSize;
- clockLock.Unlock();
- return result;
- }
- int CScopeFilter::getFilled()
- {
- clockLock.Lock();
- int result= int(writePos-curPos)+(1-cycleDif)*bufSize;
- clockLock.Unlock();
- return result;
- }
- DSound中音频与时间的转换
- DSound音频播放
- DSound音频截取实践
- oracle中字符串与时间的转换
- DShow之DSound与WaveOut的学习笔记
- 音频播放处理(openal、dsound、waveout)
- DSound
- iOS中字符串时间与时间戳的相互转换
- iOS中时间与时间戳的转换
- 音频采样率与时间戳的计算
- 音频采样率与时间戳的计算
- AAC音频裸码流时间戳与时间长度的关系
- AAC音频裸码流时间戳与时间长度的关系
- 关于Python中时间与字符串直接的转换...
- 关于Python中时间与字符串直接的转换
- MYSQL中UNIX时间戳与日期的转换
- MYSQL中UNIX时间戳与日期的转换
- java计时中字符串时间与秒的转换
- tomcat占用jvm内存数修改方法及监控方法
- 一段贴背景及写文字的代码
- 让LFS LiveCD从U盘启动
- google map api在ie6中:缺少对象的解决方案
- JavaScript 特殊字符
- DSound中音频与时间的转换
- JAVA String.format 方法使用介绍
- DBGridEh和dbgrid导出
- 工作多年,换工作多份,感慨良多
- Asp.Net 构架(Http请求处理流程)1
- 微软的CallBack机制(入个门)
- 多线程传文件
- C 语言的储存类和链接
- ActiveRecord 执行原生SQL语句及返回DataTable