# SoundSet

改变音频设备的各种设置(主音量静音, 主音量等).

    SoundSet, NewSetting , ComponentType, ControlType, DeviceNumber

## 参数

NewSetting

  介于 -100 和 100(包含的) 之间的百分数(它可以为浮点数或表达式). 如果这个数字以加号或减号开头, 则将当前设置往上或往下调指示的数量. 否则, 此设置将被明确地设置为 NewSetting 表示的级别.

  对于只有两种可能设置的 控制器类型 而言(即 ONOFF, MUTE, MONO, LOUDNESS, STEREOENH 以及 BASSBOOST), 任何正数都将开启设置, 而 0 则进行关闭. 然而, 如果这个数字以加号或减号开头, 则对设置进行切换(设置为和当前状态相反).

ComponentType

  如果省略或为空, 则它默认为单词 MASTER. 否则, 它可以为下列单词的其中一个: MASTER(与 SPEAKERS 含义相同), DIGITAL, LINE, MICROPHONE, SYNTH, CD, TELEPHONE, PCSPEAKER, WAVE, AUX, ANALOG, HEADPHONES 或 N/A. 如果音频设备缺少指定的 组件类型, 则 ErrorLevel 会表明此问题.

  在某些混音器中标为 Auxiliary 的组件可能需要作为 ANALOG 而不是 AUX 进行访问.

  如果一个设备含有同种 组件类型 的多个实例(例如两个 LINE 类型), 那么通常首个包含播放设置, 第二个包含录制设置. 要访问首个实例外的其他实例, 请在此参数后加上冒号和数字. 例如: `Analog:2` 表示 analog 组件的第二个实例.

ControlType

  如果省略或为空, 则它默认为 VOLUME. 否则, 它可以为下列单词的其中一个: VOLUME(或 VOL), ONOFF, MUTE, MONO, LOUDNESS, STEREOENH, BASSBOOST, PAN, QSOUNDPAN, BASS, TREBLE, EQUALIZER 或表示有效的控制器类型数字(请参阅声卡分析脚本). 如果指定的 组件类型 没有指定的 控制器类型, 则 ErrorLevel 会表明此问题.

  注意: 音频设备通常仅支持 VOLUME(或VOL) 和 MUTE, 不过根据 Windows 和音频设备的不同还可能支持其他.

DeviceNumber

  介于 1 和支持设备总数之间的数字. 如果省略此参数, 则它默认为 1(首个音频设备), 在 Windows Vista 及更高版本中则为系统默认的录制和播放设备. 此参数可以为表达式. 声卡分析脚本有助于确定要使用的编号.

## 错误处理

[v1.1.04+]: 此命令失败时会抛出异常. 想了解更多信息, 请参阅运行时错误.

命令执行成功时 ErrorLevel 被设置为 0. 否则, 它会被设置为下列短语的其中一个:

- Invalid Control Type or Component Type(无效的控制器类型或组件类型)
- Can't Open Specified Mixer(无法打开指定的混音器)
- Mixer Doesn't Support This Component Type(混音器不支持此组件类型)
- Mixer Doesn't Have That Many of That Component Type(混音器没有那么多的组件类型)
- Component Doesn't Support This Control Type(组件不支持此控件类型)
- Can't Get Current Setting(无法获取当前设置)
- Can't Change Setting(无法更改设置)

## 备注

[v1.1.10+]: 添加了对 Windows Vista 及更高版本系统的支持.

与音频设备相关的更多功能和细微控制, 考虑使用 VA 库.

另一种调整音量方法是在脚本中发送音量控制键击来改变整个系统的主音量, 如后面的例子所示:

    Send {Volume_Up}  ; 增加 1 个音程的主音量(通常为 5%).
    Send {Volume_Down 3}  ; 降低 3 个音程的主音量.
    Send {Volume_Mute}  ; 对主音量进行静音/取消静音.

要找出安装在系统上的音频设备(混音器) 的功能(例如可用的组件类型和控制器类型), 请运行声卡分析脚本.

Windows 2000/XP/2003: 当 SoundSet 改变一个组件的音量时, 此组件的所有声道(例如左和右) 都会被设置为相同级别. 换句话说, 会丢失任何原来的不平衡的声道设置. 此问题可以使用 SoundSetWaveVolume 设置 WAVE 组件来避免, 它在改变音量级别时会尝试维持原有的声道平衡.

Windows Vista 及更高版本(v1.1.10+): SoundSet 在改变音量级别时会尝试维持原有的声道平衡.

使用 SoundGet 来获取某个设置的当前值.

## 相关

SoundGet, SoundGetWaveVolume, SoundSetWaveVolume, SoundPlay

## 示例

将主音量设置为 50%.

    SoundSet, 50

将主音量增加 10%.

    SoundSet +10

将主音量减小 10%.

    SoundSet -10

对麦克风进行静音.

    SoundSet, 1, Microphone, Mute

切换主静音(设置到相反的状态).

    SoundSet, +1,, Mute

将低音级别增加 20%(如果可能), 否则会显示错误信息.

    SoundSet, +20, Master, Bass
    if ErrorLevel
        MsgBox, The BASS setting is not supported for MASTER.

声卡分析. 使用下面的脚本来找出您声卡的功能(组件类型和控制器类型). 它会在简单的 ListView 中显示结果. 还可以从后面的论坛主题中下载用于 Windows Vista 及更高版本的脚本, 它提供了更多的细节(例如显示设备名称): https://www.autohotkey.com/board/topic/90877-/

    SetBatchLines -1
    SplashTextOn,,, Gathering Soundcard Info...

    ; 下面的大部分纯数字也许不存在于任何混音器中, 但查询时需要它们才完整.; 对应于下面项目的数字(按顺序):CUSTOM,BOOLEANMETER,SIGNEDMETER,PEAKMETER,
    ; UNSIGNEDMETER,BOOLEAN,BUTTON,DECIBELS,SIGNED,UNSIGNED,PERCENT,SLIDER,FADER,SINGLESELECT,MUX,
    ; MULTIPLESELECT,MIXER,MICROTIME,MILLITIME
    ControlTypes := "VOLUME,ONOFF,MUTE,MONO,LOUDNESS,STEREOENH,BASSBOOST,PAN,QSOUNDPAN,BASS,TREBLE,EQUALIZER,0x00000000, 0x10010000,0x10020000,0x10020001,0x10030000,0x20010000,0x21010000,0x30040000,0x30020000,0x30030000,0x30050000,0x40020000,0x50030000,0x70010000,0x70010001,0x71010000,0x71010001,0x60030000,0x61030000"

    ComponentTypes := "MASTER,HEADPHONES,DIGITAL,LINE,MICROPHONE,SYNTH,CD,TELEPHONE,PCSPEAKER,WAVE,AUX,ANALOG,N/A"

    ; 创建 ListView, 为主循环做准备:
    Gui, Add, ListView, w400 h400 vMyListView, Component Type|Control Type|Setting|Mixer
    LV_ModifyCol(4, "Integer")
    SetFormat, Float, 0.2  ; 限制小数位数为两位.

    Loop  ; 对于系统中存在的每个混音器编号, 查询它的性能.
    {
        CurrMixer := A_Index
        SoundGet, Setting,,, %CurrMixer%
        if (ErrorLevel = "Can't Open Specified Mixer")   ; 除了这个外的其他任何错误都表明混音器存在.
            break

        ; 对于此混音器中的每个组件类型, 查询它的实例和控制器类型:
        Loop, parse, ComponentTypes, `,
        {
            CurrComponent := A_LoopField
            ; 首先检查这个组件类型是否实际存在于混音器中:
            SoundGet, Setting, %CurrComponent%,, %CurrMixer%
            if (ErrorLevel = "Mixer Doesn't Support This Component Type")
                continue  ; 移动到下一个组件类型进行新的重复.
            Loop  ; 对于此组件类型的每个实例, 查询它的控制器类型.
            {
                CurrInstance := A_Index
                ; 首先检查当前实例的这个实例是否存在于混音器中:
                SoundGet, Setting, %CurrComponent%:%CurrInstance%,, %CurrMixer%
                ; 检查下面两个错误以允许在较旧的版本中运行此脚本:
                if ErrorLevel in Mixer Doesn't Have That Many of That Component Type,Invalid Control Type or Component Type
                    break  ; 这个组件类型已经没有更多实例了.
                ; 获取这个组件的当前实例中存在的每个控制器类型的当前设置:
                Loop, parse, ControlTypes, `,
                {
                    CurrControl := A_LoopField
                    SoundGet, Setting, %CurrComponent%:%CurrInstance%, %CurrControl%, %CurrMixer%
                    ; 检查下面两个错误以允许在较旧的版本中运行此脚本:
                    if ErrorLevel in Component Doesn't Support This Control Type,Invalid Control Type or Component Type
                        continue
                    if ErrorLevel  ; 出现其他错误, 这是意外的情况, 所以把它显示在结果中.
                        Setting := ErrorLevel
                    ComponentString := CurrComponent
                    if (CurrInstance > 1)
                        ComponentString := ComponentString ":" CurrInstance
                    LV_Add("", ComponentString, CurrControl, Setting, CurrMixer)
                }  ; 对于每个控制器类型.
            }  ; 对于每个组件实例.
        }  ; 对于每个组件类型.
    }  ; 对于每个混音器.

    Loop % LV_GetCount("Col")  ; 自动根据内容调节每列的宽度.
        LV_ModifyCol(A_Index, "AutoHdr")

    SplashTextOff
    Gui, Show
    return

    GuiClose:
    ExitApp

dftg