API-MCI라이브러리(사운드,비디오)

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위치로 등을 별도의 함수로 만들어 구현하면 좀 더 편하게 사용할 수 있을겁니다.


출저: 긔엽긔는 거꾸로 해도 긔엽긔 :: 네이버 블로그

이 글을 공유하기

댓글

Designed by JB FACTORY