DirectShowで音声を再生するには、IMediaControlを取得して、メソッドのRenderFileを呼び出して、フィルタグラフを生成します。 フィルタグラフが生成できれば、IMediaControlのRunを呼び出せば音声を再生することができます。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <string> #include <windows.h> #include <dshow.h> // lib #pragma comment( lib, "strmiids.lib" ) /* DirectShowで音声を再生する */ int _tmain ( int argc , _TCHAR* argv[] ) { // std::wcoutのロケールを設定 std::wcout.imbue( std::locale( "", std::locale::ctype ) ); // エラーコード HRESULT hResult = S_OK; // COMを初期化 ::CoInitialize( NULL ); // 再生する音声ファイル std::wstring strFilePath = L".¥¥TestData¥¥Kalimba.mp3"; // IGraphBuilder IGraphBuilder* pGraphBuilder = NULL; // IMediaControl IMediaControl *pMediaControl = NULL; // FilterGraphを生成 hResult = ::CoCreateInstance( CLSID_FilterGraph , NULL , CLSCTX_INPROC , IID_IGraphBuilder , (LPVOID *)&pGraphBuilder ); if ( !SUCCEEDED( hResult ) ) { // エラー goto err; } // IMediaControlの取得 hResult = pGraphBuilder->QueryInterface( IID_IMediaControl , (void**)&pMediaControl ); if ( !SUCCEEDED( hResult ) ) { // エラー goto err; } // FilterGraphの生成 hResult = pMediaControl->RenderFile( (BSTR)strFilePath.c_str() ); if ( !SUCCEEDED( hResult ) ) { // エラー goto err; } // 動画の再生 hResult = pMediaControl->Run(); if ( !SUCCEEDED( hResult ) ) { // エラー goto err; } // 音声再生待ち ::MessageBox( NULL, L"音声を再生しています。¥r¥nOKを押すと終了します。", L"お知らせ", MB_OK ); err: // IMediaControlの破棄 if ( NULL != pMediaControl ) { pMediaControl->Release(); } // IGraphBuilderの破棄 if ( NULL != pGraphBuilder ) { pGraphBuilder->Release(); } // COMの終了 ::CoUninitialize(); // 処理結果を返す return( 0 ); }