You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4使用OpenAL播放正弦波仅出现静电噪音的问题求助

树莓派4使用OpenAL播放正弦波仅出现静电噪音的问题求助

各位好,我正在树莓派4上做一个简单的音频测试:用OpenAL生成并播放一个正弦波,但目前只能听到静电噪音,完全没有预期的清晰正弦波声音。我已经过一遍代码的基本流程,但找不到问题所在,想请大家帮忙看看。

我使用的编译命令是:

g++ vc.cpp -o vc -l openal

以下是我的完整代码:

#include <cmath>
#include <AL/al.h>
#include <AL/alc.h>
#include <iostream>
using namespace std;

const int nos = 204800;
const int freq = 44100;
const float pi = 3.14159265359;

int main(){
    if (alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT") ==AL_TRUE)
        printf("enum supported\n");
    // 待办:获取并打印设备列表,选择合适的设备
    ALCdevice* Device = alcOpenDevice(NULL);
    ALCcontext* Context = alcCreateContext(Device,NULL);
    alcMakeContextCurrent(Context);
    alGetError();

    ALuint buffer;
    alGenBuffers((ALuint)1, &buffer);

    unsigned char testdata[nos];
    for(int n = 0; n < nos; n++){
        testdata[n] = 128+(char)(126*sin(2*pi*freq/10.0*n));
    }

    alBufferData(buffer, AL_FORMAT_MONO8, &testdata[0], nos, freq);

    ALuint source;
    alGenSources((ALuint)1, &source);
    alSourcei(source, AL_BUFFER, buffer);

    printf("test\n");
    alSourcePlay(source);

    ALint source_state;
    alGetSourcei(source, AL_SOURCE_STATE, &source_state);
    while (source_state == AL_PLAYING) {
        alGetSourcei(source, AL_SOURCE_STATE, &source_state);
    }

    alDeleteSources(1, &source);
    alDeleteBuffers(1, &buffer);

    Device = alcGetContextsDevice(Context);
    alcMakeContextCurrent(NULL);
    alcDestroyContext(Context);
    alcCloseDevice(Device);

    printf("done\n");
}

目前我自己初步怀疑几个可能的方向,但还没找到确切问题:

  • 设备选择:我现在用alcOpenDevice(NULL)打开默认设备,会不会树莓派上的默认音频设备不是我实际要输出的设备(比如HDMI和3.5mm耳机孔的优先级问题)?
  • 正弦波生成逻辑:计算样本值的时候,类型转换或者数学公式有没有错误?比如2*pi*freq/10.0*n这个频率计算是不是哪里不对?
  • OpenAL在树莓派上的兼容性:有没有特殊的配置要求?比如需要调整ALSA设置或者启用特定的音频服务?

希望有经验的朋友能帮我排查下问题,谢谢大家!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:44:33