2016-12-12 2 views
1

Ich bin etwas neu in Haskell, und als ein Anfänger-Projekt versuche ich, ein wenig Musik Visualizer zu machen.Haskell: gelesene feste Menge von Daten aus Named Pipe

Normalerweise benutze ich ncmpcpp + mpd als Musikplayer, und deshalb habe ich eine FIFO benannte Pipe, die rohe PCM-Daten an /tmp/mpd.fifo sendet.

Was ich tun möchte, ist in einer festen Menge von PCM-Samples aus dieser Datei zu lesen, eine FFT für diesen Datenblock durchzuführen, die Ausgabe zu drucken und dann zu wiederholen. Ich habe Data.Stream, Data.Bytestring in der Haskell-Bibliothek betrachtet, kann aber nicht herausfinden, wie man einfach eine bestimmte Menge an Daten aus der Named Pipe erhält.

Ich denke, es muss eine einfache Möglichkeit, dies zu tun, und ich vermisse nur etwas nicht verstehen, so dass jede Hilfe geschätzt wird.

+1

Was ist falsch mit 'hGet' von' Data.ByteString'? Sie können die Anzahl der Bytes angeben, die Sie lesen möchten. – Alec

+0

@Alec: Könnten Sie das als Antwort verwenden? Es wäre auch gut hinzuzufügen, wie man ein "Handle" von einer Named Pipe (die ich selbst nicht kenne) bekommt. –

+0

Ja, das macht es! Ich habe es als Antwort veröffentlicht, nachdem ich das Snippet verwendet habe, um es vollständig herauszufinden. – Rigel

Antwort

1

Wie von Alec erwähnt, ist dies eigentlich sehr einfach.

Setzen Sie sich einfach mit einem Griff für die Named Pipe:

sourceHandle <- openFile "/path/to/pipe.fifo" ReadMode 

und dann Data.ByteString.hGet sourceHandle n verwenden, um n Bytes zu lesen.

Ich hatte keine Beispiele mit dieser Methode gesehen und dachte einfach, dass Handles die gleiche wie readFile funktionieren würde, die nur die gesamte Datei tun können. So wie ich angenommen hatte, habe ich etwas vermisst, danke!

+0

Froh, dass du es hast! Vielleicht möchte ich erwähnen, dass 'hGet' Blöcke (oder so denke ich), bis es entweder die Anzahl der Bytes erhalten, die Sie angegeben haben oder EOF. IIRC-Handles sind ähnlich wie Dateideskriptoren auf Unix-basierten Systemen. – Alec

Verwandte Themen