Software-Experimente mit Linux

frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

Sire hat geschrieben: Bei der Gelegenheit: Ich habe gestern noch ein paar Versuche mit einem USB-Plattenspieler gemacht. Den habe ich einfach an einen USB-Port des RPi2 angeschlossen. Per

Code: Alles auswählen

rec  -t raw -r 44100 -c 2 -e signed -b 16 - | nc -l -q 0 -p 3456
auf dem Server und einem zu

Code: Alles auswählen

nc 192.168.170.33  3456 | playhrt \
geänderten Eintrag im play_simple-script auf dem Audiorechner geht es schon. Das müsste doch auch mit dem play_remote-script des Servers möglich sein, um eben die ganzen Schmankerl zu genießen. Aber wie müsste das script angepasst werden?
Hallo Klaus,

das play_remote spielt ja eine als Argument übergebene flac-Datei über den remote Rechner. Du kannst natürlich eine Variante, sagen wir play_remote_from_usb erzeugen, die statt der flac-Datei mit rec den USB-Port ausliest.

In play_remote wird eine flac-Datei als erstes Argument übergeben. Dann wird die Samplerate der flac-Datei bestimmt, danach wird die Datei mit cptoshm in den RAM geladen und schließlich mit shmcat nach sox zum decodieren geschickt. Das wird alles nicht benötigt, sondern durch den Aufruf von rec ersetzt, den Du oben angegeben hast.

Hier also die genaue Anleitung:
  • Kopiere play_remote nach play_remote_from_usb und editiere letztere.
  • Lösche die Zeilen, die mit 'ORIGRATE=', 'cptoshm' und mit 'rm -f' anfangen.
  • Ersetze die Zeilen

    Code: Alles auswählen

    shmcat --shmname=/play.flac |
          sox  -t flac -  -t raw -r ${ORIGRATE} -c 2 -e float -b 64 - | \
    
    durch

    Code: Alles auswählen

    ORIGRATE=44100
    rec  -t raw -r 44100 -c 2 -e signed -b 16 -  |
         sox -t raw -c 2 -r 44100 -e signed -b 16 - \
               -t raw -r 44100 -c 2 -e float -b 64 - | \
    
  • Ausprobieren,ob es klappt . . .
Viele Grüße,
Frank
Bild
Sire
Aktiver Hörer
Beiträge: 309
Registriert: 02.12.2013, 14:01

Beitrag von Sire »

Hallo Frank,

es läuft mit den Anpassungen. Wieder sehr beeindruckend. Ich werde demnächst mit einem besseren Dreher experimentieren und weiter berichten...

Herzlich

Klaus
Bild
Tinitus
Aktiver Hörer
Beiträge: 1322
Registriert: 10.11.2013, 21:48

Beitrag von Tinitus »

Hallo Klaus,

freut mich, dass Du mit Franks Programmen so gute Erfahrungen machst. Mich würde interessieren, ob Franks 0-Datei für brutefir damit verwenbar wäre, so dass ich testen könnte, ob der pipe out funktioniert, ohne schon einen Filter für brutefir zu haben.

Gruß

Uwe
Bild
frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

Tinitus hat geschrieben: freut mich, dass Du mit Franks Programmen so gute Erfahrungen machst. Mich würde interessieren, ob Franks 0-Datei für brutefir damit verwenbar wäre, so dass ich testen könnte, ob der pipe out funktioniert, ohne schon einen Filter für brutefir zu haben.
Hallo Uwe und andere Interessierte,

die Beispiel brutefir config-Datei ist unten auf [url=http://frank_l.bitbucket.org/stereoutils/loco.html]dieser Seite[/url]. Ich habe darunter einen Hinweis hinzugefügt: Kommentiere einfach das Einlesen von Filtern, die Du (noch) nicht hast, aus und ersetze diese weiter unten in den 'filter' Einträgen durch '-1'. Damit wird das Signal einfach durchgelassen ("Dirac"-Filter).

Viele Grüße,
Frank
Bild
Tinitus
Aktiver Hörer
Beiträge: 1322
Registriert: 10.11.2013, 21:48

Beitrag von Tinitus »

Hallo Frank,

wie im anderen Thread gerade fest gestellt käme ich eigentlich auch ohne mpd aus. Von deinen Programmen gefällt mir:

Player script with convolver and other tricks

am besten. Ich würde es ohne RACE (also nur ein Wert für Vol eingeben) und ohne brutfir (keine conf und brutefir Zeile auskommentieren) verwenden. Vol 1 und Vol -1, wären dann maximale Lautstärke und maximale Lautstärke invertiert?
Schön ist, dass das Programm die sample rate der zu spielenden Datei selbst findet. Was muss ich auskommentieren, wenn ich auch nicht upsamplen will?
Habe ich es richtig verstanden, dass die Extrabytespersecond Funktion eine gute Synchonisation des Audiorechners mit dem DAC erlaubt (und dann eine PLL überflüssig machen könnte?).
Ansonsten erlaubt es das Programm Dateien aus dem RAM zu spielen, ohne dass die ganze Datei auf einmal ins RAM geladen werden muss.
Die Gretchenfrage für mich als Albumhörer, gibt es eine Möglichkeit mit diesem script mit einmaligen Aufruf ein ganzes Album (mehrere WAV Dateien) an den DAC weiter zu leiten?
Wie kann ich das Script auf dem Rechner speichern, so dass ich nur noch eingeben muss, wo sich die zu lesenden Dateien (das Album) befinden und es dann gleich los geht?

Gruß

Uwe
Bild
frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

Tinitus hat geschrieben: wie im anderen Thread gerade fest gestellt käme ich eigentlich auch ohne mpd aus. Von deinen Programmen gefällt mir:

Player script with convolver and other tricks

am besten. Ich würde es ohne RACE (also nur ein Wert für Vol eingeben) und ohne brutfir (keine conf und brutefir Zeile auskommentieren) verwenden. Vol 1 und Vol -1, wären dann maximale Lautstärke und maximale Lautstärke invertiert?
Schön ist, dass das Programm die sample rate der zu spielenden Datei selbst findet. Was muss ich auskommentieren, wenn ich auch nicht upsamplen will?
Hallo Uwe,

ok, Du möchtest das Skript play_upsample_convolve, aber ohne Upsampler, brutefir und RACE. Das erinnert mich an das Kind, das selbstbewusst in der Pizzeria eine "Pizza Tonno, aber ohne Thunfisch und Käse" bestellt.

Wir können vielleicht erstmal per PN das richtige Skript für Dich finden und dann eventuell hier berichten.
Tinitus hat geschrieben: Habe ich es richtig verstanden, dass die Extrabytespersecond Funktion eine gute Synchonisation des Audiorechners mit dem DAC erlaubt (und dann eine PLL überflüssig machen könnte?).
Nein, dass ist nicht richtig. Eine PLL ist dafür zuständig, beim Abspielen Sample für Sample ein konstantes Timing zu erzeugen. In der Abspiel-Software transportieren wir immer nur Blöcke von Daten, nicht einzelne Samples. Das Programm playhrt --mmap benutzt den hochauflösenden Timer des Rechners, um in sehr regelmäßigen Abständen einen Block von Samples in den Speicher des Hardwaretreibers zu schreiben. (Andere Programme nutzen entweder Interrupts des Rechners, um zu wissen, wann Daten geschrieben werden können oder nutzen "blocking write", überlassen es also dem Betriebssystem, die Daten wirklich zu schreiben, wenn Platz dafür vorhanden ist.) Die Option --extra-bytes-per-second ist zum Feintuning, um dafür zu sorgen, dass immer ungefähr der halbe Hardwarebuffer gefüllt ist. Zu Anfang kann die doppelte --verbose Option angeschaltet werden, über die man Informationen über den jeweils verfügbaren Speicher im Puffer bekommt, um den passenden Wert für --extra-bytes-per-second zu finden.
Tinitus hat geschrieben: Ansonsten erlaubt es das Programm Dateien aus dem RAM zu spielen, ohne dass die ganze Datei auf einmal ins RAM geladen werden muss.
ist das als Frage gemeint? Ich kopiere (in der Regel ein ganzes Album) die Musik zum Abspielen zuerst ins RAM und hänge dann die Festplatte sogar aus. Wenn man nicht genug Speicher hat, oder nicht erst auf das Kopieren in den Speicher warten will, kann man die Daten mittels writeloop und catloop lesen, wobei man mit der Puffergröße (--file-size) etwas experimentieren kann. Ich fand kleine Puffer eher besser, mit großem Puffer kann man ein unregelmäßiges Lesen aber gut ausgleichen.
Tinitus hat geschrieben: Die Gretchenfrage für mich als Albumhörer, gibt es eine Möglichkeit mit diesem script mit einmaligen Aufruf ein ganzes Album (mehrere WAV Dateien) an den DAC weiter zu leiten?
Wie sind denn Alben bei Dir abgespeichert? Eine flac-Datei pro Track und alle Tracks eines Albums in einem separaten Verzeichnis? (Vielleicht schreibst Du noch etwas genauer, was Du möchtest per PN, dann kann ich einen Vorschlag machen.)
Tinitus hat geschrieben: Wie kann ich das Script auf dem Rechner speichern, so dass ich nur noch eingeben muss, wo sich die zu lesenden Dateien (das Album) befinden und es dann gleich los geht?
Die beiden Standardmöglichkeiten unter Linux/UNIX sind: das Skript etwa in /usr/local/bin kopieren, da dieses Verzeichnis meist im Standard-Suchpfad aller Benutzer ist (Deinen kannst Du mit 'echo $PATH' sehen). Oder in ein beliebiges Verzeichnis kopieren und dieses zum eigenen PATH hinzufügen (in der Konfiguration Deiner shell).

Viele Grüße,
Frank
Bild
frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

frankl hat geschrieben:
Daihedz hat geschrieben: Und noch eine andere Frage: Ab Kernel 3.14 ist neu deadline scheduling implementiert. Bringt dies nach Deinem Dafürhalten Vorteile für Deine Programme, und falls ja: müssten in diesem Falle Deine Script-Beispiele etwas modifiziert werden, um das neue Feature zu nutzen?
Gute Frage. Die Antwort weiß ich (noch) nicht. Vielleicht hast Du gesehen, dass mein Audio-Rechner so ein Aria G25 Board ist, von dem ich hier schon berichtet habe. Darauf benutze ich noch einen selbst cross-kompilierten 2.6.39 Kernel. Ich kann zwar einen neuen Kernel kompilieren, wie auf der Acme Seite beschrieben, aber wenn ich highres-timer einschalte bootet der nicht. Das wird meine nächste Software-Baustelle. Mit einem neueren Kernel hätte ich neuere Scheduler und eine neue ALSA Version - der USB Audio Treiber hat sich da auch stark geändert.
Hallo Linux-Experimentierer,

hier sind noch zwei Anmerkungen zu der obigen alten Frage (April 2014) von Simon.

Vor einiger Zeit ist es mir gelungen, einen für meine Zwecke geeigneten 3.16 Kernel für mein Aria G25 zu erzeugen. Der 'deadline scheduler' ist allerdings ein Ein- und Ausgabe Scheduler, etwa für Festplattenzugriffe. Deswegen ist der auf meinem Audiorechner gar nicht relevant, da ich Daten nur vom Netzwerk lese.

Ich bin jetzt aber auch der Frage nach dem deadline scheduling nachgegangen, allerdings auf meinem Convolver Rechner. Der Festplattenzugriff ist bei mir relevant, wenn ich vorgefaltete Musikdateien abspiele, oder wenn ich mein improvefile Skript verwende. Und in der Tat hat die Verwendung des deadline IO Schedulers bei mir eine positive klangliche Wirkung. Das sind sicher keine Tag-und-Nacht Unterschiede, aber groß genug, dass ich empfehlen kann, es einfach mal im eigenen Setup zu probieren. Das ist für jedes Linux-System mit Kernel 2.6.33 oder neuer relevant.

Wenn die Musikdateien zum Beispiel auf der Festplatte /dev/sda stehen, kann mit

Code: Alles auswählen

cat /sys/block/sda/queue/scheduler
festgestellt werden, welcher IO Scheduler für diese Platte genutzt wird (wohl meist 'cfq'). Den deadline Scheduler mit möglichst kurzen deadlines kann man so einstellen:

Code: Alles auswählen

echo deadline > /sys/block/sda/queue/scheduler
echo 4 > /sys/block/sda/queue/iosched/fifo_batch 
echo 5 > /sys/block/sda/queue/iosched/read_expire 
echo 5 > /sys/block/sda/queue/iosched/write_expire 
Zurückstellen geht so:

Code: Alles auswählen

echo cfq > /sys/block/sda/queue/scheduler
Viel Spaß beim Ausprobieren,
Frank
Bild
Sire
Aktiver Hörer
Beiträge: 309
Registriert: 02.12.2013, 14:01

Beitrag von Sire »

Hallo Frank,

ich möchte Uwes Frage aufgreifen:
Die Gretchenfrage für mich als Albumhörer, gibt es eine Möglichkeit mit diesem script mit einmaligen Aufruf ein ganzes Album (mehrere WAV Dateien) an den DAC weiter zu leiten?
und Deine Rückfrage
Wie sind denn Alben bei Dir abgespeichert? Eine flac-Datei pro Track und alle Tracks eines Albums in einem separaten Verzeichnis?
Denn genau so schaut es bei mir aus. Da solte doch eigentlich auch ein einfaches Shell-Kommando genügen, irgendwie komm ich aber bisher nicht weiter, wenn ich zb. /pfad/zu/play_remote *.flac im entsprechenden Verzeichnis aufrufe, spielt doch nur die erste Datei...

Viele Grüße

Klaus

P.S..: Wie oben angekündigt, habe ich jetzt Deine Programme mit einem guten Plattenspieler testen können (an dieser Stelle einen herzlichen Dank an Forenmitglied Karl-Heinz, karlo enzo, für die großzügige Überlassung desselben). Ein unglaublich gutes Ergebnis präsentiert sich da meinen Ohren. Sieht so aus, als würde ich demnächst überwiegend Vinyl hören...
Bild
Melomane
Aktiver Hörer
Beiträge: 3114
Registriert: 14.10.2011, 18:30

Beitrag von Melomane »

Hallo,

wie war doch die alte Werbung? Früher oder später werden wir euch kriegen. ;)

Zur script-Frage: Geht keine Schleife nach dem Motto: for Datei in Verzeichnis do?
Gapless wäre das allerdings noch nicht.
Gruß

Jochen
Bild
Sire
Aktiver Hörer
Beiträge: 309
Registriert: 02.12.2013, 14:01

Beitrag von Sire »

Hallo Jochen,

da lass ich mich gerne kriegen :cheers:

Deinen Vorschlag mit der Schleife habe ich noch nicht verstanden. Könntest Du das vielleicht noch etwas ausführen?

Viele Grüße

Klaus
Bild
Melomane
Aktiver Hörer
Beiträge: 3114
Registriert: 14.10.2011, 18:30

Beitrag von Melomane »

Hallo Klaus,

so etwas:

Code: Alles auswählen

for file in *.flac ; do echo "$file"; done
Wenn du das in einem Verzeichnis deiner Wahl mit flac-Dateien auf der Linux-Konsole eingibst, bekommst du alle flac-Dateien aufgelistet. Anstatt des echo-Befehls könntest du dann deinen player-Befehl einsetzen.
Achtung: Das Beispiel dient nur zur Veranschaulichung einer for-Schleife. Braucht ansonsten noch Überarbeitung. Stichwort dazu ist etwa die Sortierreihenfolge. Du wirst schon sehen, wenn du den Codeschnipsel testest. Aber da sollte Google weiterhelfen. Zur Scriptprogrammierung mit der bash-shell findet sich zu Hauf das Nötige.

Gruß

Jochen
Bild
Sire
Aktiver Hörer
Beiträge: 309
Registriert: 02.12.2013, 14:01

Beitrag von Sire »

Danke Melomane,

das funktioniert soweit. Der Hinweis Scriptprogrammierung für bash-shell zu lernen ist in meinem Fall durchaus angemessen, da habe ich noch Nachholbedarf.

wünsche einen schönen Abend

Klaus
Bild
frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

Sire hat geschrieben:
Wie sind denn Alben bei Dir abgespeichert? Eine flac-Datei pro Track und alle Tracks eines Albums in einem separaten Verzeichnis?
Denn genau so schaut es bei mir aus. Da solte doch eigentlich auch ein einfaches Shell-Kommando genügen, irgendwie komm ich aber bisher nicht weiter, wenn ich zb. /pfad/zu/play_remote *.flac im entsprechenden Verzeichnis aufrufe, spielt doch nur die erste Datei...
Hallo Linux-Scripter,

hier sind noch ein paar Code-Schnipsel, die für ein Script nützlich sein könnten, das alle flac-Dateien in einem als Argument übergebenen Verzeichnis abspielt (also ist $1 dieses Verzeichnis).

(1) Die erste der flac-Dateien finden, und dann dessen Samplerate:

Code: Alles auswählen

FIRSTFLAC=`ls "$1"/*.flac | head -1`

ORIGRATE=`sox --i "$FIRSTFLAC" | grep "Sample Rate" | cut -d: -f2 | sed -e "s/ //g"`
Zu beachten sind die Anführungszeichen "...". Wenn alle Verzeichnisnamen und Dateinamen keine Leerzeichen enthalten, können die oft auch weggelassen werden; aber gerade bei Musikdateien sind Leerzeichen in Dateinamen ja (leider) recht verbreitet.

(2) Alle flac-Dateien in einem Verzeichnis abspielen, erstmal ohne kopieren in den RAM (ohne cptoshm, shmcat).

Code: Alles auswählen

sox "$1"/*.flac -t raw -r ${ORIGRATE} -c 2 -e float -b 64 - | \
und so weiter. Das ist gap-less.

(3) Erst alle Dateien in Ramdisk kopieren:

Code: Alles auswählen

# directory in RAM:
RAMDISK=/tmp

TEMPDIRFORFLACS=`mktemp -d --tmpdir=$RAMDISK`

cp "$1"/*.flac $TEMPDIRFORFLACS/
und dann weiter wie oben, aber mit $TEMPDIRFORFLACS statt $1. Nach dem Abspielen mit

Code: Alles auswählen

rm -rf $TEMPDIRFORFLACS
wieder löschen.

(4) Und eine Variante, in der alle flac-Dateien im Verzeichnis im wav-Format in einem Stück im shared memory gespeichert werden (falls genug Platz im shared memory vorhanden ist):

Code: Alles auswählen

# maximal number of bytes in shared memory
MAXSHAREDMEM=1000000000

sox "$1"/*.flac -t wav - | cptoshm --shmname=/play.wav --max-input=$MAXSHAREDMEM
und dann später

Code: Alles auswählen

shmcat --shmname=/play.wav |
     sox  -t wav -  -t raw -r ${ORIGRATE} -c 2 -e float -b 64 - | \
und so weiter.

(5) Wie von Jochen vorgeschlagen, kann natürlich auch das vorhandene Skript in einer Schleife genutzt werden, aber das ist dann nicht gap-less:
#!/bin/bash

for fname in "$1"/*.flac; do
play_remote "$fname"
done
Viele Grüße,
Frank
Bild
Tinitus
Aktiver Hörer
Beiträge: 1322
Registriert: 10.11.2013, 21:48

Beitrag von Tinitus »

Hallo Frank,

vielen Dank für deine Bemühungen das Fußvolk mit zu nehmen. Ob ich mich im Programmieren mit Linux üben will weiß ich noch nicht, da würden auch wieder einige Stunden nötig sein, bis ich das hin bekomme. Im Moment höre ich sehr zufrieden mit Volumio und bastel mir nun mal ein Gehäuse für meinen C1, weil das bei Odroid ehältliche Plastik Ding ein no-go ist. Vielleicht schaffe ich mir noch einen zweiten C1 an um gleichzeitig hören und experimentieren zu können. Bezüglich einfaches System schwebt mir vor, Musik von der Festplatte auf eMMc kopieren, Musik in RAM streamen und von dort aus abspielen. Die Möglichkeit, die Polarität umzukehren wäre nett. Dann könnte ich mich mal an Experimente mit brutefir wagen, wobei dann alles wieder komplizierter würde, weil dann für jede Samplerate ein anderes Filter notwendig wäre. (Wohl dem der Musik nur im redbook-Format sein eigen nennt). Schaun mer mal.


Gruß

Uwe
Bild
Sire
Aktiver Hörer
Beiträge: 309
Registriert: 02.12.2013, 14:01

Beitrag von Sire »

Auch von meiner Seite ein weiteres Danke an Frank!

An Uwe:
Die Möglichkeit, die Polarität umzukehren wäre nett
Meinst Du, das Signal zu invertieren? Mit Volrace geht das. Die Datei /tmp/VOLRACE lässt sich im laufenden Betrieb editieren. Wenn die Datei gespeichert wird, ändert Volrace seine Parameter unmittelbar. Übliche Parameter sind z.b.

Code: Alles auswählen

0.6 12 0.20
. Wenn Du

Code: Alles auswählen

-0.6 12 0.20
wählst, dann wird das Signal invertiert.

Gruß

Klaus
Bild
Antworten