在 /dev/snd/ 中生成随机噪音以供娱乐

在 /dev/snd/ 中生成随机噪音以供娱乐

最近我一直在探索神奇的 /dev 文件夹。我想将一些随机数据写入音频设备以产生一些噪音。

我正在使用 ALSA。

所以我指示 cat 将一些随机数据通过管道传输到 /dev 文件夹中的播放文件...

 cat file-of-random-data > /dev/snd/pcmC0D0p

然后我收到了来自 cat 的错误

 cat: write error: File descriptor in bad state

我该如何解决这个问题,以便我可以从声卡中听到一些美妙的静态播放声音?

答案1

我认为这对您不起作用的原因是该接口已被弃用。您通常无法/dev/dsp再使用它来编写音频,至少在不棘手的情况下。

有一个程序可以在您的系统上为您完成此操作:padsp。这会将/dev/audio/dev/dsp文件映射到新的音频服务器系统。

启动终端并使用 进入 root 模式sudo su

然后,我将把cat /dev/urandom输出通过管道传输到padsp并使用tee命令将数据发送到/dev/audio.您的终端中会出现大量垃圾,因此您可能需要重定向到/dev/null.

成为超级用户后,请尝试以下命令:

cat /dev/urandom | padsp tee /dev/audio > /dev/null

您甚至可能想尝试使用其他设备,例如鼠标:/dev/psaux例如,使用:或 USB 驱动程序。你甚至可以通过它来运行你的记忆: /dev/mem

希望这能澄清为什么它之前不起作用。

就我个人而言,我发现鼠标和内存比玩随机静态更有趣!

答案2

cat /dev/urandom | aplay 是需要输入的命令。如果您不在“音频”组中,您可以在 aplay 前面加上 sudo 前缀。这也不会干扰任何守护进程(我pulseaudio在该命令处于活动状态时正在运行并且正确地听到了“噪音”。

编辑(2019 年 8 月 6 日):在旧版本的命令中,我在和padsp tee之间也有一个东西。现在我真正在这个领域工作,我意识到这完全没有意义。另外,我知道更新后的命令(现在在本答案开头可见的命令)有效,因为我每天在工作中使用它几次。cataplay

答案3

尝试 /dev/audio 或 /dev/snd 下的其他设备之一。并非所有这些都是音频数据接收器,您可能已经捕获了混音器、麦克风或其他东西

答案4

更新(2020-12-25):我创建了一个 shell 脚本,用于将数据从 stdin 转发到 stdout,如果它是 PCM 文件,则设置 stdout。查看https://github.com/psqli/pcmsh

TL;DR:在读取或写入数据之前必须设置设备的参数。

一步步:

  1. 打开 PCM 设备。例如:fd = open("/dev/snd/pcmC0D0p", O_RDWR)。打开后,PCM处于OPEN状态。

  2. 用 设定参数ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)。硬件参数结构有面具(每一位都是一个值)和间隔([最小,最大]范围)。未设置的参数必须通过填充(为掩码设置的所有位/值;间隔的完整范围)。设置完硬件参数后,PCM就处于SETUP状态。看pcm_set_config()TinyALSA 的代码。

    设置ACCESSFORMATRATECHANNELSPERIOD_SIZEPERIODS足够了。其他参数是这些参数的变体,除了BUFFER_SIZE在某些设备中可以设置为非倍数PERIOD_SIZE

  3. 调用ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)以准备设备和 ALSA 运行时变量。此后,PCM 处于PREPARED状态。

  4. 开始读取(捕获)或写入(播放)。

用于读取或写入 PCM 设备的最小应用程序的大部分代码都围绕硬件参数操作。

相关内容