IWMDMDeviceControl
COM公式ドキュメント
IWMDMDeviceControl インターフェイスは、デバイス上の再生を制御するためのメソッドを提供します。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetStatus メソッドは、デバイスの制御状態を取得します。
| pdwStatus | DWORD* | out | デバイスの制御状態を示す DWORD へのポインター。制御状態の値には、次のフラグのうち 1 つ以上が指定されます。
|
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pdwStatus パラメーターが無効なポインターまたは NULL ポインターです。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
この呼び出しは、このインターフェイスのデバイス制御操作に固有の状態値を返します。制御状態からは、再生や録音など、デバイスの制御に関連する動作の状態についての情報が得られます。ただし、デバイスがデータをダウンロード中であるか、他の理由でアクセスされているかといった、デバイス全体の状態については分かりません。デバイス制御以外の理由でデバイスがビジー状態の場合はビジーを示すコードが返されるため、より詳細な情報を得るには IWMDMDeviceControl::GetStatus メソッドを呼び出す必要があります。
状態値として WMDM_STATUS_BUSY が返され、かつ状態値表の他の値がいずれも含まれていない場合は、このインターフェイスの Play、Record、Pause、Resume、Stop の各メソッドを呼び出そうとしてはいけません。
GetCapabilities メソッドは、デバイスがどの操作を実行できるかを判断するために、デバイスの機能を取得します。機能は、メディア デバイスがサポートするデバイス制御のメソッドを示します。
| pdwCapabilitiesMask | DWORD* | out | デバイスの機能を示す DWORD へのポインター。この変数には次のフラグが返される可能性があります。
|
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pdwCapabilitiesMask パラメーターが無効なポインターまたは NULL ポインターです。 | |
| 不特定のエラーが発生しました。 |
解説(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.
}
}
Play メソッドは、現在のシーク位置から再生を開始します。IWMDMDeviceControl::Seek メソッドが呼び出されていない場合は、最初のファイルの先頭から再生が始まり、再生長は未定義になります。
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
デバイスがビジー状態です。 |
| このデバイスでは再生機能が実装されていません。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
このメソッドは、デバイス再生 (メディア デバイスの記憶媒体上にあるオーディオ トラックの再生) と、ストリーミング オーディオ再生 (ユーザーのコンピューターからメディア デバイスへオーディオ データをストリーミングし、デバイス側で再生する) の両方を実行するために使用します。どちらの形式の再生が行われるかは、Seek メソッドによって決まります。
デバイスによっては、デバイス再生とストリーミング オーディオ再生のいずれかをサポートしていない場合があります。特定の種類の再生を開始する前に、GetCapabilities メソッドを呼び出す必要があります。サポートされていない再生を試みた場合、このメソッドは WMDM_E_NOTSUPPORTED を返します。
再生操作を実行する前に、あるオーディオ形式をメディア デバイスが再生できるかどうかを判断するには、GetFormatSupport メソッドを呼び出します。
Record メソッドは、デバイスの外部録音入力からの録音を、現在のシーク位置から開始します。事前に IWMDMDeviceControl::Seek メソッドを呼び出しておく必要があります。
| pFormat | WAVEFORMATEX* | in | データを録音する形式を指定する _WAVEFORMATEX 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
デバイスは既に別の操作を実行中です。 |
| このデバイスでは録音機能が実装されていません。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
このメソッドは、デバイス録音 (メディア デバイスに保存するオーディオ トラックの録音) と、メディア デバイスからオーディオ データをストリーミングしてコンピューター上に録音する処理の両方を実行するために使用します。どちらの形式の録音が行われるかは、Seek メソッドによって決まります。
デバイスによっては、いずれの種類の録音もサポートしていない場合があります。録音を開始する前に GetCapabilities メソッドを呼び出す必要があります。サポートされていない種類の録音を試みた場合、このメソッドは WMDM_E_NOTSUPPORTED を返します。
pFormat パラメーターに引数を指定することで、録音に使用するオーディオ形式を指定できます。デバイスがサポートする形式を調べるには、GetFormatSupport を参照してください。pFormat パラメーターに NULL を設定した場合、デバイスは既定の形式でオーディオ データを録音します。
デバイス録音を使用する場合は、録音操作の完了後に記憶媒体の内容を列挙して、新しいオブジェクトを見つける必要があります。
Pause メソッドは、現在の再生または録音セッションを、コンテンツ内の現在位置で一時停止します。(IWMDMDeviceControl.Pause)
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| デバイスは既に一時停止しています。 | |
| このデバイスでは一時停止機能が実装されていません。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
現在の再生または録音セッションが一時停止され、現在のファイル位置が保存されます。その後 Resume メソッドを呼び出すと、保存されたファイル位置から再生または録音の操作が再開されます。
Resume メソッドは、Pause の呼び出し時に保存されたファイル位置から、現在の再生または録音操作を再開します。
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| デバイスは一時停止していません。 | |
| このデバイスでは再開機能が実装されていません。 | |
| 不特定のエラーが発生しました。 |
Stop メソッドは、現在の録音または再生の操作を停止します。
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
デバイスがビジー状態です。 |
| このデバイスでは停止機能が実装されていません。 | |
| 不特定のエラーが発生しました。 |
Seek メソッドは、Play メソッドまたは Record メソッドが開始位置として使用する位置へシークします。(IWMDMDeviceControl.Seek)
| fuMode | DWORD | in | 実行するシーク操作のモード。fuMode パラメーターには、次のいずれかのモードを指定する必要があります。
| ||||||||||||
| nOffset | INT | in | fuMode で指定した基準位置から開始位置をどれだけ移動させるかを示す単位数。nOffset の単位はコンテンツによって定義され、音楽であればミリ秒、電子書籍であればページなどになります。 nOffset が正の値の場合はファイル内を前方へシークし、負の値の場合は後方へシークします。nOffset と fuMode の組み合わせが、ファイルの先頭より前またはファイルの終端より後の位置へのシークを示す場合は無効であり、このメソッドは E_INVALIDARG を返します。 |
戻り値
このメソッドは HRESULT を返します。返される可能性のある値には、次の表に示すものが含まれます (ただしこれらに限定されません)。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 1 つ以上のパラメーターが無効です。 | |
| このデバイスでは Seek が実装されていません。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
シーク位置は、デバイスの記憶媒体上の場所を指す IWMDMStorage インターフェイス、またはストリーミング オーディオをサポートするように実装された IWMDMOperation インターフェイスを渡すことで指定します。また、指定したインターフェイスが指すオブジェクト内の特定の位置を示すために、IWMDMObjectInfo インターフェイスを渡すこともできます。
デバイス再生では、Play の前に Seek を呼び出さなかった場合、メディア デバイスの最初の記憶媒体にある最初のオーディオ トラックから再生が始まります。
デバイス録音では、Record の前に Seek を呼び出さなかった場合、録音操作は失敗します。録音の長さを制限するには、Seek の呼び出しから戻った後に IWMDMObjectInfo::SetPlayLength メソッドを呼び出します。
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 方式にも切替可。#define global IID_IWMDMDeviceControl "{1DCB3A04-33ED-11D3-8470-00C04F79DBC0}" #usecom global IWMDMDeviceControl IID_IWMDMDeviceControl "{}" #comfunc global IWMDMDeviceControl_GetStatus 3 sptr #comfunc global IWMDMDeviceControl_GetCapabilities 4 sptr #comfunc global IWMDMDeviceControl_Play 5 #comfunc global IWMDMDeviceControl_Record 6 sptr #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が無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。