MP3´Â ¿¹»ó ¿Ü·Î °ø°³ Æ÷¸ËÀÌ ¾Æ´Ï¸ç ¶óÀ̼¾½º°¡ °É·Á ÀÖ´Â Æó¼â Æ÷¸ËÀÔ´Ï´Ù.
±×·¡¼ OGG³ª Wav¿Í´Â ´Þ¸® Àç»ýÇÏ·Á¸é FMOD, BASS °°Àº À¯·á ¶óÀ̺귯¸®¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.
ÀÌ·± ¶óÀ̺귯¸®µéÀº ¼º´ÉÀº ¹°·Ð ÁÁÁö¸¸ ¿ë·®ÀÌ Ä¿ ºÒÆíÇÑ ¸éµµ ÀÖ½À´Ï´Ù.
±×·¡¼ ¼ø¼öÇÑ Win32 API¸¸À¸·Î MP3¸¦ Àç»ýÇÏ´Â ¿¹Á¦¸¦ ¸¸µé¾î ºÃ½À´Ï´Ù.
MCI¸¦ »ç¿ëÇÏ¸é ¶óÀ̺귯¸® ¾øÀ̵µ Mp3 Àç»ý Á¤µµ´Â ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹Á¦À̴ϸ¸Å ±â´ÉÀº ´Ü¼øÇÕ´Ï´Ù.
- Àç»ý/ÀϽÃÁ¤Áö/Àç°³
- ÀÌÀü/´ÙÀ½°î
- ÇöÀç Àç»ý À§Ä¡ º¸¿© ÁÖ±â
- ÀÓÀÇÀÇ Àç»ý À§Ä¡·Î À̵¿
ÀÌ Á¤µµÀÔ´Ï´Ù. ¸ÖƼ¹Ìµð¾î Àç»ý±â·Î´Â °¡Àå ±âº»ÀûÀ̶ó°í ÇÒ ¼ö ÀÖÁÒ.
Àüü ¼Ò½º´Â ´ÙÀ½°ú °°½À´Ï´Ù.
// MCI¸¦ ÀÌ¿ëÇÑ MP3 Àç»ý »ùÇà ¿¹Á¦. ¿ÜºÎ ¶óÀ̺귯¸®¸¦ ÀÏü »ç¿ëÇÏÁö ¾Ê´Â´Ù.
// ÀÌ ¿¹Á¦¸¦ ½ÇÇàÇÏ·Á¸é C:\Temp¿¡ a.mp3, b.mp3, c.mp3 ¼¼ °³ÀÇ »ùÇÃÀÌ ¹Ì¸® ÁغñµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
// 2021³â 8¿ù 19ÀÏ Á¦ÀÛ
#include <windows.h>
#include <CommCtrl.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "comctl32.lib")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass = TEXT("ApiMp3");
int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
, _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 350, 150,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&Message, NULL, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
// Àç»ý ¹× Á¤º¸ Ç¥½Ã¿ë ÄÁÆ®·Ñ
HWND stPath, trProg, btnPlay, btnStop, btnPrev, btnNext;
enum { ST_PATH, TR_PROG, BTN_PLAY, BTN_STOP, BTN_PREV, BTN_NEXT };
// ÆÄÀÏ ¸ñ·ÏÀº ¼¼ °³·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÀÚ½ÅÀÌ °¡Áø Àû´çÇÑ »ùÇ÷Π°æ·Î¸¦ ¹Ù²ãµµ »ó°ü ¾ø´Ù.
// ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼´Â »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ ÆÄÀÏ·Î ¸ñ·ÏÀ» ÀÛ¼ºÇÑ´Ù.
LPCTSTR arMp3[] = { L"c:\\Temp\\a.mp3" , L"c:\\Temp\\b.mp3", L"c:\\Temp\\c.mp3" };
int mp_idx = 0; // ÇöÀç Àç»ý ÆÄÀÏ
UINT dev_id = 0; // ÀåÄ¡ ID
// ÇöÀç Àç»ýÁßÀÎ ÆÄÀÏÀ» Ç¥½ÃÇÑ´Ù.
void DisplayFileName()
{
SetWindowText(stPath, arMp3[mp_idx]);
}
// ÇöÀç »óŸ¦ Á¶»çÇÑ´Ù. dev_id´Â ¿·Á ÀÖ´Â »óÅ¿©¾ß ÇÑ´Ù.
DWORD GetStatus()
{
MCI_STATUS_PARMS statusParam;
DWORD Result;
TCHAR sError[256];
statusParam.dwItem = MCI_STATUS_MODE;
Result = mciSendCommand(dev_id, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParam);
if (Result) {
mciGetErrorString(Result, sError, 256);
MessageBox(hWndMain, sError, L"¿¡·¯ ¹ß»ý", MB_OK);
return 0;
}
return statusParam.dwReturn;
}
// Àç»ý ±æÀ̸¦ Á¶»çÇÑ´Ù.
DWORD GetLength()
{
MCI_STATUS_PARMS statusParam;
DWORD Result;
TCHAR sError[256];
statusParam.dwItem = MCI_STATUS_LENGTH;
Result = mciSendCommand(dev_id, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParam);
if (Result) {
mciGetErrorString(Result, sError, 256);
MessageBox(hWndMain, sError, L"¿¡·¯ ¹ß»ý", MB_OK);
return 0;
}
return statusParam.dwReturn;
}
// ÇöÀç Àç»ý À§Ä¡¸¦ Á¶»çÇÑ´Ù.
DWORD GetPosition()
{
MCI_STATUS_PARMS statusParam;
DWORD Result;
TCHAR sError[256];
statusParam.dwItem = MCI_STATUS_POSITION;
Result = mciSendCommand(dev_id, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParam);
if (Result) {
mciGetErrorString(Result, sError, 256);
MessageBox(hWndMain, sError, L"¿¡·¯ ¹ß»ý", MB_OK);
return 0;
}
return statusParam.dwReturn;
}
// Àç»ý ¹× Á¤ÁöÇÑ´Ù. fromPos°¡ ÁÖ¾îÁö¸é ÀÌ À§Ä¡ºÎÅÍ Àç»ýÇÑ´Ù.
void DoPlay(int fromPos = 0)
{
DWORD Result;
MCI_OPEN_PARMS openParam;
MCI_PLAY_PARMS playParam;
TCHAR sError[256];
DWORD status;
// ¿·Á ÀÖÁö ¾ÊÀº »óÅÂÀ̸é ÀåÄ¡¸¦ ¿°í Àç»ýÀ» ½ÃÀÛÇÑ´Ù.
if (dev_id == 0) {
// ÀåÄ¡¸¦ OpenÇϰí ID¸¦ ¹ß±Þ¹Þ´Â´Ù.
openParam.lpstrDeviceType = L"mpegvideo";
openParam.lpstrElementName = arMp3[mp_idx];
Result = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&openParam);
if (Result) {
mciGetErrorString(Result, sError, 256);
MessageBox(hWndMain, sError, L"¿¡·¯ ¹ß»ý", MB_OK);
return;
}
dev_id = openParam.wDeviceID;
// Àç»ýÀ» ½ÃÀÛÇÑ´Ù. fromPos°¡ ¾øÀ¸¸é óÀ½ºÎÅÍ Àç»ýÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì·Î ÅëÁö¸¦ º¸³½´Ù.
playParam.dwCallback = (DWORD)hWndMain;
DWORD dwFlag = MCI_NOTIFY;
if (fromPos != 0) {
playParam.dwFrom = fromPos;
dwFlag = dwFlag | MCI_FROM;
}
Result = mciSendCommand(dev_id, MCI_PLAY, dwFlag, (DWORD)(LPVOID)&playParam);
if (Result) {
mciGetErrorString(Result, sError, 256);
MessageBox(hWndMain, sError, L"¿¡·¯ ¹ß»ý", MB_OK);
mciSendCommand(dev_id, MCI_CLOSE, 0, (DWORD)NULL);
return;
}
SetWindowText(btnPlay, L"Pause");
// ±æÀÌ Á¶»çÇØ¼ Æ®·¢¹Ù·Î ¹üÀ§¸¦ ¼³Á¤ÇÑ´Ù. ÃÊ´ÜÀ§À̸ç 32ºñÆ®·Î ¹üÀ§¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù.
SendMessage(trProg, TBM_SETRANGEMAX, FALSE, (LPARAM)GetLength());
} else {
// ¿·Á ÀÖ´Â »óÅÂÀ̸é ÇöÀç »óÅ¿¡ µû¶ó ÀϽÃÁ¤Áö ¶Ç´Â Àç°³ÇÑ´Ù.
status = GetStatus();
switch (status) {
case MCI_MODE_PLAY:
mciSendCommand(dev_id, MCI_PAUSE, 0, (DWORD)NULL);
SetWindowText(btnPlay, L"Play");
break;
case MCI_MODE_PAUSE:
mciSendCommand(dev_id, MCI_RESUME, 0, (DWORD)NULL);
SetWindowText(btnPlay, L"Pause");
break;
}
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (iMessage) {
case WM_CREATE:
stPath = CreateWindow(TEXT("static"), TEXT("Path"), WS_CHILD | WS_VISIBLE,
10, 10, 310, 25, hWnd, (HMENU)ST_PATH, g_hInst, NULL);
trProg = CreateWindow(TRACKBAR_CLASS, NULL, WS_CHILD | WS_VISIBLE,
10, 40, 310, 25, hWnd, (HMENU)TR_PROG, g_hInst, NULL);
btnPlay = CreateWindow(TEXT("button"), TEXT("Play"), WS_CHILD | WS_VISIBLE |
BS_PUSHBUTTON, 10, 70, 70, 25, hWnd, (HMENU)BTN_PLAY, g_hInst, NULL);
btnStop = CreateWindow(TEXT("button"), TEXT("Stop"), WS_CHILD | WS_VISIBLE |
BS_PUSHBUTTON, 90, 70, 70, 25, hWnd, (HMENU)BTN_STOP, g_hInst, NULL);
btnPrev = CreateWindow(TEXT("button"), TEXT("Prev"), WS_CHILD | WS_VISIBLE |
BS_PUSHBUTTON, 170, 70, 70, 25, hWnd, (HMENU)BTN_PREV, g_hInst, NULL);
btnNext = CreateWindow(TEXT("button"), TEXT("Next"), WS_CHILD | WS_VISIBLE |
BS_PUSHBUTTON, 250, 70, 70, 25, hWnd, (HMENU)BTN_NEXT, g_hInst, NULL);
hWndMain = hWnd;
InitCommonControls();
// ÇÁ·Î±×·¡½º °»½Å¿ë ŸÀ̸Ó. ÁÖ±âÀûÀ¸·Î Æú¸µÇÑ´Ù.
SetTimer(hWnd, 1, 200, NULL);
DisplayFileName();
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case BTN_PLAY:
DoPlay();
break;
case BTN_STOP:
if (dev_id != 0) {
mciSendCommand(dev_id, MCI_STOP, 0, (DWORD)NULL);
SetWindowText(btnPlay, L"Play");
}
break;
case BTN_PREV:
mp_idx = mp_idx == 0 ? 2 : mp_idx - 1;
DisplayFileName();
if (dev_id != 0) {
mciSendCommand(dev_id, MCI_STOP, MCI_WAIT, (DWORD)NULL);
// ÅëÁö±îÁö ó¸®ÇÏ°í ¿ÏÀüÈ÷ ´ÝÀ»¶§±îÁö ±â´Ù¸° ÈÄ Àç»ý ½ÃÀÛÇÑ´Ù.
SetTimer(hWnd, 99, 100, NULL);
}
break;
case BTN_NEXT:
mp_idx = mp_idx == 2 ? 0 : mp_idx + 1;
DisplayFileName();
if (dev_id != 0) {
mciSendCommand(dev_id, MCI_STOP, MCI_WAIT, (DWORD)NULL);
SetTimer(hWnd, 99, 100, NULL);
}
break;
}
return 0;
case WM_TIMER:
switch (wParam) {
// ÇÁ·Î±×·¡½º ÁøÇà ŸÀ̸Ó
case 1:
if (dev_id != 0) {
int pos = GetPosition();
SendMessage(trProg, TBM_SETPOS, TRUE, pos);
}
break;
// ÀÌÀü, ´ÙÀ½°î Àç»ý ½ÃÀÛ¿ë ÀÏȸ¿ë ŸÀ̸Ó
case 99:
KillTimer(hWnd, 99);
DoPlay();
break;
// Àç»ý À§Ä¡ À̵¿¿ë ŸÀ̸Ó
case 98:
KillTimer(hWnd, 98);
DoPlay(SendMessage(trProg, TBM_GETPOS, 0, 0));
break;
}
return 0;
case MM_MCINOTIFY:
switch (wParam) {
case MCI_NOTIFY_ABORTED:
// ¸ØÃ߸é ABORTED ÅëÁö ³¯¶ó°¡¸ç ¿©±â¼ ÀåÄ¡¸¦ ´Ý´Â´Ù.
mciSendCommand(LOWORD(lParam), MCI_CLOSE, 0, (DWORD)NULL);
dev_id = 0;
break;
case MCI_NOTIFY_SUCCESSFUL:
// ÀåÄ¡¸¦ ¸ØÃá ÈÄ ´ÙÀ½ °î Àç»ý
mciSendCommand(LOWORD(lParam), MCI_CLOSE, 0, (DWORD)NULL);
dev_id = 0;
mp_idx = mp_idx == 2 ? 0 : mp_idx + 1;
DisplayFileName();
DoPlay();
break;
}
return 0;
case WM_HSCROLL:
if ((HWND)lParam == trProg) {
if (dev_id != 0) {
// À§Ä¡¸¦ ¿Å±â¸é ÀåÄ¡´Â STOPµÇ¸ç ABORTED ÅëÁö°¡ ³¯¶ó°£´Ù.
//MCI_SEEK_PARMS seekParam;
//seekParam.dwTo = SendMessage(trProg, TBM_GETPOS, 0, 0);
//mciSendCommand(dev_id, MCI_SEEK, MCI_TO, (DWORD)(LPVOID)&seekParam);
// ÀÌ·² ¹Ù¿¡¾ß ±×³É ¸ØÃß°í ÇÁ·Î±×·¡½º À§Ä¡¿¡¼ ´Ù½Ã ½ÃÀÛÇÏ´Â°Ô ´õ ±ò²ûÇÏ´Ù.
mciSendCommand(dev_id, MCI_STOP, 0, (DWORD)NULL);
SetTimer(hWndMain, 98, 100, NULL);
}
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// ÇÒÀÏ ¾øÀÌ ºóµÕ ºóµÕ ³í´Ù.
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
// ÀåÄ¡°¡ ¿·Á ÀÖÀ¸¸é ´Ý°í Á¾·áÇÑ´Ù.
if (dev_id != 0) {
mciSendCommand(dev_id, MCI_STOP, 0, (DWORD)NULL);
}
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
÷ºÎÇÑ ¾ÐÃà ÆÄÀÏ¿¡´Â ÇÁ·ÎÁ§Æ®¿Í ¸±¸®Áî ½ÇÇà ÆÄÀÏÀ» Æ÷ÇÔ½ÃÄÑ µÎ¾ú½À´Ï´Ù.
¿äÁò À©µµ¿ì µðÆæ´õ°¡ ¹ÌÃÆ´ÂÁö ºñÁÖ¾ó ½ºÆ©µð¿À·Î ÄÄÆÄÀÏÇÑ ¸ðµç ½ÇÇà ÆÄÀÏÀ» ¹ÙÀÌ·¯½º·Î Áø´ÜÇÏ¿©
Â÷´ÜÇØ ¹ö¸®´Â ¾î󱸴Ͼø´Â Áþ°Å¸®¸¦ Çϰí ÀÖ½À´Ï´Ù.
±×·¡¼ ºÒ°¡ÇÇÇÏ°Ô ¾ÐÃà ÆÄÀÏ¿¡ ¾ÏÈ£¸¦ °É¾ú½À´Ï´Ù. ¾ÏÈ£´Â soenÀÔ´Ï´Ù.
½ÇÇà ÆÄÀÏÀÌ Á¤ Àǽɽº·¯¿ì½Ã¸é ÇÁ·ÎÁ§Æ® ¿¾î ÄÄÆÄÀÏÇÑ ÈÄ Âü°íÇØ ÁֽʽÿÀ.

¿À´Ãµµ ÃÖ¼±À» ´Ù ÇÏÀÚ. |
|