ubuntuusers.de

xmms2 seek mit variable ansprechen

Status: Gelöst | Ubuntu-Version: Ubuntu 15.04 (Vivid Vervet)
Antworten |

digital-junkie

Anmeldungsdatum:
26. Januar 2009

Beiträge: 26

Moin,

ich habe gerade einen Audioplayer für meine Kinder gebaut und ein Shell-Skript geschrieben. Die Kinder können nun über einen Druck auf einen von 6 Buttons, denen jeweils eine bunte Figur zugeordnet ist, einen Song bzw. eine Playlist auswählen und abspielen (beliebiges Audioformat). Der Quelltext ist hier:

https://github.com/Terminal-Geek/Audioplayer

Das Ganze basiert auf einem Raspberry Pi mit Raspbian (wie Ubuntu ein Debian-Derivat, weshalb ich mich dafür entschieden habe, weil ich seit Jahren mit Ubuntu arbeite). Als Player-Daemon fungiert xmms2. Die Inputs erfolen über die GPIO pins des Raspberry Pi.

Die ausführliche Doku mache ich, wenn das Projekt vollständig zu Ende entwickelt ist. Das eine oder andere Feature (auf Seiten von Hardware und Software) fehlt nämlich noch.

Nun möchte ich erreichen, dass nach dem Anspringen einer Playlist der zuletzt gespielte Track an derselben Stelle fortgesetzt wird, wo er zuletzt gespielt wurde. Dafür lasse ich im Hintergrund ein Helper-Script laufen, das alle zehn Sekunden den gerade gespielten Track und die aktuelle Spielzeit in eine Datei schreibt. Die kann ich dann wiederum im Audioplayer-Skript auslesen (mit grep) - selbst nach einem Neustart des Systems bleibt somit die letzte Position im Track erhalten. Jede Playlist (6 Stück) hat ihre eigene "Log-Datei", die alle so aufgebaut sind:

track: x

playtime: yy:zz

So weit die Theorie. Das Auslesen der Variablen funktioniert auch wunderbar. Setzte ich die Variable für den Track als Integer (typeset -i track), kann ich den richtigen Track mit

xmms2 jump $track

anspringen. Wunderbar. Bei playtime funktioniert Folgendes NICHT:

xmms2 seek $playtime

Mit Anführungsstrichen und einfachen Anführungsstrichen rund um $playtime geht es auch nicht.

Mit einer "Umtypisierung" der Variablen in einen integren Wert komme ich natürlich auch nicht weiter: yy:zz ist nun mal kein Integer.

Hat jemand eine Idee, wie ich das gewünschte Verhalten erreiche?

Jeder Hinweis hilft. Danke! Digital-Junkie

Sh4kal

Anmeldungsdatum:
18. August 2011

Beiträge: 343

Grüße,

kann zwar nicht groß mit Bash programmieren, aber hier vlt ein Denkanstoß: In einer älteren Manpage von xmms2 hier wird beim Argument seek ausdrücklich von Sekunden gesprochen. In der aktuellen Version wird nur noch von "time" und "offset" gesprochen hier. Hast du mal versucht den Wert, den du seek übergibst, in Sekunden umzurechnen? Also deine Playtime variable in y und z am ":" cutten und y*60+z zu rechnen?

digital-junkie

(Themenstarter)

Anmeldungsdatum:
26. Januar 2009

Beiträge: 26

Das ist ein interessanter Ansatz. Probiere ich mal aus. Danke!

digital-junkie

(Themenstarter)

Anmeldungsdatum:
26. Januar 2009

Beiträge: 26

Juhu, es funktioniert! ABER …

Hier erstmal der Code, so weit ich ihn fertig habe. Das Anspringen der letzten Wiedergabe-Stelle im Song habe ich zunächst nur für den ersten Button implementiert:

https://github.com/Terminal-Geek/Audioplayer/blob/master/audioplayer

Die Funktion read_playlist_history, die aus den lokal geschriebenen History-Dateien die letzte Wiedergabestelle extrahiert, ist vor dem Loop zu finden.

Jetzt habe ich aber den merkwürdigen Effekt, dass ich nach Anspringen der richtige Stelle im Song mit seek plötzlich einen "Zeitlupen"-Effekt im Sound habe: Die Datei wird mit geringerer Geschwindigkeit wiedergegeben. Hört sich lustig an, ist aber so natürlich nicht wirklich gewollt. Ich habe es mit einem alsa suspend, gefolgt von einem alsa resume versucht, das scheint auch partiell zu funktionieren, aber erstens kann es das ja nicht sein, und zweitens ist der Effekt nicht wirklich reproduzierbar.

Hat jemand eine Idee?

digital-junkie

(Themenstarter)

Anmeldungsdatum:
26. Januar 2009

Beiträge: 26

Ich habe die Lösung, aber eine andere, als ich eigentlich zu finden gedachte. xmms2 hat doch so einige Probleme mit der Seek-Funktion in meinem Setting. Ich hatte zwischenzeitig ein kleines Delay eingebaut nach Umschalten der Playlist (sleep 0.5), das brachte auch Erfolg, aber nicht zuverlässig und bedingt reproduzierbar. Und zwischendurch wurden dann doch einzelne Audios wieder von vorne an gespielt, obwohl sie vorher schon mal angespielt worden waren. Sei's drum, always kill your darlings. Ich bin also umgestiegen auf eine andere Server-Client-Lösung für den Player: mpd in Kombination mit dem Kommandozeilen-Player mpc. Ts ts ts, dass ich da nicht schon früher drauf gekommen bin. Läuft nun wie Schmitz' Katze und exakt so, wie ich es haben wollte. Hier der Code:

https://github.com/Terminal-Geek/Audioplayer/blob/mpd/audioplayer

Sh4kal

Anmeldungsdatum:
18. August 2011

Beiträge: 343

Freut mich zu hören 👍

Eigenentwicklungen sind immer noch die schönsten.

Antworten |