网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
在Delphi下用Direct Sound 实现混音器组件
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式

 李国柱

  Direct X是微软公司提供给游戏编写人员的一套应用程序编程接口(APIs),它为编写高效、实时的应用程序提供了有力的支持。因此,有必要将这个接口封装到Delphi的组件库中。Direct X SDK是面向Visual C/C++和Watcom C/C++的,因而使用Object Pascal直接存取Direct X SDK,将带来诸多不便。但我们可先在VC下将Direct X接口封装成动态链接库,然后在Delphi下通过该动态链接库去存取Direct X。

  本文介绍用Delphi封装Direct Sound的方法,这种方法同样也可以应用到Direct Draw(但建议不要使用独占模式,否则会带来不少问题)。

  先简单介绍一下Direct Sound的接口界面。Direct Sound的基本对象有两个,即IDirectDraw和IDirectDrawBuffer。前者代表声卡,后者代表声音数据缓冲区。

  IDirectDraw是整个Direct Sound的基础,其建立方法如下:

  LPDIRECTSOUND lpDS;

  HRESULT ErrorCode;

  HWND hwnd=Mainhwnd;//窗口句柄

  ErrorCode=DirectSoundCreate(NULL, &lpDS, NULL); //建立对象

  if(ErrorCode!=DS_OK)return FALSE; //失败则返回

   ErrorCode=lpDS->SetCooperativeLevel(hwnd, DSSCL_NORMAL);//设置存取模式

  if(ErrorCode!=DS_OK) //失败则返回

  {

   lpDS->Release();

   lpDS=NULL;

   return FALSE;

  }

  IDirectDrawBuffer通过IDirectDraw建立。IDirectDrawBuffer有两种基本类型,一种被称作“基本缓冲区”(Primary Buffer), 另一种被称作“辅助缓冲区”(Secondary Buffer)。 基本缓冲区是Direct Sound 混音的基础,一般不直接存取这个缓冲区(虽然也可以),但可以通过该缓冲区去存取初始化声卡,方法如下:

  HRESULT ErrorCode;

  LPDIRECTSOUND lpDS=lpMainDS;//Direct Sound对象

  LPDIRECTSOUNDBUFFER lpDBP;

  DSBUFFERDESC dsbds;

  ZeroMemory(&dsbds,sizeof(dsbds));

  dsbds.dwSize=sizeof(dsbds);

  dsbds.dwFlags=DSBCAPS_PRIMARYBUFFER;

  ErrorCode=lpDS->CreateSoundBuffer(&dsbds,&lpDBP,NULL);//建立基本缓冲区

  if(ErrorCode!=DS_OK)return FALSE;//失败则返回

   ErrorCode=lpDBP->Play(0,0,DSBPLAY_LOOPING);//初始化

  if(ErrorCode!=DS_OK)//失败则返回

  {

   lpDBP->Release();

   lpDBP=NULL;

   lpDS->Release();

   lpDS=NULL;

   return FALSE;

  }

  lpDBP->Release();//释放基本缓冲区

  return TRUE; //初始化成功

  辅助缓冲区可以建立任意多个,声音数据就放在这种缓冲区内,每个缓冲区可被独立播放(IDirectSoundBuffer::Play),Direct Sound会处理这些声音并实现混音的效果。其建立方法与基本缓冲区的差不多,只是对DSBUFFERDESC的填写有些不一样:

  ZeroMemory(&dsbufferdesc,sizeof(dsbufferdesc));

  dsbufferdesc.dwSize=sizeof(dsbufferdesc);

  dsbufferdesc.dwFlags=DSBCAPS_STATIC|DSBCAPS_CTRLDEFAULT;

  dsbufferdesc.dwBufferBytes=BufferSize;//缓冲区大小

  dsbufferdesc.lpwfxFormat=(LPWAVEFORMATEX)&pcmformat;//wav文件的PCM格式

  ErrorCode=lpDS->CreateSoundBuffer(&dsbd,&lpSB,NULL);

  建立该缓冲区后,通过IDirectSoundBuffer::Lock锁定内存即可写入数据。数据可以用普通MCI的多媒体函数读取,由于篇幅所限,这里不再详述,读者可以参考Win32 SDK手册和Direct X SDK的联机帮助。值得注意的是,Direct Sound的缓冲区是循环的,Lock返回两个指针,数据必须分成两部分写入。

  数据进入DirectSoundBuffer后,就可以调用IDirectSoundBuffer的声音控制方
  • 上一篇资讯: Delphi控制Excel2000心得
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号