Ветеран
Сообщения: 649
Благодарности: 444
|
Профиль
|
Отправить PM
| Цитировать
Raf-9600,
Цитата Raf-9600:
Спасибо, но это не совсем то, в чём затык произошёл. Кроме этого функционала, нужно ещё чтобы после того как воспроизведение само завершиться (без клика пользователя по кнопке Стоп), кнопка Стоп становилась неактивной. »
|
вот пример. Перенёс отсюда http://programmersforum.ru/showthread.php?p=426736
попутно читал справку, чего и тебе советую, тк возможностей много, например регулировка громкости, отображение прогресса, перемотка, итд
http://www.un4seen.com/doc/#bass/BAS...reateFile.html
короче вот код конкретно по твоему вопросу:
читать дальше »
Код: 
[Files]
Source: bass.dll; Flags: dontcopy
[Code ]
type
HSYNC = DWORD;
SYNCPROC = Longint;
Pointer = Longint;
HSTREAM = DWORD;
const
BASS_SYNC_END = 2;
BASS_UNICODE = $80000000;
function BASS_ChannelRemoveSync(handle: DWORD; sync: HSYNC): BOOL; external 'BASS_ChannelRemoveSync@files:bass.dll stdcall';
function BASS_ChannelSetSync(handle: DWORD; type_: DWORD; param1, param2: DWORD; proc: SYNCPROC; user: Pointer): HSYNC; external 'BASS_ChannelSetSync@files:bass.dll stdcall';
function BASS_Init(device: LongInt; freq, flags: DWORD; win: HWND; clsid: Pointer): BOOL; external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: String; offset1: DWORD; offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Free(): BOOL; external 'BASS_Free@files:bass.dll stdcall';
var
Channel: HSTREAM;
PlaySync: DWORD;
BassInitialized: BOOL;
StopBtn, PlayBtn: TButton;
// Процедура которая будет вызвана по окончанию проигривания файла
procedure ChannelEndSync(handle: HSYNC; Stream, data: DWORD; user: Pointer);
begin
// Вот здесь обрабатывайте окончание!
// Когда Channel доиграет до конца, то будет вызвана эта процедура
// Например освободим этот поток который проигрался
// Сперва удалим обработку
BASS_ChannelRemoveSync(Stream, Handle);
// Освободим поток
BASS_StreamFree(Stream);
// Очистим переменные
Channel := 0;
PlaySync := 0;
// Покажем пользователю что файл проигран до конца...
//MsgBox('Файл проигран!', mbInformation, MB_OK);
StopBtn.Enabled := False;
end;
// Просто процедура которая открывает файл и проигривает его
procedure BASS_PlayFile(const FilePath: String);
begin
if Channel = 0 then
begin
// Открываем файл...
Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
#ifdef UNICODE
BASS_UNICODE
#else
0
#endif
);
// Начинаем его воспроизведение
BASS_ChannelPlay(Channel, False);
// А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
// ChannelEndSync котора будет запущена по окончанию проигривания файла
PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
end else
begin
// Если файл уже играет, то отключаем его
BASS_ChannelRemoveSync(Channel, PlaySync);
BASS_StreamFree(Channel);
// Открываем файл...
Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
#ifdef UNICODE
BASS_UNICODE
#else
0
#endif
);
// Начинаем его воспроизведение
BASS_ChannelPlay(Channel, False);
// А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
// ChannelEndSync котора будет запущена по окончанию проигривания файла
PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
end;
end;
function InitBass(const _hwnd: HWND): BOOL;
begin
Result := BassInitialized;
if not Result then
begin
Result := BASS_Init(-1, 44100, 0, _hwnd, 0);
BassInitialized := Result;
end;
end;
procedure StopAndFree();
begin
if PlaySync <> 0 then
begin
BASS_ChannelRemoveSync(Channel, PlaySync);
PlaySync := 0;
end;
// Освободим поток
if Channel <> 0 then
begin
BASS_StreamFree(Channel);
Channel := 0;
end;
end;
function DeInitBass(): BOOL;
begin
Result := not BassInitialized;
if not Result then
begin
Result := Bass_Free();
BassInitialized := not Result;
end;
end;
/////////////////////////////////// demo /////////////////////////////////
procedure BtnClick(Sender: TObject);
var
uFilePath: String;
begin
case TButton(Sender) of
PlayBtn:
begin
uFilePath := '';
if GetOpenFileName('Choose audio file', uFilePath, ExpandConstant('{userdesktop}'), 'mp3 files (*.mp3)|*.mp3|All files (*.*)|*.*', 'mp3') then
if uFilePath <> '' then
BASS_PlayFile(uFilePath);
StopBtn.Enabled := True;
end;
StopBtn:
begin
StopAndFree();
StopBtn.Enabled := False;
end;
end;
end;
procedure InitializeWizard();
begin
BassInitialized := False;
InitBass(0);
//////////////////////////////////
WizardForm.OuterNotebook.Hide;
PlayBtn := TButton.Create(WizardForm);
with PlayBtn do
begin
Parent := WizardForm;
SetBounds(100, 100, 65, 25);
Caption := 'Play';
OnClick := @BtnClick;
end;
StopBtn := TButton.Create(WizardForm)
with StopBtn do
begin
Parent := WizardForm;
SetBounds(200, 100, 65, 25);
Caption := 'Stop';
OnClick := @BtnClick;
end;
end;
procedure DeinitializeSetup();
begin
DeInitBass();
end;
[/color]
|