如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮

2024-01-12

我想在所有页面的左下角创建两个彼此相邻的按钮,例如重新加载。

第一个按钮显示PauseResume命令(如果我单击Pause,按钮将切换到Resume自动地)。

另一个按钮显示Stop命令(如果我单击Stop,下一个按钮将切换到从头开始播放自动地)

这段代码只是添加Pause/恢复/从头开始播放*按钮和Stop button

问题是:如果我按Stop按钮,音乐永久停止并且播放形式开始按钮永远不会出现。

    [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处理程序。

改变OnClick根据需要动态处理程序,以获得更简单的代码:

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 and BASS_ChannelPlay两次具有相同的参数。它没有任何意义。我已经删除了第二组。
  • 我还调整了按钮的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮 的相关文章

随机推荐

  • 像 '%' 不接受 NULL 值

    我有一个根据用户输入构建的查询 通过 html 表单传递 它看起来像 简单的例子 Select From table Where table column like
  • 检测语言和 django locale-url

    我想部署一个英语和西班牙语网站并检测用户浏览器语言并重定向到正确的区域设置网站 我的网站是www elmalabarista com 我安装django localeurl https bitbucket org carljm django
  • .htaccess 文件很长可以吗?

    我在网站上向人们提供 URL 这些 URL 实际上指向一些丑陋的东西 在同一个网站上 http www mydomain com cool URL http www mydomain com cool URL实际上指向 我计划通过在需要时修
  • 为什么 iOS11 中 UIScreen.bounds 不正确

    请不要标记为重复 可用线程尚未提供答案 行为仅限 iOS11 将项目从 Xcode 8 更新到 Xcode 9 现在使用 iOS11 但仍然使用 Swift 3 我有以下经验 print UIScreen main bounds width
  • 在 PHP 5.4 中工作的 PHP 5.3 中出现错误 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 这是在 P
  • 如何处理绑定到自定义程序集对象数据源的 RDLC 报告中的空嵌套对象?

    我有一个 RDLC 报告 我将其直接以 PDF 形式呈现到响应流 而不是使用 ReportViewer 在呈现报表的代码中 它的 DataSource 绑定到自定义程序集中定义的 List Of ClassA 对象 这似乎在大多数情况下都有
  • 如何使用注释自动装配 RestTemplate

    当我尝试自动装配 Spring 时RestTemplate 我收到以下错误 nested exception is org springframework beans factory NoSuchBeanDefinitionExceptio
  • Facebook C# SDK ASP.Net 3.5 示例

    我被要求开发一个 Facebook 应用程序 允许当前系统的用户使用这个 Facebook 应用程序找到彼此 不幸的是 他们的要求是它必须在 ASP NET 3 5 中构建 更容易为客户分发 我是一名经验丰富的 PHP 开发人员 尽管我过去
  • Android SpeechRecognizer 音频录制错误

    我正在尝试在 Android 上使用 SpeechRecognizer 而不使用 Intent Dialog 它在大多数设备上工作正常 但某些设备返回音频录制错误 错误代码 3 并且没有此错误的详细信息 有什么解决办法或者原因吗 谢谢你 当
  • 伊伊。如何添加CSS“错误”类到表单提交的输入?

    我有 Yii 形式 有些字段是必需的 提交表单时 我需要将 CSS 类 错误 添加到文本输入中 我的代码
  • Firefox 不遵守 rel=stylesheet 链接的“disabled”属性

    我有一个网站需要加载两个主题 用户可以打开 关闭第二个主题 我目前正在通过使用来完成此任务disabled链接中的标签如下 然后我切换disabled在 JavaScript 中 这在 Safari Mac Chrome Mac Windo
  • 为什么 gprof 大大低估了程序的运行时间?

    我有这个程序需要 2 34 秒才能运行 而 gprof 说它只需要 1 18 秒 我在其他地方读过答案 表明如果程序受 I O 限制 gprof 可能会出错 但这个程序显然不是 对于我正在尝试分析的有用程序 也会发生这种情况 它并不特定于这
  • MySQL validate_password_policy 未知系统变量

    我正在使用 MySQL 5 7 25 我想通过在 MySQL 命令中执行以下操作来增加我的 MySQL 密码策略 SET GLOBAL validate password policy 2 但我总是收到错误 错误 1193 HY000 未知
  • Valums Ajax Uploader (Mutli) - 检测所有文件何时上传

    我正在使用 Valums Ajax Uploader 上传一批文件 我们最近将代码从单一上传类型更改为多重上传类型 这给我们的代码带来了问题 正如你所看到的 当onComplete事件触发后 我们重新加载页面以显示新上传的图像 但是 那on
  • Java正则表达式匹配方括号[重复]

    这个问题在这里已经有答案了 我正在尝试使用正则表达式 java ReplaceAll 执行以下操作 Input Test Test1 Test2 Test3 Output TestTest3 简而言之 我需要删除方括号内的所有内容 包括方括
  • 如何在 SQLAlchemy 中使用数学方程作为过滤器

    我正在使用 SQLAlchemy ORM 在应用程序中构建 MySQL 查询 并且完全能够向查询添加基本过滤器 如下所示 query meta Session query User filter User user id 1 这给了我基本上
  • 如何使用 Jersey 2.x 设置连接和读取超时?

    在球衣 1 中我们有一个函数设置连接超时 https jersey java net apidocs 1 1 5 jersey com sun jersey api client Client html setConnectTimeout
  • 切换选项卡时倒计时器停止

    因此 基本上 当我切换选项卡时 特定页面上的倒计时器会停止倒计时 并在您返回选项卡时恢复 无论如何 有没有办法减轻这种情况 以便它在后台计数或计入您在另一个选项卡上花费的时间 这基本上就是我对 js 的看法 document getElem
  • gganimate 中框架标题的自定义列

    我想在 gganimate 标题中使用自定义列 但无法在文档中的任何位置阅读如何操作 使用其页面中的代码的示例 library gapminder ggplot gapminder aes gdpPercap lifeExp size po
  • 如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮

    我想在所有页面的左下角创建两个彼此相邻的按钮 例如重新加载 第一个按钮显示Pause和Resume命令 如果我单击Pause 按钮将切换到Resume自动地 另一个按钮显示Stop命令 如果我单击Stop 下一个按钮将切换到从头开始播放自动