C ++特定的声音输出?

时间:2011-04-21 00:15:46

标签: audio c++

我想将一个电路连接到我的计算机,该计算机使用音频输出作为交流电流,通过某些频率,然后将其整流为几个LED,所以如果我编写一个程序,让你创建一个特定的模式和要点亮的LED组合,它会输出特定频率的声音。

如何使用C ++以特定频率播放声音?

可能的?

1 个答案:

答案 0 :(得分:1)

你可以用OpenAL做到这一点。

您需要生成一个包含代表所需输出的PCM编码数据的数组,然后使用所需的采样频率和格式调用阵列上的a​​lBufferData()。有关alBufferData()函数所需的格式,请参见OpenAL Programmers Guide的第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;
}