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

IWMDMDeviceControl

COM
IID1dcb3a04-33ed-11d3-8470-00c04f79dbc0継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IWMDMDeviceControl インターフェイスは、デバイス上の再生を制御するためのメソッドを提供します。

メソッド 8

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

vtbl 3 HRESULT GetStatus(DWORD* pdwStatus)

GetStatus メソッドは、デバイスの制御状態を取得します。

pdwStatusDWORD*out

デバイスの制御状態を示す DWORD へのポインター。制御状態の値には、次のフラグのうち 1 つ以上が指定されます。

フラグ 説明
WMDM_STATUS_READY Windows Media Device Manager とそのサブコンポーネントが準備完了状態です。
WMDM_STATUS_BUSY 現在何らかの操作を実行中です。どの操作であるかを判断するには、他の状態値を評価してください。
WMDM_STATUS_DEVICECONTROL_PLAYING デバイスは現在再生中です。
WMDM_STATUS_DEVICECONTROL_RECORDING デバイスは現在録音中です。
WMDM_STATUS_DEVICECONTROL_PAUSED デバイスは現在一時停止中です。
WMDM_STATUS_DEVICECONTROL_REMOTE デバイスの再生または録音操作が、アプリケーションによってリモート制御されています。
WMDM_STATUS_DEVICECONTROL_STREAM 再生または録音メソッドが、メディア デバイスとの間でデータをストリーミングしています。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
pdwStatus パラメーターが無効なポインターまたは NULL ポインターです。
E_FAIL
不特定のエラーが発生しました。

解説(Remarks)

この呼び出しは、このインターフェイスのデバイス制御操作に固有の状態値を返します。制御状態からは、再生や録音など、デバイスの制御に関連する動作の状態についての情報が得られます。ただし、デバイスがデータをダウンロード中であるか、他の理由でアクセスされているかといった、デバイス全体の状態については分かりません。デバイス制御以外の理由でデバイスがビジー状態の場合はビジーを示すコードが返されるため、より詳細な情報を得るには IWMDMDeviceControl::GetStatus メソッドを呼び出す必要があります。

状態値として WMDM_STATUS_BUSY が返され、かつ状態値表の他の値がいずれも含まれていない場合は、このインターフェイスの PlayRecordPauseResumeStop の各メソッドを呼び出そうとしてはいけません。

vtbl 4 HRESULT GetCapabilities(DWORD* pdwCapabilitiesMask)

GetCapabilities メソッドは、デバイスがどの操作を実行できるかを判断するために、デバイスの機能を取得します。機能は、メディア デバイスがサポートするデバイス制御のメソッドを示します。

pdwCapabilitiesMaskDWORD*out

デバイスの機能を示す DWORD へのポインター。この変数には次のフラグが返される可能性があります。

フラグ 説明
WMDM_DEVICECAP_CANPLAY メディア デバイスは MP3 オーディオを再生できます。
WMDM_DEVICECAP_CANSTREAMPLAY メディア デバイスは、ホスト コンピューターから直接ストリーミング オーディオを再生できます。
WMDM_DEVICECAP_CANRECORD メディア デバイスはオーディオを録音できます。
WMDM_DEVICECAP_CANSTREAMRECORD メディア デバイスは、ホスト コンピューターに直接ストリーミング オーディオを録音できます。
WMDM_DEVICECAP_CANPAUSE メディア デバイスは、再生または録音の操作中に一時停止できます。
WMDM_DEVICECAP_CANRESUME メディア デバイスは、一時停止した操作を再開できます。
WMDM_DEVICECAP_CANSTOP メディア デバイスは、ファイルの終端に達する前に再生を停止できます。
WMDM_DEVICECAP_CANSEEK メディア デバイスは、ファイルの先頭以外の位置へシークできます。
WMDM_DEVICECAP_HASSECURECLOCK メディア デバイスはセキュア クロックを備えています。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
pdwCapabilitiesMask パラメーターが無効なポインターまたは NULL ポインターです。
E_FAIL
不特定のエラーが発生しました。

解説(Remarks)

現時点では、機能を正しく報告するデバイスは多くありません。

次の C++ コードは、デバイスの機能を取得します。


// Examine the device capabilities.
// Use some of these to enable or disable the application's
// user interface elements.
CComQIPtr<IWMDMDeviceControl> pDeviceControl(pIWMDMDevice);
if (pDeviceControl != NULL)
{
    DWORD caps = 0;
    hr = pDeviceControl->GetCapabilities(&caps);
    if (caps & WMDM_DEVICECAP_CANPLAY)
    {
        // TODO: Display a message indicating that the media device can play MP3 audio.
    }
    if (caps & WMDM_DEVICECAP_CANSTREAMPLAY)
    {
        // TODO: Display a message that the device can play audio directly from the host computer.
    }
    if (caps & WMDM_DEVICECAP_CANRECORD)
    {
        // TODO: Display a message that the device can record audio.
    }
    if (caps & WMDM_DEVICECAP_CANSTREAMRECORD)
    {
        // TODO: Display a message that the media device can record 
        // streaming audio directly to the host computer.
    }
    if (caps & WMDM_DEVICECAP_CANPAUSE)
    {
        // TODO: Display a message that the device can pause during play or record operations.
    }
    if (caps & WMDM_DEVICECAP_CANRESUME)
    {
        // TODO: Display a message that the device can resume an operation that was paused.
    }
    if (caps & WMDM_DEVICECAP_CANSTOP)
    {
        // TODO: Display a message that the device can stop playing before the end of a file.
    }
    if (caps & WMDM_DEVICECAP_CANSEEK)
    {
        // TODO: Display a message that the device can seek to a position 
        // other than the beginning of the file.
    }
    if (caps & WMDM_DEVICECAP_HASSECURECLOCK)
    {
        // TODO: Display a message indicating that the device has a secure clock.
    }
}
vtbl 5 HRESULT Play()

Play メソッドは、現在のシーク位置から再生を開始します。IWMDMDeviceControl::Seek メソッドが呼び出されていない場合は、最初のファイルの先頭から再生が始まり、再生長は未定義になります。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
E_BUSY
デバイスがビジー状態です。
WMDM_E_NOTSUPPORTED
このデバイスでは再生機能が実装されていません。
E_FAIL
不特定のエラーが発生しました。

解説(Remarks)

このメソッドは、デバイス再生 (メディア デバイスの記憶媒体上にあるオーディオ トラックの再生) と、ストリーミング オーディオ再生 (ユーザーのコンピューターからメディア デバイスへオーディオ データをストリーミングし、デバイス側で再生する) の両方を実行するために使用します。どちらの形式の再生が行われるかは、Seek メソッドによって決まります。

デバイスによっては、デバイス再生とストリーミング オーディオ再生のいずれかをサポートしていない場合があります。特定の種類の再生を開始する前に、GetCapabilities メソッドを呼び出す必要があります。サポートされていない再生を試みた場合、このメソッドは WMDM_E_NOTSUPPORTED を返します。

再生操作を実行する前に、あるオーディオ形式をメディア デバイスが再生できるかどうかを判断するには、GetFormatSupport メソッドを呼び出します。

vtbl 6 HRESULT Record(WAVEFORMATEX* pFormat)

Record メソッドは、デバイスの外部録音入力からの録音を、現在のシーク位置から開始します。事前に IWMDMDeviceControl::Seek メソッドを呼び出しておく必要があります。

pFormatWAVEFORMATEX*inデータを録音する形式を指定する _WAVEFORMATEX 構造体へのポインター。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
E_BUSY
デバイスは既に別の操作を実行中です。
WMDM_E_NOTSUPPORTED
このデバイスでは録音機能が実装されていません。
E_FAIL
不特定のエラーが発生しました。

解説(Remarks)

このメソッドは、デバイス録音 (メディア デバイスに保存するオーディオ トラックの録音) と、メディア デバイスからオーディオ データをストリーミングしてコンピューター上に録音する処理の両方を実行するために使用します。どちらの形式の録音が行われるかは、Seek メソッドによって決まります。

デバイスによっては、いずれの種類の録音もサポートしていない場合があります。録音を開始する前に GetCapabilities メソッドを呼び出す必要があります。サポートされていない種類の録音を試みた場合、このメソッドは WMDM_E_NOTSUPPORTED を返します。

pFormat パラメーターに引数を指定することで、録音に使用するオーディオ形式を指定できます。デバイスがサポートする形式を調べるには、GetFormatSupport を参照してください。pFormat パラメーターに NULL を設定した場合、デバイスは既定の形式でオーディオ データを録音します。

デバイス録音を使用する場合は、録音操作の完了後に記憶媒体の内容を列挙して、新しいオブジェクトを見つける必要があります。

vtbl 7 HRESULT Pause()

Pause メソッドは、現在の再生または録音セッションを、コンテンツ内の現在位置で一時停止します。(IWMDMDeviceControl.Pause)

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
S_FALSE
デバイスは既に一時停止しています。
WMDM_E_NOTSUPPORTED
このデバイスでは一時停止機能が実装されていません。
E_FAIL
不特定のエラーが発生しました。

解説(Remarks)

現在の再生または録音セッションが一時停止され、現在のファイル位置が保存されます。その後 Resume メソッドを呼び出すと、保存されたファイル位置から再生または録音の操作が再開されます。

vtbl 8 HRESULT Resume()

Resume メソッドは、Pause の呼び出し時に保存されたファイル位置から、現在の再生または録音操作を再開します。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
S_FALSE
デバイスは一時停止していません。
WMDM_E_NOTSUPPORTED
このデバイスでは再開機能が実装されていません。
E_FAIL
不特定のエラーが発生しました。
vtbl 9 HRESULT Stop()

Stop メソッドは、現在の録音または再生の操作を停止します。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
E_BUSY
デバイスがビジー状態です。
WMDM_E_NOTSUPPORTED
このデバイスでは停止機能が実装されていません。
E_FAIL
不特定のエラーが発生しました。
vtbl 10 HRESULT Seek(DWORD fuMode, INT nOffset)

Seek メソッドは、Play メソッドまたは Record メソッドが開始位置として使用する位置へシークします。(IWMDMDeviceControl.Seek)

fuModeDWORDin

実行するシーク操作のモード。fuMode パラメーターには、次のいずれかのモードを指定する必要があります。

モード 説明
WMDM_SEEK_BEGIN ファイルの先頭から nOffset 単位後の位置へシークします。
WMDM_SEEK_CURRENT 現在位置から nOffset 単位離れた位置へシークします。
WMDM_SEEK_END ファイルの終端から nOffset 単位前の位置へシークします。
WMDM_SEEK_REMOTECONTROL リムーバブル コントロールをシークします。
WMDM_SEEK_STREAMINGAUDIO ストリーミング オーディオをシークします。
nOffsetINTin

fuMode で指定した基準位置から開始位置をどれだけ移動させるかを示す単位数。nOffset の単位はコンテンツによって定義され、音楽であればミリ秒、電子書籍であればページなどになります。

nOffset が正の値の場合はファイル内を前方へシークし、負の値の場合は後方へシークします。nOffsetfuMode の組み合わせが、ファイルの先頭より前またはファイルの終端より後の位置へのシークを示す場合は無効であり、このメソッドは E_INVALIDARG を返します。

戻り値

このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
WMDM_E_NOTSUPPORTED
このデバイスでは Seek が実装されていません。
E_FAIL
不特定のエラーが発生しました。

解説(Remarks)

シーク位置は、デバイスの記憶媒体上の場所を指す IWMDMStorage インターフェイス、またはストリーミング オーディオをサポートするように実装された IWMDMOperation インターフェイスを渡すことで指定します。また、指定したインターフェイスが指すオブジェクト内の特定の位置を示すために、IWMDMObjectInfo インターフェイスを渡すこともできます。

デバイス再生では、Play の前に Seek を呼び出さなかった場合、メディア デバイスの最初の記憶媒体にある最初のオーディオ トラックから再生が始まります。

デバイス録音では、Record の前に Seek を呼び出さなかった場合、録音操作は失敗します。録音の長さを制限するには、Seek の呼び出しから戻った後に IWMDMObjectInfo::SetPlayLength メソッドを呼び出します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IWMDMDeviceControl "{1DCB3A04-33ED-11D3-8470-00C04F79DBC0}"
#usecom global IWMDMDeviceControl IID_IWMDMDeviceControl "{}"
#comfunc global IWMDMDeviceControl_GetStatus        3 var
#comfunc global IWMDMDeviceControl_GetCapabilities  4 var
#comfunc global IWMDMDeviceControl_Play             5
#comfunc global IWMDMDeviceControl_Record           6 var
#comfunc global IWMDMDeviceControl_Pause            7
#comfunc global IWMDMDeviceControl_Resume           8
#comfunc global IWMDMDeviceControl_Stop             9
#comfunc global IWMDMDeviceControl_Seek             10 int,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。