API-MCI라이브러리(사운드,비디오)
- 프로그래밍/WindowsAPI
- 2011. 5. 31. 12:35
1.MCI
Win32API에서 제공하는 PlaySound 함수는 한번에 하나의 사운드만 출력할 수 있습니다.
포맷도 wave에 한정되어 있고요.
다중채널을 지원하지 않기 때문인데 이는 DirectSound나 기타 라이브러리 등을 사용하면 해결할 수 있습니다.
DirectSound는 DirectX를 배워야 하기 때문에 MCI(Multimedia Control Interface (맞나?ㅋ))를 사용해 보겠습니다.
2.사용방법
1)헤더추가
먼저 mmsystem.h 헤더를 추가합니다.
2)라이브러리 추가
그리고 별도의 라이브러리를 첨부해야 합니다.
프로젝트 속성->링커->추가종속성에서 winmm.lib를 추가해 주거나
소스코드 제일윗 부분 (#pragma once 아래)에 #pragma comment(lib, "winmm.lib")
3)객체들 선언
그리고 MCI를 사용하기 위한 객체를 선언합니다.
MCI_OPEN_PARMS mciOpen; //파일을 로드
MCI_PLAY_PARMS mciPlay; //파일을 재생
MCI_STATUS_PARMS mciStatus; //파일의 상태
4)함수 선언
그리고 파일을 DWORD 변수에 로드하는 함수를 만듭니다.
UINT wDeviceID = 0;
DWORD LoadWAV(HWND hWnd, LPCTSTR lpszWave)
{
DWORD Result;
mciOpenParms.lpstrDeviceType = L"WaveAudio";
//WaveAudio 대신 MPEGVideo를 사용하면 mp3 형식을 재생합니다.
mciOpenParms.lpstrElementName = lpszWave;
Result = mciSendCommand(wDeviceID, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciOpenParms);
if(Result)
return Result;
wDeviceID = mciOpenParms.wDeviceID;
mciPlayParms.dwCallback = (DWORD)hWnd;
if(Result)
return Result;
return 0;
5)파일로드(사용하기)
이제 파일을 로드합니다.
예시로 두가지 사운드만 해보겠습니다.
DirectSound의 LDIRECTSOUNDBUFFER와 같은 역할을 해주는 DWORD변수를 사용할 사운드 갯수만큼 선언합니다.
DWORD Sound1, Sound2;
Sound1 = LoadWav(hWnd, L"Sound1.wav");
Sound2 = LoadWav(hWnd, L"Sound2.wav");
로드한 순서대로 채널이 지정됩니다.
구조체로 DWORD변수와 채널인덱스를 묶어서 사용하면 편할겁니다.
이렇게 하면 1, 2채널에 사운드가 로드 되었습니다. //1부터 시작합니다.
재생시킬 부분에서
Sound1 = mciSendCommand( 1, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&mciPlay );
이렇게 하면 재생이 됩니다.
이때 mciPlay객체가 현재 재생위치를 기억하므로 마우스 버튼음처럼 특정 조건시 계속 재생 되게 하고 싶으면
재생 위치를 0으로 돌려주어야 합니다.
Sound1 = mciSendCommand( 1, MCI_SEEK, MCI_SEEK_TO_START, (DWORD)(LPVOID)NULL );
재생을 정지하는 용도로도 사용가능합니다.
그리고 사용한만큼 WM_DESTROY에서 메모리를 해제해 줍니다.
if(wDeviceID > 0)
{
mciSendCommand(1, MCI_CLOSE, 0, (DWORD)(LPVOID)NULL );
mciSendCommand(2, MCI_CLOSE, 0, (DWORD)(LPVOID)NULL );
}
p.s 위에서 언급하였듯이 2년전에 이거보고 저거보고 하면서 구현한 내용이라 본인도 지금보니
엄청 귀찮고 불편하게 짜여 있습니다. 사운드 정보를 관리하는 구조체를 만들고 재생, 정지, 0위치로 등을 별도의 함수로 만들어 구현하면 좀 더 편하게 사용할 수 있을겁니다.
이 글을 공유하기