;-------------------------------- ;Include Modern UI !include "MUI2.nsh" !include "LogicLib.nsh" !include "FileFunc.nsh" !include "WordFunc.nsh" !include "WinVer.nsh" ;-------------------------------- ; this is the version for Winamp 5.9.1 !define MINIMAL_VERSION "5.9.1.10021" ; The name of the installer !define NAME "Shoutcast Source DSP Plug-in" !define VERSION "2.4.2" !define BUILD "449" !define UNINSTALL "Shoutcast Source DSP" !define UNINSTALLER "uninstall_shoutcast-source-dsp-v2.exe" Name "${NAME}" BrandingText "${NAME} v${VERSION} Build ${BUILD}" ; detect winamp path from uninstall string if available InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString" ; The file to write OutFile "shoutcast-dsp-2-4-2-windows.exe" ; The default installation directory InstallDir "$PROGRAMFILES32\Winamp" ; The text to prompt the user to enter a directory DirText "Please select your Winamp path below (you will be able to proceed when Winamp is detected):" # currently doesn't work - DirShow hide ; Request application privileges for Windows Vista+ RequestExecutionLevel admin ; Set the compressor (get installer as small as possible) SetCompressor /SOLID lzma ; Set the install types available InstType "Full Install" InstType "Base Install" ; global variables Var /GLOBAL WINAMP_INI_DIR Var GetInstalledSize.total ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages !define MUI_ICON "modern-install.ico" !define MUI_UNICON "modern-install.ico" !define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of the ${NAME}.$\n$\nIt is recommended that you close all instances of Winamp before starting Setup. This will make it possible to install relevant files within your Winamp installation without issues.$\n$\nClick Next to continue." !define MUI_WELCOMEFINISHPAGE_BITMAP "win.bmp" !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "dsp_sc_license.txt" ; is best to call the version check when leaving the directory page so it will be working against correct path !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckWinampVersion !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_FUNCTION SetAsCurrentDSP !define MUI_FINISHPAGE_RUN_TEXT "Set as the current DSP plug-in" !define MUI_FINISHPAGE_SHOWREADME ; "$INSTDIR\winamp.exe" !define MUI_FINISHPAGE_SHOWREADME_FUNCTION RunWinamp !define MUI_FINISHPAGE_SHOWREADME_TEXT "Run Winamp" !define MUI_FINISHPAGE_TEXT_LARGE !define MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_TEXT "${NAME} has been installed.$\n$\nTo enable the plug-in if it is not your current DSP plug-in, goto Winamp Preferences -> Plug-ins -> DSP/Effect and select the '${NAME}' entry.$\n$\nClick Finish to close this wizard." !define MUI_PAGE_CUSTOMFUNCTION_SHOW RestoreCheckedStates !define MUI_PAGE_CUSTOMFUNCTION_LEAVE SaveCheckedStates !insertmacro MUI_PAGE_FINISH !define MUI_UNWELCOMEFINISHPAGE_BITMAP "win.bmp" !define MUI_UNWELCOMEPAGE_TEXT "This wizard will guide you through the uninstallation of the ${NAME}.$\n$\nBefore starting the uninstalltion, make sure Winamp and the ${NAME} are not running.$\n$\nClick Next to continue." !define MUI_UNFINISHPAGE_TEXT "${NAME} has been uninstalled from your Winamp install.$\n$\nClick Finish to close this wizard." !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;first language is the default language ;-------------------------------- ;Reserve Files ;If you are using solid compression, files that are required before ;the actual installation should be stored first in the data block, ;because this will make your installer start faster. !insertmacro MUI_RESERVEFILE_LANGDLL ;--------------------------------- Section "Shoutcast Source DSP" Core SectionIn 1 2 RO SetOutPath "$INSTDIR\Plugins" File "dsp_sc.dll" ; look for lamedll.dll and remove as we now use lame_enc.dll IfFileExists "$INSTDIR\Plugins\lamedll.dll" 0 +2 Delete "lamedll.dll" ; Let's upgrade to Lame 3.100.1 SetOutPath "$INSTDIR\Shared" File "..\..\..\..\resources\libraries\lame_enc.dll" ; VC142 runtimes are required for Win7 & 8 installations ; Chances are these will already exist, but let's make sure anyway... ${If} ${AtLeastWin7} ${AndIf} ${AtMostWin8.1} SetOutPath "$INSTDIR\Microsoft.VC142.CRT" File ..\..\..\..\resources\libraries\msvcp140.dll File ..\..\..\..\resources\libraries\vcruntime140.dll File ..\..\..\..\resources\libraries\msvcp140_1.dll File ..\..\..\..\resources\libraries\msvcp140_2.dll File ..\..\..\..\resources\libraries\msvcp140_atomic_wait.dll File ..\..\..\..\resources\libraries\msvcp140_codecvt_ids.dll File ..\..\..\..\resources\libraries\vccorlib140.dll File ..\..\..\..\resources\libraries\concrt140.dll ${EndIf} ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "DisplayName" "Shoutcast Source DSP Plug-in v2" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "UninstallString" "$\"$INSTDIR\${UNINSTALLER}$\"" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "NoRepair" 1 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "Publisher" "Radionomy SA" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "HelpLink" "http://forums.shoutcast.com/forumdisplay.php?f=140" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "InstallLocation" "$INSTDIR\Plugins" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "DisplayVersion" "${VERSION}.${BUILD}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "URLInfoAbout" "http://wiki.shoutcast.com/wiki/Source_DSP_Plug-in" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "URLUpdateInfo" "https://www.shoutcast.com" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "DisplayIcon" "$\"$INSTDIR\${UNINSTALLER}$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "QuietUninstallString" "$\"$INSTDIR\${UNINSTALLER}$\" /S" Call GetInstalledSize WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" "EstimatedSize" "$GetInstalledSize.total" IfFileExists "$INSTDIR\Uninstallers\${UNINSTALLER}" 0 +2 Delete "$INSTDIR\Uninstallers\${UNINSTALLER}" SetOutPath "$INSTDIR\" WriteUninstaller "$INSTDIR\${UNINSTALLER}" SectionEnd Section "Documentation" Docs SectionIn 1 SetOutPath "$INSTDIR\Plugins\Shoutcast Source DSP" File ..\docs\Source_DSP_Plug-in.html File ..\docs\Source_DSP_Plug-in_Config_Examples.html File ..\docs\Source_DSP_Changelog.html SetOutPath "$INSTDIR\Plugins\Shoutcast Source DSP\res" File ..\docs\res\*.png SectionEnd ;-------------------------------- ;Section description text !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${Core} "The ${NAME} file.$\n$\n(This is always required)" !insertmacro MUI_DESCRIPTION_TEXT ${Docs} "This will be put in 'Plugins\Shoutcast Source DSP' in the selected destination.$\n$\nThese will show you the features available in the plug-in as well as how to make it connect with the Shoutcast 2 tools." !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL}" Delete "$INSTDIR\Plugins\dsp_sc.dll" Delete "$INSTDIR\Plugins\lamedll.dll" ; we don't actually install this any more ; Delete "$INSTDIR\Shared\lame_enc.dll" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\dsp_sc.txt" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\dsp_sc_config.txt" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\Source_DSP_Plug-in.html" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\Source_DSP_Changelog.html" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\Source_DSP_Plug-in_Config_Examples.html" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\res\*.png" Delete "$INSTDIR\Plugins\Shoutcast Source DSP\res\docs.css" RMDir "$INSTDIR\Plugins\Shoutcast Source DSP\res" RMDir "$INSTDIR\Plugins\Shoutcast Source DSP" ; Delete "$INSTDIR\Microsoft.VC142.CRT\*.dll" ; not wise, because then Winamp won't run on Win7-Win8.1 - - - why did this line exist for the VC90 Runtime? Delete "$INSTDIR\${UNINSTALLER}" SectionEnd Function .onInit !insertmacro MUI_LANGDLL_DISPLAY ;Detect running Winamp instances and close them !define WINAMP_FILE_EXIT 40001 FindWindow $R0 "Winamp v1.x" IntCmp $R0 0 ok MessageBox MB_YESNO|MB_ICONEXCLAMATION "Please close all instances of Winamp before installing$\n${NAME}.$\n$\nAttempt to close Winamp now?" IDYES checkagain IDNO no checkagain: FindWindow $R0 "Winamp v1.x" IntCmp $R0 0 ok SendMessage $R0 ${WM_COMMAND} ${WINAMP_FILE_EXIT} 0 Goto checkagain no: Abort ok: FunctionEnd Function .onVerifyInstDir ;Check for Winamp installation IfFileExists $INSTDIR\Winamp.exe Good Abort Good: FunctionEnd ;Uninstaller Functions /* Function un.GetParent Exch $R0 Push $R1 Push $R2 Push $R3 StrCpy $R1 0 StrLen $R2 $R0 loop: IntOp $R1 $R1 + 1 IntCmp $R1 $R2 get 0 get StrCpy $R3 $R0 1 -$R1 StrCmp $R3 "\" get Goto loop get: StrCpy $R0 $R0 -$R1 Pop $R3 Pop $R2 Pop $R1 Exch $R0 FunctionEnd Function un.onInit !insertmacro MUI_UNGETLANGUAGE Push "$INSTDIR" Call un.GetParent Pop $R0 StrCpy $INSTDIR $R0 FunctionEnd */ Function GetWinampIniPath StrCpy $WINAMP_INI_DIR $INSTDIR ${If} $0 == "" StrCpy $WINAMP_INI_DIR "$PROGRAMFILES\Winamp" ${EndIf} ClearErrors ${If} ${FileExists} "$WINAMP_INI_DIR\paths.ini" ReadINIStr $0 "$WINAMP_INI_DIR\paths.ini" "Winamp" "inidir" ${If} $0 != "" ${WordFind2X} $0 "{" "}" "E+1" $2 ${If} ${Errors} ${IfNot} ${FileExists} "$0\*.*" ${WordFind2X} $0 "%" "%" "E+1" $2 ${If} $2 == "WINAMP_ROOT_DIR" ClearErrors ${GetRoot} "$WINAMP_INI_DIR" $3 ${WordReplace} "$0" "%$2%" "$3" "E+1" $R0 ${If} ${Errors} Return ${Else} StrCpy $WINAMP_INI_DIR $R0 ${EndIf} ${ElseIf} $2 == "WINAMP_PROGRAM_DIR" ClearErrors ${WordReplace} "$0" "%$2%" "$WINAMP_INI_DIR" "E+1" $R0 ${If} ${Errors} Return ${Else} StrCpy $WINAMP_INI_DIR $R0 ${EndIf} ${Else} ClearErrors ReadEnvStr $R0 "$2" ${If} $R0 != "" ${WordReplace} "$0" "%$2%" "$R0" "E+1" $R0 ${If} ${Errors} Return ${Else} StrCpy $WINAMP_INI_DIR $R0 ${EndIf} ${Else} Return ${EndIf} ${EndIf} ${Else} StrCpy $WINAMP_INI_DIR $0 ${EndIf} ${Else} System::Call "shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r4, i $2, i0) i .r3" ClearErrors ${WordReplace} "$0" "{$2}" "$4" "E+1" $R0 ${If} ${Errors} Return ${Else} StrCpy $WINAMP_INI_DIR $R0 ${EndIf} ${EndIf} ${Else} Return ${EndIf} ${Else} Return ${EndIf} FunctionEnd ; set as the current DSP Function SetAsCurrentDSP WriteINIStr "$WINAMP_INI_DIR\winamp.ini" "winamp" "dspplugin_name" "dsp_sc.dll" WriteINIStr "$WINAMP_INI_DIR\winamp.ini" "winamp" "dspplugin_num" "0" FunctionEnd Function RunWinamp StrCpy $1 1 File "/oname=$PLUGINSDIR\ShellDispatch.dll" "ShellDispatch.dll" ${If} ${FileExists} "$PLUGINSDIR\ShellDispatch.dll" ${AndIf} ${FileExists} "$INSTDIR\winamp.exe" Push $0 StrCpy $0 "" ClearErrors GetFullPathName /SHORT $0 "$PLUGINSDIR\ShellDispatch.dll" ${IfNot} ${Errors} ${AndIf} $0 != "" ExecWait 'rundll32.exe $0,RunDll_ShellExecute "open" "$INSTDIR\winamp.exe"' $1 ${If} ${Errors} StrCpy $1 1 ${EndIf} ${EndIf} Pop $0 ${EndIf} ${If} $1 != 0 Exec "$INSTDIR\winamp.exe" ${EndIf} FunctionEnd ; restore the last checked states on the finish page Function RestoreCheckedStates Call GetWinampIniPath ReadINIStr $0 "$WINAMP_INI_DIR\plugins\dsp_sc.ini" "installer" "cur" ${If} $0 == "0" ${NSD_Uncheck} $mui.FinishPage.Run ${EndIf} ReadINIStr $0 "$WINAMP_INI_DIR\plugins\dsp_sc.ini" "installer" "run" ${If} $0 == "0" ${NSD_Uncheck} $mui.FinishPage.ShowReadme ${EndIf} FunctionEnd ; save the last checked states on the finish page Function SaveCheckedStates ${NSD_GetState} $mui.FinishPage.Run $0 WriteINIStr "$WINAMP_INI_DIR\plugins\dsp_sc.ini" "installer" "cur" $0 ${NSD_GetState} $mui.FinishPage.ShowReadme $0 WriteINIStr "$WINAMP_INI_DIR\plugins\dsp_sc.ini" "installer" "run" $0 FunctionEnd ; the check version function ; only issue is that the strings won't be localised as i see the installer in the zip supports it Function CheckWinampVersion ${GetFileVersion} "$INSTDIR\winamp.exe" $R0 ; Get Winamp.exe version information, $R0 = Actual Version ${if} $R0 != "" ; check if Version info is not empty ${VersionCompare} $R0 ${MINIMAL_VERSION} $R1 ; $R1 = Result $R1=0 Versions are equal, $R1=1 Version1 is newer, $R1=2 Version2 is newer ${if} $R1 == "2" MessageBox MB_OK "Warning: This plug-in requires at least Winamp v${MINIMAL_VERSION} or higher.$\nThe detected version of your Winamp install is: $R0$\n$\nThe Shoutcast Source plug-in may not function correctly with the$\n version of winamp detected.Please update your Winamp client!!$\n" Abort ${EndIf} ${Else} MessageBox MB_OK "Warning: A valid Winamp install was not detected in the specified path.$\n$\nPlease check the Winamp directory and either install the latest version$\nfrom Winamp.com or choose another directory with a valid Winamp install$\nbefore you can install the Shoutcast Source on your machine." Abort ${EndIf} FunctionEnd ; Return on top of stack the total size of the selected (installed) sections, formated as DWORD ; Assumes no more than 256 sections are defined Function GetInstalledSize Push $0 Push $1 StrCpy $GetInstalledSize.total 0 ${ForEach} $1 0 256 + 1 StrCpy $0 0 ${if} ${SectionIsSelected} $1 SectionGetSize $1 $0 IntOp $GetInstalledSize.total $GetInstalledSize.total + $0 ${Endif} ; Error flag is set when an out-of-bound section is referenced ${if} ${errors} ${break} ${Endif} ${Next} ClearErrors Pop $1 Pop $0 IntFmt $GetInstalledSize.total "0x%08X" $GetInstalledSize.total Push $GetInstalledSize.total FunctionEnd