欢迎来到天天文库
浏览记录
ID:38692965
大小:48.00 KB
页数:5页
时间:2019-06-17
《使用DirectSound播放流音频数据》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、使用DirectSound播放流音频数据DirectSound使用第一步,创建一个设备对象,设置设备对象的协作度。在代码中可以通过调用DirectSoundCreate函数来创建一个支持IDirectSound接口的对象,这个对象通常代表缺省的播放设备。当然可以枚举可用的设备,然后将设备的GUID传递给DirectSoundCreate函数。如果没有声音输出设备,这个函数就返回error,如果声音输出设备正被某个应用程序通过waveform格式的api函数所控制,该函数也返回error。下面是创
2、建对象的代码,极其简单IDirectSound*m_pDS;//DirectSoundcomponentif(FAILED(DirectSoundCreate(NULL,&m_pDS,NULL))){MessageBox(NULL,"UnabletocreateDirectSoundobject","Error",MB_OK);returnS_FALSE;}注意,Directsound虽然基于COM,但是你并不需要初始化com库,这些Directsound都帮你做好了。因为Windows是一个多
3、任务操作环境,在同一个时刻有可能多个应用程序共用同一个设备,通过协作水平,DirectX就可以保证这些应用程序在访问设备的时候不会冲突,每个Directsound应用程序都有一个协作度,用来确定来接近设备的程度,当你创建完设备对象后,一定要调用IDirectSound::SetCooperativeLevel来设置协作度,否则,你不会听到声音的。m_pDS->SetCooperativeLevel(hWnd,DSSCL_PRIORITY);第二步,创建一个辅助Buffer,也叫后备缓冲区你可以通
4、过IDirectSound::CreateSoundBuffer来创建buffer对象,这个对象主要用来获取处理数据,这种buffer称作辅助缓冲区,以和主缓冲区区别开来,Direcsound通过把几个后备缓冲区的声音混合到主缓冲区中,然后输出到声音输出设备上,达到混音的效果。if(FAILED(pDS->CreateSoundBuffer(&dsbd,&pDSB,NULL)))returnNULL;第三步,获取PCM类型的数据将WAV文件或者其他资源的数据读取到缓冲区中。第四步,将数据读取到缓
5、冲区你可以通过IDirectSoundBuffer::Lock.方法来准备一个辅助缓冲区来进行写操作,通常这个方法返回一个内存地址,见数据从你的私人buffer中复制到这个地址中,然后调用IDirectSoundBuffer::Unlock.第五步,播放缓冲区中的数据你可以通过IDirectSoundBuffer::Play方法来播放缓冲区中的音频数据,你可以通过IDirectSoundBuffer::Stop来暂停播放数据,你可以反复的停止,播放音频数据。你可以通过IDirectSoundBu
6、ffer::GetVolume和IDirectSoundBuffer::SetVolume函数来获取或者设置正在播放的音频的音量的大小。播放流数据流缓冲区用来播放那些比较长的音频文件,因为数据比较长,没法一次填充到缓冲区中,一边播放,一边将新的数据填充到DirectSound的缓冲区中。可以通过IDirectSoundBuffer::Play函授来播放缓冲区中的内容,注意在该函数的参数中一定要设置DSBPLAY_LOOPING标志。通过IDirectSoundBuffer::Stop方法中断播放
7、,该方法会立即停止缓冲区播放。将音频流倒入缓冲区需要下面三个步骤1、确保你的缓冲区已经做好接收新数据的准备。2、调用IDirectSoundBuffer::Lock.函数锁住缓冲区的位置,这个函数返回一个或者两个可以写入数据的地址3、使用标准的copy数据的方法将音频数据写入缓冲区中4、IDirectSoundBuffer::Unlock.,解锁这里要讲一下DirectSound的通知机制。因为Streambuffer大小只够容纳一部分数据,因此,在播放完缓冲区中的数据后,DirectSound
8、就会通知应用程序,将新的数据填充到DirectSound的缓冲区中。假如我们设置DirectSound的buffersize为2000*4,如下图2000400060008000NotifyPoint我们可以给DirectSound设置一个事件,并且设置buffer通知大小,如下:if(FAILED(m_pDSBuf->QueryInterface(IID_IDirectSoundNotify,(void**)(&m_pDSNotify))))returnFALSE;//createautono
此文档下载收益归作者所有