Anonymous
Ошибка нарушения доступа в обратном вызове WaveInProc с указателем PTHIS в C ++
Сообщение
Anonymous » 10 мар 2025, 15:04
Я работаю над диспетчера микрофонов в 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
1741608255
Anonymous
Я работаю над диспетчера микрофонов в C ++, который обрабатывает аудио ввод с использованием API Windows MultiMedia. Тем не менее, я сталкиваюсь с ошибкой нарушения доступа при попытке получить доступ к переменным членам класса MicrophoneManager в статической WaveinProc Функции обратного вызова. Вот упрощенная версия моего кода: [b] main cpp -файл: файл CPP: [code] #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); } [/code] Файл заголовка: [/b] [code] #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); }; [/code] [b] Проблема: [/b] Когда сообщение Wim_Data получено в обратном вызове WabeInProc , я получаю ошибку нарушения доступа, пытая> Подробнее здесь: [url]https://stackoverflow.com/questions/79497938/access-violation-error-in-waveinproc-callback-with-pthis-pointer-in-c[/url]