【问题标题】:Haskell: read fixed amount of data from named pipeHaskell:从命名管道读取固定数量的数据
【发布时间】:2016-12-12 00:01:32
【问题描述】:

我对 Haskell 有点陌生,作为一个初学者项目,我正在尝试制作一个小的音乐可视化工具。

我通常使用 ncmpcpp+mpd 作为音乐播放器,因此我有一个名为 pipe 的 fifo 将原始 PCM 数据发送到 /tmp/mpd.fifo。

我想做的是从此文件中读取固定数量的 PCM 样本,对该数据块执行 FFT,打印输出,然后重复。我查看了 Haskell 库中的 Data.Stream、Data.Bytestring,但无法弄清楚如何从命名管道中简单地获取固定大小的数据量。

我认为必须有一个简单的方法来做到这一点,我只是缺少/不明白一些东西,所以任何帮助表示赞赏。

【问题讨论】:

  • 来自Data.ByteStringhGet 有什么问题?您可以指定要读取的字节数。
  • @Alec:你能把这个作为答案吗?添加如何从命名管道(我自己也不知道)获取Handle 也很好。
  • 是的,它做到了!在使用您的 sn-p 完全弄清楚后,我将其发布为答案。

标签: haskell fft pcm


【解决方案1】:

正如 Alec 所说,这实际上非常简单。

只需获取命名管道的句柄:

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

然后使用Data.ByteString.hGet sourceHandle n读取n个字节。

我没有看到使用这种方法的示例,只是认为句柄的工作方式与 readFile 相同,后者只能处理整个文件。所以正如我所假设的那样,我错过了一些东西,谢谢!

【讨论】:

  • 很高兴你得到它!可能要提到hGet 阻塞(或者我认为),直到它获得您指定的字节数或EOF。 IIRC 句柄在某种程度上等同于基于 unix 的系统上的文件描述符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2014-08-03
相关资源
最近更新 更多