1. Inno Media Player
You can use the Inno Media Player library (sorry for the self-promotion). Here is an example of its use to play an audio file stored as a temporary file inside the installation.
Please note that Inno Media Player is a Unicode library, so you can only use it with Inno Setup Unicode versions, not ANSI! There is support for ANSI versions of 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 eg 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
Or you can use, for example, the Bass Audio Library , which is free for non-commercial use. To play, for example, an endless loop with this library, you can use a script as shown below.
This script and library are compatible with both versions of Inno Setup, ANSI and 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;