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



我在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调用中的所有值都是正确的(没有零值(。

我没有发现任何错误。只是没有声音。

这里有什么问题?

或者有其他方法可以在windows 10上的这个旧应用程序中使用DirectX进行声音处理吗?任何一个例子都很好。

谢谢。。。。

虽然我不能保证这是修复,但我也不能只是评论,因为我没有50个代表,这值得一试。我对Windows 10的声音有很多问题,经常看起来很随意!切换应用程序禁用了后台应用程序的声音,游戏编程不会发出任何声音,甚至播放音乐来查看我是否有正确的曲目,CD刻录软件也坏了,Netflix在我重新启动之前一直在播放声音,无线耳机不工作或音量太低。令人愤怒。由于2018年4月10日的一次变化,你可能无法从目前的优先事项中获得控制权,只是没有遇到我遇到的问题。

无论如何,这值得一试:

右键单击任务栏右下角的声音图标。点击播放或音频设备。右键单击出现的扬声器图标在设置屏幕中。从弹出菜单中单击"属性"。点击扬声器属性屏幕上的高级选项卡。取消选中复选框对于"允许应用程序进行独占控制"one_answers"给予独占"模式应用程序优先级。

我已经解决了这个问题。最后,它与DirectX无关。

hfile:=LZOpenFile(PAnsiChar(fn(,vropenbuff,OF_READ(;

参数";fn";输入到过程的(字符串(是错误的。有什么事搞砸了。文件名不正确,因此应该播放的文件为空。与DirectX无关。我已将以上命令替换为:

hfile:=LZOpenFile(PAnsiChar(AnsiString(fn((,vropenbuff,OF_READ(;

现在它正在发挥作用。

谢谢。。。

最新更新