2012-01-12 196 views
0

我正在爲Windows Media Player編寫一個音頻DSP插件,插件充當DMO。我試圖讓WMP向我發送單聲道22.050 kHz音頻的音頻數據。但是,無論我做什麼,播放器都會將所有音頻重新採樣爲立體聲44.1k數據。即使我正在播放的文件是22.050khz波形文件,我仍然會在插件中獲得44.1音頻。Windows Media Player DSP插件格式協商

我指定了我的插件可以通過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; 
} 
+0

您是否在您的'SetInputType'中爲44.1 kHz格式返回錯誤代碼? – 2012-01-12 19:10:09

+0

另一個可能的原因是您的DMO不是WMP使用的唯一一個。它具有內部音量標準化,SRS效果等等,它們可以在音頻數據實際到達DMO之前切換到44.1 kHz。 – 2012-01-12 19:24:27

+0

我確實返回了錯誤代碼。問題最終成爲WMP本身,但感謝您的建議 – Nate 2012-01-12 20:24:31

回答

1

不幸的是它看起來問題不是我。由於這個問題給我造成的一切麻煩,我將它歸檔在這裏供將來參考。我發現了有關problem on an msdn blog的詳細報告,看來在Vista和更高版本中,您無法通過設計爲DMO插件協商媒體類型。我不能說我同意這個決定,但我的意思是如果我想要下采樣數據,我必須自己進行轉換。

希望這可以幫助任何碰到這個「功能」的人。