Возвращаясь к библиотеке bass.dll. Просидел всю ночь за мануалами и выявил следующие недостатки при использовании её в NSIS:
- при включении в сценарии параметра поддержки стилей XP (
XPStyle on) > воспроизведение не работает;
- при включении в сценарии параметра компиляции юникодной версии (
Unicode true) > воспроизведение не работает;
- при использовании в сценарии графической оболочки MUI или MUI2 (директива
!include "MUI.nsh" (
!include "MUI2.nsh")) > воспроизведение не работает.
При тестировании использовалась последняя версия bass.dll и NSIS v3.0b с официальных сайтов разработчика.
Вот немного переделанный рабочий сценарий, предложенный
MKN (Пост 872 стр 88 ):
читать дальше »
Код:

; Простой GUI - версия ANSI - при отключенной поддержки стилей ХР
; Unicode true ; если включить, то воспроизведение не работает
!include "LogicLib.nsh"
!define BASS_DLL "bass.dll"
!define BASS_LOC "$PLUGINSDIR\${BASS_DLL}"
!define MP3 "mymusic.ogg"
!define MP3_LOC "$PLUGINSDIR\mymusic.ogg"
OutFile "Bass_SimpleGUI.exe"
ShowInstDetails show
; XPStyle on ; если включить, то воспроизведение не работает
Page license
Page components
Page directory
Page instfiles
Section "Ogg"
SectionEnd
Function .onInit
InitPluginsDir
File "/oname=${MP3_LOC}" "${MP3}"
File "/oname=${BASS_LOC}" "${BASS_DLL}"
; Выполняем инициализацию аудио устройства
System::Call '${BASS_LOC}::BASS_Init(i -1,i 44100,i 0,i 0,i n) b.r0'
; Создаем файловый поток для воспроизведения
System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,t "${MP3_LOC}",i 0,i 0,i 0) i.r1'
; Если файловый поток успешно создан (не равен 0), то
${If} $1 != "0"
StrCpy $R5 "Initialization OK."
; Устанавливаем для канала флаг зацикливания при воспроизведении
System::Call '${BASS_LOC}::BASS_ChannelFlags(i r1, i 4, i 4) i.R0'
; Запускаем воспроизведение канала
System::Call '${BASS_LOC}::BASS_ChannelPlay(i r1, b 0) i.R4'
; Получаем номер ошибки
System::Call '${BASS_LOC}::BASS_ErrorGetCode(i) i.R1'
${Else}
; Закрываем все существующие каналы воспроизведения и освобождаем системные ресурсы
System::Call '${BASS_LOC}::BASS_Free()'
StrCpy $R5 "Initialization failed."
${EndIf}
; Выводим сообщение о параметрах воспроизведения (для отладки)
MessageBox MB_ICONINFORMATION|MB_OK "HSTREAM handler = $1. $\r$\n\
$R5 $\r$\n\
BASS_ChannelFlags returned - $R0. $\r$\n\
BASS_ChannelPlay returned - $R4. $\r$\n\
BASS_ErrorGetCode - $R1."
FunctionEnd
Function .onGUIEnd
; Останавливаем воспроизведение канала
System::Call '${BASS_LOC}::BASS_ChannelStop(i r1)'
; Освобождаем системные ресурсы
System::Call '${BASS_LOC}::BASS_StreamFree(i r1)'
; Закрываем все существующие каналы воспроизведения и освобождаем системные ресурсы
System::Call '${BASS_LOC}::BASS_Free()'
FunctionEnd
При передаче в функцию строки с именем файла, который необходимо воспроизвести, согласно документации
System, можно указывать тип строки:
t - TCHAR text, ANSI string или
w - WCHAR text, Unicode string. То есть, если я правильно понял, то при компиляции юникодной версии инсталлятора команду
PHP код:

System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,t "${MP3_LOC}",i 0,i 0,i 0) i.r1'
надо изменить на
PHP код:

System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,w "${MP3_LOC}",i 0,i 0,i 0) i.r1'
Но это не помогает - воспроизведение не работает.
Еще в функции
BASS_StreamCreateFile есть флаг
BASS_UNICODE, который указывает, что имя файла задано в кодировке Unicode. Но установка этого флага не дает положительного результата
PHP код:

!define BASS_UNICODE 0x80000000
System::Call '${BASS_LOC}::BASS_StreamCreateFile(b 0,w "${MP3_LOC}",i 0,i 0,i ${BASS_UNICODE}) i.r1'
- воспроизведение не работает.
Это проблемы библиотеки bass.dll или NSIS? Можно ли как-то решить все эти вопросы? Или может быть я что-то делаю неправильно?