如何在Inno Setup中设置停止和暂停/继续/播放音乐按钮 [英] How to make Stop and Pause/Resume/Play music buttons in Inno Setup
问题描述
我想在所有页面的左下角创建两个彼此相邻的按钮,如重新加载。
I want to create two buttons adjacent to each-other at the bottom left corner of all the pages like reloaded.
第一个按钮显示暂停和 Resume 命令(如果我单击 Pause ,按钮将自动切换到 Resume )。
The first button shows the Pause and the Resume command (if I click Pause, the button will switch to Resume automatically).
另一个按钮显示停止命令(如果我单击 Stop ,则下一个按钮将切换为从开始播放自动)
The other button shows the Stop command (if I click Stop, the next button will switch to Play from start automatically)
这段代码只是添加了暂停 /从开始*按钮恢复/播放和停止按钮
This code just adds Pause/Resume/Play from start* button and Stop button
问题是:如果按停止按钮,音乐将永久停止,并且播放表单开始
The problem is: If I press Stop button, the music stops permanently and the Play form start button never appears.
[Setup]
AppName=Bass Audio Project
AppVersion=1.0
DefaultDirName={pf}\Bass Audio Project
[Files]
Source: Bass.dll; Flags: dontcopy
Source: AudioFile.mp3; Flags: dontcopy
[Code]
const
BASS_SAMPLE_LOOP = 4;
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_UNICODE = $80000000;
BASS_CONFIG_GVOL_STREAM = 5;
const
#ifndef UNICODE
EncodingFlag = 0;
#else
EncodingFlag = BASS_UNICODE;
#endif
type
HSTREAM = DWORD;
function BASS_Init(device: LongInt; freq, flags: DWORD;
win: HWND; clsid: Cardinal): 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_Start: BOOL;
external 'BASS_Start@files:bass.dll stdcall';
function BASS_Pause: BOOL;
external 'BASS_Pause@files:bass.dll stdcall';
function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL;
external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): BOOL;
external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_ChannelIsActive(handle: DWORD): DWORD;
external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_Free: BOOL;
external 'BASS_Free@files:bass.dll stdcall';
var
SoundStream: HSTREAM;
PauseResumePlayButton: TNewButton;
StopButton: TNewButton;
procedure ResumeButtonClick(Sender: TObject); forward;
procedure PauseButtonClick(Sender: TObject);
begin
if BASS_Pause then
begin
PauseResumePlayButton.Caption := 'Resume';
PauseResumePlayButton.OnClick := @ResumeButtonClick;
end;
end;
procedure ResumeButtonClick(Sender: TObject);
begin
if BASS_start then
begin
PauseResumePlayButton.Caption := 'Pause';
PauseResumePlayButton.OnClick := @PauseButtonClick;
end;
end;
procedure PlayButtonClick(Sender: TObject);
begin
if BASS_Start then
begin
PauseResumePlayButton.Caption := 'Pause';
PauseResumePlayButton.OnClick := @PauseButtonClick;
end;
end;
procedure StopButtonClick(Sender: TObject);
begin
if BASS_Stop then
begin
PauseResumePlayButton.Caption := 'Play';
PauseResumePlayButton.OnClick := @PlayButtonClick;
end;
begin
BASS_Free;
end;
end;
procedure InitializeWizard();
begin
ExtractTemporaryFile('AudioFile.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
SoundStream :=
BASS_StreamCreateFile(
False, ExpandConstant('{tmp}\AudioFile.mp3'), 0, 0, 0, 0,
EncodingFlag or BASS_SAMPLE_LOOP);
BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
BASS_ChannelPlay(SoundStream, False);
StopButton := TNewButton.Create(WizardForm);
StopButton.Parent := WizardForm;
StopButton.Left :=
WizardForm.ClientWidth -
WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
StopButton.Top := WizardForm.CancelButton.Top;
StopButton.Width := WizardForm.CancelButton.Width;
StopButton.Height := WizardForm.CancelButton.Height;
StopButton.Caption := 'Stop';
StopButton.OnClick := @StopButtonClick;
PauseResumePlayButton := TNewButton.Create(WizardForm);
PauseResumePlayButton.Parent := WizardForm;
PauseResumePlayButton.Left :=
WizardForm.ClientWidth -
WizardForm.NextButton.Left - WizardForm.NextButton.Width;
PauseResumePlayButton.Top := WizardForm.CancelButton.Top;
PauseResumePlayButton.Width := WizardForm.CancelButton.Width;
PauseResumePlayButton.Height := WizardForm.CancelButton.Height;
PauseResumePlayButton.Caption := 'Pause';
PauseResumePlayButton.OnClick := @PauseButtonClick;
end;
end;
procedure DeinitializeSetup;
begin
BASS_Free;
end;
推荐答案
使用单个方法来实现它不是一个好主意 OnClick
处理程序。
It's not a good idea to implement this using a single OnClick
handler.
根据需要即时更改 OnClick
处理程序,以获得更直接的代码:
Change the OnClick
handler on the fly, as needed, for more straightforward code:
const
BASS_SAMPLE_LOOP = 4;
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_UNICODE = $80000000;
BASS_CONFIG_GVOL_STREAM = 5;
const
#ifndef UNICODE
EncodingFlag = 0;
#else
EncodingFlag = BASS_UNICODE;
#endif
type
HSTREAM = DWORD;
function BASS_Init(device: LongInt; freq, flags: DWORD;
win: HWND; clsid: Cardinal): Boolean;
external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: Boolean; f: string; offset1: DWORD;
offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: Boolean): Boolean;
external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_ChannelPause(handle: DWORD): Boolean;
external 'BASS_ChannelPause@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): Boolean;
external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_ChannelIsActive(handle: DWORD): DWORD;
external 'BASS_ChannelIsActive@files:bass.dll stdcall';
var
SoundStream: HSTREAM;
PauseResumePlayButton: TNewButton;
StopButton: TNewButton;
procedure ResumeButtonClick(Sender: TObject); forward;
procedure PauseButtonClick(Sender: TObject);
begin
if BASS_ChannelPause(SoundStream) then
begin
PauseResumePlayButton.Caption := 'Resume';
PauseResumePlayButton.OnClick := @ResumeButtonClick;
end;
end;
procedure ResumeButtonClick(Sender: TObject);
begin
if BASS_ChannelPlay(SoundStream, False) then
begin
PauseResumePlayButton.Caption := 'Pause';
PauseResumePlayButton.OnClick := @PauseButtonClick;
end;
end;
procedure PlayButtonClick(Sender: TObject);
begin
if BASS_ChannelPlay(SoundStream, True) then
begin
PauseResumePlayButton.Caption := 'Pause';
PauseResumePlayButton.OnClick := @PauseButtonClick;
end;
end;
procedure StopButtonClick(Sender: TObject);
begin
if (BASS_ChannelIsActive(SoundStream) = BASS_ACTIVE_PAUSED) or
BASS_ChannelPause(SoundStream) then
begin
PauseResumePlayButton.Caption := 'Play';
PauseResumePlayButton.OnClick := @PlayButtonClick;
end;
end;
procedure InitializeWizard();
begin
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
ExtractTemporaryFile('AudioFile.mp3');
SoundStream :=
BASS_StreamCreateFile(
False, ExpandConstant('{tmp}\AudioFile.mp3'), 0, 0, 0, 0,
EncodingFlag or BASS_SAMPLE_LOOP);
if SoundStream <> 0 then
begin
BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
if BASS_ChannelPlay(SoundStream, False) then
begin
StopButton := TNewButton.Create(WizardForm);
StopButton.Parent := WizardForm;
StopButton.Left :=
WizardForm.ClientWidth -
WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
StopButton.Top := WizardForm.CancelButton.Top;
StopButton.Width := WizardForm.CancelButton.Width;
StopButton.Height := WizardForm.CancelButton.Height;
StopButton.Caption := 'Stop';
StopButton.OnClick := @StopButtonClick;
PauseResumePlayButton := TNewButton.Create(WizardForm);
PauseResumePlayButton.Parent := WizardForm;
PauseResumePlayButton.Left :=
WizardForm.ClientWidth -
WizardForm.NextButton.Left - WizardForm.NextButton.Width;
PauseResumePlayButton.Top := WizardForm.CancelButton.Top;
PauseResumePlayButton.Width := WizardForm.CancelButton.Width;
PauseResumePlayButton.Height := WizardForm.CancelButton.Height;
PauseResumePlayButton.Caption := 'Pause';
PauseResumePlayButton.OnClick := @PauseButtonClick;
end;
end;
end;
end;
- 请注意,您调用了
BASS_StreamCreateFile
,BASS_SetConfig
和BASS_ChannelPlay
两次,且参数相同。它没有任何意义。我删除了第二组。 - 我还调整了按钮的放置。
- Note that you called the
BASS_StreamCreateFile
,BASS_SetConfig
andBASS_ChannelPlay
twice with the same arguments. It does not make sense. I've removed the second set. - I've also tweaked placement of the buttons.
这篇关于如何在Inno Setup中设置停止和暂停/继续/播放音乐按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!