c++로 마이크로 말하면 스피커로 출력되는 소스를 짜는 도중에 난관이;;
글쓴이: lsh9034 / 작성시간: 화, 2017/01/24 - 12:27오전
#include <iostream> #include <windows.h> #include <mmsystem.h> #include <conio.h> #pragma comment(lib, "winmm.lib") HWAVEIN h_input; //음성관련 함수들 쓸때 쓰는 핸들러같음 HWAVEOUT h_output; HWAVEOUT hWaveOut; WAVEFORMATEX my_wave_format; //핸들러 초기화하는 함수 부를 때 필요한 WAVEHDR waveHdr[8]; MMRESULT result; short int waveIn[8][8000]; const int NUMPTS = 8000 * 10; int sampleRate = 8000; int a = 0,b,c; BYTE pWaveIn[8][sizeof(WAVEHDR)]; HANDLE mh_wave_data, mh_wave_header; unsigned char *mp_wave_data; void CALLBACK waveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwparam2); void print(MMRESULT result) { if (result == MMSYSERR_NOERROR)printf("성공\n"); else printf("실패"); } //콜백함수, 사용자 지정한 공간에 데이터 채워지면 자동으로 콜백수행 int main(void) { //my_wave_format.wFormatTag = WAVE_FORMAT_PCM; //my_wave_format.nChannels = 1; // 마이크 녹음방식 : 모노 //my_wave_format.nSamplesPerSec = 11025; // 샘플링 주기 : 11.025 KHz //my_wave_format.wBitsPerSample = 8; // 샘플링 단위 : 8 Bits //my_wave_format.nBlockAlign = my_wave_format.nChannels*my_wave_format.wBitsPerSample / 8; //my_wave_format.nAvgBytesPerSec = my_wave_format.nSamplesPerSec*my_wave_format.nBlockAlign; //my_wave_format.cbSize = 0; // WAVEFORMATEX 구조체 정보외에 추가적인 정보가 없다. my_wave_format.wFormatTag = WAVE_FORMAT_PCM; my_wave_format.nChannels = 1; my_wave_format.nSamplesPerSec = sampleRate; my_wave_format.nAvgBytesPerSec = 2 * sampleRate; my_wave_format.nBlockAlign = 2; my_wave_format.wBitsPerSample = 16; my_wave_format.cbSize = 0; result = waveInOpen(&h_input, WAVE_MAPPER, &my_wave_format, (DWORD_PTR)waveInProc, NULL, (DWORD)CALLBACK_FUNCTION); print(result); for (int i = 0; i < 8; i++) { /* mh_wave_data = ::GlobalAlloc(GMEM_MOVEABLE, 2205); mp_wave_data = (unsigned char*)::GlobalLock(mh_wave_data); mh_wave_header = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); waveHdr[i] = *(LPWAVEHDR)::GlobalLock(mh_wave_header);*/ waveHdr[i].lpData = (LPSTR)&waveIn[i]; //녹음시 사용할 메모리 공간에 대한 주소 명시, 메모리<->다른 주소 공간 드라이버 waveHdr[i].dwBufferLength = 8000; waveHdr[i].dwBytesRecorded = 0; waveHdr[i].dwUser = 0; waveHdr[i].dwFlags = 0; waveHdr[i].dwLoops = 0; result = waveInPrepareHeader(h_input, &waveHdr[i], sizeof(WAVEHDR)); } print(result); for (int i = 0; i < 8; i++) { result = waveInAddBuffer(h_input, &waveHdr[i], sizeof(WAVEHDR)); } //printf("%d", waveOutGetNumDevs()); print(result); result = 0; result = waveInStart(h_input); a = -1; waveOutOpen(&h_output, WAVE_MAPPER, &my_wave_format, 0, 0, WAVE_FORMAT_DIRECT); while (1) { } a = -2; a = -3; waveOutPause(h_output); waveOutReset(h_output); for(int i=0; i<8; i++)waveOutUnprepareHeader(h_output, &waveHdr[i], sizeof(WAVEHDR)); waveOutClose(h_output); for(int i=0; i<8; i++)waveInUnprepareHeader(h_input, &waveHdr[i], sizeof(WAVEHDR)); waveInClose(h_input); system("pause"); return 0; } void CALLBACK waveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwparam2) { printf("입장\n"); WAVEHDR *Phr = NULL; WAVEHDR Phr2; switch (uMsg) { case WIM_OPEN: printf("녹음시작 \n"); break; case WIM_DATA: printf("재생\n"); Phr = (WAVEHDR*)dwParam1; Phr2.lpData = (LPSTR)Phr->lpData; Phr2.dwBufferLength = Phr->dwBufferLength; Phr2.dwBytesRecorded = Phr->dwBytesRecorded; Phr2.dwUser = 0; Phr2.dwFlags = WHDR_PREPARED; Phr2.dwLoops = 0; printf("%d %d", Phr->dwBufferLength, Phr->dwBytesRecorded); result = waveOutPrepareHeader(h_output, &Phr2, sizeof(WAVEHDR)); result = waveOutWrite(h_output, &Phr2, sizeof(WAVEHDR)); if (result == MMSYSERR_NOERROR)printf("재생성공!!!! %d\n",++b); printf("end\n"); waveInPrepareHeader(hWaveIn, Phr, sizeof(WAVEHDR)); waveInAddBuffer(hWaveIn, Phr, sizeof(WAVEHDR)); break; } printf("dsfsf\n"); }
제가 마이크로 말을하면 스피커로 바로 말이 나오게 하는 프로그램을 짜보려고 했는데요 제가 보기에는 문제가없는데 프로그램이 자꾸 실행을 하고 한번정도 버퍼재생을 하면 그 다음에 오류가 나더라고요 제가 디버깅해보면서 오류가나는 위치를 알았는데 waveInStart하면 녹음을 시작하잖아요 그 다음이 이제 버퍼하나가 가득차면 콜백함수를 부르잖아요 제가 디버깅해보면서 파악 해본 바로는 버퍼가 가득차고 콜백함수를 부르는 과정에서 에러가 나는것같아요... 왜그러는 지는 모르겠어요ㅠㅠㅠ 이유와 해결방법점 알려주세요 고수님들 ㅠㅠㅠ 그리고 또 이상한점이 제가 재생하는 횟수를 카운트해서 출력을 하게 해놨거든요? 근데 오류가 나는 횟수가 좀 정해져있어요 가장많은게 1번 재생하고 나서 이고 그 다음이 3번째 그다음이 20번 째 이런 순이거든요? 좀 일정한 재생횟수에서 에러가 나요 이런 부분 참고하시면 좀 도움이 될까 싶어 말합니다... 고수님들 에러이유좀 알려주세요 ㅠㅠ
Forums:
책과 예제 보는 방법이 있습니다.
미디어 프로그래밍' 검색 - 네이버 북
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=%EB%AF%B8%EB%94%94%EC%96%B4%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
'ㅋ'
"ㅋ"
댓글 달기