繁体   English   中英

如何减少音频录制程序(C ++)中的CPU消耗

[英]How to reduce consumption of CPU in audio recording program (c++)

在互联网的帮助下,我编写了程序,可在麦克风运行时始终捕获其声音。 一切正常,但是我需要减少CPU的电量,因为现在大约30-35%。

int SoundCapture()
{
const int NUMPTS = 8000 * 1; // Sample rate * seconds
int sampleRate = 8000;
short int waveIn[NUMPTS];   // 'short int' is a 16-bit type; I request 16-bit samples below
                            // for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types
    HWAVEIN hWaveIn;
    WAVEFORMATEX waveform;
    WAVEHDR waveHeader;

waveform.wFormatTag = WAVE_FORMAT_PCM;  // simple, uncompressed format
waveform.nChannels = 1;                 //  1=mono, 2=stereo
waveform.nSamplesPerSec = 8000;
waveform.nAvgBytesPerSec = 8000;        // = nSamplesPerSec * n.Channels * wBitsPerSample/8
waveform.nBlockAlign = 1;               // = n.Channels * wBitsPerSample/8
waveform.wBitsPerSample = 8;            //  16 for high quality, 8 for telephone-grade
waveform.cbSize = 0;
MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, 0, 0, WAVE_FORMAT_DIRECT);
if (result)
{
    std::cout << "Something wrong with WaveOpen";
    std::cin.ignore(2);
    return 0;
}
// Set up and prepare header for input
waveHeader.lpData = (LPSTR)waveIn; //pointer to waveform buffer
waveHeader.dwBufferLength = NUMPTS;
waveHeader.dwBytesRecorded = 0;
waveHeader.dwUser = 0L;
waveHeader.dwFlags = 0L;
waveHeader.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR));

// Insert a wave input buffer
result = waveInAddBuffer(hWaveIn, &waveHeader, sizeof(WAVEHDR));
if (result)
{
    std::cout << "Something wrong with waveInAddBuffer";
    std::cin.ignore(2);
    return 0;
}
// Commence sampling input
time_t t = time(0);   // get time now
result = waveInStart(hWaveIn);
if (result)
{
    std::cout << "Something wrong with WaveStart";
    std::cin.ignore(2);
    return 0;
}


// Wait until finished recording
do {} while (waveInUnprepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
SaveWavFile(&waveHeader, t);
waveInClose(hWaveIn);
}

这是产生电荷的全部功能。 我该如何减少呢? 也许我不能? 使用WindowsAPI以外的其他捕获方法?

我试图降低每秒采样数,但这并没有太大帮助。 我想这与缓冲区有关,但需要任何提示。

干杯

正如我们已经评论过的,cpu消耗是由于do-while循环中的主动等待。 我建议在Windows中使用Event对象 但是,作为即时解决方案,我建议您睡眠几毫秒(进行相关计算以确切地知道什么是最理想的时间,如@MSalters在其评论中所述)。

基于“ 如何使Win 32上的C ++程序进入睡眠状态”? 一个可能的解决方案是:

#include <windows.h>

//....
do {
   Sleep(X);
} 
while (waveInUnprepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
//....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM