在/ dev / snd /中生成有趣的随机噪声


41

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

我正在使用ALSA。

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

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

然后我收到了cat的错误消息

 cat: write error: File descriptor in bad state

如何解决此问题,以便可以从声卡中听到一些美味的静态演奏?


1
我认为您需要发送随机PCM数据,或者也许您需要首先使用几个ioctl设置设备-您不能只转储随机字节。
吉尔(Gilles)'所以

@Gilles根据Wikipedia的说法,.wav是PCM,当用.wav文件替换随机文件时,得到的结果完全相同。我将研究设置一些输入/输出控件。
琼斯

是否有人提供有关如何设置一些ioctl的教程的指针?对于ioctls,我认为ALSA作为API应该提供输入和输出的接口吗?
琼斯

这是一个有效的示例,如何将pcm数据直接写入设备文件:github.com/igor-liferenko/pcm
Igor Liferenko,

Answers:


46

我认为这对您不起作用的原因是因为该接口已被弃用。您通常无法再使用音频/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

希望这可以弄清楚为什么以前不起作用。

就个人而言,我发现鼠标和记忆比玩随机静态游戏更有趣!


1
非常感谢!这就是我想要的。发布问题后整整七个月回答了!:-)
jones 2012年

3
似乎sudo不需要特权。
iyrin

2
非常感谢。我发现二进制文件很有趣。/ usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql之类的东西
Don

嗯,很奇怪,“ tee”可以做到这一点,但是“ dd of = / dev / audio”却不能。
杰森

@Jasen dd一次可能写太多。padsp模拟/ dev / audio使其通过alsa重定向。除非启用了内核内OSS仿真(默认情况下未启用),否则不带padsp的dd甚至都不会看到/ dev / audio。而且我认为编写一个比驱动程序内缓冲区大得多的大块甚至可能会失败。
Paul Stelian

8

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

编辑(2019年8月6日):在较旧版本的命令中,我padsp teecat和之间也有东西aplay。现在,我实际上正在该领域工作,我意识到这绝对没有道理。另外,我知道更新的命令(该命令的开头现在可以看到该命令)有效,因为我每天在工作中使用几次。


6
我使用ALSA,并且不需要“ padsp tee”。
Geremia 2014年

1
根据我的pulseaudio经验(以及当PA padsp tee断开时Ubuntu正在使用的任何东西),这是必需的(当时我的精确度是12.04.2)。问题是,即使您是root用户,也不应尝试将数据直接转储到设备中(据我所知,在/ dev文件夹中几乎没有文件可读且没有文件可写),因为您可能会遇到错误(在最佳情况下,每次更新都会更常见),导致内核崩溃甚至损坏设备,在极少数情况下。一个人应该使用非特权元素(例如aplay)来执行此操作(不幸的是,需要音频组或root)。@geremia
Paul Stelian

有趣的是,现在我看到这padsp tee东西实际上根本没有任何意义。在工作中,我使用类似的东西来测试我在编写音频驱动程序方面是否取得了进步。现在将更新我的答案。
Paul Stelian

3

尝试使用/ dev / audio或/ dev / snd下的其他设备之一。并非所有人都是音频数据接收器,您可能抓到了调音台,麦克风或其他东西


1
谢谢回复。根据/ proc / asound / devices的说明,/ dev / snd / pcmC0D0p是用于音频播放的正确设备(因此称为“ p”)
琼斯,

1
另外,我不确定,但是可以有多个dev“文件”进行播放吗?我没有 '/ dev / audio'我认为'/ dev / audio'与OSS有关,后者用于较早的内核(2.5之前)
jones

2

声音守护程序(例如pulseaudio)是否已锁定设备?我认为您可以通过找出是否还有其他处理方法lsof


1
感谢您的有用建议。我使用grep和进行了检查lsofpulseaudio正在使用,/dev/snd/controlC0但没有打开/dev/snd/pcmC0D0p。我通过双重检查/var/lock来确定设备上是否有用于锁定的文件。ls -al告诉该文件夹为空。所以我想pcmC0D0p上没有锁
琼斯

@jones按住控制器上的锁可能足以锁定整个卡,具体取决于驱动程序。(很抱歉在8年后回答,现在我知道了自己)
Paul Stelian

0

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状态。有关代码,请参见TinyALSA的pcm_set_config()

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

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

  4. 开始阅读(捕获)或写作(播放)。

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


我不确定实际的读/写工作是否有效,因为aplay使用(至少在我正在开发的系统上)使用ioctl(fd,SNDRV_PCM_IOCTL_WRITEI_FRAMES,...),而不是回放时实际的write()调用。ALSA本身是否具有包装,该包装接受读/写入口点并将其转换为ioctl?
Paul Stelian

@PaulStelian是的。请参阅pcm的文件操作的定义。在snd_pcm_read()和中snd_pcm_write()字节转换为帧
里卡多·比尔·帕斯夸里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.