API 사운드2
- MCI (Media Control Interface)
멀티미디오 요소를 손쉽게 사용하도록 제공하는 라이브러리로 PlaySound() 보다 좀더 정밀한 제어 가능
1. 명령 메시지 방식
MCI 디바이스에 명령 메시지를 보내 수행하는 방식
2. 명령 문자열 방식
명령을 문자열 형태로 보내 수행하는 방식
MCIERROR mciSendCommand(
MCIDEVICEID 디바이스 드라이버ID,
UINT 명령메시지로 사운드 재생, 정지 등의 명령메시지 매크로, // MCI_OPEN, MCI_PLAY...
DWORD_PTR 명령관련 상태 플래그,
DWORD_PTR 명령메시지 수행에 필요한 추가정보 포인터);
성공하면 0, 실패 시 에러코드 반한
typedef struct {
DWORD_PTR MCI_NOTIFY 플래그를 사용할때 메시지를 받을 윈도우 핸들; // 사용빈도 낮음
MCIDEVICEID 프로그램에 반환되는 식별자 ID; // MCI_OPEN때 발급받은 ID
LPCTSTR 디바이스 타입 이름; // 연주하고자 하는 디바이스 타입, WAV : WaveAudio
LPCTSTR 출력할 사운드 경로; // 출력하고자하는 데이터의 경로, 예제는 wawawa.wav 로 지정
LPCTSTR 장치의 별명; // 사용빈도 낮음
} MCI_OPEN_PARMS;
사운드 재생 시 MCI_NOTIFY와 MCI_WAIT 메시지 플래그 중 하나는 반드시 사용해야 한다.
- MCI_NOTIFY : 사운드 재생을 시작하고 바로 리턴하여 재생 중 다른 작업이 가능
- MCI_WAIT : 사운드 재생을 시작하면 재생 종료할떄까지 대기
typedef struct {
DWORD_PTR MCI_NOTIFY 플래그를 사용할때 메시지를 받을 윈도우 핸들;
DWORD 재생 시작 시점;
DWORD 재생 끝나는 지점;
} MCI_PLAY_PARMS;
MM_MCINOTIFY 메시지
wParam : 통지 메시지 종류
LOWORD(lParam) : 디바이스ID
<통지 메시지 종류>
MCI_NOTIFY_SUCCESSFUL 명령을 성공적으로 수행
MCI_NOTIFY_FAILURE 명령 수행 실패
MCI_NOTIFY_SUPERSEDED 새 통지 메시지를 받은 경우
MCI_NOTIFY_ABORTED 새 명령을 받은 경우
- 사운드 재생 멈춤
MCI_PAUSE 명령 메시지 전달
- 사운드 녹음
MCI_RECORD 명령 메시지에 MCI_RECORD_PARMS 구조체 정보 전달
- 사운드 저장하기
MCI_SAVE
typedef struct {
DWORD_PTR MCI_NOTIFY 플레그를 사용할때 메시지를 받을 윈도우 핸들;
LPCSTR 저장할 파일경로 및 이름;
} MCI_SAVE_PARMS;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 |
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
static UINT wDeviceID = 0;
MCI_OPEN_PARMS mciOpenParams;
MCI_PLAY_PARMS mciPlayParams;
MCI_RECORD_PARMS mciRecordParams;
MCI_SAVE_PARMS mciSaveParams;
DWORD dwResult;
TCHAR strMsg[128];
switch (message)
{
case MM_MCINOTIFY:
switch (wParam)
{
case MCI_NOTIFY_SUCCESSFUL:
case MCI_NOTIFY_FAILURE:
case MCI_NOTIFY_SUPERSEDED:
case MCI_NOTIFY_ABORTED:
mciSendCommand(LOWORD(lParam), MCI_CLOSE, 0, (DWORD)NULL);
break;
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 메뉴 선택을 구문 분석합니다.
switch (wmId)
{
case ID_MCIOPEN:
mciOpenParams.lpstrDeviceType = L"WaveAudio";
mciOpenParams.lpstrElementName = L"wawawa.wav";
dwResult = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciOpenParams);
if (dwResult)
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, (DWORD)NULL);
mciGetErrorString(dwResult, strMsg, 128);
MessageBox(hWnd, strMsg, L"오류 메시지", MB_OK);
}
wDeviceID = mciOpenParams.wDeviceID;
break;
case ID_MCIPLAY:
mciPlayParams.dwCallback = (DWORD)hWnd;
dwResult = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&mciPlayParams);
if (dwResult)
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, (DWORD)NULL);
mciGetErrorString(dwResult, strMsg, 128);
MessageBox(hWnd, strMsg, L"오류 메시지", MB_OK);
}
break;
case ID_MCIPAUSE:
mciPlayParams.dwCallback = (DWORD)hWnd;
mciSendCommand(wDeviceID, MCI_PAUSE, MCI_NOTIFY, (DWORD)(LPVOID)&mciPlayParams);
break;
case ID_MCIRECORD:
mciRecordParams.dwTo = 5000;
mciSendCommand(wDeviceID, MCI_RECORD, MCI_TO | MCI_WAIT, (DWORD)(LPVOID)&mciRecordParams);
break;
case ID_MCIRECORDSAVE:
mciSaveParams.lpfilename = L"wa.wav";
mciSendCommand(wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParams);
break;
|
cs |