Медиаплеер на 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