使用DirectSound播放流音频数据_第1页
使用DirectSound播放流音频数据_第2页
使用DirectSound播放流音频数据_第3页
使用DirectSound播放流音频数据_第4页
使用DirectSound播放流音频数据_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用DirectSound播放流音频数据DirectSound 使用第一步,创建一个设备对象,设置设备对象的协作度。在代码中可以通过调用DirectSoundCreate函数来创建一个支持IDirectSound接口的对象,这个对象通 常代表缺省的播放设备。当然可以枚举可用的设备,然后将设备的GUID传递给DirectSoundCreate函数。如果没有声音输出设备,这个函数就返回error,如果声音输出设备正被某个应用程序通过waveform 格式的api函数所控制,该函数也返回error。下面是创建对象的代码,极其简单IDirectSound* m_pDS; / DirectSound c

2、omponentif(FAILED(DirectSoundCreate(NULL, &m_pDS, NULL)MessageBox(NULL, Unable to create DirectSound object, Error, MB_OK);return S_FALSE;注意,Directsound虽然基于COM,但是你并不需要初始化com库,这些Directsound都帮你做好了。因为Windows是一个多任务操作环境,在同一个时刻有可能多个应用程序共用同一个设备,通过协作 水平,DirectX就可以保证这些应用程序在访问设备的时候不会冲突,每个Directsound应用程序都有一个 协

3、作度,用来确定来接近设备的程度,当你创建完设备对象后,一定要调用IDirectSound:SetCooperativeLevel 来设置协作度,否则,你不会听到声音的。m_pDS-SetCooperativeLevel(hWnd, DSSCL_PRIORITY);第二步,创建一个辅助Buffer,也叫后备缓冲区你可以通过IDirectSound:CreateSoundBuffer来创建buffer对象,这个对象主要用来获取处理数据,这 种buffer称作辅助缓冲区,以和主缓冲区区别开来,Direcsound通过把几个后备缓冲区的声音混合到主缓 冲区中,然后输出到声音输出设备上,达到混音的效果。

4、if(FAILED(pDS-CreateSoundBuffer(&dsbd, &pDSB, NULL)return NULL;第三步,获取PCM类型的数据将WAV文件或者其他资源的数据读取到缓冲区中。第四步,将数据读取到缓冲区你可以通过IDirectSoundBuffer:Lock.方法来准备一个辅助缓冲区来进行写操作,通常这个方法返回一 个内存地址,见数据从你的私人buffer中复制到这个地址中,然后调用IDirectSoundBuffer:Unlock.第五步,播放缓冲区中的数据你可以通过IDirectSoundBuffer:Play方法来播放缓冲区中的音频数据,你可以通过 IDirect

5、SoundBuffer:Stop来暂停播放数据,你可以反复的停止,播放音频数据。你可以通过 IDirectSoundBuffer:GetVolume 和 IDirectSoundBuffer:SetVolume 函数来获取或者设置正 在播放的音频的音量的大小。播放流数据流缓冲区用来播放那些比较长的音频文件,因为数据比较长,没法一次填充到缓冲区中,一边播放, 一边将新的数据填充到DirectSound的缓冲区中。可以通过IDirectSoundBuffer:Play函授来播放缓冲区中的内容,注意在该函数的参数中一定要设置 DSBPLAY_LOOPING 标志。通过IDirectSoundBuff

6、er:Stop方法中断播放,该方法会立即停止缓冲区播放。将音频流倒入缓冲区需要下面三个步骤1、确保你的缓冲区巳经做好接收新数据的准备。2、调用IDirectSoundBuffer:Lock.函数锁住缓冲区的位置,这个函数返回一个或者两个可以写入数据 的地址3、使用标准的copy数据的方法将音频数据写入缓冲区中4、IDirectSoundBuffer:Unlock.,解锁这里要讲一下DirectSound的通知机制。因为Stream buffer大小只够容纳一部分数据,因此,在播 放完缓冲区中的数据后,DirectSound就会通知应用程序,将新的数据填充到DirectSound的缓冲区中。假如

7、我们设置DirectSound的buffersize为2000*4,如下图Notify Point2000400060008000我们可以给DirectSound设置一个事件,并且设置buffer通知大小,如下:if(FAILED(m_pDSBuf-QueryInterface(IID_IDirectSoundNotify, (void*)(&m_pDSNotify) return FALSE ;/ create auto notify eventm_hNotifyEvent = CreateEvent( NULL, FALSE, FALSE, NULL );/ Setup the notif

8、ication positionsfor( i = 0; i SetNotificationPositions( NUM_REC_NOTIFICATIONS, m_aPosNotify )return S_FALSE ;当DirectSound播放到buffer的2000, 4000, 6000, 8000等位置时,Directsound就会通知应用程 序,将m_hNotifyEvent设置为通知态,应用程序就可以通过WaitForMultipleObjects函数等待DirectSound 的通知,将数据填充到DirectSound的辅助缓冲区。在填充音频数据的时候,开启一个线程,在Wait

9、ForMultipleObjects等待DirectSound的通知,然后将 音频数据填充到DirectSound的空buffer中。CreateThread(NULL, 0, CDXSoundPlay:notify_stream_thd, (LPVOID)(this), 0, NULL);在notify_stream_thd中填充音频数据.while(psmado-m_bPlaying)(/ Wait for a messagedwResult = MsgWaitForMultipleObjects(1, &psmado-m_hNotifyEvent,FALSE, INFINITE, QS_

10、ALLEVENTS);/ Get notificationswitch(dwResult)(case WAIT_OBJECT_0:(psmado-LoadStreamData();break ;default:break ;下面的函数主要是给空的DirectSound缓冲区填充音频数据。HRESULT hr;VOID* pvStreamDatal = NULL;DWORD dwStreamLength1 = 0 ;VOID* pvStreamData2 = NULL;DWORD dwStreamLength2 = 0 ;DWORD dwWritePos = 0 ;DWORD dwPlayPos

11、 = 0 ;LONG lLockSize = 0 ;DWORD dwBytesWrittenToBuffer = 0;if( FAILED( hr = m_pDSBuf-GetCurrentPosition( &dwPlayPos, &dwWritePos ) return S_FALSE;lLockSize = dwWritePos - m_dwNextPlayOffset;if( lLockSize Lock( m_dwNextPlayOffset, lLockSize,&pvStreamData1, &dwStreamLength1,&pvStreamData2, &dwStreamLe

12、ngth2, 0L)return FALSE;/ read in the dataif(m_stream_handler)(if (dwStreamLength1 m_stream_handler-GetStock()m_stream_handler-Read(pvStreamData1, m_stream_handler-GetStock();elsem_stream_handler-Read(pvStreamData1, dwStreamLength1) ;/ Move the capture offset alongm_dwNextPlayOffset += dwStreamLengthl;m_dwNextPlayOffset %= m_dwPlayBufSize; / Circular bufferif(pvStreamData2 != NULL)(if(m_stream_handler)(if (dwStreamLength2 m_stream_handler-GetStock()m_stream_handler-Read(pvStreamData2, m_stream_handler-GetStock() ;elsem_stream_handler-Read(pvStreamData2, dwStreamLength2);/ Move the capture offs

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论