废话少说,看代码: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封装的接口对不对?
#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封装的接口对不对?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货