【发布时间】:2011-01-08 05:20:46
【问题描述】:
我正在使用 Windows API 来获取音频输入。我已经按照 MSDN 上的所有步骤,并设法将音频录制到 WAV 文件中。没问题。我正在使用多个缓冲区等等。我想对缓冲区做更多的事情,而不是简单地写入文件,所以现在我已经设置了一个回调。它工作得很好,我正在获取数据,但我不知道一旦我有了它该怎么做。
这是我的回调...这里一切正常:
// Media API callback
void CALLBACK AudioRecorder::waveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
// Data received
if (uMsg == WIM_DATA)
{
// Get wav header
LPWAVEHDR mBuffer = (WAVEHDR *)dwParam1;
// Now what?
for (unsigned i = 0; i != mBuffer->dwBytesRecorded; ++i)
{
// I can see the char, how do get them into my file and audio buffers?
cout << mBuffer->lpData[i] << "\n";
}
// Re-use buffer
mResultHnd = waveInAddBuffer(hWaveIn, mBuffer, sizeof(mInputBuffer[0])); // mInputBuffer is a const WAVEHDR *
}
}
// waveInOpen cannot use an instance method as its callback,
// so we create a static method which calls the instance version
void CALLBACK AudioRecorder::staticWaveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
// Call instance version of method
reinterpret_cast<AudioRecorder *>(dwParam1)->waveInProc(hWaveIn, uMsg, dwInstance, dwParam1, dwParam2);
}
就像我说的,效果很好,但我正在尝试执行以下操作:
- 将数据转换为短格式并复制到数组中
- 将数据转换为浮点数并复制到数组中
- 将数据复制到一个更大的 char 数组中,我将其写入 WAV
- 将数据中继到任意输出设备
我与 FMOD 合作过很多次,我对交错和所有这些都很熟悉。但是 FMOD 将所有内容都作为浮点数处理。在这种情况下,我会走另一条路。我想我基本上只是在寻找有关如何从 LPSTR 到 short、float 和 unsigned char 的资源。
非常感谢!
【问题讨论】:
-
哇,谢谢大家的帮助!我知道这是一个非常笼统的问题,所以我很欣赏具体的答案。重新开始工作,很快就会标记答案/回复。
-
请注意:wave API 非常挑剔 - 您不能在 wave 过程中做太多工作。 MSDN (msdn.microsoft.com/en-us/library/aa909756.aspx) 上的警告非常明确:从回调中调用 wave* 函数(如 waveInAddBuffer)极有可能死锁。