Audio C++;特定声音输出?
我想把一个电路连接到我的电脑上,它使用音频输出作为交流电流,通过特定频率,然后将其整流到几个LED,所以如果我写一个程序,让你创建一个特定的模式和LED组合来点亮,它将输出特定频率的声音 < C++ > 如何在特定频率播放声音?Audio C++;特定声音输出?,audio,c++,Audio,C++,我想把一个电路连接到我的电脑上,它使用音频输出作为交流电流,通过特定频率,然后将其整流到几个LED,所以如果我写一个程序,让你创建一个特定的模式和LED组合来点亮,它将输出特定频率的声音 < C++ > 如何在特定频率播放声音? 可能吗?您可以使用OpenAL实现这一点 您需要生成一个包含PCM编码数据的数组,该数据表示所需的输出,然后使用所需的采样频率和格式对数组调用alBufferData()。有关alBufferData()函数所需的格式,请参见的第21页 例如,以下代码播放100hz音调
可能吗?您可以使用OpenAL实现这一点 您需要生成一个包含PCM编码数据的数组,该数据表示所需的输出,然后使用所需的采样频率和格式对数组调用alBufferData()。有关alBufferData()函数所需的格式,请参见的第21页 例如,以下代码播放100hz音调
#include <iostream>
#include <cmath>
#include <al.h>
#include <alc.h>
#include <AL/alut.h>
#pragma comment(lib, "OpenAL32.lib")
#pragma comment(lib, "alut.lib")
int main(int argc, char** argv)
{
alutInit(&argc, argv);
alGetError();
ALuint buffer;
alGenBuffers(1, &buffer);
{
// Creating a buffer that hold about 1.5 seconds of audio data.
char data[32 * 1024];
for (int i = 0; i < 32 * 1024; ++i)
{
// get a value in the interval [0, 1) over the length of a second
float intervalPerSecond = static_cast<float>(i % 22050) / 22050.0f;
// increase the frequency to 100hz
float intervalPerHundreth = fmod(intervalPerSecond * 100.0f, 1.0f);
// translate to the interval [0, 2PI)
float x = intervalPerHundreth * 2 * 3.14159f;
// and then convert back to the interval [0, 255] for our amplitude data.
data[i] = static_cast<char>((sin(x) + 1.0f) / 2.0f * 255.0f);
}
alBufferData(buffer, AL_FORMAT_MONO8, data, 32 * 1024, 22050);
}
ALuint source;
alGenSources(1, &source);
alSourcei(source, AL_BUFFER, buffer);
alSourcePlay(source);
system("pause");
alSourceStop(source);
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
alutExit();
return 0;
}
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“OpenAL32.lib”)
#pragma注释(lib,“alut.lib”)
int main(int argc,字符**argv)
{
明矾(&argc,argv);
阿尔及利亚恐怖();
明矾缓冲液;
阿尔金缓冲区(1和缓冲区);
{
//创建一个缓冲区,保存大约1.5秒的音频数据。
字符数据[32*1024];
对于(int i=0;i<32*1024;++i)
{
//在一秒钟的长度上获取间隔[0,1]中的值
浮动间隔秒=静态(i%22050)/22050.0f;
//将频率增加到100hz
浮动间隔百分之一百=fmod(间隔秒*100.0f,1.0f);
//转换为间隔[0,2PI)
浮点数x=百分之二间隔*2*3.14159f;
//然后转换回振幅数据的区间[0255]。
数据[i]=静态(sin(x)+1.0f)/2.0f*255.0f);
}
alBufferData(缓冲区,AL_格式,数据,32*1024,22050);
}
明矾源;
阿尔及利亚资源(1,&来源);
alSourcei(源、AL_缓冲区、缓冲区);
alSourcePlay(来源);
系统(“暂停”);
alSourceStop(来源);
alDeleteSources(1和来源);
alDeleteBuffers(1和缓冲区);
alutExit();
返回0;
}
您使用的是什么操作系统?任何特定的库/框架?完全取决于设备和设备驱动程序。关闭。如果不回答James和Gabe的问题,我们将无法为您提供有意义的答案。请注意,即使有了这些信息,您仍然应该自己研究这个问题,而不是询问信息n直到你陷入困境。不过,如果你的问题是关于你电路的具体细节,你也会因为过于本地化而面临被关闭的风险。在这种情况下,我建议在讨论板上寻求关于具体电路的帮助。