Воспроизведение звука во время установки Inno Setup

Я хочу использовать Inno Setup для создания сценария установки для моего приложения, но мне бы хотелось, чтобы он воспроизводил звуковой файл во время установки, возможно ли это? Если да, то можете ли вы указать мне правильное направление!

2 ответа

1. Inno Media Player

Вы можете использовать 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, Param1, 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, 0, 0) then
  begin
    StreamHandle := 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(StreamHandle, False);
  end;
end;

procedure DeinitializeSetup;
begin
  BASS_Free;
end;

Чтобы избежать необходимости в сторонней библиотеке, вы также можете использовать объект Windows SAPI.

      [Files]
Source: "sound.wav"; Flags: dontcopy
      var
  oVoice, oSpFileStream: Variant;
begin
  ExtractTemporaryFile('sound.wav');
  oVoice := CreateOleObject('SAPI.SpVoice');
  oSpFileStream := CreateOleObject('SAPI.SpFileStream');
  oSpFileStream.Open(ExpandConstant('{tmp}\sound.wav'));
  oVoice.SpeakStream(oSpFileStream);
end;
Другие вопросы по тегам