2016-12-12 14 views
1

Я немного новичок в Haskell, и в качестве начинающего проекта я пытаюсь создать небольшой визуализатор музыки.Haskell: читать фиксированное количество данных из именованной трубы

Обычно я использую ncmpcpp + mpd в качестве музыкального плеера, и из-за этого у меня есть именованный канал fifo, отправляющий необработанные данные PCM в /tmp/mpd.fifo.

Что я хочу сделать, это читать в фиксированном количестве образцов PCM из этого файла, выполнять БПФ на этом блоке данных, печатать выходные данные и затем повторять. Я просмотрел Data.Stream, Data.Bytestring в библиотеке Haskell, но не могу понять, как просто получить фиксированный размер данных из именованного канала.

Я полагаю, что должен быть простой способ сделать это, и я просто упускаю/не понимаю что-то, поэтому любая помощь приветствуется.

+1

Что не так с 'hGet' из' Data.ByteString'? Вы можете указать количество байтов, которое вы хотите прочитать. – Alec

+0

@Alec: Не могли бы вы назвать это ответом? Также было бы неплохо добавить, как получить «Handle» из именованного канала (который я сам не знаю). –

+0

Да, это так! Я опубликовал его как ответ после использования вашего фрагмента, чтобы понять его полностью. – Rigel

ответ

1

Как уже упоминалось Алек, на самом деле это очень просто.

Просто получить ручку для именованного канала:

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

, а затем использовать Data.ByteString.hGet sourceHandle n читать п байт.

Я не видел примеров с использованием этого метода и просто думал, что ручки будут работать так же, как readFile, которые могут выполнять только весь файл. Как я и предполагал, я чего-то упустил, спасибо!

+0

Рад, что у тебя это получилось! Можете упомянуть о том, что блоки hGet (или, как я думаю) до тех пор, пока не получат либо количество байтов, которые вы указали, либо EOF. Обработчики IIRC являются своего рода эквивалентом дескрипторов файлов в системах на основе UNIX. – Alec