根据Bass的文档,我正在尝试使用以下代码加载ogg文件:
var
FFile : string;
Music: HSAMPLE;
ch: HCHANNEL;
OpenDialog1 : TOpenDialog;
begin
Dynamic_Bass.Load_BASSDLL('Library/Bass.dll');
Dynamic_Bass.BASS_Init(1,44000,Bass_DEVICE_SPEAKERS,0,nil);
OpenDialog1 := TOpenDialog.Create(nil);
if not OpenDialog1.Execute then
Exit;
ffile := OpenDialog1.FileName;
Music := BASS_SampleLoad(FALSE, PChar(ffile), 0, 0, 3, BASS_SAMPLE_OVER_POS);
ch := BASS_SampleGetChannel(Music, False);
BASS_ChannelSetAttribute(ch, BASS_ATTRIB_PAN, 0);
BASS_ChannelSetAttribute(ch, BASS_ATTRIB_VOL, 1);
BASS_ChannelPlay(ch, False);
ShowMessage(IntToStr(BASS_ErrorGetCode));
end;
ShowMessage
返回5.根据文档,这是Handle错误,这意味着错误在music
var中。如果我评论BASS_SampleLoad
下面的行,我会收到错误2.表示无法加载文件。所以这是一个普通的OGG文件。所以我的问题是:我做错了吗?
提前致谢。
答案 0 :(得分:8)
您的代码似乎是正确的,只需确保在每次通话时检查错误。
固定代码:
var
ffile : string;
music: HSAMPLE;
ch: HCHANNEL;
opendialog1 : topendialog;
begin
if not Dynamic_Bass.Load_BASSDLL('Library/Bass.dll') then
Exit;
// change device to -1 which is the default device
if Dynamic_Bass.BASS_Init(-1,44000,Bass_DEVICE_SPEAKERS,0,nil) then
begin
opendialog1 := topendialog.Create(nil);
try
if OpenDialog1.Execute then
begin
ffile := OpenDialog1.FileName;
music := BASS_SampleLoad(FALSE, PChar(ffile), 0, 0, 3, BASS_SAMPLE_OVER_POS);
if music <> 0 then
begin
ch := BASS_SampleGetChannel(music, False);
if ch <> 0 then
begin
// omitted, see if the basics work
// BASS_ChannelSetAttribute(ch, BASS_ATTRIB_PAN, 0);
// BASS_ChannelSetAttribute(ch, BASS_ATTRIB_VOL, 1);
if not BASS_ChannelPlay(ch, False) then
ShowMessage(inttostr(bass_errorgetcode));
end
else
ShowMessage(inttostr(bass_errorgetcode));
end
else
ShowMessage(inttostr(bass_errorgetcode));
end;
finally
OpenDialog1.Free;
end;
end
else
ShowMessage(inttostr(bass_errorgetcode));
end;
<强>更新强>
我应该早点看到这个,你的代码失败因为BASS_SampleLoad
期望ANSI格式的文件名the documentation clearly mentions this,因为你有Delphi XE3而且字符串是Unicode,你必须提供{{1} } flag表示这一点。
所以BASS_UNICODE
行变为:
Bass_SampleLoad
<强> UPDATE2 强>
Per Sir Rufo的要求: 我添加了一个基于异常的错误检查例程,以使代码更清晰,调试更直接。
music := BASS_SampleLoad(FALSE, PChar(ffile), 0, 0, 3, BASS_SAMPLE_OVER_POS
or BASS_UNICODE);