最近我一直在探索神奇的 /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
之间也有一个东西。现在我真正在这个领域工作,我意识到这完全没有意义。另外,我知道更新后的命令(现在在本答案开头可见的命令)有效,因为我每天在工作中使用它几次。cat
aplay
答案3
尝试 /dev/audio 或 /dev/snd 下的其他设备之一。并非所有这些都是音频数据接收器,您可能已经捕获了混音器、麦克风或其他东西
答案4
更新(2020-12-25):我创建了一个 shell 脚本,用于将数据从 stdin 转发到 stdout,如果它是 PCM 文件,则设置 stdout。查看https://github.com/psqli/pcmsh。
TL;DR:在读取或写入数据之前必须设置设备的参数。
一步步:
打开 PCM 设备。例如:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
。打开后,PCM处于OPEN
状态。用 设定参数
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
。硬件参数结构有面具(每一位都是一个值)和间隔([最小,最大]范围)。未设置的参数必须通过填充(为掩码设置的所有位/值;间隔的完整范围)。设置完硬件参数后,PCM就处于SETUP
状态。看pcm_set_config()TinyALSA 的代码。设置
ACCESS
、FORMAT
、RATE
、CHANNELS
和PERIOD_SIZE
就PERIODS
足够了。其他参数是这些参数的变体,除了BUFFER_SIZE
在某些设备中可以设置为非倍数PERIOD_SIZE
。调用
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
以准备设备和 ALSA 运行时变量。此后,PCM 处于PREPARED
状态。开始读取(捕获)或写入(播放)。
用于读取或写入 PCM 设备的最小应用程序的大部分代码都围绕硬件参数操作。