MPEG3 の再生

おそらく最も簡単な方法は DirectShow を利用することだと思います。

サンプルコードのダウンロード [makefile でのビルド, playmp.zip]

以下のコードは DirectShow を使って MP3 音楽ファイルを再生する方法を示しています。 COM を使わないといけないのでコードがこんな風になっちゃってます。

#define UNICODE
#define _UNICODE

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <assert.h>
#include <dshow.h>
#include <process.h>
#include "playmp.h"

#define IDM_BUTTON1 (100)
#define IDM_EDIT1 (101)


TCHAR g_lpszClassName[] = TEXT("_MY_PLAYMP3_");
HWND g_hWnd = NULL;
HWND g_hButton = NULL;
HWND g_hEdit = NULL;


//////////////////////////////////////////////////////////////////////////


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {

     WNDCLASSEX wcl;

     wcl.cbSize = sizeof(WNDCLASSEX);
     wcl.hInstance = hInstance;
     wcl.lpszClassName = g_lpszClassName;
     wcl.lpfnWndProc = WndProc;
     wcl.style = NULL;
     wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
     wcl.hIconSm = NULL;
     wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
     wcl.lpszMenuName = NULL;
     wcl.cbClsExtra = 0;
     wcl.cbWndExtra = 0;
     wcl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);

     if(!RegisterClassEx(&wcl)) {
          return FALSE;
     }

     g_hWnd = CreateWindowEx( 
          0,      
          g_lpszClassName,
          TEXT("MPEG3 Play Test"),
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT,      CW_USEDEFAULT,
          350, 150,
          NULL, 
          NULL, 
          hInstance, 
          NULL);

     if(!g_hWnd) {
          return FALSE;
     }

     ShowWindow( g_hWnd, nShowCmd);
     UpdateWindow(g_hWnd);

     MSG Msg;
     
     while(GetMessage(&Msg, NULL, 0, 0)) {
          TranslateMessage(&Msg);
          DispatchMessage(&Msg);
     }

     return Msg.wParam;
     
}


//////////////////////////////////////////////////////////////////////////


LRESULT CALLBACK WndProc( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) {

     switch(Msg) {
     HANDLE_MSG (hwnd, WM_COMMAND, OnCommand );
     HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
     HANDLE_MSG (hwnd, WM_DESTROY, OnDestroy );
     HANDLE_MSG(hwnd, WM_SIZE, OnSize);
     default:
          return DefWindowProc(hwnd, Msg, wParam, lParam);
     }

     return FALSE;
}


///////////////////////////////////////////////////////////////////////////////


unsigned int __stdcall MP3WorkerThread (PVOID pv) {

     LPTSTR pszFileName = (LPTSTR) pv;

     if ( !pszFileName ) {
          return 0;
     }

     HRESULT hr;

     hr = ::CoInitialize(NULL);

     assert ( SUCCEEDED(hr));
     
          IGraphBuilder* pGraphBuilder=NULL;
          IMediaControl* pMediaControl=NULL;
          IMediaEvent* pMediaEvent=NULL;

     hr = ::CoCreateInstance(
          CLSID_FilterGraph, 
          NULL, 
          CLSCTX_INPROC, 
          IID_IGraphBuilder, 
          (void**)&pGraphBuilder);
     assert ( SUCCEEDED(hr));
     
     hr = pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&pMediaControl);
     assert ( SUCCEEDED(hr) );

     hr = pGraphBuilder->QueryInterface(IID_IMediaEvent, (void **)&pMediaEvent);
     assert ( SUCCEEDED (hr) );
     
     hr = pGraphBuilder->RenderFile( pszFileName, NULL);
     assert ( SUCCEEDED (hr));

     hr = pMediaControl->Run();
     assert ( SUCCEEDED (hr) );

     long code=0;
     hr = pMediaEvent->WaitForCompletion(INFINITE,&code);

     if( pMediaEvent ) 
          pMediaEvent->Release();
     if( pMediaControl )
          pMediaControl->Release();
     if( pGraphBuilder ) 
          pGraphBuilder->Release();

     ::CoUninitialize();

     free ( pszFileName );
     
     return 0;
}


///////////////////////////////////////////////////////////////////////////////


VOID PlayMP3 ( LPTSTR pszFileName ) {

     assert ( pszFileName );
     
     // allocate the memory for the file name buffer.
     LPTSTR pszBuff = NULL;
     INT nAllocSize = (_tcslen ( pszFileName ) + 1 ) * sizeof (TCHAR);
     pszBuff = (LPTSTR) malloc ( nAllocSize );
     assert (pszBuff);
     CopyMemory ( pszBuff, pszFileName, nAllocSize );

     // create a thread
     DWORD dwThread;
     HANDLE hThread = 
          (HANDLE)_beginthreadex(
               NULL, 
               NULL, 
               MP3WorkerThread, 
               (void*) pszBuff, 
               NULL, 
               (unsigned int*)&dwThread);

     assert ( hThread );
     
}


///////////////////////////////////////////////////////////////////////////////


void OnCommand(HWND hwnd, int nID, HWND hWndCtl, UINT codeNotify) {

     if ( IDM_BUTTON1 != nID ) {
          // Do nothing
          return;
     }

     TCHAR szFileName [MAX_PATH];
     ZeroMemory ( szFileName, sizeof ( szFileName ) );
     Edit_GetText ( g_hEdit, szFileName, sizeof ( szFileName ));

     PlayMP3 ( szFileName );
          
}


///////////////////////////////////////////////////////////////////////////////


BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) {

     // Button
     
     g_hButton = CreateWindowEx (
          0,
          TEXT("Button"),
          (LPTSTR) TEXT("OK"),
          WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
          hwnd, (HMENU) IDM_BUTTON1,
          NULL, NULL );

     // Edit
     
     g_hEdit = CreateWindowEx(
          WS_EX_CLIENTEDGE, 
          TEXT("Edit"),
          (LPTSTR) TEXT("C:\\foo.mp3"), 
          WS_CHILD | WS_VISIBLE,
          0, 0, 0,0, 
          hwnd, (HMENU) IDM_EDIT1,
          NULL, NULL); 

     // Show Windows
     
     ShowWindow ( g_hButton, SW_SHOW );
     ShowWindow ( g_hEdit, SW_SHOW );

     return TRUE;
}


///////////////////////////////////////////////////////////////////////////////


void OnDestroy ( HWND hwnd ) {

     PostQuitMessage(0);

}

///////////////////////////////////////////////////////////////////////////////


void OnSize(HWND hwnd, UINT state, int cx, int cy) {

     MoveWindow (
          g_hEdit,
          10, 
          10,
          300,
          20,
          TRUE);

     MoveWindow ( 
          g_hButton, 
          10, // left 
          35, // top, 
          75, // width
          20, // height
          TRUE );

}

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説