最近,我一直在探索附魔的/ dev文件夹。我想将一些随机数据写入音频设备以产生一些噪音。
我正在使用ALSA。
所以我指示cat将一些随机数据通过管道传输到/ dev文件夹中的播放文件...
cat file-of-random-data > /dev/snd/pcmC0D0p
然后我收到了cat的错误消息
cat: write error: File descriptor in bad state
如何解决此问题,以便可以从声卡中听到一些美味的静态演奏?
最近,我一直在探索附魔的/ dev文件夹。我想将一些随机数据写入音频设备以产生一些噪音。
我正在使用ALSA。
所以我指示cat将一些随机数据通过管道传输到/ dev文件夹中的播放文件...
cat file-of-random-data > /dev/snd/pcmC0D0p
然后我收到了cat的错误消息
cat: write error: File descriptor in bad state
如何解决此问题,以便可以从声卡中听到一些美味的静态演奏?
Answers:
我认为这对您不起作用的原因是因为该接口已被弃用。您通常无法再使用音频/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
您甚至可能要尝试使用其他设备,例如鼠标:Use /dev/psaux
:,例如或usb驱动程序。您甚至可以通过它运行内存:
/dev/mem
希望这可以弄清楚为什么以前不起作用。
就个人而言,我发现鼠标和记忆比玩随机静态游戏更有趣!
sudo
不需要特权。
cat /dev/urandom | aplay
是需要输入的命令。如果您不在“音频”组中,则可以使用sudo为播放添加前缀。这也不会干扰任何守护程序(我pulseaudio
在此命令处于活动状态时正在运行,并且正确听到了“噪音”。
编辑(2019年8月6日):在较旧版本的命令中,我padsp tee
在cat
和之间也有东西aplay
。现在,我实际上正在该领域工作,我意识到这绝对没有道理。另外,我知道更新的命令(该命令的开头现在可以看到该命令)有效,因为我每天在工作中使用几次。
padsp tee
断开时Ubuntu正在使用的任何东西),这是必需的(当时我的精确度是12.04.2)。问题是,即使您是root用户,也不应尝试将数据直接转储到设备中(据我所知,在/ dev文件夹中几乎没有文件可读且没有文件可写),因为您可能会遇到错误(在最佳情况下,每次更新都会更常见),导致内核崩溃甚至损坏设备,在极少数情况下。一个人应该使用非特权元素(例如aplay)来执行此操作(不幸的是,需要音频组或root)。@geremia
padsp tee
东西实际上根本没有任何意义。在工作中,我使用类似的东西来测试我在编写音频驱动程序方面是否取得了进步。现在将更新我的答案。
声音守护程序(例如pulseaudio
)是否已锁定设备?我认为您可以通过找出是否还有其他处理方法lsof
。
grep
和进行了检查lsof
。pulseaudio
正在使用,/dev/snd/controlC0
但没有打开/dev/snd/pcmC0D0p
。我通过双重检查/var/lock
来确定设备上是否有用于锁定的文件。ls -al
告诉该文件夹为空。所以我想pcmC0D0p上没有锁
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
状态。有关代码,请参见TinyALSA的pcm_set_config()。
设置ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
和PERIODS
是足够的。其他参数是这些参数的变体,除了BUFFER_SIZE
在某些设备中可以将设置为的非整数倍PERIOD_SIZE
。
调用ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
以准备设备和ALSA运行时变量。此后,PCM处于PREPARED
状态。
开始阅读(捕获)或写作(播放)。
用于读取或写入PCM设备的最小应用程序将具有围绕硬件参数操纵的大部分代码。