在Windows 10上使用Delphi和DirectX时没有声音

m4pnthwp  于 2022-09-21  发布在  Windows
关注(0)|答案(1)|浏览(210)

我在Windows 10上使用DirectX(DirectSound)有问题。我正在更改一些使用DirectX(我认为是DirectX 9)并在Windows XP上运行的旧代码。

在Windows XP上,一切都运行得很好,但我在Windows 10上听不到声音。

该应用程序使用以下文件:DXUTIL.PAS(由Boris V.进行的原始ObjectPascal转换)、lzexpand.pas(作者:Vadim Bodrov)和DirectSound.pas(由Alexey Barkovoy进行的DirectX 9.0 Delphi/FreePascal改编)。

procedure TForm1.Button1Click(Sender: TObject);
var
sndgwait : PSound;
begin
InitSB(Handle);
LoadWave(sndgwait,   'D:gameEXP01.wav', 1);
StartSound(sndgwait, false);
end;

function LoadWave(var Sound: PSound; fn : string; conc : integer) : boolean;
var
cbData, cbdata1 : DWORD;
pd1 : pointer;
hfile : longint;
vreopenbuff : TOFStruct;
begin
hfile := LZOpenFile(PAnsiChar(fn), vreopenbuff, OF_READ);
if hfile < 0 then begin result := false; exit; end;
cbdata := LZSeek(hfile, 0, 2);  // file size
LZSeek(hfile, 0, 0);            //back to the start of the wav
getmem(pd1, cbdata);
LZRead(hfile,  pd1, cbdata);
LZClose(hfile);
if conc < 1 then conc := 1;
result := ParseWaveData(Sound, conc, cbdata, pd1);
end;

function ParseWaveData(var Sound : PSound; conc : integer; cbdata : dword; pd1 : pointer) :  boolean;
var
pWaveHeader: PWAVEFORMATEX;
pDSB: IDirectSoundBuffer;
dsBD: TDSBUFFERDESC;
rr : longint;
begin
if lpDS = nil then begin
result := false;
exit;
end;
Sound := PSNDOBJ(LocalAlloc(LPTR, SizeOf(TSNDOBJ) + (conc-1) * SizeOf(IDirectSoundBuffer)));
Sound^.iAlloc := conc;
Sound^.cbWaveSize := 0;
Sound^.pbWaveData := nil;
pwaveHeader := nil;
Sound^.pbData := pd1;
Sound^.cbSize := cbdata;
if DSParseWaveResource(pd1, pWaveHeader, Sound^.pbWaveData, Sound^.cbWaveSize) then begin
ZeroMemory(@dsBD, SizeOf(dsBD));
dsBD.dwSize := SizeOf(dsBD);
dsBD.dwFlags := DSBCAPS_STATIC or DSBCAPS_GETCURRENTPOSITION2 or DSBCAPS_CTRLFREQUENCY orDSBCAPS_CTRLPAN or DSBCAPS_CTRLVOLUME;//DSBCAPS_CTRLDEFAULT or
dsBD.lpwfxFormat := pWaveHeader;
dsBD.dwBufferBytes := Sound^.cbWaveSize;

if lpDS.CreateSoundBuffer(dsBD, pDSB, nil) = DS_OK then begin
if not DSFillSoundBuffer(pDSB, Sound^.pbWaveData, dsBD.dwBufferBytes) then begin
pDSB._Release;
pDSB := nil;
end;
Sound^.Buffers[0] := pDSB;
for rr := 1 to conc - 1 do begin
lpDS.DuplicateSoundBuffer(Sound^.Buffers[0], Sound^.Buffers[rr]);
end;
end else begin
pDSB := nil;
SndObjDestroy(Sound);
Sound := nil;
end;

end;
Result := Sound <> nil;
end;

function StartSound(Sound: PSound; Loop: boolean = false; waitforend: boolean = false): boolean;
begin
if Loop then
StartSound := SndObjPlay(Sound, DSBPLAY_LOOPING)
else
 StartSound := SndObjPlay(Sound, 0);
if waitforend and not loop then
while SoundPlaying(Sound) do Application.ProcessMessages;

end;

function SndObjPlay(pSO: PSNDOBJ; dwPlayFlags: DWORD): Boolean;
var
pDSB: IDirectSoundBuffer;
begin
Result := FALSE;
if pSO = nil then
begin
exit;
end;
if ((dwPlayFlags and DSBPLAY_LOOPING) = 0) or (pSO^.iAlloc = 1) then
begin
pDSB := SndObjGetFreeBuffer(pSO);
if (pDSB <> nil) then
Result := SUCCEEDED(pDSB.Play(0, 0, dwPlayFlags));
end else
Result:= FALSE;
end;

我认为ParseWaveData调用中的所有值都是正确的(没有空值)。

我不认为有任何错误。只是没有声音。

这里会有什么问题呢?

或者,在Windows10上的这款旧应用程序中,有没有其他方式使用DirectX来处理声音?任何一个例子都是很棒的。

谢谢..。

vdgimpew

vdgimpew1#

虽然我不能保证这是修复,我也不能只是评论,因为我没有50个代表,这是值得一试。我对Windows10的声音有很多问题,通常看起来都是随机的!切换应用程序禁用了后台应用程序的声音,游戏程序不会发出任何声音,甚至播放音乐来查看CD刻录软件是否正确音轨被损坏,Netflix中断声音直到我重启,无线耳机无法工作,或者音量太低。令人气愤。你可能不会因为2018年4月W10的变化而从任何具有当前优先级的东西中争夺控制权,只是没有我曾经遇到的问题。

总之,这是值得一试的:
右键单击任务栏右下角的声音图标。单击播放或音频设备。右键单击设置屏幕中出现的扬声器图标。从弹出菜单中单击属性。单击扬声器属性屏幕上的高级选项卡。取消选中允许应用程序获得独占控制并为独占模式应用程序提供优先级的框。

相关问题