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Դϴ.
ǽɽø Ʈ ֽʽÿ.
õ ּ . 성인인증,통영출장안마,정안마 출근부
창원출장안마,강북출장샵,김제출장마사지-마사지가이드
순천출장샵 인천콜걸샵 하남출장마사지
가정역맛사지
노원출장만남 | 대구콜걸샵 | 시흥출장만남
조성면마사지
밀워키전동공구,평택콜걸샵,온라인미팅
자위방송
가산디지털단지역소개팅
순천 성인맛사지
웹하드사이트순위
아리19 짤
성북성인마사지 | 화산동안마 | 보산동안마
강북구출장샵 강동구출장샵
성1인만화
마늘까기부업
계명대맛집
여름스타그램
계양✓대출중개✓서브웨이알바추천
예쁜사진
여행토퍼 | 대출 한도 학자금 | 사랑을했다
성장사진
집에서하는부업
고수익알바 남자
증권적 채권✓남해여행✓재택아르바이트
만남과대화
충주출장만남
부산영화동호회
서울출장샵
후장후기
|
|