Windows mobile5.0上的mp3播放器只能播放wav格式的···

Windows mobile5.0下的mp3播放器只能播放wav格式的···
为什么我在Windows mobile 5.0下编写的MP3播放器只能播放wav格式的歌曲囧,怎么才能播放MP3文件呢?

"playControl.h"

C/C++ code
#pragma once
#include <streams.h>
#pragma comment (lib,"Ole32.lib")
#pragma comment (lib,"Strmiids.lib")


#define HELPER_RELEASE(x) { if (x) x->Release(); x = NULL; }
#define WM_GRAPHNOTIFY  WM_USER+1

class CPlayControl
{
public:
    CPlayControl(void);
public:
    ~CPlayControl(void);
public:
    IGraphBuilder *pGB;        //这是directshow的核心
    IMediaControl *pMC;        //帮我们连接filter(媒体文件,解码器等)          
    //简单的说,它帮我们简单地打开和播放文件.
    IMediaEventEx *pME;        //处理过滤器图表的事件
    IVideoWindow  *pVW;        //用这个来控制directshow的视频窗口
    IBasicAudio   *pBA;        //用于控制音频流的音量和平衡
    IBasicVideo   *pBV;     //用于设置视频特性,如视频显示的目的区域和源区域
    IMediaSeeking *pMS;        //提供搜索数据流位置和设置播放速率的方法,播放位置

    enum PLAYSTATE { RUNING, PAUSED, STOPPED, INIT };

public:

    PLAYSTATE playControlInfo;
    HWND      ghApp;

public:

    bool SetNotifyWindow(HWND inWindow);
    bool Create();
    bool RenderFile(WCHAR *szFile);
    bool buttonPlay();
    bool buttonPause();
    void buttonStop();
    void CloseInterfaces(void);
    bool ListPlay(WCHAR *szFile);
    float GetAlltime();
    float GetCurrentPosition();
    bool SetCurrentPosition(double inPosition) ;
    bool Running();
    void SetVol(int m_vol);

    IMediaEventEx * GetEventHandle();
};



"playControl.cpp"


C/C++ code
#include "StdAfx.h"
#include "PlayControl.h"

CPlayControl::CPlayControl(void)
{
    IGraphBuilder *pGB = NULL;
    IMediaControl *pMC = NULL;
    IMediaEventEx *pME = NULL;
    IVideoWindow  *pVW = NULL;
    IBasicAudio   *pBA = NULL;
    IBasicVideo   *pBV = NULL;
    IMediaSeeking *pMS = NULL;
    playControlInfo = STOPPED;
    ghApp = 0;
}

CPlayControl::~CPlayControl(void)
{
    CoUninitialize();
}

void CPlayControl::CloseInterfaces(void)
{
    HELPER_RELEASE(pMC);
    HELPER_RELEASE(pME);
    HELPER_RELEASE(pMS);
    HELPER_RELEASE(pBV);
    HELPER_RELEASE(pBA);
    HELPER_RELEASE(pVW);
    HELPER_RELEASE(pGB);

    // No current media state
    playControlInfo = INIT;

}


bool CPlayControl::Create()
{
    if(FAILED(CoInitialize(NULL)))
        return false;

    // Get the interface for DirectShow's GraphBuilder
    if( SUCCEEDED( CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB )))
    {
        HRESULT hr = NOERROR;
        // QueryInterface for DirectShow interfaces
        hr |= (pGB->QueryInterface(IID_IMediaControl, (void **)&pMC));
        hr |= (pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME));
        hr |= (pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS));

        // Query for video interfaces, which may not be relevant for audio files
        hr |= (pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW));
        hr |= (pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV));

        // Query for audio interfaces, which may not be relevant for video-only files
        hr |= (pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA));

        return true;
    }
    return false;
}

bool CPlayControl::RenderFile(WCHAR *szFile)
{    
    
    if ( pGB && SUCCEEDED( pGB->RenderFile(szFile, NULL)))
    {
        return true;
    }
    else
        return false ;
}

bool CPlayControl::SetNotifyWindow(HWND inWindow)
{
    if (pME)
    {
        pME->SetNotifyWindow((OAHWND)inWindow, WM_GRAPHNOTIFY, 0);
        return true;
    }
    return false;
}

bool CPlayControl::Running()
{
    if(playControlInfo == RUNING || playControlInfo == PAUSED)
        return true;
    else
        return false;
}
bool CPlayControl::ListPlay(WCHAR *szFile)
{
    if(pME)
    {
        pME->SetNotifyWindow(NULL,0,0);
        CloseInterfaces();
    }
    if(playControlInfo == RUNING || playControlInfo == PAUSED)
    {        
        playControlInfo = STOPPED;
    }
    if(Create() && RenderFile(szFile))
    {
        pMC->Run();
        playControlInfo = RUNING ;
        return true;
    }
    return false;
}


bool CPlayControl::buttonPlay()
{
    if(playControlInfo == RUNING)
        return FALSE;
    else
    {
        pMC->Run();
        playControlInfo = RUNING;
        return TRUE;
    }
}

bool CPlayControl::buttonPause()
{
    if(playControlInfo == RUNING)
    {
        pMC->Pause();
        playControlInfo = PAUSED;
        return TRUE;
    }
    else
        return FALSE;
}

void CPlayControl::buttonStop()
{
    if((playControlInfo == PAUSED) || (playControlInfo == RUNING))
    {
        pMC->Stop();
    }    
    playControlInfo = STOPPED;
    pME->SetNotifyWindow(NULL,0,0);
    CloseInterfaces();
}

IMediaEventEx * CPlayControl::GetEventHandle()
{
    return pME;
}

bool CPlayControl::SetCurrentPosition(double inPosition)
{
    if (pMS)
    {
        __int64 one = 10000000;
        __int64 position = (__int64)(one * inPosition);
        HRESULT hr = pMS->SetPositions(&position, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame, 
            0, AM_SEEKING_NoPositioning);
        return SUCCEEDED(hr);
    }
    return false;
}

void CPlayControl::SetVol(int m_vol)
{
    pBA->put_Balance(0);
    pBA->put_Volume( -m_vol * 100);
}

float CPlayControl::GetAlltime()
{
    float time ;
    if(pMS)
    {
        LONGLONG allTimes ;
        if(SUCCEEDED(pMS->GetDuration(&allTimes)))
        {        
            time = (float)allTimes / 10000000 ;
            return time;
        }
    }
    return 0 ;
}

float CPlayControl::GetCurrentPosition()
{
    float time ;
    if(pMS)
    {
        LONGLONG theTimes ;
        if(SUCCEEDED(pMS->GetCurrentPosition(&theTimes)))
        {
            time = (float)theTimes / 10000000 ;
            return time;
        }
    }
    return 0 ;
}