IWMReaderAdvanced2
COM公式ドキュメント
IWMReaderAdvanced2 インターフェイスは、リーダーオブジェクトに追加の高度なメソッドを提供します。
メソッド 15
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetPlayMode メソッドは、再生モードを指定します。
| Mode | WMT_PLAY_MODE | in | WMT_PLAY_MODE 列挙型のメンバーを 1 つ格納する変数。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
既定の再生モードは WMT_PLAY_MODE_AUTOSELECT で、リーダーがモードを選択できるようにします。アプリケーションが、要求した URL と互換性のない再生モードを選択した場合、URL を開くときにエラーが返されます。Open 要求に対する非同期応答が完了すると、モードは WMT_PLAY_MODE_AUTOSELECT から適切に選択された再生モードに変更されます。コンテンツを開いた後は再生モードを変更できず、変更しようとするとエラーが返されます。
GetPlayMode メソッドは、現在の再生モードを取得します。
| pMode | WMT_PLAY_MODE* | out | WMT_PLAY_MODE 列挙型のメンバーを受け取る変数へのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
ファイルを開く前は、このメソッドはリーダーがファイルを開くときに使用する再生モードを返します。既定の設定は自動選択(リーダーがモードを選択)です。ファイルを開いた後は、このメソッドはファイルの再生に実際に使用されたモードを返します。非同期の Open 要求の場合、実際のモードは WMT_OPENED 状態メッセージを受信した後に取得できます。
詳細については、IWMReaderAdvanced2::SetPlayMode の解説セクションを参照してください。
GetBufferProgress メソッドは、バッファリングされたデータの割合と、完了までの残り時間を取得します。
| pdwPercent | DWORD* | out | バッファリングされたデータの割合を格納する DWORD へのポインター。 |
| pcnsBuffering | ULONGLONG* | out | すべてのバッファリングが完了するまでの残り時間を 100 ナノ秒単位で指定する変数へのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
意味のある結果を得るには、このメソッドは WMT_BUFFERING_START イベントと WMT_BUFFERING_STOP イベントの間に呼び出す必要があります。WMT_BUFFERING_START イベントより前に呼び出された場合、両方のパラメーターは 0 を返します。WMT_BUFFERING_STOP の後、次の WMT_BUFFERING_START イベントより前に呼び出された場合、このメソッドは割合として 100 を、バッファリング時間(秒)として 0 を返します。WMT_BUFFERING_START イベントは、割合と残り秒数を 0 にリセットします。
GetDownloadProgress メソッドは、ダウンロードされたデータの割合と量、および完了までの残り時間を取得します。
| pdwPercent | DWORD* | out | ダウンロードされたデータの割合を格納する DWORD へのポインター。 |
| pqwBytesDownloaded | ULONGLONG* | out | ダウンロードされたデータのバイト数を格納する QWORD へのポインター。 |
| pcnsDownload | ULONGLONG* | out | データのダウンロードに要する残り時間を 100 ナノ秒単位で指定する変数へのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、Web サーバーからコンテンツをダウンロードしている間の進行状況を監視するために呼び出すことができます。
コンテンツを Web サーバーからダウンロードできるのは、再生モードが WMT_PLAY_MODE_AUDTOSELECT の場合(この場合、リーダーは自動的に再生モードを DOWNLOAD に調整します)、または再生モードが明示的に WMT_PLAY_MODE_DOWNLOAD に設定されている場合です。
これら 2 つの再生モードのいずれも現在のモードでない状態でこのメソッドを呼び出すと、すべてのパラメーターは 0 を返します。
最初の WMT_BUFFERING_START イベントより前は、すべてのパラメーターは 0 を返します。WMT_BUFFERING_START と WMT_END_OF_STREAMING の間は、ダウンロード完了の割合とダウンロードされたバイト数の値は常に増加します。残りダウンロード秒数の値は、変化するダウンロード速度に応じて増減することがあります。WMT_END_OF_STREAMING が送信された後は、割合は 100 を返し、ダウンロードされたバイト数はダウンロードのサイズのままとなり、残り秒数は 0 になります。
GetSaveAsProgress メソッドは、保存されたデータの割合を取得します。
| pdwPercent | DWORD* | out | 保存されたデータの割合を格納する DWORD へのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、IWMReaderAdvanced2::SaveFileAs が呼び出された後にのみ呼び出す必要があります。
ファイルの保存には時間がかかることがあります。この呼び出しは、WMT_SAVEAS_START イベントと WMT_SAVEAS_STOP イベントの間で行う必要があります。WMT_SAVEAS_START より前に呼び出された場合、またはエラーが発生した場合、このメソッドは 0 を返します。WMT_SAVEAS_STOP イベントが成功した後は 100 を返します。
SaveFileAs メソッドは、現在のファイルを保存します。
| pwszFilename | LPWSTR | in | ファイル名を格納するワイド文字の null 終端文字列へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| 操作が完了する前にファイルが閉じられました。この場合、WMT_SAVEAS_STOP イベントも生成されます。 | |
|
このメソッドの呼び出しが Open の呼び出しより前に行われました。 |
| 以前の SaveFileAs 操作がまだ完了していません。ファイルの保存は順次行われます。 | |
| 再生モードが WMT_PLAY_MODE_DOWNLOAD ではありません。 | |
| ディスクの空き容量が不足しています。下の解説にある注を参照してください。 |
解説(Remarks)
このメソッドは、Web サーバーからダウンロードしたコンテンツをローカルのハードディスクに保存するために使用できます。ファイルは、リーダーが Web サーバーからダウンロードしているときに保存できます。
このメソッドを使用してサーバー側のプレイリストを保存できます。その場合、プレイリストに使用する名前を指定すると、プレイリスト内の各ファイルが自動的に保存されます。
この操作は非同期です。WMT_SAVEAS_STOP は、すべてのデータが保存されたことを示します。リーダーを閉じると、完了していない保存操作は終了します。
このメソッドは完了までに時間がかかることがあり、GetSaveAsProgress を呼び出して進行状況を確認できます。
GetProtocolName メソッドは、使用されているプロトコルの名前を取得します。
| pwszProtocol | LPWSTR | out | プロトコル名を格納する文字列を受け取るバッファーへのポインター。名前の長さを取得するには NULL を渡します。 |
| pcchProtocol | DWORD* | inout | 入力時は、pwszProtocol の長さ(文字数)を格納する変数へのポインター。出力時は、終端の null 文字を含む名前の長さがこの変数に格納されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
|
バッファーが小さすぎます。 |
|
プロトコルが確定していないか、ファイルが開かれていません。 |
| pcchProtocol パラメーターが NULL です。 |
解説(Remarks)
GetProtocolName は 2 回呼び出す必要があります。1 回目の呼び出しでは、pwszProtocol に NULL を渡します。戻ると、pcchProtocol が指す値に、プロトコル名を格納するために必要なワイド文字数(終端の null を含む)が設定されます。その後、文字列に必要な量のメモリを割り当て、2 回目の呼び出しでそのポインターを pwszProtocol として渡すことができます。
プロトコル名は、mmsu、http、file などの URL スキームです。ただし、リーダーオブジェクトは最適なプロトコルを見つけるためにプロトコルロールオーバーを使用する場合があるため、プロトコル名は IWMReader::Open で指定した URL スキームと異なることがあります。また、返される文字列は、ローカルファイルのコンテンツの場合は "File"、キャッシュに保存されたコンテンツの場合は "Cache" となることがあります。
プロトコル名を確定できない場合、このメソッドは空の文字列を返すことがあります。
StartAtMarker メソッドは、指定したマーカーからリーダーを開始します。
| wMarkerIndex | WORD | in | マーカーインデックスを格納する WORD。 |
| cnsDuration | ULONGLONG | in | 継続時間を 100 ナノ秒単位で指定します。 |
| fRate | FLOAT | in | レートを示す浮動小数点数。通常速度の再生は 1.0 で、大きい数値ほど再生が速くなります。0 未満の数値は逆方向のレート(巻き戻し)を示します。有効な範囲は 1.0~10.0 および -1.0~-10.0 です。 |
| pvContext | void* | in | アプリケーションで使用する汎用ポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| 使用可能なメモリが不足しています。 | |
| fRate の値が有効な範囲内にありません。 | |
| 原因不明の理由でメソッドが失敗しました。 |
解説(Remarks)
このメソッドは IWMReader::Start と非常によく似ています。違いは、このメソッドがマーカーインデックスを使用するのに対し、IWMReader::Start は開始時刻を使用する点です。
GetOutputSetting メソッドは、特定の出力の設定を名前で取得します。
| dwOutputNum | DWORD | in | 出力番号を格納する DWORD。 |
| pszName | LPWSTR | in | 設定名を格納するワイド文字の null 終端文字列へのポインター。設定名を表すグローバル定数の一覧については、Output Settings を参照してください。 |
| pType | WMT_ATTR_DATATYPE* | out | 値の型を指定する WMT_ATTR_DATATYPE 列挙型のメンバーへのポインター。 |
| pValue | BYTE* | out | 値を格納するバイトバッファーへのポインター。必要なバッファーの長さを取得するには NULL を渡します。 |
| pcbLength | WORD* | inout | 入力時は、pValue の長さを格納する変数へのポインター。出力時は、pValue のバイト数がこの変数に格納されます。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
GetOutputSetting は 2 回呼び出す必要があります。1 回目の呼び出しでは、pValue に NULL を渡します。戻ると、pcbLength が指す値に、設定値を格納するために必要なバッファーサイズが設定されます。その後、バッファーに必要な量のメモリを割り当て、2 回目の呼び出しでそのポインターを pValue として渡すことができます。
SetOutputSetting メソッドは、特定の出力に対して名前付きの設定を指定します。
| dwOutputNum | DWORD | in | 出力番号を格納する DWORD。 |
| pszName | LPWSTR | in | 名前を格納するワイド文字の null 終端文字列へのポインター。設定名を表すグローバル定数の一覧については、Output Settings を参照してください。 |
| Type | WMT_ATTR_DATATYPE | in | 値の型を指定する WMT_ATTR_DATATYPE 列挙型のメンバー。 |
| pValue | BYTE* | in | 値を格納するバイト配列へのポインター。 |
| cbLength | WORD | in | pValue のサイズ。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
Preroll メソッドは、リーダーのプリロール(データのバッファリング)を開始するために使用します。
| cnsStart | ULONGLONG | in | 開始時刻を 100 ナノ秒単位で指定します。 |
| cnsDuration | ULONGLONG | in | 継続時間を 100 ナノ秒単位で指定します。 |
| fRate | FLOAT | in | データレートを指定します。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、アプリケーションが Start を呼び出す前に呼び出して、あらかじめデータのバッファリングを開始できます。ここでのパラメーターは、Start を呼び出すときに渡す値と同じ値に設定する必要があります。パラメーターが異なる場合、Start は再バッファリングを行います。
Start を呼び出す前に、リーダーのプリロール(データのバッファリング)が完了するのに十分な時間を確保することが重要です。ローカルファイルをプリロールする場合、通常は 6 秒で十分です。インターネット経由でファイルをプリロールする場合は、Start を呼び出す前にさらに時間を確保してください。十分な時間を確保しないと、Start を呼び出したときに Start にかかる時間が長くなります。
SetLogClientID メソッドは、リーダーがクライアントの一意の ID を記録するか、匿名のセッション ID を記録するかを指定します。
| fLogClientID | BOOL | in | 次のいずれかの値を指定します。
|
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
リーダーオブジェクトがネットワーク経由でコンテンツをストリーミングするとき、配信元のサーバーにログデータを送信します。このログ情報には、セッションを識別する GUID が含まれます。既定では、リーダーは匿名のセッション ID を生成します。fLogClientID の値が TRUE の場合、リーダーは現在のユーザーを一意に識別する ID を送信します。この一意の ID は、レジストリの HKEY_CURRENT_USER の下に格納されます。キーが存在しない場合、リーダーは動的に作成します。
匿名のセッション ID は常に次の形式になります。
3300AD50-2C39-46c0-AE0A-XXXXXXXXXXXX
末尾の 6 バイトはランダムに生成されます。
GetLogClientID メソッドは、リーダーがクライアントの一意の ID を記録するか、匿名のセッション ID を記録するかを照会します。
| pfLogClientID | BOOL* | out | クライアントのログ ID をサーバーに送信する必要がある場合に True に設定されるブール値へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| NULL または無効な引数が渡されました。 |
解説(Remarks)
SetLogClientID の解説を参照してください。
StopBuffering メソッドは、リーダーが WMT_BUFFERING_STOP メッセージをできるだけ早く送信するように要求します。
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
リーダーは、現在データをバッファリングしている場合にのみ、バッファリング停止の要求に応答します。これは、WMT_BUFFERING_START メッセージを送信済みで、対応する WMT_BUFFERING_STOP をまだ送信していない状態を意味します。ただし、リーダーがどれだけ早く要求に応答するかは保証されません。この機能は、再生モードが WMT_PLAY_MODE_DOWNLOAD に設定されている場合に特に便利です。
OpenStream メソッドは、読み取りのために Windows Media ストリームを開きます。
| pStream | IStream* | in | IStream インターフェイスへのポインター(下の解説セクションを参照)。 |
| pCallback | IWMReaderCallback* | in | IWMReaderCallback インターフェイスへのポインター。 |
| pvContext | void* | in | アプリケーションで使用する汎用ポインター。これは IWMReaderCallback::OnStatus の呼び出し時にアプリケーションに渡されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| pCallback パラメーターが NULL です。 | |
| 使用可能なメモリが不足しています。 | |
| 原因不明の理由でメソッドが失敗しました。 |
解説(Remarks)
このメソッドは、URL の代わりに IStream インターフェイスポインターを受け取る点を除いて、IWMReader::Open と同一です。IStream は、データを提供するための標準的な COM インターフェイスです。これにより、アプリケーションは単にファイルやネットワークからデータを取得するのではなく、独自のデータを提供できます。たとえば、サポートされているメディアファイル(Windows Media Audio、Windows Media Video、MP3 など)の内容を表す IStream インターフェイスポインターがあり、パフォーマンス上の理由で一時ファイルを書き込みたくない場合、これは SDK を使用してコンテンツを解析および展開できる 1 つの方法です。
このメソッドは、アプリケーションの IWMReaderCallback::OnStatus 関数に WMT_OPENED 状態通知を送信します。(OnStatus は IWMReaderCallback が IWMStatusCallback から継承しています。)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMReaderAdvanced2 "{AE14A945-B90C-4D0D-9127-80D665F7D73E}" #usecom global IWMReaderAdvanced2 IID_IWMReaderAdvanced2 "{}" #comfunc global IWMReaderAdvanced2_SetPlayMode 23 int #comfunc global IWMReaderAdvanced2_GetPlayMode 24 var #comfunc global IWMReaderAdvanced2_GetBufferProgress 25 var,var #comfunc global IWMReaderAdvanced2_GetDownloadProgress 26 var,var,var #comfunc global IWMReaderAdvanced2_GetSaveAsProgress 27 var #comfunc global IWMReaderAdvanced2_SaveFileAs 28 wstr #comfunc global IWMReaderAdvanced2_GetProtocolName 29 var,var #comfunc global IWMReaderAdvanced2_StartAtMarker 30 int,int64,float,sptr #comfunc global IWMReaderAdvanced2_GetOutputSetting 31 int,wstr,var,var,var #comfunc global IWMReaderAdvanced2_SetOutputSetting 32 int,wstr,int,var,int #comfunc global IWMReaderAdvanced2_Preroll 33 int64,int64,float #comfunc global IWMReaderAdvanced2_SetLogClientID 34 int #comfunc global IWMReaderAdvanced2_GetLogClientID 35 var #comfunc global IWMReaderAdvanced2_StopBuffering 36 #comfunc global IWMReaderAdvanced2_OpenStream 37 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWMReaderAdvanced2 "{AE14A945-B90C-4D0D-9127-80D665F7D73E}" #usecom global IWMReaderAdvanced2 IID_IWMReaderAdvanced2 "{}" #comfunc global IWMReaderAdvanced2_SetPlayMode 23 int #comfunc global IWMReaderAdvanced2_GetPlayMode 24 sptr #comfunc global IWMReaderAdvanced2_GetBufferProgress 25 sptr,sptr #comfunc global IWMReaderAdvanced2_GetDownloadProgress 26 sptr,sptr,sptr #comfunc global IWMReaderAdvanced2_GetSaveAsProgress 27 sptr #comfunc global IWMReaderAdvanced2_SaveFileAs 28 wstr #comfunc global IWMReaderAdvanced2_GetProtocolName 29 sptr,sptr #comfunc global IWMReaderAdvanced2_StartAtMarker 30 int,int64,float,sptr #comfunc global IWMReaderAdvanced2_GetOutputSetting 31 int,wstr,sptr,sptr,sptr #comfunc global IWMReaderAdvanced2_SetOutputSetting 32 int,wstr,int,sptr,int #comfunc global IWMReaderAdvanced2_Preroll 33 int64,int64,float #comfunc global IWMReaderAdvanced2_SetLogClientID 34 int #comfunc global IWMReaderAdvanced2_GetLogClientID 35 sptr #comfunc global IWMReaderAdvanced2_StopBuffering 36 #comfunc global IWMReaderAdvanced2_OpenStream 37 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。