我正在处理一个项目,该项目涉及在播放时必须通过fft处理PCM音频数据,最好是同步。我正在使用linux g ++编译器,目前使用OpenAL读取和播放音频数据。
我的问题是:有没有更好的方法来处理PCM音频数据与fft实时音频播放然后使用线程?如果没有,那么什么线程库最适合用于这些目的。
这是我的函数,它将波形数据加载到一个字节数组中,以后可以将这些数据转换为int进行处理,而我用来播放数据的是OpenAL。
char* loadWAV(const char* fn, int& chan, int& samplerate, int& bps, int& size){
char buffer[4];
ifstream in(fn, ios::binary);
in.read(buffer, 4); //ChunkID "RIFF"
if(strncmp(buffer, "RIFF", 4) != 0){
cerr << "this is not a valid wave file";
return NULL;
}
in.read(buffer,4); //ChunkSize
in.read(buffer,4); //Format "WAVE"
in.read(buffer,4); // "fmt "
in.read(buffer,4); // 16
in.read(buffer,2); // 1
in.read(buffer,2); // NUMBER OF CHANNELS
chan = convertToInt(buffer,2);
in.read(buffer,4); // SAMPLE RATE
samplerate = convertToInt(buffer,4);
in.read(buffer,4); // ByteRate
in.read(buffer,2); // BlockAlign
in.read(buffer,2); // bits per sample
bps = convertToInt(buffer,2);
in.read(buffer,4); // "data"
in.read(buffer,4);
size = convertToInt(buffer,4);
char * data = new char[size];
in.read(data,size);
return data;
}
感谢您的帮助。
编辑:对于可能感兴趣的任何人,我使用this作为参考来编写函数 如何格式化WAV文件
答案 0 :(得分:1)
您是否希望使用OpenAL执行FFT?我不知道这是否可能。您的代码可能正在执行FFT。
您无需显式设置任何线程。但是,您的音频输出库可能会代表您这样做。我不熟悉OpenAL,但是许多音频库的运行方式是让你指定一个回调函数,将更多的音频输入到输出中。因此,您的主程序将从音频文件加载音频,将其填充到缓冲区(可能受互斥锁保护),以便读取音频回调,在音频窗口上计算FFT,并可能为用户显示数据。 / p>
同样,音频库可能会管理线程,因此您无需担心确切的线程实现或库。但请确保使用互斥锁正确管理共享数据。