Windows媒体基础:拔掉音频捕获设备会返回错误的事件

时间:2016-05-13 01:24:31

标签: c# audio ms-media-foundation

我正在使用Windows Media Foundation来跟踪应用程序中的所有麦克风和摄像头。当我拔下麦克风时,我收到事件类型MEError而不是MECaptureAudioSessionDeviceRemoved。我尝试拔掉通过USB和音频插孔连接的麦克风,我总是得到一个标识为MEError的事件类型。视频捕获设备(网络摄像头)没有出现此问题,因为我得到了预期的MEVideoCaptureDeviceRemoved事件类型。 麦克风正在初始化,因为我可以正确地听到音频。

我已经在互联网上找到了关于这个特定(有媒体基础的拔出麦克风)问题的零信息。最重要的是,我是新手C#dev。我很想知道为什么我没有得到MECaptureAudioSessionDeviceRemoved而是得到MEError?这是Mic驱动程序开发人员没有实现的东西,或者如果我的代码中存在错误,它是否是预期的东西?

这是我获取EventType的代码(我的问题不完全必要)此函数所属的类实现IMFAsyncCallback -

HRESULT MicCaptureSession::Invoke(IMFAsyncResult* pAsyncResult)
{
    ComPointerCustom<IMFMediaEvent> pEvent;

    HRESULT hr = S_OK;

    std::lock_guard<std::mutex> lock(m_critSec);

    if (pAsyncResult == 0)
    {
        return E_UNEXPECTED;
    }

    hr = m_localSession->EndGetEvent(pAsyncResult, &pEvent);

    MediaEventType eventType;
    HRESULT hr = S_OK;
    HRESULT hrStatus = S_OK;

    UINT32 TopoStatus = MF_TOPOSTATUS_INVALID;

    if (pEvent== NULL)
        return E_UNEXPECTED;

    hr = pEvent->GetType(&eventType);   <------ Y U NO WORK ??

    if (FAILED(hr))
    {
        return E_UNEXPECTED;
    }

    hr = pEvent->GetStatus(&hrStatus);

    if (FAILED(hr))
    {
        return E_UNEXPECTED;
    }
    /* ----- MORE CODE -----*/
}

1 个答案:

答案 0 :(得分:0)

我不能确切地说出它的原因,但我可以建议你查看更多的错误调用。音频捕获与视频捕获不同 - 视频捕获通常在帧之间有大约33 ms,但音频捕获大约有5 - 10 ms,并且它可以生成MEError,然后Windows Audio驱动程序生成MECaptureAudioSessionDeviceRemoved。 此外,通常MF源会产生错误链。尝试从音频捕获源检查更多错误调用。