社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

音声ファイルの再生 - Windows

音声ファイルの再生を行うコードです。

CMediaControlMMクラスは、昔ながらの Multi Media API を
使った実装で、WAVファイルの再生のみ対応しています。

CMediaControlDSクラスは、Direct Show を使った実装なので、
対応するデコーダが入っていれば何でも再生できます。
Windows 98以上であれば、WMP6.4がインストールされているので、
WAVだけでなくWMAやMP3ファイルの再生も標準で対応しています。


---
#include <strmif.h>        // IGraphBuilder
#include <control.h>       // IMediaControl, IMediaEvent
#include <uuids.h>        // CLSID_FilterGraph
#pragma comment(lib, "strmiids.lib")

#include <Mmsystem.h>
#pragma comment(lib, "winmm.lib")

_COM_SMARTPTR_TYPEDEF(IGraphBuilder, __uuidof(IGraphBuilder));
_COM_SMARTPTR_TYPEDEF(IMediaControl, __uuidof(IMediaControl));
_COM_SMARTPTR_TYPEDEF(IMediaEvent, __uuidof(IMediaEvent));


//////////////////////////////////////////////////////////////////////
// CMediaControl
class CMediaControlDS
{
protected:
 typedef CMediaControlDS      thisClass;

public:
 CMediaControlDS()
 {
 }
 virtual ~CMediaControlDS()
 {
 }

public:
 HRESULT PlaySound(LPCTSTR szFileName)
 {
  USES_CONVERSION;

  HRESULT hr = S_OK;

  // 毎回、新しくオブジェクトを生成する
  // 再生中の場合、停止します
  m_spMediaControl = thisClass::CreateMediaControl();
  if (m_spMediaControl == NULL)
  {
   return E_FAIL;
  }

  IGraphBuilderPtr spGraphBuilder = m_spMediaControl;
  if (spGraphBuilder == NULL)
  {
   return E_FAIL;
  }

  hr = spGraphBuilder->RenderFile(T2W((LPTSTR)szFileName), NULL);
  if (FAILED(hr))
  {
   return hr;
  }

  hr = m_spMediaControl->Run();
  if (FAILED(hr))
  {
   return hr;
  }

  return hr;
 }
 HRESULT StopSound()
 {
  HRESULT hr = S_OK;

  if (m_spMediaControl == NULL)
  {
   return S_FALSE;
  }

  m_spMediaControl = NULL;

  return S_OK;
 }

protected:
 static IMediaControlPtr CreateMediaControl()
 {
  HRESULT hr = S_OK;

  IMediaControlPtr spMediaControl;
  hr = spMediaControl.CreateInstance(CLSID_FilterGraph);
  if (FAILED(hr))
  {
   return NULL;
  }

  return spMediaControl;
 }

protected:
 IMediaControlPtr m_spMediaControl;
};


//////////////////////////////////////////////////////////////////////
// CMediaControlMM

class CMediaControlMM
{
protected:
 typedef CMediaControlMM      thisClass;

public:
 CMediaControlMM()
 {
 }
 virtual ~CMediaControlMM()
 {
 }

public:
 HRESULT PlaySound(LPCTSTR szFileName)
 {
  DWORD dwSound = SND_ASYNC | SND_NODEFAULT | SND_NOWAIT;  // サウンドの種類
  BOOL br = ::PlaySound(szFileName, NULL, dwSound);
  if (br = FALSE)
  {
   DWORD dwError = ::GetLastError();
   return HRESULT_FROM_WIN32(dwError);
  }

  return S_OK;
 }
 HRESULT StopSound()
 {
  DWORD dwSound = 0;
  BOOL br = ::PlaySound(NULL, NULL, dwSound);
  if (br == FALSE)
  {
   DWORD dwError = ::GetLastError();
   return HRESULT_FROM_WIN32(dwError);
  }

  return S_OK;
 }
};

#ifdef _USE_MMAPI
#define CMediaControl       CMediaControlMM
#else
#define CMediaControl       CMediaControlDS
#endif
---

投稿日時 : 2007年4月6日 16:31


コメントを追加

タイトル
名前
URL
コメント