Skocz do zawartości

Przycisk na USB pod Ubuntu 22.04


pswiton

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
Link do komentarza
Share on other sites

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/user@1000.service/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

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.
 

Link do komentarza
Share on other sites

Coś jest nie tak - dlaczego to jest enabled?

Co powie polecenie:

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

i potem jeszcze raz status

Link do komentarza
Share on other sites

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ć.

 

Link do komentarza
Share on other sites

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

 

Link do komentarza
Share on other sites

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

 

 

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.