博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在dll中用DirectSound8同时播放多个wav文件不能发声
阅读量:5859 次
发布时间:2019-06-19

本文共 2798 字,大约阅读时间需要 9 分钟。

下载:

//把工程保存为KeyBoarHook.dpr,并实现如下:以下知识都来自万一老师的博客
library KeyBoarHook;
{$R 'New1.res' 'New1.rc'}
{$R *.dres}

uses

  SysUtils,
  Windows,
  Messages,
  Classes,
  DirectSound,
  MMSystem,
  ReadWave in 'ReadWave.pas';//这个文件是万一老师编的同时播放多个声音文件的单元

//ReadWave 是上面重新定义的单元; //ReadWave 是上面重新定义的单元

{$R *.res}
 const KeyPressMask = $80000000;//掩码常量,让按一次只发声一次
var
 //tada: Pointer;
  dllHandle:THandle;
  keyboardhook: HHOOK; {钩子变量}
  myDSound: IDirectSound8;
  bufs: array[0..5] of IDirectSoundBuffer; //缓冲区数组, 用于装载资源文件中的三个 WAVE 文件

 {使用资源文件建立缓冲区并播放}

procedure PlayResourceWave(ResName: string; var buf: IDirectSoundBuffer; loop: Boolean=false);
var
  bufDesc: TDSBufferDesc;
  wav: TReadWave;
  p1: Pointer;
  n1: DWORD;
begin
  buf := nil;
  wav := TReadWave.Create;
  if not wav.OpenResource(ResName) then
  begin
    wav.Free;
    Exit;
  end;
  ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc));
  bufDesc.dwSize := SizeOf(TDSBufferDesc);
  bufDesc.dwFlags := DSBCAPS_STATIC;
  bufDesc.dwBufferBytes := wav.Size;
  bufDesc.lpwfxFormat := @wav.Format;

  myDSound.CreateSoundBuffer(bufDesc, buf, nil);

  buf.Lock(0, 0, @p1, @n1, nil, nil, DSBLOCK_ENTIREBUFFER);

  wav.Read(p1, n1);
  buf.Unlock(p1, n1, nil, 0);
  if loop then buf.Play(0, 0, DSBPLAY_LOOPING) else buf.Play(0, 0, 0);
  wav.Free;
end;
//初始化声音设备
function Setstart: Boolean; stdcall;
begin
  dllHandle:=GetModuleHandle('KeyBoarHook.dll'); //取得dll自己的句柄
  DirectSoundCreate8(nil, myDSound, nil);
  myDSound.SetCooperativeLevel(dllHandle, DSSCL_NORMAL);//原来这里使用Handle会出错,现在把它改成dll自己的句柄
  end;
  procedure Playsound2;stdcall;
  var
ss:string;
  begin
  ss:='c:\yp\0.wav';
   playsound(pchar(ss),0,SND_ASYNC);
    PlayResourceWave('wav_1', bufs[0], False);//这里不起作用
  end;
function Playsound1: Boolean; stdcall;
var
ss:string;
begin
  ss:='c:\yp\0.wav';
 playsound(pchar(ss),0,SND_ASYNC);
  PlayResourceWave('wav_1', bufs[0], False);//这里不起作用
  end;

function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

var
info:string;
ss:string;
jianno:integer;
niany:bool;
begin
 if  ((lParam and KeyPressMask)= 0) and (wParam = 96) then Playsound(pchar('wav1'),hinstance,SND_ASYNC or snd_resource);
    Result := CallNextHookEx(keyboardhook, nCode, wParam, lParam);
end;

{建立钩子}

function SetHook: Boolean; stdcall;
const
WH_KEYBOARD_LL=13;
begin
  keyboardhook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);//这里WH_KEYBOARD_会出错
  Result := keyboardhook <> 0;
end;

{释放钩子}

function DelHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(keyboardhook);
end;

{

释放次缓冲区,不然会内存出错}
function Delbufs: Boolean; stdcall;
var
iii:Integer;
begin
 for iii := Low(bufs) to High(bufs) do bufs[iii] := nil;
  myDSound := nil;
end;

{按 DLL 的要求输出函数}

exports
  SetHook ,//name 'SetHook',
  DelHook ,//name 'DelHook',
  KeyHook ,
  Setstart,
  Playsound1,
  Playsound2,//name 'KeyHook',
  delbufs;
begin

end.

转载于:https://www.cnblogs.com/yehuiyan/archive/2011/12/25/2300928.html

你可能感兴趣的文章
AI 考拉技术分享会--API 接口与 Typescript Interface
查看>>
.net core webapi 转成数据流
查看>>
SVG.js - 用于SVG操作和产生动画的一个轻量级js库
查看>>
Web前端团队开发规范文档
查看>>
spring 常用工具包
查看>>
记录技术(实时服务器)
查看>>
苹果新品发布 Mac和Windows仍要继续并存
查看>>
exec 2.1
查看>>
使用AS直接与服务器TCP通信
查看>>
VB窗体半透明的方法
查看>>
NetSpeeder V3.70 绿色特别版
查看>>
c# 将当前窗体设置为活动窗体
查看>>
Java调用shell命令解压.7z压缩包
查看>>
Percona-Server-5.6.25-73.1二进制rpm包安装
查看>>
JAVA-用HttpClient来模拟浏览器GET,POST
查看>>
安全狗云端+终端服务 将DDOS攻击拦截在“门外”
查看>>
服务器安全软件--服务器安全狗windows V4.2枸杞版发布
查看>>
写给 Android 开发者看的『微信小程序和 Android 开发的对比』
查看>>
Android中按钮的4种响应方式
查看>>
最简单的git使用流程
查看>>