Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFSensorActivityMonitor

IMFSensorActivityMonitor

COM
IIDd0cef145-b3f4-4340-a2e5-7a5080ca05cb継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

センサーアクティビティモニターを制御するためのメソッドを提供します。

解説(Remarks)

このクラスのインスタンスは MFCreateSensorActivityMonitor を呼び出して取得します。センサーのアクティビティレポートは、このメソッドに渡される IMFSensorActivitiesReportCallback インターフェイスを通じて配信されます。

以下の例では、C++/WinRT を使用した COM コールバッククラスの実装Windows Implementation Libraries (WIL) を使用しています。

完全なサンプルの Visual Studio プロジェクトは Windows-Camera GitHub リポジトリにあります。

次の例は、IMFSensorActivitiesReportCallback を実装するクラス宣言を示しています。

class MyCameraNotificationCallback : public winrt::implements <MyCameraNotificationCallback, IMFSensorActivitiesReportCallback>
{
public:
    
    static HRESULT CreateInstance(_In_z_ LPCWSTR symbolicName, _COM_Outptr_ MyCameraNotificationCallback** value) noexcept;

    // IMFSensorActivitiesReportCallback
    IFACEMETHODIMP OnActivitiesReport(_In_ IMFSensorActivitiesReport* sensorActivitiesReport) override;

    bool IsInUse();

private:

    HRESULT Initialize(_In_z_ LPCWSTR symbolicName);

    WCHAR   _symbolicName[MAX_PATH] = {};
    bool    _inUse = false;
    wil::slim_event  _event;
};

次の例は、OnActivitiesReport コールバックの実装を示しています。

OnActivitiesReport 関数は、照会したセンサーデバイスが現在使用中かどうかを示すブール型のクラスメンバーを更新し、状態が取得されたことを通知するイベントを設定します。

注意 コールバックは複数回呼び出される可能性があり、レポートが含まれない場合もあります。そのため、イベントはレポートが見つかった場合にのみ設定されます。


IFACEMETHODIMP MyCameraNotificationCallback::OnActivitiesReport(_In_ IMFSensorActivitiesReport* sensorActivitiesReport)
{
    bool inUse = false;
    wil::com_ptr_nothrow<IMFSensorActivityReport> sensorActivity;
    ULONG cProcCount = 0;

    printf("\nGetActivityReportByDeviceName [%ws] \n", _symbolicName);
    RETURN_IF_FAILED_WITH_EXPECTED(sensorActivitiesReport->GetActivityReportByDeviceName(_symbolicName, &sensorActivity),MF_E_NOT_FOUND);

    RETURN_IF_FAILED(sensorActivity->GetProcessCount(&cProcCount));
    for (ULONG i = 0; i < cProcCount; i++)
    {
        BOOL fStreaming = FALSE;
        wil::com_ptr_nothrow<IMFSensorProcessActivity> processActivity;

        RETURN_IF_FAILED(sensorActivity->GetProcessActivity(i, &processActivity));
        RETURN_IF_FAILED(PrintProcessActivity(processActivity.get()));
        
        RETURN_IF_FAILED(processActivity->GetStreamingState(&fStreaming));

        if (fStreaming)
        {
            inUse = true;
            break;
        }
    }

    // デバイスが使用中であることを示すフラグを設定し、イベントを通知する
    _inUse = inUse;
    if (cProcCount > 0)
    {
        _event.SetEvent();
    }

    return S_OK;
}

この例は、OnActivitiesReport コールバックによってイベントが通知されるのを待機するクラスメソッドを示しています。 OnActivitiesReport はアクティビティが見つかった場合にのみ SetEvent を呼び出すため、WaitForSingleObject には妥当なタイムアウト値を使用します。この例では 500ms を使用しており、タイムアウトが発生した場合はすべて「カメラは使用されていない」として扱われます。

bool MyCameraNotificationCallback::IsInUse( )
{
    if (_event.wait(500))
    {
        return _inUse;
    }

    return false;
}

次の例は、MFCreateSensorActivityMonitor を呼び出してアクティビティモニターを作成し、上記の IsInUse クラスメソッドを呼び出して指定したセンサーが現在使用中かどうかを判定する実装を示しています。

HRESULT IsCameraInUse(
    _In_z_ LPCWSTR symbolicName,
    bool& inUse
)
{
    wil::com_ptr_nothrow<MyCameraNotificationCallback> cameraNotificationCallback;
    wil::com_ptr_nothrow<IMFSensorActivityMonitor> activityMonitor;
    wil::com_ptr_nothrow<IMFShutdown> spShutdown;

    RETURN_IF_FAILED(MyCameraNotificationCallback::CreateInstance(symbolicName, &cameraNotificationCallback));

    // IMFSensorActivitiesReportCallback を渡して IMFSensorActivityMonitor を作成する。
    RETURN_IF_FAILED(MFCreateSensorActivityMonitor(cameraNotificationCallback.get(), &activityMonitor));

    // モニターを開始する
    RETURN_IF_FAILED(activityMonitor->Start());

    // 監視対象のデバイスが使用中かどうかを確認するメソッドを呼び出す。
    inUse = cameraNotificationCallback->IsInUse();

    // アクティビティモニターを停止する。
    RETURN_IF_FAILED(activityMonitor->Stop());

    // モニターをシャットダウンする。
    RETURN_IF_FAILED(activityMonitor.query_to(&spShutdown));

    RETURN_IF_FAILED(spShutdown->Shutdown());

    return S_OK;
}

メソッド 2

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Start()

センサーアクティビティモニターを開始します。

戻り値

このメソッドは HRESULT を返します。返される値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDREQUEST
センサーアクティビティモニターは既に開始されています。
vtbl 4 HRESULT Stop()

センサーアクティビティモニターを停止します。

戻り値

このメソッドは HRESULT を返します。返される値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

#define global IID_IMFSensorActivityMonitor "{D0CEF145-B3F4-4340-A2E5-7A5080CA05CB}"
#usecom global IMFSensorActivityMonitor IID_IMFSensorActivityMonitor "{}"
#comfunc global IMFSensorActivityMonitor_Start  3
#comfunc global IMFSensorActivityMonitor_Stop   4
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。