请问如何用directsound技术同时播放两个wav文件?(200分)

  • 主题发起人 主题发起人 xyf2001721
  • 开始时间 开始时间
X

xyf2001721

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何用directsound技术同时播放两个wav文件?用别的事先也可以。
 
怎么,没人会?
 
我有一套带源程序的控件,他的一个例子就是同时播放两个wav的.
 
to MilkRoad:
可以发给我吗,如果不错,保证给分。xyf2001721@sina.com.cn
 
其实并不是同时播放,而是先把它们进行了混音而已。
用mmsystem都可以做到。
 
也给我发一个,谢谢。xtypebee@163.net
 
to LuJuhe:
请问怎么做?
to MilkRoad:
晚点给分可以吗?(至少100啊),不好意思,嘻嘻!!!
 
混音,就是把两个声音叠加起来,简单的做法是直接相乘。 比如16位的pcm文件:
y1=32768*sin(x1)
y2=32768*sin(x2)
混音后: y=32768*(sin(x1)*sin(x2))=y1*y2/32768

dsound中有现成的混音函数,直接用就成了,只是知道他的原理后更好理解一些。[:)]
 

procedure TForm1.FormShow(Sender: TObject);
var
hRet: HRESULT;
BufDesc: TDSBufferDesc_DX7;
Format: TWaveFormatEx;
PCM: TWaveFormatEx;
begin

hRet := DirectSoundCreate(nil, DXSound, nil);
if hRet <> DS_OK then

begin

ErrorOut(hRet, 'DirectSoundCreate');
Close;
end;


hRet := DXsound.SetCooperativeLevel(Handle, DSSCL_Priority);
if hRet <> DS_OK then

begin

ErrorOut(hRet, 'SetCooperativeLevel');
Close;
end;


FillChar(BufDesc, SizeOf(TDSBufferDesc), 0);
BufDesc.dwSize := SizeOf(TDSBufferDesc);
BufDesc.dwFlags := DSBCAPS_PRIMARYBUFFER;
BufDesc.dwBufferBytes := 0;
BufDesc.lpwfxFormat := nil;

hRet := DXSound.CreateSoundBuffer(BufDesc, DXSPBuffer, nil);
if hRet <> DS_OK then

begin

ErrorOut(hRet, 'CreateSoundBuffer');
Close;
end;


FillChar(PCM, SizeOf(TWaveFormatEx), 0);
with PCMdo

begin

wFormatTag := WAVE_FORMAT_PCM;
nChannels := 2;
nSamplesPerSec := 44100;
nBlockAlign := 4;
wBitsPerSample := 16;
cbSize := 0;
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
nBlockAlign := (wBitsPerSample div 8) * nChannels;
// = 4
end;


hRet := DXSPBuffer.SetFormat(PCM);
if hRet <> DS_OK then

begin

ErrorOut(hRet, 'SetFormat');
Close;
end;


if not CreateSecondaryBufferFromWav(DXSound, DXSSBuffer1, WaveFile) then
showmessage('error');
if not CreateSecondaryBufferFromWav(DXSound, DXSSBuffer2, WaveFile) then
showmessage('error');
end;

 
我把我原来那个directsound 的例子改了改,满足你的要求[:)]
http://kuga.51.net
创建一个主缓冲区,再创建2个缓冲区,play就是了
 
十分感谢!
 
后退
顶部