问题描述
主题
我想制作最少的工作代码,以在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;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)