- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现当我对 snd_pcm_hw_params_get_*
进行一些调用时,一个简单的 ALSA 播放程序的行为会有所不同。职能。我的程序反复播放缓冲区中的正弦波。当我包括电话时,我得到了我所期望的纯音。但是,当我删除调用时,我会听到一连串的哔哔声。这让我很担心,因为我不希望检索数据的调用与声音的播放方式有任何关系。我在便宜的 USB 声卡和我的(可能更好的)内部声卡上都得到了这种行为。
这是代码:
#define GETPARAMS
int main() {
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
const char name[] = "hw:0,0";
int dir;
snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK;
snd_pcm_access_t access = SND_PCM_ACCESS_RW_INTERLEAVED;
snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
unsigned int rate = 48000;
unsigned int channels = 2;
unsigned int periods = 4;
snd_pcm_uframes_t periodsize = 2048;
int num_frames = 2*periodsize;
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_open(&handle, name, stream, 0);
snd_pcm_hw_params_any(handle, params);
#ifdef GETPARAMS
printf("\nparameters before setting:\n");
snd_pcm_hw_params_get_rate(params, &rate, &dir);
printf(" rate = %d, dir = %d\n", rate, dir);
snd_pcm_hw_params_get_channels(params, &channels);
printf(" channels = %d\n", channels);
snd_pcm_hw_params_get_periods(params, &periods, &dir);
printf(" periods = %d, dir = %d\n", periods, dir);
snd_pcm_hw_params_get_buffer_size(params, &periodsize);
printf(" periodsize = %ld\n", periodsize);
#endif
snd_pcm_hw_params_set_access(handle, params, access);
snd_pcm_hw_params_set_format(handle, params, format);
snd_pcm_hw_params_set_rate_near(handle, params, &rate, &dir);
snd_pcm_hw_params_set_channels(handle, params, 2);
snd_pcm_hw_params_set_periods(handle, params, periods, 0);
snd_pcm_hw_params_set_buffer_size(handle, params, num_frames);
snd_pcm_hw_params(handle, params);
#ifdef GETPARAMS
printf("\nparameters after setting:\n");
snd_pcm_hw_params_get_rate(params, &rate, &dir);
printf(" rate = %d, dir = %d\n", rate, dir);
snd_pcm_hw_params_get_channels(params, &channels);
printf(" channels = %d\n", channels);
snd_pcm_hw_params_get_periods(params, &periods, &dir);
printf(" periods = %d, dir = %d\n", periods, dir);
snd_pcm_hw_params_get_buffer_size(params, &periodsize);
printf(" periodsize = %ld\n\n", periodsize);
#endif
int16_t *data = (int16_t*)calloc(2*periodsize, sizeof(int16_t));
loadpage(data, 2*periodsize);
snd_pcm_sframes_t frames;
snd_pcm_prepare(handle);
for (int i=0; i<8; i++) {
frames = snd_pcm_writei(handle, data, num_frames);
if (frames < 0)
frames = snd_pcm_recover(handle, frames, 0);
if (frames < 0) {
printf("snd_pcm_writei failed: %s\n", snd_strerror(frames));
}
if (frames > 0 && frames < num_frames)
printf("short write (expected %d, write %li)\n", num_frames, frames);
}
snd_pcm_close(handle);
free(data);
}
loadpage()
填充缓冲区。当我注释掉
#define GETPARAMS
我听到一连串短促的哔哔声。当我包含它时,我会得到一个纯音。
GETPARAMS
时的输出被定义为:
parameters before setting:
rate = 48000, dir = 32766
channels = 2
periods = 4, dir = 32766
periodsize = 2048
parameters after setting:
rate = 48000, dir = 0
channels = 2
periods = 4, dir = 0
periodsize = 4096
最佳答案
您不得调用snd_pcm_hw_param_get_*()
如果参数尚未设置,则函数,因为那时配置空间包含参数的多个潜在值。
打印 hw_params
的当前状态容器,使用 snd_pcm_hw_params_dump()
:
snd_output_t *output;
snd_output_stdio_attach(&output, stdout, 0);
...
snd_pcm_hw_params_dump(params, output);
...
snd_output_close(output);
periods
的初始值,
periodsize
, 和
num_frames
不一致,并且
_get_
调用用恰好一致的其他值覆盖这些变量。
关于audio - ALSA 播放中断,没有 snd_pcm_hw_params_get_* 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49684021/
我正在尝试在 CentOS 5.6 上构建 qt 但它失败的原因是系统没有所需的库。 我正在尝试使用 Fedora qt 源 rpm 文件中的源文件和规范文件进行构建。 $ rpmbuild -ba
如何在默认声卡上监听主 channel 的音量变化?我希望通过 dbus 或回调或其他方式收到音量已更改的通知。 我已经尝试查看 ALSA 和 PulseAudio API,它们似乎只允许您设置和获取
我在我的 RHEL 7.5 机器上配置 ALSA 时遇到问题。 我的部分解决方案是尝试更改/etc/asound.conf 中的设置。我尝试了很多排列组合,但我仍然听到我的声音(.raw 文件)中有“
我有一个在 linux 上使用 ALSA 驱动程序的音频应用程序,并且该代码在 intel linux 台式机上运行良好。但是,我也想支持 Raspberry Pi,并且我在该平台上遇到了周期性的音频
我正在尝试使用 travis-ci 构建一个 rust 二进制文件。我设法让 windows 和 osx 构建工作,但 linux 构建一直失败。 似乎“alsa-sys” crate (依赖项之一)
我正在尝试使用 linux 机器上的 alsa api 从我的应用程序内部将麦克风静音。我正在使用以下代码更改 volume=0 的音量: long min, max; snd_mixer_t *ha
我正在尝试运行包含以下内容的基本 Pygame midi 脚本: import pygame, pygame.midi pygame.midi.init() print "Midi Dev
我正在使用没有可用的 ALSA snd-dummy 模块的 docker 镜像。我需要模拟声卡。我不需要(或不想)听音频。 根据我所做的许多搜索,我相当确定我想使用 ALSA 的 snd-dummy
我注意到 pcm.c 和 speaker-test.c 中的正弦发生器循环生成一个新的正弦缓冲区。所以它不断地重新创建相同的缓冲区。我想播放缓冲区而不是每次都重新创建它以节省一些 cpu 时间。但是,
使用不断输出数据的 USB 音频设备(它是具有多个 channel 的 HID)。 我希望实现的是在设备发出信号之前忽略音频。那时我会开始监控提要。来自设备的第二个信号表明我可以重新忽略数据。我已经以
我使用的是 Ubuntu 20。我输入了 sudo nano /usr/share/alsa/alsa.conf并得到以下输出:output of the above command 我不知道它是否有
ALSA 的 snd_pcm_hw_params_set_access使用 SND_PCM_ACCESS_RW_NONINTERLEAVED access type 调用时函数失败,报告存在无效参数。
我正在尝试使用 IBM watson TTS 引擎来播放文本。播放声音时,出现以下错误: ALSA lib confmisc.c:1286:(snd_func_refer) Unable to fin
我有一个我正在做的项目,为了这个问题,可以说它们是无线扬声器。 我们现在正在使用树莓派进行开发,但我们计划转向我们自己的嵌入式解决方案。我们选择的编解码器最适合我们的需求,尽管它不是“支持 ALSA”
我正在播放带有某些C代码(如this)的wav声音文件。它使用所有API: snd_pcm_* 我想使用均衡器插件: libasound_module_ctl_equal.so, libasound_
我有一个连接了 i2s MEMS 麦克风的 Raspberry Pi。我正在使用 SOX 库从中录制音频,并尝试增加我的 ALSA buffer_size。 我的 ALSA buffer_size 目
使用 Linux Mint 17.1 和 ALSA。我有两个产生相同声音的 wav 文件:一个使用 pcm_s16le,另一个使用 pcm_s24le。每个都由图腾/视频正确播放。我设置硬件参数和使用
我继承了一段代码,它使用 ALSA 来捕获 8KHz、8 位、1 channel 的音频输入。代码看起来相当简单,它将 channel 设置为 1,速率设置为 8000,周期大小设置为 8000。该程
使用 Linux Mint 17.1 和 ALSA。我有两个产生相同声音的 wav 文件:一个使用 pcm_s16le,另一个使用 pcm_s24le。每个都由图腾/视频正确播放。我设置硬件参数和使用
我有一个 ubuntu 安装,默认安装了pulseaudio。当pulseaudio运行时,这有效: aplay -D hw:2,7/usr/share/xbmc/sounds/Bursting\Bu
我是一名优秀的程序员,十分优秀!