标签: alsa

Java中可靠的声音API,用于简单的数字样本回放

是否有一个很好的方法可以在Java中获得体面,可靠的数字采样声音播放?

我的请求列表非常简短:

  • 将数字化样本加载到内存中(例如,来自jar中捆绑的资源),例如.wav文件
  • 以非阻塞的方式播放它们
  • 当我同时播放几个样本并且它们在时间上交叉时,它们应该正确混合

拥有以下内容会很高兴,但实际上我可以没有它:

  • 从.ogg或类似的压缩格式播放(显然没有在Java中实现CPU饥饿的解码器)
  • 在播放时仍然播放相同的样本不应该停止先前播放给定的样本,但是第二个副本应该开始并与第一个正确混合

我已经尝试了臭名昭着的Java Sound API,但发现它完全不可靠,似乎无法满足我的最小愿望清单.我得到的问题:

  • 在使用ALSA dmix(OpenJDK 6)的Linux上,在初始化Java Sound API时让任何其他应用程序使用音频只会使Java应用程序中的所有声音消失而不会出现任何错误/警告.

  • 在Linux(OpenJDK 6)上,列出MixerInfos并尝试Clip使用其中任何一个获取对象时,在尝试加载wav文件时会引发以下异常:

    java.lang.IllegalArgumentException: Line unsupported: interface Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
    
    Run Code Online (Sandbox Code Playgroud)

    因此,AudioSystem.getClip(anySortOfMixer)似乎根本不起作用.只有AudioSystem.getClip()作品.

  • 使用不同的采样率/位/格式加载文件Clip失败LineUnavailableException.似乎第一次调用clip.open将声音系统设置为特定声音选项,在调用后加载具有略微不同采样率的文件(例如,第一个是44100,第二个是48000)

  • 在Linux(OpenJDK 6)上初始化几个不同的Clips并尝试播放它们只会使最后加载Clip声音 - 没有给出错误/警告,但只有play在最后Clip加载时才使用任何声音 - 所有其他声音都是静音的:

    Clip loadSound(String name) {
        URL url = this.getClass().getResource("/" + name + ".wav");
        Clip …
    Run Code Online (Sandbox Code Playgroud)

java openal alsa lwjgl javasound

7
推荐指数
1
解决办法
685
查看次数

从ALSA录制 - 了解内存映射

我试图使用ALSA从USB音频设备获取输入并将其作为一系列signed short值写入磁盘.我最终得到的是看似有效数据的块,其中散布着大块的零.我猜我的缓冲区设置不正确,并没有正确使用内存映射.

我在尝试什么:

  • 采样率:8K(由设备强制)
  • 缓冲区大小:2048
  • 期间大小:512
  • 一个频道

该设备似乎正确打开并接受各种参数.经过一些设置后,循环运行如下:

snd_pcm_avail_update   
snd_pcm_mmap_begin   
   memcpy data from mmap buffer to array of short   
snd_pcm_mmap_commit   
Run Code Online (Sandbox Code Playgroud)

memcpy是指向short数组的指针,并以每次传递返回的帧数递增.

在此记录几秒钟后,我将其关闭并将后续缓冲区写入磁盘,作为每行的单个短值.我期待的是在1200和2300 Hz之间变化的PCM数据中的第二个或两个.我得到的是一些有很多零的数据.

我想知道的是:我对缓冲和期间理性的价值观是什么?有没有人成功使用ALSA的内存映射输出?

编辑:一些代码

const snd_pcm_channel_area_t *areas;  
snd_pcm_uframes_t offset, frames, size;   
short* pCID = (short*)malloc( 50000 * sizeof( short ));  
short* ppCID = pCID;
while( size > 0 )  
{  
   frames = size;  
   snd_pcm_mmap_begin (device, &areas, &offset, &frames);     
   short* pd = (short*)areas[0].addr;   
   memcpy( ppCID, (pd + (offset*sizeof(short))), frames * sizeof( short ));  
   ppCID += frames;  
   snd_pcm_mmap_commit(device, offset, …
Run Code Online (Sandbox Code Playgroud)

linux audio usb alsa

7
推荐指数
1
解决办法
3505
查看次数

音频无法在Virtualbox上运行的Android上运行?

我在Virtualbox上安装了Android,我使用从http://www.android-x86.org/download下载的Android x86 我选择了2.3版本的eeepc版本(android-x86-2.3-RC1-eeepc.iso).

问题是声音不起作用,我在Virtualbox设置中尝试了所有3个选项.我目前的设置:

Host driver: Windows DirectSound
Controller: ICH AC97
Run Code Online (Sandbox Code Playgroud)

我为音频控制器设置尝试的选择:

Intel HD Audio
ICH AC97
SoundBlaster 16
Run Code Online (Sandbox Code Playgroud)

我目前正在运行Windows 7,我的音频驱动程序是默认的Windows驱动程序.

我搜索并发现有相同问题的人,但我无法理解任何事情,因为我不是高级Linux用户,有些解决方案谈论ALSA驱动程序,但我找不到如何安装和使用它.

也可以来自我选择的安装.iso文件?我的电脑是Acer Travelmate 2480.

更新 在检查Android x86网站时,我发现我们应该使用SoundBlaster 16而不是ICH AC97.

我也尝试了alsa_ctl init终端内的命令(ALT + F1),我得到了这个:

Unkown hardware: "Dummy" ""Dummy Mixer" "" "" ""
Hardware is initialized using a guess method
Run Code Online (Sandbox Code Playgroud)

我查了它的版本是1.0.23

windows android virtualbox alsa android-x86

7
推荐指数
1
解决办法
1万
查看次数

为什么tinyALSA优于libasound?

在最新的Android版本中,该AOSP版本通常附带tinyALSAtinyCompress.在这个问题中,Simon提到所有Nexus设备都应该支持tinyALSA.

我的问题是为什么android没有集成libasound哪个具有音频子系统所需的所有功能tinyALSA?是否主要是由于source.android.com网站中指出的许可问题?

audio android alsa

7
推荐指数
1
解决办法
3437
查看次数

arecord创建的多个文件

我使用buildroot进行自定义分发,使用ARMv7处理器的硬流程.一切正常,除了....

# arecord -D hw:0,0 -fdat -d 5 test.wav
Run Code Online (Sandbox Code Playgroud)

这会产生多个文件.成千上万的人.

-rw-r--r--    1 root     root        958508 Jan  1 00:19 test-01.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-02.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-03.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-04.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-05.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-06.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-07.wav
-rw-r--r--    1 root     root            44 Jan  1 …
Run Code Online (Sandbox Code Playgroud)

audio alsa embedded-linux buildroot

7
推荐指数
2
解决办法
2288
查看次数

ALSA应用程序在Raspberry Pi上读取和播放WAV文件

尝试学习ALSA音频层,最终为Raspberry Pi平台编写ALSA设备驱动程序.从简单开始,我将来自ALSA项目站点和其他在线资源的各种样本粘在一起做最简单的事情:读取WAV文件并在默认声音设备上播放.我不能让这个简单的C样本工作.

我正在使用libsndfile来做所有的WAV文件读取/头部解码.我验证了我读入缓冲区的样本是正确的(验证了程序读取的第一个400K样本,对应于将样本值转储到文本文件的sndfile-to-text应用程序).所以我知道我的缓冲区包含正确的数据,问题必须是我将其传递给ALSA API的方式.

在运行时,它只在正确的通道中产生声音,并且扭曲/泥泞 - 几乎无法识别.顺便说一句,"aplay"应用程序完美地播放相同的WAV文件并报告该文件是16位带符号LE,44100Hz,立体声,它与我的应用程序报告的内容相匹配.在Raspberry Pi上运行它.

我在这里将C程序剥离到最小值以节省空间,但我验证了所有API调用的正确返回码.为什么这个简单的ALSA应用程序没有产生正确的声音?

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <sndfile.h>

#define PCM_DEVICE "default"

int main(int argc, char **argv) {

    snd_pcm_t *pcm_handle;
    snd_pcm_hw_params_t *params;
    snd_pcm_uframes_t frames;
    int dir, pcmrc;

    char *infilename = "/home/pi/shortsample.wav";
    int* buf = NULL;
    int readcount;

    SF_INFO sfinfo;
    SNDFILE *infile = NULL;

    infile = sf_open(infilename, SFM_READ, &sfinfo);
    fprintf(stderr,"Channels: %d\n", sfinfo.channels);
    fprintf(stderr,"Sample rate: %d\n", sfinfo.samplerate);
    fprintf(stderr,"Sections: %d\n", sfinfo.sections);
    fprintf(stderr,"Format: %d\n", sfinfo.format);

    /* Open the PCM device in playback mode */
    snd_pcm_open(&pcm_handle, PCM_DEVICE, SND_PCM_STREAM_PLAYBACK, 0); …
Run Code Online (Sandbox Code Playgroud)

audio alsa raspberry-pi libalsa

7
推荐指数
1
解决办法
5644
查看次数

如何在Raspberry Pi上使用C++将收到的UDP音频数据正确写入ALSA

我有2个Raspberry Pis,其中1个将UDP帧的音频数据传输到另一个Raspberry Pi.收到的UDP数据包各为160字节.传输的Raspberry Pi正在发送8KHz 8位单声道样本.接收Raspberry Pi使用带有QUDPSocket的Qt 5.4.0并尝试使用ALSA播放接收的数据.代码如下.每当字节到达接收Raspberry Pi时触发"readyRead"信号,缓冲区就会写入ALSA.我在接收Pi上的耳机插孔中发出了非常低声和毛躁的声音 - 但它是可识别的.所以它工作但听起来很糟糕.

  1. 对于ALSA,我的配置是否有任何明显的错误?
  2. 我应该如何使用snd_pcm_writei将收到的UDP数据包写入ALSA?

谢谢你的任何建议.

UdpReceiver::UdpReceiver(QObject *parent) : QObject(parent)
{

    // Debug
    qDebug() << "Setting up a UDP Socket...";

    // Create a socket
    m_Socket = new QUdpSocket(this);

    // Bind to the 2616 port
    bool didBind = m_Socket->bind(QHostAddress::Any, 0x2616);
    if ( !didBind ) {
        qDebug() << "Error - could not bind to UDP Port!";
    }
    else {
        qDebug() << "Success binding to port 0x2616!";
    }

    // Get notified that data is incoming to …
Run Code Online (Sandbox Code Playgroud)

c++ linux qt alsa raspberry-pi

7
推荐指数
1
解决办法
1104
查看次数

使用ALSA库进行音频捕获 - snd_pcm_open =>没有这样的文件或目录

我正在尝试使用ALSA库在SoC上实现音频捕获.我已经预编译libasound.so.2.0.0了一个asoundlib.h与其他标题一起.

我现在有

int returnCode;
snd_pcm_t *pcm_Handle;
char *pcm_device_name = "hw:0,0";

returnCode = snd_pcm_open(&pcm_Handle, pcm_device_name, SND_PCM_STREAM_CAPTURE, 0);
Run Code Online (Sandbox Code Playgroud)

返回snd_strerror(returnCode)No such file or directory

这是否表明捕获设备未正确安装(例如驱动程序或其他东西)?

我怎样才能找出错误/缺失的内容?

我可以列出是否安装了任何alsa可访问的声音设备?

更新:

我发现了如何通过以下方式扫描设备:以编程方式在Linux上查找可用的声卡

snd_card_next找到一个单一的cardNum : 0,但我仍然不能上snd_ctl_open(&cardHandle, "hw:0", 0)snd_pcm_open(&pcm_Handle, "hw:0,0", SND_PCM_STREAM_CAPTURE, 0)No such file or directory.这是否表明声音设备没有正确安装?

更新::

我在http://www.tldp.org/HOWTO/Alsa-sound-4.html上找到了更多信息

"4.6准备设备驱动程序目录中有一个脚本,它将在您的/ dev目录中安装ALSA-sound-devices.从驱动程序目录中键入./snddevices.现在应该有一个/ dev/snd子目录(测试它是否在那里.如果你不熟悉甚至"ls"命令,请考虑先阅读其他HOWTO.你应该有一些基本的Linux知识来安装这些驱动程序.)现在你已经准备好插入驱动程序,所以请转到下一段."

我记得我运行了一个随SoC alsa版本提供的snddevices脚本,但我不确定它是否成功或是否只是没有显示错误.但链接说我之后必须安装驱动程序?不幸的是我明天才能测试.

更新:

来自CL.和http://www.tldp.org/HOWTO/Alsa-sound-6.html我测试了以下内容: dev/snd/具有以下条目:

crw-rw----    1 root     audio     116,   0 Mar 11 04:44 controlC0 …
Run Code Online (Sandbox Code Playgroud)

c++ audio alsa capture

7
推荐指数
1
解决办法
4605
查看次数

如何配置不同的 ALSA 默认值以通过一台设备捕获并通过另一台设备播放?

我正在寻找一些帮助来配置 Raspberry Pi 上的音频,因为到目前为止我所有的谷歌搜索工作都没有成功!

我的设置:

  • Raspberry PI 3(运行 Debian Jessie)
  • 我用来捕捉音频的 USB 网络摄像头(罗技)
  • 用于播放的 3.5 毫米音频插孔中的外部扬声器

到目前为止,我已经设法将 ALSA 配置为默认情况下通过 USB 网络摄像头捕获并通过 3.5 毫米插孔播放。例如,以下工作正常:

# Capture from Webcam
arecord test.wav

# Playback through 3.5mm jack
aplay test.wav
Run Code Online (Sandbox Code Playgroud)

默认情况下,它以 8 位、8KHz、单声道捕获音频。但是,我希望默认捕获过程使用 16 位、16KHz、单声道设置,这就是我遇到的问题。

这是我的工作~/.asoundrc文件:

pcm.!default {

        type asym

        playback.pcm {
                type hw
                card 1
                device 0
        }

        capture.pcm {
                type plug
                slave {
                        pcm {
                                type hw
                                card 0
                                device 0
                        }
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

而我的/etc/modprobe.d/alsa-base.conf

options snd_usb_audio …
Run Code Online (Sandbox Code Playgroud)

linux audio alsa raspbian raspberry-pi3

7
推荐指数
1
解决办法
5941
查看次数

Linux管道音频文件到麦克风输入

我正在寻找一种方法将文件中的音频数据输入麦克风,因此当第三方应用程序(例如arecord或Chromium的"按语音搜索"功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据代替.

这是我的场景:我编写的应用程序从麦克风录制音频数据(使用ALSA)并将其保存到文件(audioFile0.raw).在未来的某个未知时间点,一些未知的第三方应用程序(例如,我没有开发的东西,所以我没有开发控制权,例如Chromium网络浏览器的"语音搜索"功能)将使用麦克风来获取音频数据.我希望第三方应用程序收集的音频数据来自audioFile.raw而不是实际的麦克风本身.

我在想是否可以将默认音频输入设备更改为音频文件,或者可能是命名管道并执行类似操作cat audioFile0.raw > mypipe(因为我不知道其他应用程序何时会尝试从麦克风读取).也许有一种更简单的方法可以做到这一点?

我希望我提供了足够的细节和清晰度.如果不清楚,请告诉我.


编辑: 所以我想通过在我的主目录中创建以下.asoundrc文件来制作虚拟麦克风:

pcm.!virtmic {
    type file
    slave.pcm "hw:0,0"
    file /dev/null
    infile "/home/charles/audioFiles/audioFile0.raw"
}

pcm.!default {
    type hw
    card 0
}

ctl.!default {
    type hw
    card 0
}
Run Code Online (Sandbox Code Playgroud)

然后调用arecord test.raw -c 1 -f S16_LE -r 16000 -t raw -D virtmic命令行,我能够记录音频数据是在audioFile0.rawtest.raw.

我现在的目标是用我的虚拟麦克风替换默认设备,这样任何访问麦克风的应用程序都将读取音频数据,audioFile0.raw而不是实际的麦克风本身.所以我编辑了我的.asoundrc文件,如下所示:

pcm.!virtmic {
    type file
    slave.pcm "hw:0,0"
    file /dev/null
    infile "/home/charles/audioFiles/audioFile0.raw"
}

pcm.!default {
    type asym
    playback.pcm {
        type hw
        card …
Run Code Online (Sandbox Code Playgroud)

linux audio microphone alsa voice-recording

7
推荐指数
1
解决办法
6864
查看次数