Articles of alsa

使用ALSA在只播放声卡上捕获播放

我的hw:1,0是只播放的外部USB卡。 录制应用程序无法捕获发送到hw:1,0的样本,如果它尝试打开hw:1,0进行捕获。 alsamixer没有为hw:1,0提供任何“[Capture]”选项 – 只有“[Playback]”选项卡上的一个音量控制。 是否有可能创build一些虚拟的“xxx”设备,它将接受来自应用程序的stream并通过2个stream(副本)发送出去 – 第一个到真正的“hw:1,0”(到我的耳机),第二个到另一个将提供捕获能力的虚拟设备“zzz”,将stream提供给可打开“zzz”以捕获的应用程序? 更新 我在内核中添加了ALSA Loopback设备,现在我有了loopback设备。 然后我发现工作.asoundrc(见下文),但是当我使用ffmpeg捕捉屏幕+声音时,声音比video前进了一些,很大的同步问题。 所以用这个.asoundrc(下面)我可以使用hw:0,0(loopback device,hw:0,0 – play,hw:0,1 – capture)捕获我发送给“default”的内容。 我也可以通过我的外部USB hw:2,0听到这些示例。 ffmpeg命令: ffmpeg -f alsa -i hw:0,1 -f x11grab -s 854×480 -r 30 -i :0.0 -vcodec libx264 -vb 4000k /tmp/screen_854x480.avi .asoundrc: pcm.!default { type plug slave.pcm "mdev" route_policy "duplicate" } pcm.mdev { type multi slaves.a.pcm "hw:Loopback,0,0" […]

ALSA&Python – 捕获多个单声道audioinput

我正在使用python audio alsa库与我的M-Audio Delta 1010LT PCIaudio接口进行交互。 这个audio接口有8个模拟input。 我想分析一个特定的单声道input的信号。 卡被认可: cat /proc/asound/cards 0 [M1010LT ]: ICE1712 – M Audio Delta 1010LT M Audio Delta 1010LT at 0xa000, irq 18 之后,我用命令“amixer”列出了所有器件名称(在这里显示inputADC) … Simple mixer control 'ADC',0 Capabilities: volume volume-joined penum Playback channels: Mono Capture channels: Mono Limits: 0 – 164 Mono: 142 [87%] [7.50dB] Simple mixer control […]

我怎样才能从PCM的缓冲区?

我想在Linux上用ALSA播放一个PCM文件,下面是我的代码: #include <stdio.h> #include <stdlib.h> #include <alsa/asoundlib.h> main (int argc, char *argv[]) { int i; int err; short buf[128]; snd_pcm_t *playback_handle; snd_pcm_hw_params_t *hw_params; if ((err = snd_pcm_open (&playback_handle, argv[1], SND_PCM_STREAM_PLAYBACK, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", argv[1], snd_strerror (err)); exit (1); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) […]

编码WAV文件提前切断

在我之前的问题,我设法得到一个工作的.wav文件作为输出。 但是,当我把这个.wav文件放到我的编码器(用其他.wav文件进行testing并且工作正常)的时候,我的编码器在完成之前把错误传回给我。 这是我的输出: $ ./capture 2 Capture device is plughw:1,0 Finished writing to /tmp/filevXDDX6.wav Starting encode to /tmp/filevXDDX6.flac Wrote 3641 bytes, 4096/88200 samples, 2/22 frames Wrote 6132 bytes, 8192/88200 samples, 2/22 frames Wrote 8748 bytes, 12288/88200 samples, 3/22 frames Wrote 11253 bytes, 16384/88200 samples, 4/22 frames Wrote 13697 bytes, 20480/88200 samples, 5/22 frames Wrote 16222 […]

从C代码中以dB为单位设置ALSA主音量

我似乎无法在我的机器上以dB为单位设置音量。 我在VirtualBox中运行Ubuntu 13.04系统(用于开发)。 我按照这些说明将音量设置为标量,并控制静音状态 ,一切正常。 但是,当我尝试使用此function以dB为单位进行设置时 snd_mixer_selem_set_playback_dB_all(elem,音量,0) 或与该function snd_mixer_selem_set_playback_dB(elem,chn,音量,0) 它总是失败,错误代码-22 (无效的参数) 在问你之前:我已经试过了很多的音量设置(从-20000到20000),我也把最后一个参数改成了三个定义的值[-1,0,1] 这里是我现在testing的完整代码: #include <alsa/asoundlib.h> #include <stdbool.h> #include <stdlib.h> void SetAlsaMasterVolume(long volume) { long min, max; snd_mixer_t *handle; snd_mixer_selem_id_t *sid; const char *card = "default"; const char *selem_name = "Master"; int x, mute_state; long i; snd_mixer_open(&handle, 0); snd_mixer_attach(handle, card); snd_mixer_selem_register(handle, NULL, NULL); snd_mixer_load(handle); snd_mixer_selem_id_alloca(&sid); snd_mixer_selem_id_set_index(sid, […]

我如何使用alsa回放同步方法调用?

我试图编写一个程序,将灯同步到一个基本的WAV文件播放。 我已经在所有的alsa文档中挣扎,ffplay.c的源代码和在互联网上search,但很难弄清楚如何做一个常见而简单的任务。 基本上我想做两件事,第一件是在audio播放时读取按键事件,并将偏移量存储在文件中。 第二个是取出这些队列文件,稍后加载它们,这次是在一个不同的audio设备,如树莓派。 我在如何首先考虑偏移位置的初始捕捉中的延迟以及如何在完全不同的硬件设备上回放时如何处理该延迟而挣扎。 我知道ffmpeg套件使用了snd_pcm_delay()来处理这个问题,但即使是基本的技巧,我也很苦恼。 这不是一个复杂的播放机制,只是一个循环中的阻塞写入。 我会发布一些代码,但目前我没有和我在一起,这只是一个混乱的当前黑客无法正常工作。

如何用ALSA播放短音

我试图在一个小的C程序中通过ALSA生成可变长度的短音。 我尝试过的几个例子在播放一秒钟的声音时工作得很好,但是比这更短的东西根本不会产生任何声音。 我用这样的正弦波填充缓冲区: #define BUFFER_LEN 44100 int freq = 700; //audio frequency int fs = 44100; //sampling frequency float buffer [BUFFER_LEN]; for (k=0; k<BUFFER_LEN; k++) { buffer[k] = (sin(2*M_PI*freq/fs*k)); } 设置pcm设备参数: if ((err = snd_pcm_set_params(handle, SND_PCM_FORMAT_FLOAT, SND_PCM_ACCESS_RW_INTERLEAVED, 1, 44100, 1, 500000)) < 0) { printf("Playback open error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } 回放: frames = snd_pcm_writei(handle, […]

我如何将控件映射到它的设备?

amixer -c 0对照: … numid=22,iface=MIXER,name='Capture Switch' numid=24,iface=MIXER,name='Capture Switch',index=1 numid=21,iface=MIXER,name='Capture Volume' numid=23,iface=MIXER,name='Capture Volume',index=1 … arecord -l: card 0: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 2: ALC662 rev3 Alt Analog [ALC662 rev3 Alt Analog] Subdevices: 1/1 Subdevice #0: […]

aplay / alsaplayer – 声音对于普通用户不起作用

我不能使用alsa作为普通用户(导致我没有铬的声音)。 我猜测它与权限有关。 把自己添加到组audio没有帮助。 [zarac@towelie ~]$ grep audio /etc/group audio:x:92:mpd,zarac 正常用户testing声音: [zarac@towelie ~]$ aplay /usr/share/sounds/alsa/Noise.wav ALSA lib confmisc.c:768:(parse_card) cannot find card '0' ALSA lib conf.c:4154:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings ALSA lib conf.c:4154:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory ALSA lib confmisc.c:1251:(snd_func_refer) error […]

ALSA:我怎样才能通过耳机和扬声器发送audio

我需要在运行时控制audio输出设备: 1) Main Speaker only 2) Headphone Only 3) Headphone + Main Speaker both together 我的应用程序需要运行时决定切换上述组合。 我应该使用什么ALSA API来达到上述目的。 (我使用Linux 3.0,ALSA,C,TI tlv320aic3x,ARM)。