Получить аудио данные, записанные в режиме реального времени переполнения стека

Я нашел код ниже, который записывает и воспроизводит волну, записанную за 3 секунды. Я хочу обрабатывать аудиоданные в режиме реального времени с конфигурацией Fs = 8000 Гц и размером буфера = 80 сэмплов, что означает длительность одного кадра = 0,01 с, я хочу получить (прочитайте 80 сэмплов и примените к нему мою работу) примерно так :

  1. Начать запись
  2. Каждые 0,01 сек. Получают данные и сохраняют их в векторе [80]
  3. myresult = myFct (вектор [80])
  4. Завершить запись (если условие завершено Время).

Так что проблема в третьем, читая некоторые документы, кажется, что я должен использовать потоки для получения данных. Любое предложение, пожалуйста?

// RecPlayThreeSec.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"#include <iostream>
#include <Windows.h>
using namespace std;

#pragma comment(lib, "winmm.lib")

short int waveIn[8000 * 3];

void PlayRecord();
void writedataTofile(LPSTR lpData, DWORD dwBufferLength);

void StartRecord()
{
const int NUMPTS = 8000 * 3;   // 3 seconds
int sampleRate = 8000;
// '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;
MMRESULT result;

WAVEFORMATEX pFormat;
pFormat.wFormatTag = WAVE_FORMAT_PCM;     // simple, uncompressed format
pFormat.nChannels = 1;                    //  1=mono, 2=stereo
pFormat.nSamplesPerSec = sampleRate;      // 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz
pFormat.nAvgBytesPerSec = sampleRate * 2;   // =  nSamplesPerSec × nBlockAlign
pFormat.nBlockAlign = 2;                  // = (nChannels × wBitsPerSample) / 8
pFormat.wBitsPerSample = 16;              //  16 for high quality, 8 for telephone-grade
pFormat.cbSize = 0;

// Specify recording parameters

result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat,
0L, 0L, WAVE_FORMAT_DIRECT);

WAVEHDR      WaveInHdr;
// Set up and prepare header for input
WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = NUMPTS * 2;
WaveInHdr.dwBytesRecorded = 0;
WaveInHdr.dwUser = 0L;
WaveInHdr.dwFlags = 0L;
WaveInHdr.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

// Insert a wave input buffer
result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));// Commence sampling input
result = waveInStart(hWaveIn);cout << "recording..." << endl;

Sleep(3 * 1000);
// Wait until finished recording

waveInClose(hWaveIn);
PlayRecord();
}

void PlayRecord()
{
const int NUMPTS = 8000 * 3;   // 3 seconds
int sampleRate = 8000;
// '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 pFormat;
pFormat.wFormatTag = WAVE_FORMAT_PCM;     // simple, uncompressed format
pFormat.nChannels = 1;                    //  1=mono, 2=stereo
pFormat.nSamplesPerSec = sampleRate;      // 44100
pFormat.nAvgBytesPerSec = sampleRate * 2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
pFormat.nBlockAlign = 2;                  // = n.Channels * wBitsPerSample/8
pFormat.wBitsPerSample = 16;              //  16 for high quality, 8 for telephone-grade
pFormat.cbSize = 0;

// Specify recording parameters

waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);

WAVEHDR      WaveInHdr;
// Set up and prepare header for input
WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = NUMPTS * 2;
WaveInHdr.dwBytesRecorded = 0;
WaveInHdr.dwUser = 0L;
WaveInHdr.dwFlags = 0L;
WaveInHdr.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

HWAVEOUT hWaveOut;
cout << "playing..." << endl;
waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT);
waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr)); // Playing the data
Sleep(3 * 1000); //Sleep for as long as there was recordedwaveInClose(hWaveIn);
waveOutClose(hWaveOut);
}
int main()
{
StartRecord();
return 0;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector