Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Возвращаясь к библиотеке 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? Можно ли как-то решить все эти вопросы? Или может быть я что-то делаю неправильно?

Отправлено: 13:59, 12-08-2014 | #1274