共用方式為


手電筒支援

從 Windows Threshold 開始,我們將公開新的 WinRT Lamp API,它允許對 相機閃光燈 進行編程,而無需創建 Windows.Media.Capture.MediaCapture 實例。 透過這樣做,開發人員可以透過消耗最少的資源(包括電源)來編寫 手電筒 應用程式(僅用於照明目的),從而優化計算設備的電池壽命和性能。

若要達成此目的,IHV/OEM 應該實作支援下列函式的 WDM 驅動程式:

  • 允許系統列舉所有快閃記憶體裝置。

  • 根據每個設備打開/關閉手電筒。

  • 如果適用,請根據每個裝置調整光強度 (類似於 PowerPercent)。

  • 如果適用,請根據每個裝置指定燈光顏色。

在功能方面,上面的清單與 MediaCapture 的清單有很大重疊(例如, FlashControlTorchControl)。 此外,相同的閃存硬體用於拍攝時閃光。 因此,建議 IHV/OEM 使用單一 WDM 驅動程式來支援兩種作業類型,以針對快閃記憶體進行專屬控制。 下圖說明了這個概念:

獨家閃光控制概念圖。

在上述範例中,只有一個快閃記憶體硬體實例 (顯示為) ,而且是由單一 KMDF 快閃記憶體驅動程式所管理。 快閃記憶體驅動程式會公開兩個裝置介面,每個介面都以特定類型的用戶端 (或 WinRT API) 為目標。 例如,給定上圖:

  • WinRT 媒體擷取 API 和 AVStream 迷你驅動程式一律會透過 GUID_DEVINTERFACE_CAMERA_FLASH 介面與快閃記憶體驅動程式通訊,而

  • WinRT Lamp API 一律會透過 GUID_DEVINTERFACE_LAMP 介面與快閃記憶體驅動程式通訊。

由於GUID_DEVINTERFACE_CAMERA_FLASH介面是由廠商特定的 AVStream 迷你驅動程式使用,因此 IHV/OEM 可以隨意定義其功能,Windows 不會施加任何限制。

不過,Microsoft會標準化介面 (GUID_DEVINTERFACE_LAMP),因為它應該由 WinRT Lamp API 使用。 如需GUID_DEVINTERFACE_LAMP的詳細資訊,請參閱 裝置介面類別 GUID

並行使用案例

在相機和手電筒應用程式之間共用閃光燈

相機閃光燈通常被視為捕獲設備的 從屬 外圍設備。 它並不適合在擷取運行時與非相機場景共用。 更複雜的是,機箱上的閃光燈設備數量極其有限,因此在實踐中,不會有專門用於手電筒用途的備用閃光燈。

從軟體的角度來看,上述提出了一個挑戰,即相機應用程式和手電筒應用程式可以共存並同時存取閃光燈。 例如,理論上,使用者可以在相機取景器運作時透過手電筒應用程式切換 LED 狀態。

由於相機需要精確控制閃光燈以支援對焦和捕捉,因此駕駛員可能難以在確保影像品質的同時解決利益衝突的閃光燈請求。 為了解決此問題,下列原則會在系統層級以合約的形式強制執行:

  • 如果擷取工作階段先啟動,則手電筒應用程式無法操作閃光燈,直到擷取停止為止。

    • 手電筒應用程式仍然可以取得快閃記憶體驅動程式的控制碼,但任何修改快閃記憶體狀態的作業都會立即產生錯誤。

    • 當擷取停止,讓 AVStream 迷你驅動程式釋放閃光時,閃光燈驅動程式必須發佈 PnP 通知(請參閱非同步通知中的 GUID_LAMP_RESOURCES_AVAILABLE),指出基礎硬體現在已可供使用。 收到此類通知後,手電筒應用程式可以相應地對閃光燈進行編程。

  • 如果手電筒應用程式先啟動,則擷取會話可以不經同意直接控制閃光燈硬體。

    • 透過「劫持」,我們表示 IHV/OEM 可以實作任意通訊協定 (可能透過 GUID_DEVINTERFACE_CAMERA_FLASH 介面) ,讓 AVStream 迷你驅動程式取得快閃記憶體,就像完全未使用硬體一樣。

    • 發生劫持時,快閃記憶體驅動程式必須張貼另一個 PnP 通知 (請參閱 非同步通知中的GUID_LAMP_RESOURCES_LOST) ,指出快閃記憶體已非自願地重新指派,讓手電筒應用程式可以據以執行動作 (例如,透過更新 UI)

多個手電筒應用程式共用閃光功能

如果不涉及相機,且兩個手電筒應用程式連續執行,驅動程式應該繼續為已取得GUID_DEVINTERFACE_LAMP介面的第一個用戶端提供服務,並拒絕所有其他用戶端,直到第一個用戶端最終釋放介面為止。

換句話說,GUID_DEVINTERFACE_LAMP介面一次只允許一個手電筒用戶端,而取得該介面的第一個用戶端會阻止其他用戶端執行(相機/AVStream 除外)。

裝置介面類別 GUID

能夠支援獨立於 MediaCapture 的手電筒的 IHV/OEM 快閃記憶體驅動程式必須向 裝置介面類別 GUID GUID_DEVINTERFACE_LAMP註冊本身。

屬性 設定
識別碼 GUID_DEVINTERFACE_LAMP
類別 GUID {6C11E9E3-8232-4F0A-AD19-AAEC26CA5E98}

GUID_DEVINTERFACE_CAMERA_FLASH 的裝置介面類別 GUID 可以由 IHV/OEM 自定義定義。 不過,GUID_DEVINTERFACE_LAMP 的裝置介面類別 GUID 是由 Windows 所定義。

根據合約,需要公開裝置介面的驅動程式 GUID_DEVINTERFACE_LAMP,才能支援下列函式 (如需詳細資訊,請參閱稍後的章節):

  • IOCTL_LAMP_GET_CAPABILITIES_{白色|彩色} – 取得基礎硬體支援的所有模式(例如,僅白色與彩色)

  • IOCTL_LAMP_{GET|SET}_MODE – 取得或設定目前模式

  • IOCTL_LAMP_{GET|SET}_強度_{白色|彩色} – 取得或設定光線強度

  • IOCTL_LAMP_{GET|SET}_EMITTING_LIGHT – 取得或設定閃光狀態 (例如,ON/OFF)

如果裝置有多個不同類型的快閃記憶體硬體 (例如, 白色 LED氙氣快閃記憶體) ,且這些硬體是由不同的快閃記憶體驅動程式控制,則每個驅動程式都應公開具有唯一實例識別碼的相同 GUID_DEVINTERFACE_LAMP 介面。

裝置介面屬性

由於計算裝置可以在不同的面板上有零個或多個快閃記憶體裝置,因此 WinRT Lamp API 需要一種機制來列舉所有快閃記憶體硬體,以便應用程式可以對特定實例進行程式設計。

若要支援裝置列舉,類似於相機驅動程式,快閃記憶體驅動程式必須將 ACPI _PLD v2 結構與每個 GUID_DEVINTERFACE_LAMP 介面產生關聯,做為介面屬性資料。

IOCTL_LAMP_GET_CAPABILITIES_WHITE

當裝置設定為發出白光時,IOCTL_LAMP_GET_CAPABILITIES_WHITE I/O 要求會查詢快閃記憶體的功能。

定義

#define IOCTL_LAMP_BASE FILE_DEVICE_UNKNOWN
#define IOCTL_LAMP_GET_CAPABILITIES_WHITE \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp-AssociatedIrp.SystemBuffer> 指向類型為 LAMP_CAPABILITIES_WHITE 的緩衝區。 如需詳細資訊,請參閱<

IO_STACK_LOCATION.Parameters.DeviceIoControl.OutputBufferLength 是在 Irp-AssociatedIrp.SystemBuffer> 欄位中傳遞的緩衝區長度 (以位元組為單位)。

輸出參數

Irp-AssociatedIrp.SystemBuffer> 會填入快閃記憶體硬體支援的所有功能。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。 它會將 Irp-IoStatus.Information> 設定為保留緩衝區所需的位元組數。

備註

根據需求,驅動程式支援GUID_DEVINTERFACE_LAMP介面的閃光燈必須支援發射白光。 此 IOCTL 的承載定義如下:

// The output parameter type of IOCTL_LAMP_GET_CAPABILITIES_WHITE.
typedef struct LAMP_CAPABILITIES_WHITE
{
    BOOLEAN IsLightIntensityAdjustable;
} LAMP_CAPABILITIES_WHITE;

IsLightIntensityAdjustable 欄位指出是否可以編程亮度等級。 如果此欄位的評估結果為false,則表示底層裝置僅支援開/關開關,無法調整光強度。

IOCTL_LAMP_GET_CAPABILITIES_COLOR (燈具取得色彩能力)

IOCTL_LAMP_GET_CAPABILITIES_COLOR I/O 要求在裝置設定為發出色彩光時,會查詢閃光燈的功能特性。

定義

#define IOCTL_LAMP_GET_CAPABILITIES_COLOR \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0001, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp->AssociatedIrp.SystemBuffer 指向一個緩衝區,其類型為 LAMP_CAPABILITIES_COLOR。 如需詳細資訊,請參閱<

IO_STACK_LOCATION: Parameters.DeviceIoControl.OutputBufferLength 是在 Irp->AssociatedIrp.SystemBuffer 欄位中傳遞的緩衝區長度(以位元組為單位)。

輸出參數

Irp->AssociatedIrp.SystemBuffer 會被填入快閃記憶體硬體所支援的所有功能。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。 它會將 Irp-IoStatus.Information> 設定為保留緩衝區所需的位元組數。

備註

此 IOCTL 的承載定義如下:

// The output parameter type of IOCTL_LAMP_GET_CAPABILITIES_COLOR.
typedef struct LAMP_CAPABILITIES_COLOR
{
    BOOLEAN IsSupported;
    BOOLEAN IsLightIntensityAdjustable;
} LAMP_CAPABILITIES_COLOR;

第一個欄位 IsSupported 指出閃光燈是否可以發出彩色光。 如果硬體不支援色彩光源,驅動程式應該將此欄位設定為 false。

第二個欄位 IsLightIntensityAdjustable 指出是否可以程式設計亮度層級。 例如,如果閃光燈不支援色彩光源(例如判斷為 false),客戶端應該忽略 IsLightIntensityAdjustable 的值。

IOCTL_LAMP_GET_MODE (燈模式擷取指令)

IOCTL_LAMP_GET_MODE I/O 要求會查詢目前設定的閃光燈模式。

定義

#define IOCTL_LAMP_GET_MODE \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0002, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp-AssociatedIrp.SystemBuffer> 指向類型為 LAMP_MODE 的緩衝區,其定義如下:

typedef enum LAMP_MODE
{
    LAMP_MODE_WHITE = 0,
    LAMP_MODE_COLOR
} LAMP_MODE;

IO_STACK_LOCATION.Parameters.DeviceIoControl.OutputBufferLength 是在 Irp-AssociatedIrp.SystemBuffer欄位中傳遞的緩衝區的長度(以位元組為單位)。

輸出參數

Irp->AssociatedIrp.SystemBuffer 會填入 LAMP_MODE 值。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。 它會將 Irp-IoStatus.Information> 設定為保留 DWORD 值所需的位元組數。

如果 MediaCapture 會話在提出此要求時正在串流資料,驅動程式應該透過 Irp->IoStatus.Status 傳回錯誤(STATUS_RESOURCE_IN_USE)。

IOCTL_LAMP_SET_MODE

IOCTL_LAMP_SET_MODE I/O 要求會設定快閃記憶體運作的模式。

定義

#define IOCTL_LAMP_SET_MODE \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0003, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp-AssociatedIrp.SystemBuffer> 指向類型為 LAMP_MODE 的緩衝區。

輸出參數

沒有。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。

如果 MediaCapture 會話在提出此要求時正在串流數據,驅動程式應該透過 Irp>IoStatus.Status 傳回錯誤(STATUS_RESOURCE_IN_USE)。

IOCTL_LAMP_GET_INTENSITY_WHITE

當閃光燈配置為發出白光時,IOCTL_LAMP_GET_INTENSITY_WHITE I/O 要求會查詢光強度。

定義

#define IOCTL_LAMP_GET_INTENSITY_WHITE \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0004, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp->AssociatedIrp.SystemBuffer 指向 LAMP_INTENSITY_WHITE 結構。 如需詳細資訊,請參閱<

IO_STACK_LOCATION.Parameters.DeviceIoControl.OutputBufferLength 是在 Irp->AssociatedIrp.SystemBuffer 欄位中傳遞的緩衝區長度(以位元組為單位)。

輸出參數

Irp-AssociatedIrp.SystemBuffer> 會填入光強度資訊。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。

如果在提出此要求時,MediaCapture 會話正在串流數據,驅動程式應該透過 Irp->IoStatus.Status 傳回錯誤(STATUS_RESOURCE_IN_USE)。

備註

此 IOCTL 的承載類型定義如下:

// The I/O parameter type of IOCTL_LAMP_{GET|SET}_INTENSITY_WHITE.
typedef struct LAMP_INTENSITY_WHITE
{
    BYTE Value;
} LAMP_INTENSITY_WHITE;

值欄位是白光強度,百分比介於 0 到 100 之間(含)。

IOCTL_LAMP_SET_INTENSITY_WHITE(設置燈具亮度為白光的控制代碼)

IOCTL_LAMP_SET_INTENSITY_WHITE I/O 要求會將閃光燈設定為指定的光強度。

定義

#define IOCTL_LAMP_SET_INTENSITY_WHITE \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp->AssociatedIrp.SystemBuffer 指向 LAMP_INTENSITY_WHITE 結構(如需詳細資訊,請參閱 IOCTL_LAMP_GET_INTENSITY_WHITE)。

輸出參數

沒有。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。

如果 MediaCapture 會話在提出此要求時正在串流數據,驅動程式應透過 Irp->IoStatus.Status 傳回錯誤(STATUS_RESOURCE_IN_USE)。

IOCTL_LAMP_GET_INTENSITY_COLOR

IOCTL_LAMP_GET_INTENSITY_COLOR I/O 要求在閃光燈設定為發出彩色光時,查詢光強度。

定義

#define IOCTL_LAMP_GET_INTENSITY_COLOR \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0006, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp->AssociatedIrp.SystemBuffer 指向LAMP_INTENSITY_COLOR結構。 如需詳細資訊,請參閱<

IO_STACK_LOCATION.Parameters.DeviceIoControl.OutputBufferLength 是在 Irp->AssociatedIrp.SystemBuffer 欄位中傳遞的緩衝區長度(以位元組為單位)。

輸出參數

Irp-AssociatedIrp.SystemBuffer> 會填入光強度資訊。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。

如果媒體捕獲會話在提出此要求時正在串流數據,驅動程式應應透過 Irp-IoStatus.Status> 傳回錯誤(STATUS_RESOURCE_IN_USE)。

備註

此 IOCTL 的承載類型定義如下:

// The I/O parameter type of IOCTL_LAMP_{GET|SET}_INTENSITY_COLOR.
typedef struct LAMP_INTENSITY_COLOR
{
    BYTE Red; // Red light intensity in percentage (0-100)
    BYTE Green; // Green light intensity in percentage (0-100)
    BYTE Blue; // Blue light intensity in percentage (0-100)
} LAMP_INTENSITY_COLOR;

IOCTL_LAMP_SET_INTENSITY_COLOR

IOCTL_LAMP_SET_INTENSITY_COLOR I/O 要求會將閃光燈設定為指定的光強度。

定義

#define IOCTL_LAMP_SET_INTENSITY_COLOR \
    CTL_CODE(IOCTL_LAMP_BASE, 0x0007, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp->AssociatedIrp.SystemBuffer 指向 LAMP_INTENSITY_COLOR 結構體(如需詳細資訊,請參閱 IOCTL_LAMP_GET_INTENSITY_COLOR)。

輸出參數

沒有。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。

若 MediaCapture 會話在提出此要求時正在進行資料串流,驅動程式應透過 Irp-IoStatus.Status> 傳回錯誤(STATUS_RESOURCE_IN_USE)。

IOCTL_LAMP_GET_EMITTING_LIGHT(取得燈的發光狀況)

IOCTL_LAMP_GET_EMITTING_LIGHT 輸入/輸出請求會查詢(閃光燈)是否已開啟。

定義

#define IOCTL_LAMP_GET_EMITTING_LIGHT
    CTL_CODE(IOCTL_LAMP_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp-AssociatedIrp.SystemBuffer> 指向 BOOLEAN 類型的緩衝區。

IO_STACK_LOCATION.Parameters.DeviceIoControl.OutputBufferLength 是 在 Irp->AssociatedIrp>.SystemBuffer 欄位中傳遞的緩衝區長度(以位元組為單位)。

輸出參數

Irp-AssociatedIrp.SystemBuffer> 會填入 TRUE 的快閃記憶體狀態,表示快閃記憶體已開啟 (例如,發光) ;否則為 FALSE。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。 它會將 Irp-IoStatus.Information> 設定為保留 DWORD 值所需的位元組數。

如果在提出此要求時,MediaCapture 會話正在串流資料,驅動程式應該透過 Irp-IoStatus.Status 傳回錯誤(STATUS_RESOURCE_IN_USE)。

IOCTL_LAMP_SET_EMITTING_LIGHT

IOCTL_LAMP_SET_EMITTING_LIGHT I/O 要求會開啟/關閉(閃爍)燈。

定義

#define IOCTL_LAMP_SET_EMITTING_LIGHT
    CTL_CODE(IOCTL_LAMP_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)

輸入參數

Irp-AssociatedIrp.SystemBuffer> 指向 BOOLEAN 類型的緩衝區,其中 TRUE 指出 ON;否則為 FALSE。

輸出參數

沒有。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS 或適當的錯誤狀態。

如果 MediaCapture 會話在該請求提出時正進行數據串流,驅動程式應透過 Irp->IoStatus.Status 傳回錯誤(STATUS_RESOURCE_IN_USE)。

非同步通知

並行使用案例中所述,需要快閃記憶體驅動程式傳送 PnP 通知以報告資源可用性。 這可以依據不同案例,使用下列 GUID 呼叫 IoReportTargetDeviceChange(或 IoReportTargetDeviceChangeAsynchronous)來完成:

  • 閃光燈資源被釋放,因為擷取工作階段【或其他手電筒應用程式】啟動。

    屬性 設定
    識別碼 GUID_LAMP_RESOURCES_LOST
    類別 GUID {F770E98C-4403-48C9-B1D2-4EEC3302E41F}
  • 快閃記憶體資源現已可用:

    屬性 設定
    識別碼 GUID_LAMP_RESOURCES_AVAILABLE
    類別 GUID {185FE7CE-2616-481B-9094-20BB893ACD81}