mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-26 23:17:34 +00:00
fix(web): libopus ищется по нескольким именам, а не по одному зашитому
Файл библиотеки в каждой сборке называется по-своему: MSYS2 кладёт
libopus-0.dll, взятая из чужого дистрибутива или собранная руками — libopus.dll,
у Unix это soname libopus.so.0, у Homebrew — .dylib в своём префиксе. Одно
жёстко зашитое имя означало немой web там, где библиотека в системе есть:
именно в это упирался инсталлятор, куда libopus приехал как libopus.dll (a2a12a0),
тогда как LoadLibrary просил libopus-0.dll.
Перебор кандидатов сделан ровно как у загрузчика PortAudio (AudioOutput.LoadLib):
локальный массив имён и цикл до первой удачи.
Проверено демоном на изолированном конфиге: с битой libopus.so.0 в
LD_LIBRARY_PATH и целой libopus.so состояние отдаёт "opus":true (до правки на
том же стенде было false), с битыми всеми тремя именами — false, и страница
поднимает баннер.
This commit is contained in:
+35
-4
@@ -81,6 +81,9 @@ unit WebServer;
|
|||||||
libopus в системе нет, LoadOpus молча возвращает False, кадры 'A' не
|
libopus в системе нет, LoadOpus молча возвращает False, кадры 'A' не
|
||||||
уходят и микрофон не декодируется — раньше это выглядело как немой
|
уходят и микрофон не декодируется — раньше это выглядело как немой
|
||||||
звук без объяснений. Теперь страница показывает баннер.
|
звук без объяснений. Теперь страница показывает баннер.
|
||||||
|
- (Audio fix 7) LoadOpus перебирает имена библиотеки (OPUS_LIBS), как
|
||||||
|
загрузчик PortAudio, а не грузит одно жёстко зашитое: libopus-0.dll /
|
||||||
|
libopus.dll / opus.dll, libopus.so.0 / .so, .dylib для macOS.
|
||||||
}
|
}
|
||||||
|
|
||||||
{$IFDEF FPC}
|
{$IFDEF FPC}
|
||||||
@@ -756,14 +759,42 @@ end;
|
|||||||
═══════════════════════════════════════════════════════════════════════════ }
|
═══════════════════════════════════════════════════════════════════════════ }
|
||||||
|
|
||||||
function TWebServer.LoadOpus: Boolean;
|
function TWebServer.LoadOpus: Boolean;
|
||||||
|
// Имя файла у каждой сборки libopus своё: MSYS2 кладёт рядом с exe libopus-0.dll,
|
||||||
|
// собранная руками или взятая из чужого дистрибутива — libopus.dll, у Unix это
|
||||||
|
// soname libopus.so.0, у Homebrew — .dylib в своём префиксе. Поэтому перебираем
|
||||||
|
// кандидатов, как это давно делает загрузчик PortAudio (AudioOutput.LoadLib):
|
||||||
|
// одно жёстко зашитое имя означало бы немой web там, где библиотека есть.
|
||||||
const
|
const
|
||||||
{$IFDEF WINDOWS} LIBNAME = 'libopus-0.dll';
|
{$IFDEF DARWIN}
|
||||||
{$ELSE} LIBNAME = 'libopus.so.0';
|
OPUS_LIBS: array[0..3] of AnsiString = (
|
||||||
|
'libopus.dylib',
|
||||||
|
'libopus.0.dylib',
|
||||||
|
'/usr/local/lib/libopus.dylib',
|
||||||
|
'/opt/homebrew/lib/libopus.dylib'
|
||||||
|
);
|
||||||
|
{$ELSE}
|
||||||
|
{$IFDEF UNIX}
|
||||||
|
OPUS_LIBS: array[0..2] of AnsiString = (
|
||||||
|
'libopus.so.0',
|
||||||
|
'libopus.so',
|
||||||
|
'libopus.so.0.8.0'
|
||||||
|
);
|
||||||
|
{$ELSE}
|
||||||
|
OPUS_LIBS: array[0..2] of AnsiString = (
|
||||||
|
'libopus-0.dll',
|
||||||
|
'libopus.dll',
|
||||||
|
'opus.dll'
|
||||||
|
);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
var Err: Integer;
|
{$ENDIF}
|
||||||
|
var Err, i: Integer;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
FOpusLib := LoadLibrary(LIBNAME);
|
for i := 0 to High(OPUS_LIBS) do
|
||||||
|
begin
|
||||||
|
FOpusLib := LoadLibrary(OPUS_LIBS[i]);
|
||||||
|
if FOpusLib <> 0 then Break;
|
||||||
|
end;
|
||||||
if FOpusLib = 0 then Exit;
|
if FOpusLib = 0 then Exit;
|
||||||
|
|
||||||
FOpusCreate := TOpus_encoder_create( GetProcAddress(FOpusLib, 'opus_encoder_create'));
|
FOpusCreate := TOpus_encoder_create( GetProcAddress(FOpusLib, 'opus_encoder_create'));
|
||||||
|
|||||||
Reference in New Issue
Block a user