如何解决C ++中的ALSA-编写最少的工作代码 背景
主题
我想制作最少的工作代码,以在ALSA
计算机上使用C++
中的Linux
使用C++
生成任何类型的 PCM声音。
设置
我正在Code::Blocks
的{{1}}的{{1}}中进行编码。
背景
我曾经做过简单的Ubuntu 20.04
程序来进行声音处理,只需要播放原始PCM样本。
问题
ALSA Project's Website不太容易理解。
我查看了c - ALSA tutorial required,发现许多链接已过期。
我将minimal PCM example in C的代码直接复制粘贴到一个空的 Code :: Blocks 项目中,但出现错误:
Arduino UNO
第一行代码为||=== Build: Release in Test (compiler: GNU GCC Compiler) ===|
Test/main.cpp|5|fatal error: ../include/asoundlib.h: No such file or directory|
||=== Build failed: 1 error(s),0 warning(s) (0 minute(s),0 second(s)) ===|
。
我猜可能是因为我必须下载某些内容或为编译器添加链接器。
但我也认为可能是从C到C ++转换的问题,这意味着它在C中有效,但在C ++中无效。
我是否必须为编译器添加链接程序或下载某些内容以使the code正常工作?
然后我查看了ALSA library并下载了#include "../include/asoundlib.h"
。
我有一个档案看似正确的档案,但不知道如何处理。
然后我在计算机上找到了alsa-lib-1.2.3.tar.bz2
。它似乎是ALSA的一部分,但是当我更改代码以使用它时,使用时它会吐出一堆错误。
代码如下所示:
usr/include/sound/asound.h
错误是这样的:
/*
* This extra small demo sends a random samples to your speakers.
*/
#include <sound/asound.h>
#include <cstdio>
static char *device = "default"; /* playback device */
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] = random() & 0xff;
if ((err = snd_pcm_open(&handle,device,SND_PCM_STREAM_PLAYBACK,0)) < 0) {
printf("Playback open error: %s\n",snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,SND_PCM_FORMAT_U8,SND_PCM_ACCESS_RW_INTERLEAVED,1,48000,500000)) < 0) { /* 0.5sec */
printf("Playback open error: %s\n",snd_strerror(err));
exit(EXIT_FAILURE);
}
for (i = 0; i < 16; i++) {
frames = snd_pcm_writei(handle,buffer,sizeof(buffer));
if (frames < 0)
frames = snd_pcm_recover(handle,frames,0);
if (frames < 0) {
printf("snd_pcm_writei failed: %s\n",snd_strerror(frames));
break;
}
if (frames > 0 && frames < (long)sizeof(buffer))
printf("Short write (expected %li,wrote %li)\n",(long)sizeof(buffer),frames);
}
/* pass the remaining samples,otherwise they're dropped in close */
err = snd_pcm_drain(handle);
if (err < 0)
printf("snd_pcm_drain failed: %s\n",snd_strerror(err));
snd_pcm_close(handle);
return 0;
}
解决方法
请按照以下步骤操作:
- 安装ALSA开发软件包,或确保已安装。名称取决于您的分布。就我而言(OpenSUSE Tumbleweed),它是alsa-devel。这将在目录/ usr / include / alsa下安装文件asoundlib.h。
- 将代码中的行从
#include "../include/asoundlib.h"
更改为#include <alsa/asoundlib.h>
。注意尖括号而不是引号。 - 要链接的库名为libsound.so,因此请使用
gcc -Wall pcm_min.c -lasound -o pcm_min
之类的命令来编译程序。 - 运行程序:
./pcm_min
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。