c++ - waveInProc/Windows 音频问题

标签 c++ windows winapi audio

我正在使用 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);

}

就像我说的,效果很好,但我正在尝试执行以下操作:

  • 将数据转换为short并复制到数组中
  • 将数据转为float并复制到数组中
  • 将数据复制到一个更大的字符数组,我将其写入 WAV
  • 将数据中继到任意输出设备

我经常使用 FMOD,并且熟悉交错等等。但是 FMOD 将所有内容都作为 float 进行处理。在这种情况下,我要走另一条路。我想我基本上只是在寻找有关如何从 LPSTR 转换为 short、float 和 unsigned char 的资源。

提前致谢!

最佳答案

typedef struct { 
    LPSTR      lpData; 
    // etc..
} WAVEHDR; 

Hmya,有点笨拙。这当然不是 STR,应该是 PVOID。只需将其转换为您需要的任何类型即可:

short* data = (short*)(mBuffer->lpData);
unsigned samples = mBuffer->dwBytesRecorded / sizeof(short);
// etc..

关于c++ - waveInProc/Windows 音频问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4632502/

相关文章:

c++ - 为什么在 Windows API 中调用 CoCreateInstance 函数时没有类型不匹配?

c++ - Vista 上的 MultiByteToWideChar API 更改

c++ - SDL2 - 为什么 SDL_CreateTextureFromSurface() 需要渲染器*?

c - (c) 我遇到了麻烦,每次我尝试执行程序时它都会崩溃

windows - 我可以向 Windows 上的应用程序发送 ctrl-C (SIGINT) 吗?

c# - SetWindowPos/MoveWindow 持续存在问题

c++ - VCOMP100.dll 丢失?

c++ - 模板文件中的类 'does not name a type' 错误

c++ - 为什么我的 C++ 对象一创建就被删除?

windows - 注册表碎片整理程序