U E D R , A S I H C RSS

5�용C++스터디/멀티미디어

  • 발표ì—� ê¼­ 들어가야 í•  것들
    • 프로그램ì—�서 사운드 재ìƒ�ì�€ 어떻게 하는가?
    • 프로그램ì—�서 ë�™ì˜�ìƒ� 재ìƒ�ì�€ 어떻게 하는가?

1. 사운드 연주



1-1) PlaySound

MFC는 멀티미디어를 위한 별�� �래스를 제공하지 않는다. Win32 API함수 차��서 멀티미디어를 지�하기 때문� MFC�서는 별�� �래스로 만들어 놓지 않� 것�다.
우선 사운드를 연주하는 API함수를 보�.

~cpp 
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);

pszSound : 연주할 사운드 파�� �름. 파�� 경로를 넣� � 수� 있다.

hmod : 리소스� 있는 Wave파�� 연주할 경우 리소스를 가진 실행파�� 핸들��, 그 외� 경우는 NULL로 준다.

fdwSound : 사운드� 연주방�과 연주할 사운드� 종류를 정�하는 플래그�다. �것� 따� 첫 번째, � 번째 �수� 해� 방�� 달�진다. 여러 플래그 중 몇 가지만 알아보�.

- SND_FILENAME : 첫 번째 �수� pszSound는 사운드 파�� �름�다.
- SND_ASYNC : 비�기화� 연수를 한다. 연주시작 후 바로 리턴하므로 다른 작업� 바로 시작할 수 있다.
- SND_LOOP : 지정한 사운드를 반복�으로 계� 연주한다. � 플래그는 반드시 SND_ASYNC와 함께 사용�어야 한다.
- SND_SYNC : �기화� 연주를 한다. 사운드 파�� 연주가 완전히 �나기 전�는 리턴하지 않는다.

예제) AppWizard를 사용하여 Sound�는 �름으로 SDI 프로�트를 만든다.
뷰� WM_LBUTTONDOWN메시지� 핸들러를 만들고 OnLButtonDown 핸들러� 다�과 같� 코드를 작성한다.


~cpp 
#include "mmsystem.h"
void CSoundView::.....
{
	PlaySound("Battle.wav", NULL, SND_SYNC);

	CView:....
}
PlaySound 함수를 사용하려면 mmsystem.h 파�� 먼저 include 해주어야 하고,
Project/ Settings/Link 탭�서 winmm.lib를 ��해 주어야 한다.

그 후 컴파�하고 실행한 후 작업�역� 왼쪽 마우스 버튼으로 누르면 소리가 날 것�다. 시스템� 사운드카드가 장착�어 있어야 하며 같� 디렉토리� Battle.wav�는 파�� 있어야 할 것�다.

1-2) 비�기 연주

앞서 만든 예제를 보면 PlaySound 함수는 사운드 파� 연주가 완전히 종료�기 전�는 리턴하지 않으므로 연주중� �안� 어떤 �� 할 수 없다. �런 방법� �기화 방���고 한다.
반대로 PlaySound함수가 연주를 시작해 놓고 곧바로 리턴하는 비�기 연주 방�� 있다.

�번�는 SND_LOOP 플래그를 사용하여 작성해 보고, WM_RBUTTONDOWN 메시지� 핸들러� 같� 만들어보�.


~cpp 
void CSoundView::OnLB.........
{
	PlaySound("Battle.wav", NULL, SND_ASYNC | SND_LOOP);

	CView:....
}

void CSoundView::OnRB......
{
	PlaySound(NULL, NULL, 0);

	CView:....
}

SND_LOOP 플래그를 지정하면 반복ì �ì�¸ 효과ì�Œì�´ë‚˜ ë°°ê²½ì�Œì•…ì�„ 연주하는 등ì�˜ 설정ì�„ í•  수 있ì�„ 것ì�´ë‹¤. 연주를 중지시키려면 PlaySound 함수ì�˜ 첫 번째 ì�¸ìˆ˜ë¥¼ NULL로 하여 다시 호ìœí•´ 주면 ë�œë‹¤. ë”°ë�¼ì„œ, 오른쪽 마우스 버튼ì�„ 누르면 연주가 중지ë�  것ì�´ë‹¤. 주ì�˜í•  것ì�€ SND_LOOP 플래그는 반드시 SND_ASYNC와 함께 사용해야 한다. 만약 ë�™ê¸°í™” 연주방ì‹�으로 반복연주를 하면 무한 루프로 빠져버릴 위험ì�´ 있다.

1-3) 리소스� Wave 연주

사운드 파�� 연주하는 것� 사용하기는 간단하지만 연주할 때마다 디스��서 사운드 파�� �어와야 하므로 반� ��가 �리다. 따�서 � 경우�는 사운드 파�� 리소스� �함시켜 놓고 리소스�서 �어서 연주하는 방법으로 하는 것� 좋� 것�다.

앞�서 만든 예제를 수정해서 Battle.wav 파�� 실행파�� 합�보�.
리소스 뷰� �업메뉴�서 Import 메뉴항목� 선�하고 리소스� �함시키고� 하는 Wave 파�� 선�한다. 그러면 IDR_WAVE1��는 ID로 리소스� 삽입� 것�다.
리소스� �함� 사운드를 연주하려면 PlaySound� 세 번째 �수� SND_RESOURCE 플래그를 주고 첫 번째 �수� 리소스� ID를 준다. � 번째 �수�는 리소스를 가진 실행파�� �스턴스 핸들� 주어야 하는� MFC�서는 AfxGetInstanceHandle() 전역함수로 �스턴스 핸들� 구할 수 있다. 다�과 같� 코드를 작성해 보�.


~cpp 
void CSoundView::OnLButtonDown(UINT nFlags, CPoint point)
{
	PlaySound(MAKEINTRESOURCE(IDR_WAVE1), AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
	CView:OnLButtonDown(nFlags, point);
}
�렇게 하면 실행파� �� wav파�� �함�어 Battle.wav파�� 없어� 연주할수 있게 �다.

1-4) MCI (Media Control Interface)

PlaySound함수는 메모리 �기� 제한� 받아서 1-2분 정�� 사운드 밖� 낼 수 없다는 �, Wave형태만 지�한다는 �, 연주과정� 사용�가 개입할 수 없다는 단�� 있다.
MCI는 멀티미디어 요소� 대한 지�� 장치�립�으로 제공하는 �종� ��브러리�다. �것� PlaySound 함수가 하지 못하는 여러 가지 �� 할 수 있지만, 사용 방법� 훨씬 � 복잡하다.


Upload:SoundMwm.zip



2. ��� 재�


2-1) PlayAVI

MCI를 사용하면 ���� 아주 쉽게 재�할 수 있다. AppWizard로 PlayAVI�는 SDI 프로�트를 만들고 WM_LBUTTONDOWN 메시지� 핸들러와 WM_DESTROY 메시지� 핸들러를 다�과 같� 작성한다.


~cpp 
HWND hWndAVI=0;
void CPlayAVIView::OnLButtonDown...
{
	if(hWndAVI) {
	MCIWndClose(hWndAVI);
	MCIWndDestroy(hWndAVI);
	hWndAVI=0;
	}
	hWndAVI=MCIWndCreate(this->m_hWnd, AfxGetInstanceHandle(), 0, "cf3.avi");
	if(hWndAVI) {
	MCIWndPlay(hWndAVI);
	}
	CView::OnLButtonDown(nFlags, point);
}

void CPlayAVIView::OnDestroy()
{
	CView::OnDestroy();
	MCIWndDestroy(hWndAVI);
}

��� 연주는 Video fot window ��브러리를 사용하므로 뷰�서 vfw.h를 ��루드 해 주어야 한다.


~cpp 
#include "PlayAVIDoc.h"
#include "PlayAVIView.h"
#include <vfw.h>

�한 프로�트�서 � ��브러리를 사용할 수 있�� Project/Settings/Link 탭� vfw32.lib를 추가한다. 그리고 ��� 파�� 프로�트 디렉토리� 넣어�면 �다.

MCIWnd 윈�우는 마우스 왼쪽 버튼� 눌르면 만들어진다. 그 전� hWndAVI가 유효하면 먼저 MCIWnd를 닫는 작업부터 해주고 있다. MCIWnd를 만드는 함수는 MCIWndCreate 함수�다.

~cpp 
HWND MCIWndCreate(HWND hwndParent, HINSTANCE hinstance, DWORD dwStyle, LPSTR szFile);

hWndParent: 부모윈�우를 지정한다. NULL� 경우, 별�� 윈�우로 열린다.
hInstance: MCIWnd롤 사용하는 �스턴스 핸들� 지정한다.
dwStyle: MCIWnd� 모양, �작방�등� 설정하는 스타�(플래그)�다.
szFile: MCIWnd�성시 오픈할 장치, �는 AVI파�� 지정한다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:18
Processing time 0.0075 sec