ÀÚ·á½Ç

Win32 API¸¸À» ÀÌ¿ëÇÑ Mp3 Àç»ý ¿¹Á¦ ³¯Â¥:2021-8-19 12:30:17 Á¶È¸¼ö:655
ÀÛ¼ºÀÚ : ¼Ò³â°¡Àå
Æ÷ÀÎÆ® : 438
°¡ÀÔÀÏ : 2020-02-02 00:50:03
¹æ¹®È½¼ö : 54
±Û 42°³, ´ñ±Û 27°³
¼Ò°³ : ÀÚ±â¼Ò°³
ÀÛ¼º±Û º¸±â
ÂÊÁö º¸³»±â
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ÀÔ´Ï´Ù. 
½ÇÇà ÆÄÀÏÀÌ Á¤ Àǽɽº·¯¿ì½Ã¸é ÇÁ·ÎÁ§Æ® ¿­¾î ÄÄÆÄÀÏÇÑ ÈÄ Âü°íÇØ ÁֽʽÿÀ.

 



¿À´Ãµµ ÃÖ¼±À» ´Ù ÇÏÀÚ.
÷ºÎ ÆÄÀÏ 210819-123017_ApiMp3.zip(48281 byte). ´Ù¿î·Îµå : 91

¸ñ·Ïº¸±â »èÁ¦ ¼öÁ¤ ½Å°í ½ºÅ©·¦

¸¶À½Àº¾î¸°ÀÌ 8¿ù19ÀÏ 11:14:27  

ÁÁÀº ÀÚ·á °¨»çµå¸³´Ï´Ù.

¼Ò³â°¡Àå 8¿ù22ÀÏ 11:58:30  

ÀÌ Äڵ带 Àß »ç¿ëÇߴµ¥ ¿©·¯ °¡Áö ÆÄÀÏÀ» Å×½ºÆ®ÇØ º¸´Ï °¡²û Àç»ý ¸øÇÏ´Â ÆÄÀÏÀÌ ÀÖÀ½À» ¹ß°ßÇß½À´Ï´Ù. ¿øÀÎÀ» ºÐ¼®ÇØ º¸´Ï ID3v2 űװ¡ ÀÖ´Â ÆÄÀÏÀ» ÀνÄÇÏÁö ¸øÇϳ׿ä.
¿ø·¡ MP3 ÆÄÀÏÀº °î¸í, ¾Ù¹ü¸í, °¡¼ö¸í µîÀÇ Ãß°¡ Á¤º¸¸¦ ID3 ű׷ΠÆÄÀÏ ³¡ ºÎºÐ¿¡ 128 ¹ÙÀÌÆ® °íÁ¤ ±æÀÌ·Î °¡Áö´Âµ¥ ÀÌ Á¤µµ ±æÀ̷δ °¡»ç³ª ¾Ù¹ü ÀÚÄÏ µîÀ» ÀúÀåÇϱ⿡ Åõµ ¾ø´Â°Ì´Ï´Ù. ±×·¡¼­ ID3v2 ű׸¦ »õ·Î ¸¸µé¾ú´Âµ¥ ÀÌ ³à¼®Àº ¾Õ ºÎºÐ¿¡ ºÙÀÔ´Ï´Ù. ±×·¡¼­ À½¼º µ¥ÀÌÅͰ¡ ¹Ù·Î ³ª¿ÀÁö ¾Ê°í 20³âÀü¿¡ ¸¸µç MCI´Â ÀÌ°Ô ÀÖÀ¸¸é À½¼º ÆÄÀÏ·Î ÀνÄÇÏÁö ¸øÇÕ´Ï´Ù.
ÇØ°áÃ¥Àº ¾ÕºÎºÐÀÇ Å±׸¦ °Ç³Ê¶Ù´Â°Çµ¥ MCI°¡ ¸Þ¸ð¸®»óÀÇ ½ºÆ®¸²À» ÀνÄÇÏÁö´Â ¾Ê°í ¹«Á¶°Ç ÆÄÀÏ ±â¹ÝÀ̱⠶§¹®¿¡ Àӽà ÆÄÀÏÀ» ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ű×ÀÇ ±æÀÌ´Â Çì´õÀÇ 6~9 ¹ÙÀÌÆ®¿¡ ÀÖµÇ »óÀ§ 1ºñÆ®´Â ¹ö¸®°í 7ºñÆ® 4°³¸¦ ¸ð¾Æ ¾²´Â synchsafe ¹æ½ÄÀ¸·Î ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ¸®Æ² ¿£µð¾ðÀ̰í Çì´õ ÀÚüÀÇ ±æÀÎ 10Àº Á¦¿Ü µÇ¾î ÀÖ¾î ±æÀ̸¦ ¾Ë¾Æ³»´Â °úÁ¤ÀÌ Á» º¹ÀâÇÕ´Ï´Ù. ´ÙÀ½ ÇÔ¼ö°¡ ÀÌ ÀÛ¾÷À» ÇØ ÁÝ´Ï´Ù. 

// ID3v2 űװ¡ ÀÖ´Â MP3 ÆÄÀÏÀº ű׸¦ °Ç³Ê¶Ù°í Àӽà ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. 
// º¯È¯ ¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. 
bool StripID3Tag(LPCTSTR path)
{
    HANDLE hFile;
    DWORD dwRead, dwWritten;
    DWORD size;
    void* buf = NULL;

    // ¿øº» ÆÄÀÏÀ» ¿­°í ¹öÆÛ·Î ÀÐ¾î µéÀδÙ. 
    // ÀÐÀ» ¼ö ¾ø´Ù¸é ¿øº»À» ±×´ë·Î Àеµ·Ï ¹«º¯È¯ »óÅ·Π¸®ÅÏÇÑ´Ù. 
    hFile = CreateFile(path, GENERIC_READ, 0, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        return false;
    }
    size = GetFileSize(hFile, NULL);
    buf = malloc(size);
    ReadFile(hFile, buf, size, &dwRead, NULL);
    CloseHandle(hFile);

    int offset = 0;
    char* p = (char*)buf;

    // ID3·Î ½ÃÀÛÇϸé űװ¡ ÀÖ´Â °ÍÀÌ´Ù. ű׸¦ »©°í ³ª¸ÓÁö À½¼º µ¥ÀÌÅ͸¸À¸·Î Àӽà ÆÄÀÏÀ» ¸¸µç´Ù. 
    if (p[0] == 'I' && p[1] == 'D' && p[2] == '3') {
        // ű×ÀÇ ±æÀÌ´Â 6~9¹ÙÀÌÆ®¿¡ ÀÖµÇ synchsafe Æ÷¸ËÀ¸·Î µÇ¾î ÀÖ´Ù.
        // ù ºñÆ®´Â ¸ðµÎ 0À̸ç ÇÏÀ§ 7ºñÆ®¸¸ »ç¿ëÇÏ´Â ¸®Æ²¿£µð¾ðÀÌ´Ù. 
        offset = p[6] * pow(2, 21) + p[7] * pow(2, 14) + p[8] * pow(2, 7) + p[9];
        // ű×ÀÇ ±æÀÌ¿¡¼­ Çì´õ ±æÀÌ´Â ºüÁö¹Ç·Î Çì´õ ±æÀÌ 10¸¸Å­ ´õÇØ¾ß À½¼ºÀÌ ÀÖ´Â À§Ä¡°¡ µÈ´Ù.
        offset += 10;

        // Àӽà ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. MCI°¡ ¸Þ¸ð¸®»óÀÇ À½¼º ÆÄÀÏÀ» Áö¿øÇÏÁö ¾Ê¾Æ ¹Ýµå½Ã ÆÄÀÏÀ» °æÀ¯ÇØ¾ß ÇÑ´Ù.
        // ¼û±è ÆÄÀÏ·Î »ý¼ºÇ쵂 ÇÁ·Î±×·¥ Á¾·á½Ã ÀÌ ÆÄÀÏÀ» ¹Ýµå½Ã Áö¿ö¾ß ÇÑ´Ù. 
        hFile = CreateFile(L"c:\\Temp\\temp.mp3", GENERIC_WRITE, 0, NULL,
            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_HIDDEN, NULL);
        WriteFile(hFile, p + offset, size - offset, &dwWritten, NULL);
        CloseHandle(hFile);
    }
    free(buf);

    // º¯È¯ ¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. 
    if (offset == 0) {
        return false;
    } else {
        return true;
    }
}

ÄÚµå ¼³¸íÀº ÁÖ¼®¿¡ ÃæºÐÈ÷ ´Þ¾Æ µÎ¾ú½À´Ï´Ù. 7ºñÆ®¾¿ »© ³»´Â°Å¾ß ÀüÇô ¾î·Á¿î ÀÛ¾÷ÀÌ ¾Æ´Ñµ¥ ºñÆ® ±¸Á¶¸¦ Àß ¸ð¸£´Â ¿äÁò ¼¼´ëµé¿¡°Ô´Â ¹«Ã´ ¾î·Á¿î Äڵ尡 µÉ °Å °°³×¿ä. Àý´ë °æ·ÎÀÇ Àӽà ÆÄÀÏÀ» »ç¿ëÇߴµ¥ »ç¿ëÀÚµéÀÌ Àß ¾Èº¸´Â À§Ä¡³ª ¾Æ´Ï¸é ¸Þ¸ð¸® ¸Ê ÆÄÀÏ·Î »ý¼ºÇؼ­ »ç¿ëÇÏ´Â ¹æ¹ýµµ °¡´ÉÇÕ´Ï´Ù. ¿©±â¼­´Â ¿ø¸®¸¦ ¼³¸íÇÏ´Â°Ô Áß¿äÇÏ´Ï Àӽà ÆÄÀÏÀ» »ç¿ëÇß½À´Ï´Ù. Àç»ýÇÏ´Â ºÎºÐ¿¡¼­´Â ű׸¦ ¸ÕÀú °È¾î³½ ÆÄÀÏÀ» Àç»ýÇÕ´Ï´Ù. 

    // ID3 ű׸¦ Á¦°ÅÇßÀ¸¸é º¯È¯ÇÑ ÆÄÀÏÀ» Àç»ýÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ¿øº»À» Àç»ýÇÑ´Ù. 
    TCHAR tPath[MAX_PATH];
    if (StripID3Tag(arMp3[mp_idx])) {
        lstrcpy(tPath, L"c:\\Temp\\temp.mp3");
    } else {
        lstrcpy(tPath, arMp3[mp_idx]);
    }

ÀÌ ÄÚµå·Î Å×½ºÆ®ÇØ º»°á°ú Á¦°¡ °¡Áø MP3 ÆÄÀÏÀº ´ëºÎºÐ Àß Àç»ýµÇ¾ú½À´Ï´Ù. ±×·¯³ª ID3v2 ű׵µ ¹öÀü¿¡ µû¶ó Á¶±Ý¾¿ ´Ù¸£´Ù´Â ¾ê±âµµ ÀÖ¾î ´Ù¸¥ ¹®Á¦°¡ ´õ ÀÖÀ» ¼öµµ ÀÖ½À´Ï´Ù. ±×·± °æ¿ì¶óµµ À¢¸¸Çϸé ÇØ°áÇÒ ¼ö ÀÖÀ» °Å °°½À´Ï´Ù. 
FMOD³ª BASS¸¦ ¾²¸é ½±°Ô Ç® ¼ö ÀÖ´Â ¹®Á¦¸¦ °¡±ÞÀû MCI¸¸À¸·Î ÇØ°áÇÏ´Ù º¸´Ï º¹ÀâÇϳ׿ä. ²À µ·ÀÌ ¾ø¾î¼­ ±×·±°Ô ¾Æ´Ï¶ó Ãß°¡ ¶óÀ̺귯¸® ÆÄÀÏÀÌ µû¶ó ºÙ´Â°Ô ¹èÆ÷»ó ¹ø°Å·Ó°Ô °¡±ÞÀûÀ̸é À©µµ¿ìÀÇ ±âº» ±â´É¸¸À¸·Î ¿Ï¼ºÇϱâ À§Çؼ­ÀÔ´Ï´Ù. MCI°¡ ¸¸µé¾îÁøÁö ¿À·¡µÇ¾úÁö¸¸ ¸î °¡Áö ¹®Á¦¸¸ ÇØ°áÇÏ¸é ¾ÆÁ÷µµ ¾µ¸¸ÇÑ °Å °°½À´Ï´Ù. 






 


·Î±×ÀÎÇÏ¼Å¾ß ´ñ±ÛÀ» ´Þ ¼ö ÀÖ½À´Ï´Ù.