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
'ㅋ'
"ㅋ"
댓글 달기