Ошибка нарушения доступа в обратном вызове WaveInProc с указателем PTHIS в C ++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка нарушения доступа в обратном вызове WaveInProc с указателем PTHIS в C ++

Сообщение Anonymous »

Я работаю над диспетчера микрофонов в C ++, который обрабатывает аудио ввод с использованием API Windows MultiMedia. Тем не менее, я сталкиваюсь с ошибкой нарушения доступа при попытке получить доступ к переменным членам класса MicrophoneManager в статической WaveinProc Функции обратного вызова.
Вот упрощенная версия моего кода:
main cpp -файл:

файл CPP:




Код: Выделить всё

 #include "MicrophoneManager.h"

MicrophoneManager::MicrophoneManager(): logger(LOG_FILE)
{
this->isRun = false;
this->buffer.resize(MICRO_DATA_BUF_SIZE);
}

MicrophoneManager::~MicrophoneManager()
{
this->Stop();
}

void MicrophoneManager::Stop()
{
this->isRun = false;
this->StopMicrophone();
this->logger.Debug("MicrophoneManager", "Thread has been terminated");
}

MMRESULT MicrophoneManager::Run(SendCallback sendCallback, RunCallback runCallback)
{
this->isRun = true;
this->callback = sendCallback;

MMRESULT result = this->SetupMicrophone();
if (result != MMSYSERR_NOERROR) return result;

if (runCallback != nullptr) runCallback();

return waveInStart(this->hWaveIn);
}

MMRESULT MicrophoneManager::SetupMicrophone()
{
this->wfx.wFormatTag      = WAVE_FORMAT_PCM;
this->wfx.nChannels       = 1;
this->wfx.nSamplesPerSec  = 44100;
this->wfx.wBitsPerSample  = 16;
this->wfx.nBlockAlign     = this->wfx.nChannels * this->wfx.wBitsPerSample / 8;
this->wfx.nAvgBytesPerSec = this->wfx.nSamplesPerSec * this->wfx.nBlockAlign;
this->wfx.cbSize          = 0;

MMRESULT openRes = waveInOpen(&this->hWaveIn, 1, &this->wfx, (DWORD_PTR)&MicrophoneManager::WaveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION);
if (openRes != MMSYSERR_NOERROR)
{
this->logger.Error("MicrophoneManager", "Failed to open wave");
return openRes;
}

WAVEHDR _waveHeader;
std::vector dataBuf(MICRO_DATA_BUF_SIZE);
_waveHeader.lpData         = dataBuf.data();
_waveHeader.dwBufferLength = dataBuf.size();
_waveHeader.dwFlags        = 0;

MMRESULT prepareRes = waveInPrepareHeader(this->hWaveIn, &_waveHeader, sizeof(WAVEHDR));
if (prepareRes != MMSYSERR_NOERROR)
{
logger.Error("MicrophoneManager", "Failed to prepare header");
return prepareRes;
}

MMRESULT addRes = waveInAddBuffer(this->hWaveIn, &_waveHeader, sizeof(WAVEHDR));
if (addRes != MMSYSERR_NOERROR)
{
logger.Error("MicrophoneManager", "Failed to add buffer");
return addRes;
}

this->waveHeader = _waveHeader;
this->logger.Debug("MicrophoneManager", "Microphone has been successfully set up");

return MMSYSERR_NOERROR;
}

void MicrophoneManager::StopMicrophone()
{
waveInStop(this->hWaveIn);
waveInUnprepareHeader(this->hWaveIn, &this->waveHeader, sizeof(WAVEHDR));
waveInClose(this->hWaveIn);
}

void CALLBACK MicrophoneManager::WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInst, DWORD dwP1, DWORD dwP2)
{
MicrophoneManager* pThis = reinterpret_cast(dwInst);

switch (uMsg)
{
case WIM_DATA:
pThis->OnWaveData(pThis);
waveInAddBuffer(pThis->hWaveIn, &pThis->waveHeader, sizeof(WAVEHDR));
break;

default:
printf("ANOTHER MESSAGE: %d
", uMsg);
break;
}
}

void MicrophoneManager::OnWaveData(MicrophoneManager* pThis)
{
char headerBuf[1024];
snprintf(headerBuf, sizeof(headerBuf), "MICRO %d", pThis->waveHeader.dwBytesRecorded); // Error occurs here
pThis->callback(headerBuf, pThis->waveHeader.lpData, sizeof(headerBuf), pThis->waveHeader.dwBytesRecorded);
}
Файл заголовка: [/b]

Код: Выделить всё

 #pragma once

#include 
#include 
#include 
#include 
#include 
#include "Constants.h"
#include "Logger.h"
#include 

#define MICRO_DATA_BUF_SIZE 44100 * 2

typedef std::function SendCallback;
typedef std::function  RunCallback;

class MicrophoneManager
{
public:
bool isRun;
SendCallback callback;
Logger logger;
WAVEFORMATEX wfx;
HWAVEIN hWaveIn;
WAVEHDR waveHeader;
std::vector buffer;

MicrophoneManager();
~MicrophoneManager();

MMRESULT Run(SendCallback sendCallback, RunCallback runCallback);
void Stop();

private:
MMRESULT SetupMicrophone();
void StopMicrophone();
void OnWaveData(MicrophoneManager* pThis);
static void CALLBACK WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInst, DWORD dwP1, DWORD dwP2);
};
Проблема: Когда сообщение Wim_Data получено в обратном вызове WabeInProc , я получаю ошибку нарушения доступа, пытая>

Подробнее здесь: https://stackoverflow.com/questions/794 ... inter-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»