Skip to main content

Sterowanie Amarokiem w Gnome

Zamieszczone w

Przyzwyczaiłem się już do tego, że podczas pracy przy komputerze, kontroluje swój odtwarzacz muzyki za pomocą skrótów klawiaturowych. Ponieważ od dawna używam już Amaroka a jak już pisałem tutaj, od pewnego czasu pracuję ze środowiskiem Gnome, musiałem poszukać jakiegoś nowego sposobu by kontrolować tę aplikację pochodzącą przecież ze środowiska KDE. Znalazłem nawet dwa sposoby.




Sposób pierwszy: proste jest piękne

Najprostszym sposobem na kontrolowanie tego odtwarzacza jest jego uruchomienie z odpowiednim parametrem w linii komend. Jeśli Amarok już działa, to ta działająca instancja wykona przekazane jako parametr polecenie. Jeśli nie działa - zostanie powołana do życia nowa instancja odtwarzacza a następnie dopiero wykona się przesłane polecenie. Na przykład w przypadku chęci zatrzymania aktualnie odtwarzanego utworu, należy po prostu napisać:

$ amarok --stop

Z kolei rozpoczęcie odtwarzania utworu z bieżącej listy można uzyskać poprzez:
$ amarok --play

Najciekawszy jednak wydaje się przełącznik --play-pause, którego użycie spowoduje:

  • pauzę jeśli odtwarzany jest właśnie jakiś utwór,
  • wyłączenie pauzy jeśli aktualnie odtwarzany utwór jest "zapauzowany",
  • rozpoczęcie odtwarzania utworu jeśli akurat żaden nie jest odtwarzany.

Teraz już bardzo łatwo można podpiąć wybraną akcję pod konkretny skrót klawiaturowy - za pomocą standardowego okna Gnome do konfigurowania skrótów klawiaturowych. Dodajemy własny skrót, w okienko Polecenie wpisujemy np. któreś z powyższych i definujemy dla niego kombinację klawiszy gu uruchamiającą. Gotowe.

Dla uzyskania listy wszystkich możliwych poleceń wystarczy uruchomić odtwarzacz z przełącznikiem --help:

$ amarok --help




Sposób drugi: szybkie też jest fajne

Do tej pory (tzn. w KDE w wersji 3.5 i wcześniejszych) przesyłać polecenia do aplikacji można było za pomocą mechanizmów DCOPa - systemu do komunikacji pomiędzy procesami zaprojektowanym dla KDE. Od wersji 4tej, KDE przechodzi jednak na DBUSa - rozwiązanie konkurencyjne używane przez Gnome'a. Nie chce mi się w tej chwili szukać odpowiedzi na pytanie czym pokierowana była ta decyzja, ale pierwsze co przychodzi mi do głowy to radosna myśl, że przynajmniej na pewnym poziomie następuje integracja niektórych mechanizmów obu środowisk. Na pewno przyczyni się to pozytywnie do rozwoju tzw. biurkowego Linuksa.

Aby nie powielać instrukcji używania z linii komend interfejsów udostępnianych przez aplikacje poprzez DBUSa, podam tylko kilka przykładowych poleceń kontrolujących pracę działającej instancji odtwarzacza Amarok.
Rozpoczęcie odtwarzania bieżącej listy uzyskujemy przez następującą komendę wysłaną do Amaroka przez szynę DBUS:

$ dbus-send --type=method_call --dest=org.kde.amarok /Player org.freedesktop.MediaPlayer.Play

Zakończenie odtawarzania to:
$ dbus-send --type=method_call --dest=org.kde.amarok /Player org.freedesktop.MediaPlayer.Stop

Identyczne zachowanie jak przy użyciu opisanego w sposobie pierwszym przełącznika --play-pause uzyskuje się dzięki:
$ dbus-send --type=method_call --dest=org.kde.amarok /Player org.freedesktop.MediaPlayer.PlayPause

Do wyświetlenia wszystkich możliwych operacji na interfejsie /Player użyć można polecenia qdbus, np.:

$ qdbus org.kde.amarok /Player
method void org.freedesktop.MediaPlayer.Backward(int)
signal void org.freedesktop.MediaPlayer.CapsChange(int)
method void org.freedesktop.MediaPlayer.Forward(int)
method int org.freedesktop.MediaPlayer.GetCaps()
method QVariantMap org.freedesktop.MediaPlayer.GetMetadata()
method void org.freedesktop.MediaPlayer.LoadThemeFile(QString)
method void org.freedesktop.MediaPlayer.Mute()
method void org.freedesktop.MediaPlayer.Next()
method void org.freedesktop.MediaPlayer.Pause()
method void org.freedesktop.MediaPlayer.Play()
method void org.freedesktop.MediaPlayer.PlayPause()
method int org.freedesktop.MediaPlayer.PositionGet()
method void org.freedesktop.MediaPlayer.PositionSet(int)
method void org.freedesktop.MediaPlayer.Prev()
method void org.freedesktop.MediaPlayer.Repeat(bool)
method void org.freedesktop.MediaPlayer.ShowOSD()
method void org.freedesktop.MediaPlayer.Stop()
method void org.freedesktop.MediaPlayer.StopAfterCurrent()
method void org.freedesktop.MediaPlayer.VolumeDown(int)
method int org.freedesktop.MediaPlayer.VolumeGet()
method void org.freedesktop.MediaPlayer.VolumeSet(int)
method void org.freedesktop.MediaPlayer.VolumeUp(int)
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()




Podsumowanie

Pierwszy z opisanych powyżej sposobów ma tę przewagę nad drugim, że w razie potrzeby uruchomi nawet instancję Amaroka. Drugi natomiast jest nieco szybszy:

$ time amarok --play-pause
 
real	0m0.051s
user	0m0.030s
sys	0m0.014s
$ time amarok --play-pause
 
real	0m0.051s
user	0m0.027s
sys	0m0.016s
$ time dbus-send --type=method_call --dest=org.kde.amarok /Player org.freedesktop.MediaPlayer.PlayPause
 
real	0m0.006s
user	0m0.000s
sys	0m0.002s
$ time dbus-send --type=method_call --dest=org.kde.amarok /Player org.freedesktop.MediaPlayer.PlayPause
 
real	0m0.005s
user	0m0.002s
sys	0m0.001s
$ 

Z tego też powodu, obecnie korzystam z komendy dbus-send.