# SoundGetInterface

检索声音设备或组件的原生 COM 接口.

    InterfacePtr := SoundGetInterface(IID, Component, Device)

## 参数

IID

  类型: 字符串

  格式为 "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" 的接口标识符(GUID).

Component

  类型: 字符串或整数

  组件的显示名称和/或索引. 例如, `1`, `"Line in"` 或 `"Line in:2"`.

  如果省略或留空, 则检索由设备本身实现的接口.

  有关详情, 请参阅 Component (Sound 函数).

Device

  类型: 字符串或整数

  设备的显示名称和/或索引. 例如, `1`, `"Speakers"`, `"Speakers:2"` 或 `"Speakers (Example HD Audio)"`.

  如果省略该参数, 则它默认为系统的默认回放设备(不一定是设备 1).

  有关详情, 请参阅 Device (Sound 函数).

## 返回值

类型: 整数

如果成功, 返回值是接口指针.

如果接口不支持, 返回值是零.

## 错误处理

失败时可能会抛出以下异常之一:

Error 类 | 消息
--- | ---
TargetError | Device not found(无法找到设备)
Component not found(无法找到组件)
OSError | System-generated.(由系统生成)

## 备注

接口是从以下来源之一检索的:

- 如果省略 Component, 则调用 IMMDevice::Activate 检索接口.
- 为 Component 连接器标识调用 QueryInterface, 如果成功, 则返回接口指针. 这可以用于检索连接器的 IPart 或 IConnector 接口.
- 对于给定 Component 唯一的每个子单元, 都会调用 IPart::Activate. 例如, IID 可以是 `"{7FB7B48F-531D-44A2-BCB3-5AD5A134B3DC}"` 检索 IAudioVolumeLevel 接口, 该接口提供对每个通道音量级别控件的访问.

一旦检索到接口指针, 可用 ComCall 来调用它的方法. 参考 Windows SDK 头文件来识别正确的方法索引.

接口指针必须在不再需要时通过传递给 ObjRelease 来释放. 这可以通过使用 ComValue "包装" 它来实现. 包装的值(对象) 可以直接传递给 ComCall.

    Interface := ComValue(13, InterfacePtr)

## 相关

Sound 函数, DeviceTopology API

## 示例

峰值表. 将显示带有当前峰值的工具提示, 但峰值为零时除外(无声音播放).

    ; IAudioMeterInformation
    audioMeter := SoundGetInterface("{C02216F6-8C67-4B5B-9D00-D008E73E0064}")
    if audioMeter
    {
        try loop  ; 直到脚本退出或发生错误.
        {
            ; audioMeter->GetPeakValue(&peak)
            ComCall 3, audioMeter, "float*", &peak:=0
            ToolTip peak > 0 ? peak : ""
            Sleep 15
        }
        ObjRelease audioMeter
    }
    else
        MsgBox "Unable to get audio meter"

dftg