
13.05.2011, 23:42
|
Прохожий
|
|
Регистрация: 03.05.2011
Сообщения: 3
Версия Delphi: Delphi2007win32
Репутация: 10
|
|
BASS.dll и MOD-файл: не удаётся распознать окончание звучания трека
Здравствуйте!
Никак не получается распознать момент завершения трека:
Код:
unit BGMusic;
interface
uses
Classes, Windows, SysUtils, BASS;
type
TMelodies = class(TThread)
private
{ Private declarations }
Handle: Cardinal;
Folder: String;
procedure RunPlay();
procedure Error(msg: string);
protected
procedure Execute; override;
public
constructor Create(CreateSuspennded: Boolean; const idHandle: Cardinal; const idPath: string);
end;
implementation
var
MODFile: PChar;
Melody: HMUSIC;
PlaySync: HSYNC;
constructor TMelodies.Create(CreateSuspennded: Boolean; const idHandle: Cardinal; const idPath: string);
begin
inherited Create(CreateSuspennded);
Handle := idHandle;
Folder := idPath;
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
MessageBox(0,'An incorrect version of BASS.DLL was loaded',nil,MB_ICONERROR);
Halt;
end;
// Initialize audio - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, Handle, nil) then
Error('Error initializing audio!');
BASS_Start();
end;
procedure TMelodies.Error(msg: string);
var
s: string;
begin
s := msg + #13#10 + '(Error code: ' + IntToStr(BASS_ErrorGetCode) + ')';
MessageBox(Handle, PChar(s), nil, 0);
end;
// Процедура которая будет вызвана по окончанию проигривания файла
procedure ChannelEndSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); stdcall;
begin
// Вот здесь обрабатывайте окончание!
// Когда Channel доиграет до конца, то будет вызвана эта процедура
// Например освободим этот поток который проигрался
// Сперва удалим обработку
BASS_ChannelRemoveSync(Stream, handle);
// Освободим поток
BASS_MusicFree(handle);
// Очистим переменные
Melody := 0;
PlaySync := 0;
// Покажем пользователю что файл проигран до конца...
MessageBox(Handle, PChar('Файл проигран!'), nil, 0);
end;
procedure TMelodies.RunPlay();
begin
MODFile := PChar(Folder + 'music.mod');
Melody := BASS_MusicLoad(False, MODFile, 0, 0, 0, 0);
BASS_ChannelRemoveSync(Melody, PlaySync);
PlaySync := BASS_ChannelSetSync(Melody, BASS_SYNC_END, 0, @ChannelEndSync, nil);
if not BASS_ChannelPlay(Melody, False) then
Error('Error playing music!');
end;
procedure TMelodies.Execute;
begin
{ Place thread code here }
// while not Terminated do
Synchronize(RunPlay);
end;
end.
по идее, при завершении трека, управление должно передаваться процедуре ChannelEndSync... однако этого не происходит.
Прошу Вашей помощи.
|