ڷ

Win32 API ̿ Mp3 ¥:2021-8-19 12:30:17 ȸ:925
ۼ : ҳⰡ
Ʈ : 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Դϴ. 
ǽɽø Ʈ ֽʽÿ.

 



õ ּ .
성인인증,통영출장안마,정안마 출근부 창원출장안마,강북출장샵,김제출장마사지-마사지가이드 순천출장샵 인천콜걸샵 하남출장마사지 가정역맛사지 노원출장만남 | 대구콜걸샵 | 시흥출장만남 조성면마사지 밀워키전동공구,평택콜걸샵,온라인미팅 자위방송 가산디지털단지역소개팅 순천 성인맛사지 웹하드사이트순위 아리19 짤 성북성인마사지 | 화산동안마 | 보산동안마 강북구출장샵 강동구출장샵 성1인만화

마늘까기부업 계명대맛집 여름스타그램 계양✓대출중개✓서브웨이알바추천 예쁜사진 여행토퍼 | 대출 한도 학자금 | 사랑을했다 성장사진 집에서하는부업 고수익알바 남자 증권적 채권✓남해여행✓재택아르바이트 만남과대화 충주출장만남 부산영화동호회 서울출장샵 후장후기
÷ 210819-123017_ApiMp3.zip(48281 byte). ٿε : 164

Ϻ Ű ũ

819 11:14:27  

ڷ 帳ϴ.

ҳⰡ 822 11:58:30  

ڵ带 ߴµ ׽Ʈ ϴ ߽߰ϴ. м ID3v2 ±װ ִ ν ϳ׿.
MP3 , ٹ, ߰ ID3 ±׷ κп 128 Ʈ ̷ µ ̷δ 糪 ٹ ϱ⿡ õ °̴ϴ. ׷ ID3v2 ±׸ µ ༮ κп Դϴ. ׷ Ͱ ٷ ʰ 20 MCI ̰ Ϸ ν մϴ.
ذå պκ ±׸ dzʶٴ°ǵ MCI ޸𸮻 Ʈ ν ʰ ̱ ӽ մϴ. ± ̴ 6~9 Ʈ ֵ 1Ʈ 7Ʈ 4 synchsafe Ǿ ֽϴ. Դٰ Ʋ ̰ ü 10 Ǿ ־ ̸ ˾Ƴ մϴ. Լ ۾ ݴϴ. 

// ID3v2 ±װ ִ MP3 ±׸ dzʶٰ ӽ Ѵ. 
// ȯ θ Ѵ. 
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 Ǿ ذϸ ϴ. 






 


αϼž ֽϴ.