树莓派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
相关产品推荐
相关产品推荐

