【发帖醒目:)】关于在Delphi下用DirectSound播放音频
clasj 2005-11-05 08:50:05 废话少说,看代码:
VC++实现
#include <mmsystem.h>
#include <dsound.h>
#pragma comment(lib, "dsound.lib")
void CDirectsoundDlg::OnButton1()
{
unsigned char audiobuf[160000];
CFile file;
WAVEFORMATEX format;
DSBUFFERDESC BufferDesc;
LPDIRECTSOUND lpDirectSound;
LPDIRECTSOUNDBUFFER lpDSoundBuffer;
LPVOID ptr1, ptr2;
DWORD pwd1, pwd2;
file.Open("1.txt", CFile::modeRead | CFile::shareDenyNone);
file.Read(audiobuf, file.GetLength());
memset(&format, 0, sizeof(format));
format.wFormatTag = WAVE_FORMAT_PCM;
format.nChannels = 1;
format.nSamplesPerSec = 8000;
format.nAvgBytesPerSec = 16000;
format.nBlockAlign = 2;
format.wBitsPerSample = 16;
memset(&BufferDesc, 0, sizeof (BufferDesc));
BufferDesc.dwSize = sizeof(DSBUFFERDESC);
BufferDesc.dwBufferBytes = file.GetLength();
BufferDesc.lpwfxFormat = &format;
DirectSoundCreate(0, &lpDirectSound, 0);
lpDirectSound->SetCooperativeLevel(m_hWnd, DSSCL_NORMAL);
lpDirectSound->CreateSoundBuffer(&BufferDesc, &lpDSoundBuffer, 0);
lpDSoundBuffer->Lock(0, file.GetLength(), &ptr1, &pwd1, &ptr2, &pwd2, 0);
memcpy(ptr1, audiobuf, pwd1);
memcpy(ptr2, audiobuf+pwd1, pwd2);
lpDSoundBuffer->Unlock(ptr1, pwd1, ptr2, pwd2);
lpDSoundBuffer->Play (0, 0, 0);
file.Close ();
}
Delphi实现
uses MMSystem, DirectSound;
procedure TForm1.Button1Click(Sender: TObject);
var
audiobuf: array[0..160000-1] of byte;
stream: TFileStream;
format: TWAVEFORMATEX;
BufferDesc: DSBUFFERDESC;
lpDirectSound: IDirectSound;
lpDirectSoundBuffer: IDirectSoundBuffer;
ptr1, ptr2: pointer;
pdw1, pdw2: dword;
begin
stream:=TFileStream.Create('1.txt', fmOpenRead);
stream.ReadBuffer(audiobuf, stream.Size);
fillchar(format, sizeof(format), 0);
format.wFormatTag:=WAVE_FORMAT_PCM;
format.nChannels:=1;
format.nSamplesPerSec:=8000;
format.nAvgBytesPerSec:=16000;
format.nBlockAlign:=2;
format.wBitsPerSample:=16;
fillchar(bufferdesc, sizeof(bufferdesc), 0);
bufferdesc.dwSize:=sizeof(bufferdesc);
bufferdesc.dwBufferBytes:=stream.Size;
bufferdesc.lpwfxFormat:=@format;
DirectSoundCreate(nil, lpDirectSound, nil);
lpDirectSound.SetCooperativeLevel(Handle, DSSCL_NORMAL);
lpDirectSound.CreateSoundBuffer(bufferdesc, lpDirectSoundBuffer, nil);
lpDirectSoundBuffer.Lock(0, stream.Size, ptr1, pdw1, ptr2, pdw2, 0);
copymemory(ptr1, @audiobuf, pdw1);
copymemory(ptr2, pchar(@audiobuf)+pdw1, pdw2);
lpDirectSoundBuffer.Unlock(ptr1, pdw1, ptr2, pdw2);
lpDirectSoundBuffer.Play(0, 0, 0);
stream.Free;
end;
说明:
一."test.pci"这个文件是我录制的一段纯pci数据(10秒),无wave文件头(为了测试方便)
二.DirectSound.pas这个单元我是用的dspack提供的,里面包涵DSBUFFERDESC、IDirectSound、IDirectSoundBuffer的定义
结果:
VC++实现的代码工作正常,Delphi实现的代码没有任何错误就是放不出声音:)
问题:
一.啥原因?
二.Delphi下如何使用DirectSound?像我这样直接使用dspack封装的接口对不对?