# Manage in-meeting audio settings

<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

After the SDK is initialized and connected, use `setting::GetSettingToolkit()->GetSettingAudioToolkit()`
for device selection or audio settings, `meeting::GetAudioToolkit(...)` for in-meeting mute controls,
and `meeting::GetParticipantsToolkit(...)` for participant audio state.

```cpp
auto* settingAudio = setting::GetSettingToolkit()->GetSettingAudioToolkit();
auto* meetingAudio = meeting::GetAudioToolkit(g_meetingInstance);
auto* participants = meeting::GetParticipantsToolkit(g_meetingInstance);
```

## Get a participant's audio state

Use `ZMToolSuiteUser` to expose `audioType` (`ZMToolSuiteAudioType_None`, `ZMToolSuiteAudioType_Voip`, `ZMToolSuiteAudioType_Telephony`) and `bAudioMuted`.

```cpp
auto* participants = meeting::GetParticipantsToolkit(g_meetingInstance);
ZMToolSuiteUser me = participants->GetMySelf();
ZMToolSuiteAudioType myAudioType = me.audioType;
bool myMuted = me.bAudioMuted;
ZMToolSuiteUser other = participants->GetUserByUserID(12345);
ZMToolSuiteAudioType otherAudioType = other.audioType;
```

## Manage audio speaker

List devices with `GetAudioDeviceList(false)`. `ZMToolSuiteDeviceInfo` includes `device_id`,
`device_name`, and `isSelected`. Switch with `SelectAudioDevice(false, ...)`.

```cpp
auto* audioSetting = setting::GetSettingToolkit()->GetSettingAudioToolkit();
IToolSuiteVector<ZMToolSuiteDeviceInfo>* speakers = audioSetting->GetAudioDeviceList(false);
for (int i = 0; speakers && i < speakers->GetCount(); ++i) {
    ZMToolSuiteDeviceInfo d = speakers->GetItem(i);
    if (d.isSelected) {
        // current output device
    }
}
bool submitted = audioSetting->SelectAudioDevice(
    false,                 // speaker
    deviceId,              // const zchar_t*
    deviceName,            // const zchar_t*
    [](const BaseResult& result) {
        // handle result.error_code
    }
);
```

## Manage audio microphone

Managing audio microphone follows a similar pattern as managing the audio speaker. List devices with
`getAudioDeviceList(true)`, inspect with `ZoomToolSuiteDeviceInfo`. Switch with
`selectAudioDevice(_:deviceId:deviceName:completion:)`, with the first parameter `true` for microphone.

```cpp
auto* audioSetting = setting::GetSettingToolkit()->GetSettingAudioToolkit();
IToolSuiteVector<ZMToolSuiteDeviceInfo>* mics = audioSetting->GetAudioDeviceList(true);
bool submitted = audioSetting->SelectAudioDevice(
    true,                  // microphone
    deviceId,
    deviceName,
    [](const BaseResult& result) {
        // handle result.error_code
    }
);
```

## Mute or unmute your microphone

To mute the current user's microphone, useMuteMyAudio. To unmute on the current user's microphone, use UnmuteMyAudio. To toggle the current user's microphone mute or unmute status, use ToggleMyAudioStatus.

```cpp
auto* meetingAudio = meeting::GetAudioToolkit(g_meetingInstance);
meetingAudio->MuteMyAudio([](const BaseResult& result) {
    // handle result.error_code
});
meetingAudio->UnMuteMyAudio([](const BaseResult& result) {
    // handle result.error_code
});
meetingAudio->ToggleMyAudioStatus([](const BaseResult& result) {
    // handle result.error_code
});
```

## Control whether participants may unmute themselves

Hosts can control whether participants may unmute themselves. To check if participants can
unmute themselves, use `IsParticipantsUnmuteSelfAllowed`. To let all participants mute or
unmute themselves, use `AllowParticipantsToUnmuteSelf`.

```cpp
auto* participants = meeting::GetParticipantsToolkit(g_meetingInstance);
participants->IsParticipantsUnmuteSelfAllowed([](const BoolValueResult& result) {
    // result.bValue, result.error_code
});
participants->AllowParticipantsToUnmuteSelf(
    true,
    [](const BaseResult& result) {
        // handle result.error_code
    }
);
```

## Mute or unmute everyone

To mute all current participants, use `MuteAllAudio`. To unmute all current participants, use
`UnMuteAllAudio.`

**NOTE** Only hosts or co-hosts can mute or unmute all participants.

```cpp
auto* meetingAudio = meeting::GetAudioToolkit(g_meetingInstance);
meetingAudio->MuteAllAudio([](const BaseResult& result) {
    // handle result.error_code
});
meetingAudio->UnMuteAllAudio([](const BaseResult& result) {
    // handle result.error_code
});
```

## Mute participants on entry

To mute participants as they enter the meeting, use `EnableMuteOnEntryFeature`. To see
if this feature is currently enabled, use `IsMuteOnEntryFeatureOn`.

```cpp
auto* meetingAudio = meeting::GetAudioToolkit(g_meetingInstance);
meetingAudio->EnableMuteOnEntryFeature(
    true,   // muteOnEntry
    true,   // allowUnmuteBySelf
    [](const BaseResult& result) {
        // handle result.error_code
    }
);
meetingAudio->IsMuteOnEntryFeatureOn([](const BoolValueResult& result) {
    // result.bValue, result.error_code
});
```
