0

ボタンのクリック、エラー、通知など、UI で複数のサウンドを再生する必要があります。この目的のために、次のコードを作成しました (Windows で mp3 を再生したことはありません)。

bool ClientHandler::InitSoundAndMusic()
{
    m_pSoundGraph = NULL;
    m_pSoundControl = NULL;

    HRESULT hr = ::CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
                                    (void**) &m_pSoundGraph);

    if (!SUCCEEDED(hr) || !m_pSoundGraph)
        return false;

    hr = m_pSoundGraph->QueryInterface(IID_IMediaControl, (void**) &m_pSoundControl);
    if (!SUCCEEDED(hr) || !m_pSoundControl)
        return false;

    return true;
}

void ClientHandler::PlayFile(LPCTSTR file)
{
    if (!m_pSoundGraph)
        return;

    m_pSoundControl->Stop();
    HRESULT hr = m_pSoundGraph->RenderFile(file, NULL);
    if (SUCCEEDED(hr))
        m_pSoundControl->Run();
}

bool ClientHandler::OnEvent(const String& message)
{
    if (message == _T("button"))
    {
        PlayFile(_T(".\\sound\\button.mp3"));
        return true;
    }

    return false;
}

とても遅いようです。ボタンを毎秒 5 回クリックすると、UI がフリーズします。毎回 Stop/Render/Run を呼び出すべきではないと思いますが、回避する方法がわかりません。コードをどのように書き直せばよいですか?

よろしく、

4

1 に答える 1

0

DirectShow の代わりに、libzplay (http://libzplay.sourceforge.net/) を試してみました。

そのreadmeを引用させてください:

C++ で libZPlay を使用する方法

  1. ソースコードに libzplay.h をインクルードします
  2. libZPlay 名前空間を含める

    名前空間 libZPlay を使用します。

  3. プロジェクトをインポート ライブラリにリンクします。

    libzplay.lib - libzplay.dll の VC++ インポート ライブラリ
    libzplay_borland.lib - libzplay.dll の Borland C++ インポート ライブラリ
    libzplay.a - libzplay.dll の MinGW/GCC インポート ライブラリ

  4. ZPlay クラスを作成します。

    ZPlay *player = CreateZPlay();

  5. ファイルを開きます。

    if(player->OpenFile("mySong.mp3", sfAutodetect) == 0) { // エラー }

  6. プレイを開始

    プレーヤー->プレイ();

  7. 最後に ZPlay クラスを破棄します

    プレーヤー->リリース();

スムーズに動作します。ファイルを 1 回だけ開いて、必要なときにいつでも Play() を呼び出すことができます。DirectShow で Run() を呼び出しても、同じようには機能しませんでした。

それが The Right Library である必要があります: 30 分で、最初からしっかりとした岩石から埋め込むことができます。

于 2012-06-25T20:11:59.967 に答える