Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.197.113.64] |
|
Сообщ.
#1
,
|
|
|
В программе Как программа записи звука с микрофона прерывает запись? формируются буферы
for(int j = jmin; j < nKan; j++) { wvRes = waveInOpen(&hwvInDev, nDev, &wvFormat, (DWORD)wvRecCallBack, 0L, CALLBACK_FUNCTION); wvErrorMes("\nУстройство для записи открыть не удалось!\n", wvRes); for(UINT i = 0; i < numBuf; i++) { char *sbuf = (char*) malloc(numBufSize); WAVEHDR *wvBuf = (WAVEHDR *)malloc(sizeof(*wvBuf)); wvBuf -> lpData = sbuf; wvBuf -> dwFlags = 0; wvBuf -> dwLoops = 0; wvBuf -> dwUser = 0; wvBuf -> dwBufferLength = numBufSize; wvRes = waveInPrepareHeader(hwvInDev, wvBuf, sizeof(*wvBuf)); wvErrorMes("\nНе удалось подготовить буфер для записи!\n", wvRes); wvRes = waveInAddBuffer(hwvInDev, wvBuf, sizeof(*wvBuf)); wvErrorMes("\nНе удалось добавить буфер для записи!\n", wvRes); } wvRes = waveInStart(hwvInDev); wvErrorMes("\nНе удалось начать запись!\n", wvRes); } void CALLBACK wvRecCallBack(HWAVEIN hwvInDev, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { WAVEHDR *wvBuf = (WAVEHDR*) dwParam1; MMRESULT wvRes = 0; switch(uMsg) { case WIM_OPEN: printf("\nЗапись началась\n"); break; case WIM_DATA: if(!mode) printf("Операции с буфером\n"); fwrite(wvBuf -> lpData, wvBuf -> dwBytesRecorded, 1, pf); if(mode == stop) { cout << "Операции завершения записи" << endl; wvRes = waveInUnprepareHeader(hwvInDev, wvBuf, sizeof(*wvBuf)); wvErrorMes("\nНе удалось освободить буфер!\n", wvRes); free(wvBuf -> lpData); free((WAVEHDR*)dwParam1); numBufCyr--; } else { wvRes = waveInAddBuffer(hwvInDev, wvBuf, sizeof(*wvBuf)); wvErrorMes("\nНе удалось добавить буфер для записи!\n", wvRes); } break; case WIM_CLOSE: printf("\nЗапись закончилась\n"); break; } } 1. Буферы сформированы, колбек функция задана. Что значит и зачем строка: WAVEHDR *wvBuf = (WAVEHDR*) dwParam1; 2. Допустим, я хочу передать в колбек функцию целое число через dwParam2. Как это сделать? Ведь нигде в программе я не задаю, что dwParam1 связано с буферами, как колбек функция определит, с каким числом связан dwParam2? |
Сообщ.
#2
,
|
|
|
https://msdn.microsoft.com/en-us/library/wi...9(v=vs.85).aspx
Приложение передаёт звуковой подсистеме буферы посредством waveinaddbuffer. После заполнения буфера, звуковая подсистема выбрасывает его из своей очереди записи и уведомляет приложение о том, что буфер заполнен. В данном случае, посредством вызова функции, куда в качестве dwParam1 передает адрес заголовка, приведенный к DWORD. Цитата Ведь нигде в программе я не задаю, что dwParam1 связано с буферами Майкрософт задаёт. Цитата Что значит и зачем строка: WAVEHDR *wvBuf = (WAVEHDR*) dwParam1; Присвоение значения dwParam1 локальной переменной wvBuf с одновременным приведением типа DWORD к указателю на WAVEHDR. Зачем? Чтобы можно было обратиться к полям заголовка. Цитата Допустим, я хочу передать в колбек функцию целое число через dwParam2. Как это сделать? Никак. Можете передать dwInstance в waveinopen. Это значение будет передано в колбек в одноименном параметре. Или использовать поле dwUser заголовка буфера. |
Сообщ.
#3
,
|
|
|
Цитата Prince @ Цитата Допустим, я хочу передать в колбек функцию целое число через dwParam2. Как это сделать? Никак. Можете передать dwInstance в waveinopen. Это значение будет передано в колбек в одноименном параметре. Или использовать поле dwUser заголовка буфера. А как это сделать? Ведь dwInstance в waveinopen нет. |
Сообщ.
#4
,
|
|
|
MMRESULT waveInOpen(
LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwCallbackInstance, DWORD fdwOpen ); |
Сообщ.
#5
,
|
|
|
Спасибо большое, понял.
|