- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我稍微修改了取自 ALSA Project website 的演示为了在我笔记本电脑的声卡(Intel PCH ALC3227 Analog,Ubuntu 18.04)上进行测试,它需要 2 个 channel 和 16 位整数。我还将延迟加倍(1 秒),关闭重采样并使演示持续时间更长。这是代码(为了综合起见,未粘贴运行时错误检查)
#include <alsa/asoundlib.h>
#include <stdlib.h>
static char *device = "hw:1,0"; /* playback device */
snd_output_t *output = NULL;
unsigned char buffer[16*1024]; /* some random data */
int main(void) {
int err;
unsigned int i;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
for (i = 0; i < sizeof(buffer); i++)
buffer[i] = (unsigned char) (rand() & 0xff);
snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)
snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE,
SND_PCM_ACCESS_RW_INTERLEAVED, 2, 48000, 0, 1E6);
// Print actual buffer size
snd_pcm_hw_params_t *hw_params;
snd_pcm_hw_params_malloc(&hw_params);
snd_pcm_hw_params_current(handle, hw_params);
snd_pcm_uframes_t bufferSize;
snd_pcm_hw_params_get_buffer_size(hw_params, &bufferSize);
printf("ALSA buffer size = %li\n", bufferSize);
// playback
for (i = 0; i < 256; ++i) {
frames = snd_pcm_writei(handle, buffer, sizeof(buffer) / 4);
if (frames < 0)
frames = snd_pcm_recover(handle, (int) frames, 0);
if (frames < 0) {
printf("snd_pcm_writei failed: %s\n", snd_strerror((int) frames));
break;
}
if (frames > 0 && frames < (long) sizeof(buffer) / 4)
printf("Short write (expected %li, wrote %li)\n",
(long) sizeof(buffer) / 4, frames);
}
snd_pcm_hw_params_free(hw_params);
snd_pcm_close(handle);
return (0);
}
音频有效,但有人能解释一下为什么我有时会得到如下输出
ALSA buffer size = 16384
Short write (expected 4096, wrote 9)
Short write (expected 4096, wrote 4080)
表示 snd_pcm_writei
写入的帧数少于预期?根据ALSA docs ,我知道必须出现一个信号,但我不明白原因和哪个信号。
我也尝试将 buffer
的大小减半,但结果是一样的。
最佳答案
报错时报short read,但部分帧已经写入成功。
你应该用剩余的缓冲区再次调用同一个函数;如果错误不是暂时性的,则将被报告。(这个示例代码是错误的;它只是忽略了缓冲区的剩余部分没有被写入。)
关于c - ALSA 'snd_pcm_writei' 阻塞模式下的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55182162/
我注意到 pcm.c 和 speaker-test.c 中的正弦发生器循环生成一个新的正弦缓冲区。所以它不断地重新创建相同的缓冲区。我想播放缓冲区而不是每次都重新创建它以节省一些 cpu 时间。但是,
我试图使用 ALSA 生成蜂鸣声。应发出 2 声蜂鸣声,第二声在延迟 1 秒后发出。我的代码如下所示。 if ((err = snd_pcm_prepare (playback_handle)) <
在运行我最近从 Ember 中恢复的旧程序时,我遇到了缓冲区不足的情况。 程序将原始声音文件完全加载到内存中(2100 字节长,525 帧)并准备 ALSA 进行输出(44.1khz,2 channe
如果我的问题标题很糟糕,请原谅我。我的妻子总是告诉我,我不擅长措辞。 我编写了一些代码来读取由另一个线程填充的缓冲区。缓冲区中充满了由 opus 编解码器编码的音频数据。每次 20 毫秒从远程端接收
我在 arm linux 3.10 中使用 alsa。有 3 个无线设备:两个使用 snd_pcm_readi 和 sendmsg 捕获和发送 pcm,一个作为接收器,使用 snd_pcm_write
snd_pcm_writei 和 snd_pcm_readi 有什么区别?当我尝试使用这两个功能时,它们似乎都在从缓冲区中播放?似乎只有 handle 的配置方式 SND_PCM_STREAM_CAP
我稍微修改了取自 ALSA Project website 的演示为了在我笔记本电脑的声卡(Intel PCH ALC3227 Analog,Ubuntu 18.04)上进行测试,它需要 2 个 ch
我正在尝试以重复的方式播放 1000 毫秒的 wav 文件。因此,播放 1000 毫秒,然后播放 1000 毫秒的静音,然后再次播放 1000 毫秒的音频,... 但是当我在此过程中打印计时时,我注意
我很难理解我在音频播放例程中做错了什么。我有一个线程从其他线程获取缓冲区并以与此 alsa 示例程序相同的方式播放它们:https://www.alsa-project.org/alsa-doc/al
我正在使用 ASLA Audio API 在我的嵌入式 Linux 应用程序中播放声音。我有时观察到 snd_pcm_writei API 返回 –EPIPE 错误,当该错误发生时,我调用 snd_p
用ALSA播放音频,调用snd__pcm__writei后,是立即释放sample buffer还是需要等声音播放完再释放sample buffer? 例如: unsigned short *buff
我已经尝试了多个示例程序,它们似乎有代码来处理播放时的 xruns: https://albertlockett.wordpress.com/2013/11/06/creating-digital-a
我是一名优秀的程序员,十分优秀!