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;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)