Skocz do zawartości

Pomocna odpowiedź

18 godzin temu, pswiton napisał:

Jak dodać tą aplikację do startup w Ubuntu, próbowałem wg poniższego linku i nie działa:

 

Nic dziwnego, bo to służy np. do uruchamiania gadu-gadu od razu po zalogowaniu, a nie do uruchamiania usług systemowych. Ale to potem.

Przede wszystkim przeczytaj to: https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/

I weź pod uwagę fakt, że ktoś Ci może coś pourywać (niekoniecznie uszy) jak spinkolisz konifgurację wymarzonego Ubuntu. Wszystko robisz na własną odpowiedzialność!

Dalej: ja to testuję na Ubuntu 20.04 (na pewno nie będę już nowych wersji instalować bo jak na mój gust to się nawet na desktop przestaje nadawać). Mam nadzieję, że w 22.04 jest tak samo.

No więc zaczynamy administrowanie systemem - przestawiamy PA w tryb system-wide.

Najpierw coś bezpiecznego. Tylko nie dodawaj od siebie jakichś sudo bo sam będziesz naprawiał. I nie zmieniaj nic w tych poleceniach!

Wydaj polecenie:

systemctl --user status pulseaudio

Powinno wyświetlić jakiś sensowny tekst. Jeśli stwierdzi że nie może czegoś znaleźć, w tym miejscu kończ zabawę i napisz co on wypisał.

 W folderze /etc/pulse jest plik system.pa - skopiuj go gdzieś sobie na wszelki wypadek jakbyś coś źle wpisał, a potem znajdź linijkę:

load-module module-native-protocol-unix 

i zamień na:

load-module module-native-protocol-unix auth-anonymous=1 

 

Teraz trzeba wyłączyć pulseaudio:

systemctl --user stop pulseaudio.service
systemctl --user stop pulseaudio.socket
sudo systemctl --global disable pulseaudio.service pulseaudio.socket

Jeśli teraz wydasz polecenie "play cośtam.mp3" poczęstuje ciebie linijką o tym że czegoś nie może, a potem pewnie odtworzy plik przez driver ALSA. Nieważne, ale na wszelki wypadek sprawdź jeszcze raz status:

systemctl --user status pulseaudio

Powinno wyświetlić coś w stylu:

● pulseaudio.service - Sound Service
     Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; disabled; vendor>
     Active: inactive (dead)
TriggeredBy: ● pulseaudio.socket

Jeśli tak, idziemy dalej.

Trzeba stworzyć plik dla systemd:

[Unit]
Description=Sound Service
 
[Service]
# Note that notify will only work if --daemonize=no
Type=notify
ExecStart=/usr/bin/pulseaudio --daemonize=no --exit-idle-time=-1 --disallow-exit=true --system --disallow-module-loading
Restart=always
 
[Install]
WantedBy=default.target

Plik trzeba wrzucić do folderu /etc/systemd/system/ - ma być dokładnie taki jak wyżej.

Teraz uruchamiamy maszynerię:

sudo systemctl start pulseaudio

i sprawdzamy czy działa:

sudo systemctl status pulseaudio.

Powinno wyświetlić coś w stylu:

● pulseaudio.service - Sound Service
     Loaded: loaded (/etc/systemd/system/pulseaudio.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-05-26 07:56:33 CEST; 38min ago
   Main PID: 1068 (pulseaudio)
      Tasks: 4 (limit: 18763)
     Memory: 11.6M
     CGroup: /system.slice/pulseaudio.service
             └─1068 /usr/bin/pulseaudio --daemonize=no --exit-idle-time=-1 --disallow-exit=true --system --disallow-module-loading

maj 26 07:56:33 darva systemd[1]: Starting Sound Service...
maj 26 07:56:33 darva pulseaudio[1068]: N: [pulseaudio] main.c: Uruchamianie w trybie systemowym, wymuszanie wyłączenia trybu SHM.
maj 26 07:56:33 darva pulseaudio[1068]: W: [pulseaudio] main.c: PulseAudio jest uruchomione w trybie systemowym. Proszę się upewnić, że na pewno tak ma być.
maj 26 07:56:33 darva pulseaudio[1068]: W: [pulseaudio] main.c: Proszę przeczytać http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/ , gdzie wyjaśniono, dlaczego tryb systemowy jest zwykle złym pomysłem.
maj 26 07:56:33 darva pulseaudio[1068]: W: [pulseaudio] authkey.c: Failed to open cookie file '/var/run/pulse/.config/pulse/cookie': Nie ma takiego pliku ani katalogu
maj 26 07:56:33 darva pulseaudio[1068]: W: [pulseaudio] authkey.c: Failed to load authentication key '/var/run/pulse/.config/pulse/cookie': Nie ma takiego pliku ani katalogu
maj 26 07:56:33 darva pulseaudio[1068]: W: [pulseaudio] authkey.c: Failed to open cookie file '/var/run/pulse/.pulse-cookie': Nie ma takiego pliku ani katalogu
maj 26 07:56:33 darva pulseaudio[1068]: W: [pulseaudio] authkey.c: Failed to load authentication key '/var/run/pulse/.pulse-cookie': Nie ma takiego pliku ani katalogu
maj 26 07:56:33 darva systemd[1]: Started Sound Service.

(darva to mój host). Komunikatami o cookie i kluczu możesz zignorować, bo i tak nie będą używane (to ta linijka co była zmieniana w system.pa).

Jeśli tak, to pozwalamy mu startować przy każdym uruchomieniu systemu:

sudo systemctl enable pulseaudio

Możesz teraz przetestować:

play cośtam.mp3 - powinno zagrać

sudo play cośtam mp3 - poprzednio nie działało, a teraz powinno zacząć działać.

Jeśli wszystko jest w porządku będzie można stworzyć usługę odgrywającą mp3 przy naciśnięciu klawisza. Ale warunkiem jest na razie to, że wszystko (również po reboocie) działa prawidłowo.

Daj znać czy działa.

  • Lubię! 1
1 godzinę temu, ethanak napisał:
systemctl --user status pulseaudio

wyrzucio mi takie coś:

patw@patw-Default-string:~$ systemctl --user status pulseaudio
● pulseaudio.service - Sound Service
     Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-05-26 09:23:52 BST; 3min 8s ago
TriggeredBy: ● pulseaudio.socket
   Main PID: 1352 (pulseaudio)
     CGroup: /user.slice/user-1000.slice/[email protected]/pulseaudio.service
             └─1352 /usr/bin/pulseaudio --daemonize=no --log-target=journal

May 26 09:23:51 patw-Default-string systemd[1346]: Starting Sound Service...
May 26 09:23:52 patw-Default-string systemd[1346]: Started Sound Service.
May 26 09:24:17 patw-Default-string pulseaudio[1352]: GetManagedObjects() failed: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection

8 minut temu, pswiton napisał:

wyrzucio mi takie coś:

 

Czyli pulseaudio działa sobie w trybie user, teraz dalej. I nie wrzucaj mi słitaśnych foci swojego ekranu bo i tak nie dam rady ich obejrzeć.

2 godziny temu, ethanak napisał:

Powinno wyświetlić coś w stylu:

● pulseaudio.service - Sound Service
     Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; disabled; vendor>
     Active: inactive (dead)
TriggeredBy: ● pulseaudio.socket

Jestem tu, i wyrzuca mi tak, wygląda na to że jak narazie wszystko idzie agodnie z planem:

● pulseaudio.service - Sound Service
     Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Fri 2023-05-26 09:52:03 BST; 2min 3s ago
TriggeredBy: ● pulseaudio.socket
    Process: 1352 ExecStart=/usr/bin/pulseaudio --daemonize=no --log-target=journal (code=exited, status=0/SUCCESS)
   Main PID: 1352 (code=exited, status=0/SUCCESS)

May 26 09:23:51 patw-Default-string systemd[1346]: Starting Sound Service...
May 26 09:23:52 patw-Default-string systemd[1346]: Started Sound Service.
May 26 09:24:17 patw-Default-string pulseaudio[1352]: GetManagedObjects() failed: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection>
May 26 09:52:03 patw-Default-string systemd[1346]: Stopping Sound Service...
May 26 09:52:03 patw-Default-string systemd[1346]: pulseaudio.service: Succeeded.
May 26 09:52:03 patw-Default-string systemd[1346]: Stopped Sound Service.
 

Coś jest nie tak - dlaczego to jest enabled?

Co powie polecenie:

sudo systemctl --global disable pulseaudio.service pulseaudio.socket

i potem jeszcze raz status

OK to jedziemy dalej.

Przede wszystkim zrobiłem literówkę w programie w pythonie, ale to szybka poprawka: Zamieniasz:

        subprocess.call(['play','-q','-t','mp3',filename])

na:

        subprocess.call(['play','-q','-t','mp3',fname])

(tak to jest jak się coś robi na szybko)

No i teraz trzeba to jakoś uruchomić.  Ponieważ systemd bardzo chce przechowywać jakieś logi, a przekierowania w pliku service nie działają, tworzycz prosty skrypt i umieszczasz go w pliku serkey.sh (tam gdzie serkey.py i tak dalej):

#!/bin/bash
pełna_ścieżka_do_serkey.py >/dev/null 2>&1

Na wszelki wypadek możesz to uruchomić:

bash serkey.sh

Powinien reagować na klawisz. Jeśli tak, ostatnia czynność to stworzenie pliku service. Ma on postać:

[Unit]
Description=USB key player
 
[Service]
Type=simple
ExecStart=/bin/bash pełna_ścieżka_do_serkey.sh
Restart=always
RestartSec=20

[Install]
WantedBy=multiuser.target

Oczywiście tam gdzie jest pełna_scieżka_do_czegośtam podajesz rzeczywistą absolutną ścieżkę do pliku. Jeśli nie wiesz co to za zwierz ta absolutna ścieżka, wejdż po prostu do foldera gdzie trzymasz pliki serkey.cośtam i wydaj polecenie:

ls $PWD/serkey.sh

Plik service umieszczasz w /etc/systemd/system/ (jak poprzednio przy pulseaudio) i wydajesz polecenie:

sudo systemctl start serkey

System powinien reagować na wciśnięcie klawisza na Pico. Jeśli tak, to podajesz:

sudo systemctl enable serkey

i po reboocie sprawdzasz, czy działa.

Jest jedna wada tego rozwiązania: całość działa z roota, a to nie jest wskazane. Możesz lekko zmodyfikować plik service tak, żeby działał z konkretnego uzytkownika (np. z tego z którego się logujesz). W tym celu w pliku service dodajesz zaraz za RestartSec linijkę:

USER=nazwaużytkownika

(oczywiście podając właściwą nazwę).

Teraz trzeba poinformować systemd że zmieniliśmy plik:

sudo systemctl daemon-reload
sudo systemctl restart serkey

Powinno dalej działać.

Teraz tylko ostatnia sprawa:

sudo loginctl enable-linger nazwaużytkownika

(to po to, aby nie zatrzymywał demona serkey przy wylogowaniu)

...i to powinno być wszystko.

Proste 🙂

I jedna uwaga: jeśli odłączysz Pico od USB, program się przerwie, ale demon co 20 sekund będzie próbował go uruchomić.

 

37 minut temu, ethanak napisał:
bash serkey.sh

OK, działa na powyższe polecenie ale nie działa na:

38 minut temu, ethanak napisał:
sudo systemctl start serkey

 

zmienione mam nazwy plików serkey na ad

w folderze /home/patw/Music mam pliki ad.mp3, ad.py i ad.sh

w pliku ad.sh:

#!/bin/bash
/home/patw/Music/ad.py >/dev/null 2>&1

 

w folderze /etc/systemd/system plik ad.service a w pliku:

[Unit]
Description=USB key player
 
[Service]
Type=simple
ExecStart=/bin/bash /home/patw/Music/ad.sh
Restart=always
RestartSec=20

[Install]
WantedBy=multiuser.target

 

 

1 minutę temu, ethanak napisał:

Poprawiłeś tą linijkę w pythonie?

Tak, jest jak poniżej:

#!/usr/bin/env python3
import serial, subprocess, os, alsaaudio

volume = 90
filename="ad.mp3"
fname=os.path.join((os.path.dirname(os.path.abspath(__file__))),filename)

try:
    serport=serial.Serial('/dev/ttyACM0',115200,timeout=0.1)
except:
    serport=serial.Serial('/dev/ttyACM1',115200,timeout=0.1)
M=alsaaudio.Mixer()

while True:
    r=serport.readline()
    if r.strip() == b'#up':
        oldvol = M.getvolume()
        if oldvol[0] < volume or oldvol[1] < volume:
            M.setvolume(volume)
        else:
            oldvol=None
        subprocess.call(['play','-q','-t','mp3',fname])
        if oldvol is not None:
            M.setvolume(oldvol[0],0)
            M.setvolume(oldvol[1],1)
        while serport.read():
            pass

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...