加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

inno-setup – 在Inno Setup安装期间播放声音

发布时间:2020-12-15 09:40:33 所属栏目:大数据 来源:网络整理
导读:我希望使用Inno Setup为我的应用程序创建安装脚本,但我希望它在安装过程中播放声音文件,这可能吗?如果是这样,你能指出我正确的方向! 解决方法 1. Inno媒体播放器 您可以使用 Inno Media Player 库(对不起自我推销).以下是用于播放存储为设置内的临时文件的
我希望使用Inno Setup为我的应用程序创建安装脚本,但我希望它在安装过程中播放声音文件,这可能吗?如果是这样,你能指出我正确的方向!

解决方法

1. Inno媒体播放器

您可以使用Inno Media Player库(对不起自我推销).以下是用于播放存储为设置内的临时文件的音频文件的示例.

请注意,Inno Media Player是一个Unicode库,因此您只能使用Inno Setup的Unicode版本,而不能使用ANSI版本!不支持ANSI版本的Inno Setup ……!

[Setup]
AppName=Media Player Project
AppVersion=1.0
DefaultDirName={pf}Media Player Project

[Files]
Source: "AudioFile.mp3"; Flags: dontcopy
Source: "MediaPlayer.dll"; Flags: dontcopy

[Code]
const
  EC_COMPLETE = $01;
type
  TDirectShowEventProc = procedure(EventCode,Param1,Param2: Integer);

function DSGetLastError(var ErrorText: WideString): HRESULT;
  external 'DSGetLastError@files:mediaplayer.dll stdcall';
function DSPlayMediaFile: Boolean;
  external 'DSPlayMediaFile@files:mediaplayer.dll stdcall';
function DSStopMediaPlay: Boolean;
  external 'DSStopMediaPlay@files:mediaplayer.dll stdcall';
function DSSetVolume(Value: LongInt): Boolean;
  external 'DSSetVolume@files:mediaplayer.dll stdcall';
function DSInitializeAudioFile(FileName: WideString; 
  CallbackProc: TDirectShowEventProc): Boolean; 
  external 'DSInitializeAudioFile@files:mediaplayer.dll stdcall';

procedure OnMediaPlayerEvent(EventCode,Param2: Integer); 
begin
  if EventCode = EC_COMPLETE then
  begin
    { playback is done,so you can e.g. play the stream again,play another }
    { one using the same code as in InitializeWizard (in that case would be }
    { better to wrap that in some helper function) or do just nothing }
  end;
end;

procedure InitializeWizard;
var
  ErrorCode: HRESULT;
  ErrorText: WideString;   
begin
  ExtractTemporaryFile('AudioFile.mp3');
  if DSInitializeAudioFile(ExpandConstant('{tmp}AudioFile.mp3'),@OnMediaPlayerEvent) then
  begin
    DSSetVolume(-2500);
    DSPlayMediaFile;
  end
  else
  begin
    ErrorCode := DSGetLastError(ErrorText);
    MsgBox('TDirectShowPlayer error: ' + IntToStr(ErrorCode) + '; ' + 
      ErrorText,mbError,MB_OK);
  end;
end;

procedure DeinitializeSetup;
begin
  DSStopMediaPlay;
end;

2.低音音频库

或者您可以使用例如Bass Audio Library库,该库可以免费用于非商业用途.要使用该库进行无限循环,您可以使用如下脚本.

此脚本和库与Inno Setup,ANSI和Unicode的两个版本兼容.

[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_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_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_Free: BOOL;
  external 'BASS_Free@files:bass.dll stdcall';

procedure InitializeWizard;
var
  StreamHandle: HSTREAM;
begin
  ExtractTemporaryFile('AudioFile.mp3');
  if BASS_Init(-1,44100,0) then
  begin
    StreamHandle := BASS_StreamCreateFile(False,ExpandConstant('{tmp}AudioFile.mp3'),EncodingFlag or BASS_SAMPLE_LOOP);
    BASS_SetConfig(BASS_CONFIG_GVOL_STREAM,2500);
    BASS_ChannelPlay(StreamHandle,False);
  end;
end;

procedure DeinitializeSetup;
begin
  BASS_Free;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读