# Advanced features

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

Beyond the core audio controls, the Video SDK for Windows offers several advanced audio features.

## Select a microphone or speaker

To choose which capture and playback devices the SDK uses, enumerate the available devices with `getMicList` and `getSpeakerList`, then pass a device's ID and name to `selectMic` or `selectSpeaker`.

```cpp
IZoomVideoSDKAudioHelper* pAudioHelper = m_pVideoSDK->getAudioHelper();

// Enumerate microphones.
IVideoSDKVector<IZoomVideoSDKMicDevice*>* pMicList = pAudioHelper->getMicList();
for (int i = 0; i < pMicList->GetCount(); i++)
{
    IZoomVideoSDKMicDevice* pMic = pMicList->GetItem(i);
    // Inspect pMic->getDeviceName() and pMic->getDeviceId() to find the device you want.
}

// Select a microphone by its ID and name.
pAudioHelper->selectMic(deviceId, deviceName);
```

Select a speaker the same way using `getSpeakerList` and `selectSpeaker`.

## Monitor mic and speaker volume

The SDK reports the local microphone and speaker volume levels through the `onMicSpeakerVolumeChanged` callback. Use this to drive a volume meter in your UI or to detect when the mic gain has been pushed unusually low.

```cpp
void CExampleListener::onMicSpeakerVolumeChanged(unsigned int micVolume, unsigned int speakerVolume)
{
    // Update your volume meters with micVolume and speakerVolume.
}
```

## Adjust a user's local playback volume

You can control how loud each user sounds _on the local device_ using `setUserPlaybackVolume` on the `IZoomVideoSDKUser` object. This only changes what the current user hears. It does not change the volume for any other participant in the session. Setting the volume to `0` silences that user on your device only.

The `isShareAudio` argument selects whether you are adjusting microphone audio (`false`) or shared audio (`true`, used when the user is sharing a screen with audio). Use `canSetUserPlaybackVolume` to check whether the SDK currently permits a volume change for that audio source. For example, the SDK returns `false` for a user who is not connected to audio.

```cpp
// Lower a remote user's microphone audio on this device only.
if (pRemoteUser->canSetUserPlaybackVolume(false)) {
    pRemoteUser->setUserPlaybackVolume(5.0f, false);
}

// Read the current local playback volume.
float currentVolume = 0;
pRemoteUser->getUserPlaybackVolume(currentVolume, false);
```

## Subscribe to raw audio data

For server-side processing, transcription, or custom audio pipelines, the SDK can deliver raw PCM audio. Call `subscribe` on the `IZoomVideoSDKAudioHelper` to begin receiving raw audio, and `unSubscribe` to stop. The mixed, per-user, and shared raw streams arrive through the [`onMixedAudioRawDataReceived`](/docs/video-sdk/windows/audio/audio-events/#get-notified-when-mixed-audio-raw-data-is-received), [`onOneWayAudioRawDataReceived`](/docs/video-sdk/windows/audio/audio-events/#get-notified-when-one-way-audio-raw-data-is-received), and [`onSharedAudioRawDataReceived`](/docs/video-sdk/windows/audio/audio-events/#get-notified-when-shared-audio-raw-data-is-received) callbacks.

```cpp
m_pVideoSDK->getAudioHelper()->subscribe();
```

For the full raw-data integration pattern, see [Receive raw data](/docs/video-sdk/windows/raw-data/receive-raw-data/).
