Невозможно настроить SDL2 для работы со звуком (alsa) в linux ubuntu 20.04 с использованием conan

В зависимости от того, что я делаю, я либо получаю

Нет такого аудиоустройства

если я оставлю определение своего аудиоустройства до SDL2, или я получу

Не удалось загрузить libasound.a: /home/aypahyo/.conan/data/libalsa/1.2.4// /package/d48130e0dd76369b1338deb3b2372c5a649f9f2d/lib/libasound.a: недопустимый заголовок ELF

когда я установил SDL_AUDIODRIVER=alsa. (Сообщение об ошибке на самом деле обрезано, я добавил r в конце).

Вот реализация, которая показывает ошибку:

#include <SDL.h>
#include <iostream>

void SetupWant(SDL_AudioSpec * want);
void PrintError(std::string source);

void run()
{
  //https://wiki.libsdl.org/FAQUsingSDL
  putenv((char *)"SDL_AUDIODRIVER=alsa");

  if(0 != SDL_Init(SDL_INIT_AUDIO)) PrintError("SDL_Init");

  SDL_AudioSpec want, have;
  SDL_AudioDeviceID dev;

  SetupWant(&want);
  dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);
  if (0 == dev) PrintError("SDL_OpenAudioDevice");
}

void SetupWant(SDL_AudioSpec * want)
{
  SDL_memset(want, 0, sizeof(SDL_AudioSpec));
  want->freq = 48000;
  want->format = AUDIO_F32;
  want->channels = 2;
  want->samples = 4096;
}

void PrintError(std::string source)
{
  std::cout << "error " << source << ": " << SDL_GetError() << "\n";
}

Я установил зависимости в своем проекте CMake с помощью conan. Вот файл conan:

[requires]
sdl2/2.0.12@bincrafters/stable
sdl2_image/2.0.5@bincrafters/stable
sdl2_mixer/2.0.4@bincrafters/stable
flac/1.3.2@bincrafters/stable
glib/2.64.0@bincrafters/stable
boost/1.71.0@conan/stable
zlib/1.2.11@conan/stable
bzip2/1.0.8@conan/stable
gtest/1.10.0
glm/0.9.9.8
libmpg123/1.25.13@bincrafters/stable
libalsa/1.2.4

[generators]
cmake

Зависимость sdl2/2.0.12@bincrafters/stable не поставляется с исходной папкой, однако я могу использовать пакет sdl2/2.0.10@bincrafters/stable для запуска sdl2 ./configure.

Вот краткое изложение:

SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic sensor power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   : mmx 3dnow sse sse2 sse3
Audio drivers   : disk dummy oss alsa(dynamic) pulse(dynamic) jack(dynamic) nas(dynamic)
Video drivers   : dummy x11(dynamic) opengl opengl_es2 vulkan
X11 libraries   : xcursor xdbe xinerama xinput2 xinput2_multitouch xrandr xscrnsaver xshape xvidmode
Input drivers   : linuxev linuxkd
Using libsamplerate : NO
Using libudev       : NO
Using dbus          : YES
Using ime           : YES
Using ibus          : NO
Using fcitx         : NO

В большинстве результатов Google в основном указываются имена пакетов, которые необходимо установить, а затем необходимо перестроить sdl2. Я делал это с любой библиотекой, которую мог найти таким способом.

Единственный другой совет, который я нашел, - это явно установить аудиодрайвер, что и приводит к проблеме с заголовком ELF.

Я новичок в Linux, а также в Conan и cmake. Я изо всех сил пытаюсь определить, что еще может быть сломано.

Это может быть проблема, которая является локальной для моей машины, но, судя по количеству обращений, которые я нашел в Интернете, я думаю, что эта общая проблема представляет более широкий интерес.

У меня вопрос: что не так с моей настройкой и как это исправить?

РЕДАКТИРОВАТЬ:

Я скопировал файл libasound.a в шестнадцатеричном формате, вот несколько первых битов:

00000000: 21 3C 61 72 63 68 3E 0A 2F 20 20 20 20 20 20 20    !<arch>./.......
00000010: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20    ........0.......
00000020: 20 20 20 20 30 20 20 20 20 20 30 20 20 20 20 20    ....0.....0.....
00000030: 30 20 20 20 20 20 20 20 36 33 33 30 32 20 20 20    0.......63302...

Читая ELF, он не похож на файл elf, который объясняет, почему загрузка его в предположении, что это файл elf, не удалась. Так что, может быть, отсюда и моя несовместимость.

Редактировать №1: я написал сообщение на libsdl.org.

Редактировать №2: я следил за публикацией в bincrafters / community

Курс №3: Эрик Леманисье создал запрос на вытягивание, который кажется быть частью решения.


person Johannes    schedule 05.11.2020    source источник
comment
Вы можете попробовать передать --build=all команде conan install, чтобы позволить conan скомпилировать все зависимости. Или просто --build=sdl2 --build sdl2_mixer --build sdl2_image.   -  person darcamo    schedule 06.11.2020
comment
@darcamo Только что попробовал --build=sdl2 --build sdl2_mixer --build sdl2_image, а после этого --build=sdl2 --build sdl2_mixer --build sdl2_image --build=libalsa перекомпилировать Conan. Все та же ошибка.   -  person Johannes    schedule 06.11.2020
comment
А как насчет --build=all? Он должен скомпилировать все зависимости, но я не уверен, что он также скомпилирует их зависимости. В идеале вы хотите определить, какая из библиотек, которые вы добавляете в свой файл conanfile, на самом деле зависит от libasound и используйте --build=identified_library. Кроме того, указав библиотеку, вы можете опубликовать проблему в репозитории рецептов conan этой библиотеки. В случае сборщиков мусора это этот репозиторий.   -  person darcamo    schedule 06.11.2020
comment
@darcamo Я попробовал еще раз проверить. Тот же результат.   -  person Johannes    schedule 06.11.2020


Ответы (1)


Проблема решена, и следы в вопросе показывают, как это сделать.

В конечном итоге возникло несколько многоуровневых проблем.

  • libalsa / 1.2.4 требовалось исправление для разделяемых библиотек, и мне пришлось добавить эту опцию в файл conan.
  • Мне пришлось подключить свои боксы, потому что устройством по умолчанию был канал, который я обычно не использую
  • В конечном итоге мне нужно будет правильно настроить звук в моей системе.
person Johannes    schedule 19.11.2020