![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| gidm |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 20.3.2003 Репутация: нет Всего: нет |
Народ вод код, который позволяет записать данные с микрофона в файл. Мной замечен интересный баг, не могу понять чей мой или ... Опис ан7ие бага ниже прямо в коде.
HWAVEIN hWaveIn = NULL; HMMIO hmmio; MMCKINFO ckRIFF, ckFMT; WAVEHDR waveHdr1; WAVEHDR waveHdr2; LPWAVEHDR address; LPBYTE waveData1; LPBYTE waveData2; DWORD dwDataSize; PCMWAVEFORMAT FAR *lpFmt; DWORD WaveDataLength = 8000; BOOL stop; DWORD n; BOOL wioRecord(HWND hwnd) { waveData1 = (LPBYTE)GlobalAlloc(GPTR/*GMEM_FIXED | GMEM_NOCOMPACT | GMEM_NODISCARD*/, WaveDataLength); waveData2 = (LPBYTE)GlobalAlloc(GPTR/*GMEM_FIXED | GMEM_NOCOMPACT | GMEM_NODISCARD*/, WaveDataLength); lpFmt = (PCMWAVEFORMAT FAR *)GlobalAllocPtr(GPTR, sizeof(WAVEFORMAT)); if (lpFmt== NULL) return (FALSE); lpFmt->wBitsPerSample = 8; lpFmt->wf.wFormatTag = WAVE_FORMAT_PCM; lpFmt->wf.nChannels = 1; lpFmt->wf.nSamplesPerSec = 22050; lpFmt->wf.nAvgBytesPerSec = (lpFmt->wf.nChannels * lpFmt->wf.nSamplesPerSec * lpFmt->wBitsPerSample) / 8; lpFmt->wf.nBlockAlign = (lpFmt->wf.nChannels * lpFmt->wBitsPerSample) / 8; ZeroMemory(&waveHdr1, sizeof(WAVEHDR)); if (!waveHdr1.lpData) { waveHdr1.lpData = (LPSTR)waveData1; waveHdr1.dwBufferLength = WaveDataLength*sizeof(BYTE); } waveHdr1.dwFlags = 0; waveHdr1.dwUser = 0; ZeroMemory(&waveHdr2, sizeof(WAVEHDR)); if (!waveHdr2.lpData) { waveHdr2.lpData = (LPSTR)waveData2; waveHdr2.dwBufferLength = WaveDataLength*sizeof(BYTE); } waveHdr2.dwFlags = 0; waveHdr2.dwUser = 0; hmmio = mmioOpen("record.wav", NULL, MMIO_CREATE | MMIO_READWRITE); if (hmmio == NULL) return (FALSE); mmioWrite(hmmio, (HPSTR)&waveHdr1, sizeof(WAVEHDR)); address = &waveHdr1; if (waveInOpen(&hWaveIn, WAVE_MAPPER, (WAVEFORMATEX FAR *)lpFmt, (DWORD)hwnd, NULL, CALLBACK_WINDOW) != MMSYSERR_NOERROR) return (FALSE); if (waveInPrepareHeader(hWaveIn, &waveHdr1, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) return (FALSE); if (waveInPrepareHeader(hWaveIn, &waveHdr2, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) return (FALSE); if (waveInAddBuffer(hWaveIn, &waveHdr1, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) return (FALSE); stop = FALSE; n = 0; if (waveInStart(hWaveIn) != MMSYSERR_NOERROR) return (FALSE); return (TRUE); } void MakeHeader() { HGLOBAL hMem; DWORD dwFmtSize = sizeof(PCMWAVEFORMAT); char szData[] = "data"; char szFmt[] = "fmt "; /* Почему если n не уменьшить на 12 байт или уменьшить на меньшее кол-во байт, то при попытке проигрывания полученного файла, проигрыватель выдает ошибку. Это первый баг, второй ниже. */ n = n - 12; if (hmmio != NULL) { mmioSeek(hmmio, 0, SEEK_SET); ckRIFF.ckid = MMIO_CREATERIFF; ckRIFF.cksize = n+36; ckRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E'); mmioCreateChunk(hmmio, (LPMMCKINFO)&ckRIFF, MMIO_CREATERIFF); mmioWrite(hmmio, (HPSTR)szFmt, 4); mmioWrite(hmmio, (HPSTR)&dwFmtSize, sizeof(DWORD)); mmioWrite(hmmio, (HPSTR)lpFmt, sizeof(WAVEFORMAT)); mmioWrite(hmmio, (HPSTR)&lpFmt->wBitsPerSample, sizeof(WORD)); mmioWrite(hmmio, (HPSTR)szData, 4); mmioWrite(hmmio, (HPSTR)&n, sizeof(DWORD)); mmioClose(hmmio, 0); } if (waveData1 != NULL) { hMem = GlobalHandle(waveData1); GlobalFree(hMem); } if (waveData2 != NULL) { hMem = GlobalHandle(waveData2); GlobalFree(hMem); } /* Соответственно второй баг. Почему при выполнении GlobalFreePtr возникает ошибка ведь в wioRecord я выделил память lpFmt = (PCMWAVEFORMAT FAR *)GlobalAllocPtr(GPTR, sizeof(WAVEFORMAT)) и lpFmt != NULL */ if (lpFmt != NULL) GlobalFreePtr(lpFmt); } void wioStopRecord() { if (hWaveIn) { waveInReset(hWaveIn); //waveInUnprepareHeader(hWaveIn, &waveHdr1, sizeof(WAVEHDR)); //waveInUnprepareHeader(hWaveIn, &waveHdr2, sizeof(WAVEHDR)); waveInClose(hWaveIn); } } void wioMessageRecord(HWND hwnd, unsigned msg, LPWAVEHDR hdr) { if (msg == MM_WIM_DATA) { int recorded; if (address == &waveHdr1) address = &waveHdr2; else address = &waveHdr1; if (stop == FALSE) waveInAddBuffer(hWaveIn, address, sizeof(WAVEHDR)); recorded = hdr->dwBytesRecorded; mmioWrite(hmmio, (HPSTR)hdr->lpData, recorded); n = n + recorded; } } Если кто собирается проверить, то wioRecord начинает запись, wioMessageRecord вызывается при событии MM_WIM_DATA следующим способом wioMessageRecord(hWnd, message, (LPWAVEHDR)lParam); а wioStopRecord завершает запись, но для полноценного завершения MakeHeader должен вызываться при событии MM_WIM_CLOSE. Если кто знает помогите!!! |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| gidm |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 20.3.2003 Репутация: нет Всего: нет |
Второй глюк происходит во время исполнения программы при попытке завершить запись
|
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| gidm |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 20.3.2003 Репутация: нет Всего: нет |
В предыдущей моей парограмме никаких проблем с этим преобразованием не было. Ну3 да ладно черт с ним, а по поводу первого вопроса можете проверить и сказать где косяк и почему?
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |