Windows Media Player DSP插件格式协商

时间:2012-01-12 17:54:32

标签: c++ windows wmp

我正在为Windows Media Player编写音频DSP插件,插件充当DMO。我试图让WMP向我发送单声道22.050 khz音频的音频数据。但是,无论我做什么,播放器都会将所有音频重新采样为立体声44.1k数据。即使我正在播放的文件是22.050khz波形文件,我的插件仍然可以获得44.1音频。

我指定了我的插件可以通过GetInputType/GetOutputType函数处理的数据,但无论调用时间SetInputType/SetOutputType发生什么,格式都会回到44.1k。有没有人知道发生了什么?我试着写ValidateMediaType只接受我想要的采样率,但后来我根本就没有数据。我的GetInputType功能位于

之下
STDMETHODIMP CWMPIPSpeaker::GetInputType ( 
               DWORD dwInputStreamIndex,
               DWORD dwTypeIndex,
               DMO_MEDIA_TYPE *pmt)
{
    HRESULT hr = S_OK;

    if ( 0 != dwInputStreamIndex )
    {
        return DMO_E_INVALIDSTREAMINDEX ;
    }

    // only support one preferred type
    if ( 0 != dwTypeIndex )
    {
        return DMO_E_NO_MORE_ITEMS;
    }

    if ( NULL == pmt )
    {
       return E_POINTER;

    }


    hr = MoInitMediaType(pmt, sizeof( WAVEFORMATEX ) );

    WAVEFORMATEX* format = ((WAVEFORMATEX*)pmt->pbFormat);
    format->nChannels = 1;
    format->nSamplesPerSec = 22050;
    format->wFormatTag = WAVE_FORMAT_PCM;
    format->wBitsPerSample = 16;    
    format->cbSize = 0;
    format->nBlockAlign = (format->nChannels * format->wBitsPerSample) / 8;
    format->nAvgBytesPerSec = format->nBlockAlign * format->nSamplesPerSec;

    pmt->formattype = FORMAT_WaveFormatEx;
    pmt->lSampleSize = format->nBlockAlign;
    pmt->bFixedSizeSamples = true;
    pmt->majortype = MEDIATYPE_Audio;
    pmt->subtype = MEDIASUBTYPE_PCM;

    return hr;
}

1 个答案:

答案 0 :(得分:1)

不幸的是,问题似乎不是我。我将这个存档在这里以供将来参考,因为这个问题引起了我的所有麻烦。我找到了关于problem on an msdn blog的详细报告,看来在Vista及以后您无法协商DMO插件的媒体类型按设计。我不能说我同意这个决定,但我的意思是如果我想要下采样数据,我必须自己进行转换。

希望这可以帮助其他遇到此“功能”的人。