Skip to main content

Медиаплеер на RPi и Android #адъмеломана

Приключения Google Play Music, телефона и медиацентра на RPi3

Хочу (просто сил моих нет, как хочу), чтобы Google Play Music прямо с телефона играл, красиво и аккуратно, и еще и управлялся бы магией из кнопок вебморды (об этом позднее, не сейчас, да). Несколько магических пассов wanted.

Хорошо описаны манипуляции с systemd/udev здесь, прям душевненько так. Идейное вдохновение черпалъ отсюда. Короче, оно работает, только у меня в принципе нет pulseaudio (что хорошо) – двинулся в сторону alsaloop, в силу специфики работы mpd работать не будет, это, так скажем, запланированная акция, dmix я использовать не собираюсь в принципе.

Часть один, systemd unit, для начала (я все понимаю, это круто, стильно, модно, но более несуразного монстроузного поделия не едал, и – да, мораль – systemd – дикий наворотъ, в простых задачах ужас-ужас и сильно доставляющая штуковина):

[Unit]
Requires=multi-user.target

[Service]
Type=forking
GuessMainPID=false
ExecStart=/bin/sh -c "exec /root/bin/sony-handler.sh %I"

Часть два, правило для udev, сразу оговорюсь – пробел нужно экранировать, то есть в оригинале \x20, а должно быть \x20 – иначе болт и вечерняя боль при попытке все это завести:

SUBSYSTEM!="usb", GOTO="sony_rules_end"
ACTION!="add", GOTO="sony_rules_end"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device",\
  ENV{ID_VENDOR_ID}=="0fce", ENV{ID_MODEL_ID}=="01bb",TAG+="systemd",\
  ENV{SYSTEMD_WANTS}="sony-handler@$env{ID_VENDOR_ID}\\x20$env{ID_MODEL_ID}.service"
LABEL="sony_rules_end"

Часть три, мега-скрипт для подключения моей радости телефона:

#!/bin/sh
/root/bin/android-usb-audio.py $1 $2
/usr/bin/mpc stop
sleep 3
exec /usr/bin/alsaloop -C plughw:1,0 -P hw:0,0 -t 50000 -f S32_LE -r 44100 -S 1 &

Результат после подключения телефона:

● sony-handler@0fce\x2001bb.service
   Loaded: loaded (/usr/lib/systemd/system/sony-handler@.service; static; vendor preset: disabled)
   Active: active (running) since Fri 2017-07-14 23:11:19 MSK; 3min 40s ago
  Process: 763 ExecStart=/bin/sh -c exec /root/bin/sony-handler.sh 0fce 01bb (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/system-sony\x2dhandler.slice/sony-handler@0fce\x2001bb.service
           └─776 /usr/bin/alsaloop -C plughw:1,0 -P hw:0,0 -t 50000 -f S32_LE -r 44100 -S 1 -d

июл 14 23:11:14 kangaroo systemd[1]: Starting sony-handler@0fce\x2001bb.service...
июл 14 23:11:16 kangaroo sh[763]: volume: 58%   repeat: on    random: off   single: off   consume: off
июл 14 23:11:19 kangaroo systemd[1]: Started sony-handler@0fce\x2001bb.service.
июл 14 23:12:45 kangaroo alsaloop[776]: underrun for playback hw:0,0
июл 14 23:12:46 kangaroo alsaloop[776]: overrun for capture plughw:1,0

Ну и, понятное дело, музыка играет, интернеты исправно идут в расход. Ресемплер больше чем на 44100 ставить смысла не имеет, играем с интернетов, акромясь лишней нагрузки – ничего хорошего не выгорит, ну разве что Poweramp гонять, но таких планов нет. underrun/overrun – будучи честным человеком, я забил на них, это не особо беспокойная тема.

Srate 44100:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 688048  16204 149296    0    0     7     1  374  101  1  0 99  0  0
 0  0      0 688048  16204 149296    0    0     0     0 9389  478  0  0 100  0  0
 0  0      0 688016  16204 149296    0    0     0     4 9391  531  0  0 100  0  0
 0  0      0 688048  16204 149296    0    0     0     0 9399  478  0  0 100  0  0

Srate 192000, уже не так жизнерадостно и кучеряво, это же mini-компьютер 😉

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 685780  16320 151500    0    0     7     1  423  102  1  0 99  0  0
 0  0      0 685780  16320 151500    0    0     0     0 16749  728 12  5 84  0  0
 0  0      0 685772  16320 151508    0    0     0     0 17516  771 13  1 86  0  0
 0  0      0 685772  16320 151508    0    0     0     0 17505  755 12  0 87  0  0