【问题标题】:Play a sound only in a specific page in Inno Setup仅在 Inno Setup 的特定页面中播放声音
【发布时间】:2020-09-06 10:20:55
【问题描述】:

我正在使用 Inno Setup 为我的应用程序创建安装程序。我使用 BASS 音频库在安装程序的后台播放音乐。

这是我播放声音的代码。

[Code]
const
  DI_NORMAL = 3;
  FR_PRIVATE = $10;  {added to compact Mode}
  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 = {#MusicVolume};
  EncodingFlag = BASS_UNICODE;
  #if CheckCRC == "1"
  PM_REMOVE = 1;
  WM_QUIT   = 18;
  #endif

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_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;

procedure MusicButtonClick(Sender: TObject);
begin
  case BASS_ChannelIsActive(SoundStream) of
    BASS_ACTIVE_PLAYING:
    begin
      if BASS_Pause then
        MusicButton.Caption := ExpandConstant('{cm:MusicButtonCaptionSoundOn}');
    end;
    BASS_ACTIVE_PAUSED:
    begin
      if BASS_Start then
        MusicButton.Caption := ExpandConstant('{cm:MusicButtonCaptionSoundOff}');
    end;
  end;
end;

ExtractTemporaryFile('{#MusicFile}');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
  SoundStream := BASS_StreamCreateFile(False,
  ExpandConstant('{tmp}\{#MusicFile}'), 0, 0, 0, 0,
  EncodingFlag or BASS_SAMPLE_LOOP);
  BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
  BASS_ChannelPlay(SoundStream, False);
end;

我只想在我的安装程序页面中播放声音(在本例中为许可证页面) 我希望当用户进入 license page 时,正常音乐 stop 和其他声音开始播放,完成此声音音乐 start 再次播放 还有无论如何要禁用 next 按钮直到声音结束?

谢谢


在 Martin Prikryl 的帮助下,我稍微编辑了代码。我的代码现在是这样的(同样我不能把完整的代码放在帖子上,因为它有很多行)

procedure InitializeWizard();
var
  SoundStream: HSTREAM;
  LicenseSoundStream: HSTREAM;
  //-some other code-//
  IniFile := ExpandConstant('{tmp}\Settings.ini');
  #if Music == "1"
  if BASS_Init(-1, 44100, 0, 0, 0) then
    begin
      BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
      ExtractTemporaryFile('{#MusicFile}');
      ExtractTemporaryFile('lic.mp3');
      SoundStream :=
        BASS_StreamCreateFile(
          False, ExpandConstant('{tmp}\{#MusicFile}'), 0, 0, 0, 0,
          BASS_UNICODE or BASS_SAMPLE_LOOP);
      LicenseSoundStream :=
        BASS_StreamCreateFile(
      False, ExpandConstant('{tmp}\lic.mp3'), 0, 0, 0, 0, BASS_UNICODE);
      BASS_ChannelPlay(SoundStream, False);
    end;
  #endif

procedure CurPageChanged(CurPageID: integer);
begin
  //-some other code-//
  #if UseLicense == "1"
  if CurPageID = wpLicense then
  begin
    AboutButton.Hide;
    WizardForm.DirEdit.Hide;
    WizardForm.DirBrowseButton.Hide;
    WizardForm.GroupEdit.Hide;
    WizardForm.GroupBrowseButton.Hide;
    WizardForm.PageNameLabel.Hide;
    WizardForm.PageDescriptionLabel.Hide;
    WizardForm.UserInfoNameLabel.Hide;
    WizardForm.UserInfoNameEdit.Hide;
    if Assigned(LicenseSoundStream) then
    begin
      BASS_ChannelPlay(LicenseSoundStream, True);
      BASS_Start;
    end;
  end
    else
  begin
    { On other pages, restore the standard music }
    if Assigned(SoundStream) then
    begin
      BASS_ChannelPlay(SoundStream, False);
    end;
  end;
  #endif
end;

它现在给我if Assigned(LicenseSoundStream) 中的编译器错误,错误是Line 4416: Column 17: Unknown identifier 'LicenseSoundStream'


-编辑 2-

如你所知,我在安装程序中有 2 个声音

  1. 是背景音乐(它在整个安装程序页面播放,除了许可证页面)
  2. 是许可证页面声音(用户间许可证页面背景声音暂停等声音播放,退出其他声音时重新开始播放)

我添加按钮以使用此代码禁用和启用背景声音

procedure MusicButtonClick(Sender: TObject);
begin
  case BASS_ChannelIsActive(SoundStream) of
    BASS_ACTIVE_PLAYING:
    begin
      if BASS_Pause then
        MusicButton.Caption := ExpandConstant('{cm:MusicButtonCaptionSoundOn}');
    end;
    BASS_ACTIVE_PAUSED:
    begin
      if BASS_Start then
        MusicButton.Caption := ExpandConstant('{cm:MusicButtonCaptionSoundOff}');
    end;
  end;
end;

但我的问题是,如果用户在许可页面之前暂停背景声音,则在许可页面内再次播放背景声音(而不是其他声音)

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    假设您的 ExtractTemporaryFileBASS_Init 呼叫在 InitializeSetup 中,如下所示:How to make Stop and Pause/Resume/Play music buttons in Inno Setup

    更新代码以加载两个音乐文件:

    var
      SoundStream: HSTREAM;
      LicenseSoundStream: HSTREAM;
    
    procedure InitializeWizard;
    begin
      if BASS_Init(-1, 44100, 0, 0, 0) then
      begin
        BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
        ExtractTemporaryFile('{#MusicFile}');
        ExtractTemporaryFile('{#LicenseMusicFile}');
        SoundStream :=
          BASS_StreamCreateFile(
            False, ExpandConstant('{tmp}\{#MusicFile}'), 0, 0, 0, 0,
            BASS_UNICODE or BASS_SAMPLE_LOOP);
        LicenseSoundStream :=
          BASS_StreamCreateFile(
            False, ExpandConstant('{tmp}\{#LicenseMusicFile}'), 0, 0, 0, 0, BASS_UNICODE);
        BASS_ChannelPlay(SoundStream, False);
      end;
    end;
    

    然后在CurPageChanged event function的授权页面,启动“授权”音乐:

    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpLicense then
      begin
        if LicenseSoundStream <> 0 then
        begin
          BASS_ChannelPause(SoundStream);
          BASS_ChannelPlay(LicenseSoundStream, True);
          BASS_Start;
        end;
      end
        else
      begin
        { On other pages, restore the standard music }
        if SoundStream <> 0 then
        begin
          BASS_ChannelPause(LicenseSoundStream);
          BASS_ChannelPlay(SoundStream, False);
        end;
      end;
    end;
    

    未经测试 - 可能需要一些调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多