max*_*fax 6 delphi mp3 function bass.dll
我想从某个地方手动加载一个低音DLL,然后播放一个mp3文件.怎么做?德尔福XE2.
我的尝试不起作用:
type
QWORD = Int64;
HSTREAM = LongWord;
type
TBASS_ChannelPlay = function(handle: HSTREAM; restart: LongBool): LongBool; stdcall;
type
TBASS_StreamCreateFile = function(mem: LongBool; f: Pointer;
offset, length: QWORD; flags: LongWord): HSTREAM; stdcall;
procedure PlayMP3(FileName: string);
var
BASS_ChannelPlay: TBASS_ChannelPlay;
BASS_StreamCreateFile: TBASS_StreamCreateFile;
DllHandle: THandle;
MP3Stream: HSTREAM;
DllPath:string;
pFileName:pchar;
begin
DllPath:= 'c:\dll\bass.dll';
DllHandle := LoadLibrary(pchar(DLLPath));
try
if DllHandle = 0 then
Exit;
@BASS_StreamCreateFile := GetProcAddress(DllHandle,
'BASS_StreamCreateFile');
if @BASS_StreamCreateFile <> nil then
begin
pfilename:=pchar(FileName);
MP3Stream := BASS_StreamCreateFile(false, Pfilename, 0, 0, 0);
if MP3Stream <> 0 then
begin
@BASS_ChannelPlay := GetProcAddress(DllHandle, 'BASS_ChannelPlay');
if @BASS_ChannelPlay <> nil then
BASS_ChannelPlay(MP3Stream,false);
end;
end;
finally
FreeLibrary(DllHandle);
end;
end;
Run Code Online (Sandbox Code Playgroud)
但是BASS_StreamCreateFile一直返回0 :(
他们的例子(Bass Test)和Bass.pas中的代码:
type
DWORD = LongWord;
BOOL = LongBool;
QWORD = Int64;
HSTREAM = DWORD;
function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length: QWORD; flags: DWORD): HSTREAM; {$IFDEF WIN32}stdcall{$ELSE}cdecl{$ENDIF}; external bassdll;
strs: array[0..128] of HSTREAM;
procedure TForm1.Button15Click(Sender: TObject);
var
f: PChar;
begin
if not OpenDialog2.Execute then Exit;
f := PChar(OpenDialog2.FileName);
strs[strc] := BASS_StreamCreateFile(False, f, 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
if strs[strc] <> 0 then
begin
ListBox3.Items.Add(OpenDialog2.FileName);
Inc(strc);
end
else
Error('Error creating stream!');
end;
Run Code Online (Sandbox Code Playgroud)
MP3Stream := BASS_StreamCreateFile(false, Pfilename, 0, 0, 0);
ShowMessage(SysErrorMessage(GetLastError));
Run Code Online (Sandbox Code Playgroud)
GetLastError
没有显示任何错误!
还有BASS 2.4 Delphi单元(动态).
它写道:
如何安装将DYNAMIC_BASS.PAS复制到Delphi路径或项目目录的\ LIB子目录中调用Load_BASSDLL(例如在FormCreate中)以在使用任何函数之前加载BASS,并在您使用
Unload_BASSDLL(例如在FormDestory中)卸载它时重做.注意:Delphi 2009用户应尽可能使用BASS_UNICODE标志
我做:
if Load_BASSDLL(DllPath) then
begin
FileName:='C:\Users\V\Desktop\cmd.mp3';
MP3Stream:=BASS_StreamCreateFile(False, pchar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
if MP3Stream <> 0 then
BASS_ChannelPlay(MP3Stream, False);
Unload_BASSDLL;
end;
Run Code Online (Sandbox Code Playgroud)
它仍然不起作用:(
如果要这样做
BASS_Init(-1, 44100, 0, Form1.Handle, nil);
Run Code Online (Sandbox Code Playgroud)
然后BASS_ChannelPlay(MP3Stream, False)
返回true但我听不到声音:(
你错过了电话BASS_Init
.从您引用的相同演示中,在以下情况FormCreate
中:
// Initialize audio - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, Handle, nil) then
Error('Error initializing audio!');
Run Code Online (Sandbox Code Playgroud)
另外,看一下demo源的调用:
BASS_StreamCreateFile(False, f, 0, 0,
0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
Run Code Online (Sandbox Code Playgroud)
注意最后一个参数会发生什么?在or BASS_UNICODE
需要对D2009及以上的,除非你使用PAnsiChar
的替代PChar
; Delphi的默认字符串类型是UnicodeString
,默认PChar
为PWideChar
.
您可以在有{$IFDEF UNICODE}
或没有它的情况下使用它; Delphi定义UNICODE
,所以如果你使用它,你的代码也将与早期版本的Delphi(pre-D2009)向后兼容.
您还应该查看dynamic_bass.pas
该Bass\Delphi\dynamic
文件夹.它有代码来动态加载库并检索所有函数; 如果你不想直接使用它,至少你可以从那里复制你需要的函数定义和动态加载代码.