edit

Этот хитрый маемо

event Mon 22 Nov '10
label pulseaudio, глюки, maemo, n900
language ru
code code

Относительно недавно я стал счастливым владельцем Nokia N900. Телефоном этот волшебный девайс язык назвать не поворачивается, это действительно «мобильный компьютер», который ко всему прочему может звонить. При этом при звонке запускаяется отдельное приложение «Телефон» со всеми вытекающими.

Девайс этот работает на Maemo 5, которая суть Дебиан допиленный усилиями Нокии, со всеми вытекающими плюшками, включая обширные дебиановские репы софта. Рассказывать про этот девайс ещё смысла нет, т.к. в гуглонете про него инфы до фига и трошки, а вот про недавнее приключение рассказать стоит.

Относительно, опять же, недавно, вышла свежая прошивка PR1.3. Как истинный дебианщик вместо перепрошивки я сделал просто «aptitude update && aptitude safe-upgrade -y» и успешно скачал 80 с лишним метров апдейтов. Всё было вроде неплохо, хотя иногда после перезагрузке перестал работать звук в телефоне, то есть телефон при звонке запускался, но слышать не мог ни я собеседника, ни мой собеседник меня. Перезагрузка как правило всё чинила, потому за неимением времени я на это забил. Недавно же выяснилось ещё несколько неприятных моментов. Сам я последнее время плеером не пользовался, да и звук держал выключенным, но вот выпросила у меня малая мультик на «асё» (то есть телефоне на её детском языке). Включил плеер и подивился нескольким интересным симптомам, как то:

  1. звук не регулируется хардварной кнопкой-качалкой,
  2. при попытке проиграть любой аудио- или видеофайл стандартный плеер выдавал ошибку на неподдерживаемый формат файла, хотя раньше он все эти файлы проигрывал прекрасно,
  3. mplayer проигрывал всё, но без звука.

Все симптомы говорили о том, что что-то стряслось с pulseaudio, а ps подтвердил эту догадку. Попытка запустить пульс через «start pulseaudio» приводила к тому, что апстарт жаловался на слишком быстрый респавн процесса и прекращал всякие попытки пульс оживить.

С третьей перезагрузки пульс ожил сам. Я за него порадовался и отложил разборки на потом, т.к. надо было бежать по делам.

Недавно вот решиль всё же погуглить мою проблему и нашёл такое решение:

I found the reason. At least on my device pulseaudio application depends on the library libFLAC.

On device start the system starts the pulseaudio daemon. As it needs libFLAC the system tries to load this library. The library is at /opt/maemo/usr/lib/libFLAC.so.8.2.0

So the application pulseaudio fails to load (cannot load library libFLAC.so, no such file) Because all this happens before the internal mmc is mounted :-)

After failing to start the daemon the system tries this again and again. It may work at some point when the internal mmc is mounted. But sometimes the restart (respawn) happens to often and the system stops this process.

I don't know why pulseaudio needs this lib, it has something to do with the package decoders-support. But it seems this only happens if you upgraded to PR1.3.

I did a reflash now and installed decoders-support. The libFLAC library is on /opt/maemo .... But pulseaudio starts without an error. (And it does not depend on this library anymore, ldd /usr/bin/pulseaudio shows which librarys are needed by an executable/library).

Nicolai

В общем смысл бага такой: при прямой прошивки все либы кладутся прямо туда, куда надо (т.к. всё прописано в образе), так что libFLAC оказывается в /usr/lib напрямую, поэтому никаких глюков нет. Но при апдейте через репозитории после разворачивания пакетов запускается замечательный хук optify, который часть установленного пакета (вроде либ) перемещает в /opt/maemo, который смонтирован на другой раздел большего размера, чтобы сэкономить лишние пару килобайт в маленьком рутфс. Всё бы хорошо, но пульс зависит от libflac8, который в образе для прошивки напрямую устанавливает свои либы в /usr/lib, а при апдейте менеджером пакетов запускается optify, которые эти либы успешно перемещает в /opt/maemo/usr/lib и оставляет в /usr/lib симлинки.

Теперь начинается магия апстарта, который асинхронен по природе своей, что приводит к интересному рейс кондишену. Запуститься ли пульс при загрузке или нет зависит только от того, успеет ли до запуска пульса произойти полное монтирование раздела /opt или нет. Не успеет — пульс грохнется при запуске от недостатка libflac, успеет — всё будет работать прекрасно. Тот факт, что у меня он не запускался и ручками, может объясняться тем, что запускал я его сразу после перезагрузки, запустив терминал ещё до того, как все сервисы поднялись. В общем задача на данный момент решена с помощью «rm /usr/lib/libFLAC.so.8.2.0 && cp /opt/maemo/usr/lib/libFLAC.so.8.2.0 /usr/lib», пока не перегружался, так что подтвердить фикс на 100% не могу, но судя по дальнейшему разговору в найденном топике, я прав (равно как и Николай из топика).