Воспроизведение звука во время установки 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;