c++로 마이크로 말하면 스피커로 출력되는 소스를 짜는 도중에 난관이;;

lsh9034의 이미지

#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번 째 이런 순이거든요? 좀 일정한 재생횟수에서 에러가 나요 이런 부분 참고하시면 좀 도움이 될까 싶어 말합니다... 고수님들 에러이유좀 알려주세요 ㅠㅠ
shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

ozon1000의 이미지

"ㅋ"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.