Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Audio C++;特定声音输出?_Audio_C++ - Fatal编程技术网

Audio C++;特定声音输出?

Audio C++;特定声音输出?,audio,c++,Audio,C++,我想把一个电路连接到我的电脑上,它使用音频输出作为交流电流,通过特定频率,然后将其整流到几个LED,所以如果我写一个程序,让你创建一个特定的模式和LED组合来点亮,它将输出特定频率的声音 < C++ > 如何在特定频率播放声音? 可能吗?您可以使用OpenAL实现这一点 您需要生成一个包含PCM编码数据的数组,该数据表示所需的输出,然后使用所需的采样频率和格式对数组调用alBufferData()。有关alBufferData()函数所需的格式,请参见的第21页 例如,以下代码播放100hz音调

我想把一个电路连接到我的电脑上,它使用音频输出作为交流电流,通过特定频率,然后将其整流到几个LED,所以如果我写一个程序,让你创建一个特定的模式和LED组合来点亮,它将输出特定频率的声音

< C++ >

如何在特定频率播放声音?
可能吗?

您可以使用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直到你陷入困境。不过,如果你的问题是关于你电路的具体细节,你也会因为过于本地化而面临被关闭的风险。在这种情况下,我建议在讨论板上寻求关于具体电路的帮助。