Winapi 从立体声输入录制单声道

Winapi 从立体声输入录制单声道,winapi,audio,winmm,Winapi,Audio,Winmm,我有一个带有两个输入的音频接口:麦克风和乐器。在Windows中,它由单个立体声音频输入表示,左声道获得麦克风输入,右声道获得乐器输入 我像这样打开录制会话: void CALLBACK waveIn(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2); // ... const int nchannels = 2; const int sr = 48000; HWAVE

我有一个带有两个输入的音频接口:麦克风和乐器。在Windows中,它由单个立体声音频输入表示,左声道获得麦克风输入,右声道获得乐器输入

我像这样打开录制会话:

void CALLBACK waveIn(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);

// ...

const int nchannels = 2;
const int sr = 48000;

HWAVEIN hwi;
WAVEFORMATEX wfe = 
{
    WAVE_FORMAT_IEEE_FLOAT,         // wFormatTag
    nchannels,                      // nChannels
    sr,                             // nSamplesPerSec
    sr * sizeof(float) * nchannels, // nAvgBytesPerSec
    sizeof(float) * nchannels,      // nBlockAlign
    32,                             // wBitsPerSample
    0                               // cbSize
};
MMRESULT openResult = waveInOpen(&hwi, 0, &wfe, (DWORD_PTR)waveIn, 0, CALLBACK_FUNCTION);
// ..set up buffers..
MMRESULT startResult = waveInStart(hwi);

然后在
waveIn
函数中处理样本。它工作得很好,但我只需要处理乐器(右声道)数据,对麦克风不感兴趣。我尝试在上面的代码中设置
nchannels=1
,希望它能混合两个通道,但我只从麦克风(左)通道获取数据。有没有办法通过立体声输入设置录音,以便只获得正确(或两者混合)的音频通道数据(如单声道录音)?

您只需在
waveIn
回调函数中执行所需的处理。在每秒
sampleRate
的次数下,您将获得
nchannels
样本。或者选择您想要的,然后将其传递给进一步的处理,或者将它们混合在一起并将结果传递给进一步的处理。只需丢弃一个通道或另一个通道,或将它们一起添加-这是直截了当的。不幸的是,我无法更改实际的处理代码,它需要单声道输入,而我没有它的来源。几个月来我一直在思考这个问题-是什么阻止你编写
waveIn
(如上所示)回调函数?在它中,您可以根据需要剥离/混合通道,然后再调用您的原始处理函数?据第三方代码所知,它只是由MM子系统使用单通道数据调用。上面的代码本质上是对已编译的二进制文件(即,不是实际代码,无需编译)进行反向工程的结果,我希望对其稍加修补,使其与我的硬件正常工作。@nOrd-ahhh!我懂了。嗯-近十年来没有做过任何严重的反向工程/黑客攻击。嗯,除了找到一个代码洞并将程序流重新定向到它和您自己的一些新代码之外,在调用原始代码之前,您可能需要通过Api挂钩(即迂回库或等效工具)尝试执行该任务。如果你愿意,我很乐意与OllyDbg和IDA Pro Advanced中的任何一方/双方一起玩这个程序,但我已经很久没有以类似的方式玩过这个程序了。您可能会从exetools或tuts4you论坛获得更好的答案。;)