C++ 特定的声音输出? [关闭]
Posted
技术标签:
【中文标题】C++ 特定的声音输出? [关闭]【英文标题】:C++ Specific Sound Output? [closed] 【发布时间】:2011-04-21 00:15:46 【问题描述】:我想在我的计算机上连接一个电路,它使用音频输出作为交流电流,通过某些频率,然后将其整流为几个 LED,所以如果我编写一个程序,让您创建一个特定的模式并组合点亮的LED,会输出特定频率的声音。
如何使用 C++ 以特定频率播放声音?
可能吗?
【问题讨论】:
您使用的是什么操作系统?任何特定的库/框架? 完全取决于设备和设备驱动程序。 已关闭。如果不回答 James 和 Gabe 的问题,我们就无法为您提供有意义的答案。请注意,即使有了这些信息,您仍然应该自己研究这个问题,并且在遇到困难之前不要询问信息。但是,如果您的问题是关于电路的具体细节,那么您也可能会因为过于本地化而被关闭。在这种情况下,我建议在讨论板上寻求有关特定电路的帮助。 【参考方案1】:您可以使用 OpenAL 做到这一点。
您需要生成一个包含代表您所需输出的 PCM 编码数据的数组,然后使用所需的采样频率和格式在您的数组上调用 alBufferData()。请参阅OpenAL Programmers Guide 第 21 页了解 alBufferData() 函数所需的格式。
例如,以下代码播放 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;
【讨论】:
以上是关于C++ 特定的声音输出? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章