세션 볼륨 컨트롤

앞서 설명한 대로 WASAPI 클라이언트는 각 오디오 세션의 볼륨 수준을 개별적으로 제어할 수 있습니다. WASAPI는 세션의 볼륨 설정을 세션의 모든 스트림에 균일하게 적용합니다. 각 볼륨 수준은 0.0에서 1.0 범위의 값입니다. 여기서 0.0은 무음, 1.0은 전체 볼륨(감쇠 없음)을 나타냅니다.

클라이언트는 해당 세션에 첫 번째 스트림을 할당하여 세션을 암시적으로 만듭니다. 새 세션의 기본 볼륨 수준은 1.0입니다. 앞에서 설명한 것처럼 사용자는 WASAPI 클라이언트인 제어 프로그램(예: Sndvol)의 사용자 인터페이스를 통해 세션의 볼륨 수준을 조정할 수 있습니다. 컨트롤 설정은 영구적입니다.

클라이언트에서 제어하는 볼륨 설정 외에도 시스템은 자체 볼륨 설정을 세션에 적용합니다. 이러한 설정은 오디오 정책을 기반으로 하며 전역 오디오 믹스를 구성하는 스트림의 변경에 따라 동적으로 변경됩니다. 오디오 정책에 대한 자세한 내용은 사용자 모드 오디오 구성 요소를 참조하세요.

각 스트림에 대한 볼륨 제어를 구현하는 시스템 소프트웨어는 스트림의 PCM 샘플을 유효 볼륨 수준으로 곱합니다. 유효 볼륨 수준은 클라이언트 및 시스템 볼륨 설정을 곱한 결과입니다. 따라서 신호 진폭의 결과 변경은 클라이언트와 시스템 볼륨 수준의 선형 조합입니다. 예를 들어 클라이언트 볼륨 수준이 0.8이고 시스템 볼륨 수준이 0.5인 경우 유효 볼륨 수준은 (0.8)입니다. (0.5) = 0.4.

인식된 음수는 신호 진폭과 관련하여 선형이 아닙니다. 대신 음량은 볼륨 수준 v의 로그와 거의 다릅니다.

10진수의 음량 = 20. log(v)

따라서 v = 0.5를 설정하면 원래 신호(볼륨 수준이 적용되기 전의 신호)의 음량을 6데시벨로 감쇠하고 v = 0.25를 설정하면 신호가 12데시벨로 감쇠됩니다. 0 데시벨에 해당하는 볼륨 수준 v = 1.0은 원래 신호 수준을 변경하지 않습니다.

볼륨 수준을 제어하기 위한 사용자 인터페이스가 있는 오디오 애플리케이션은 일반적으로 슬라이더 위치의 변경 내용에 선형으로 비례하는 인식된 음량의 변화를 생성하는 슬라이더를 표시합니다. 인식된 음량과 슬라이더 위치 간에 선형 관계를 생성하려면 애플리케이션이 볼륨 수준 v와 슬라이더 위치 간에 비선형 관계를 정의해야 합니다. 자세한 내용은 오디오 테이퍼 볼륨 컨트롤을 참조하세요.

앞에서 설명한 것처럼 시스템 볼륨 제어 프로그램인 Sndvol은 각 오디오 렌더링 디바이스에서 재생되는 오디오 세션에 대한 볼륨 슬라이더를 표시합니다. 이러한 슬라이더는 SndVol 창의 애플리케이션 레이블이 지정된 그룹 상자에 표시됩니다. 일반적으로 각 세션에는 특정 애플리케이션 창의 모든 재생 스트림이 포함됩니다. Sndvol 창의 슬라이더를 통해 사용자는 개별 오디오 애플리케이션의 볼륨 수준을 제어합니다.

일반적으로 애플리케이션은 모든 재생 스트림을 동일한 오디오 세션에 할당해야 합니다. WASAPI는 애플리케이션이 여러 세션 간에 재생 스트림을 배포하는 것을 방지하지 않습니다. 그러나 Sndvol에서 볼륨 슬라이더의 확산으로 인해 사용자가 혼동될 수 있습니다.

옵션으로 애플리케이션 창에 볼륨 슬라이더가 표시 될 수 있습니다. 애플리케이션 슬라이더는 항상 해당 Sndvol 슬라이더의 상태를 반영해야 합니다. 따라서 사용자가 애플리케이션 창에서 슬라이더를 이동하여 볼륨 수준을 변경하는 경우 Sndvol 창의 해당 슬라이더가 애플리케이션 슬라이더와 함께 이동해야 합니다. 마찬가지로 사용자가 Sndvol 슬라이더를 이동하면 애플리케이션 슬라이더가 Sndvol 슬라이더와 함께 이동해야 합니다.

이 동작을 지원하기 위해 WASAPI는 ISimpleAudioVolume 인터페이스를 구현합니다. 사용자가 애플리케이션 슬라이더를 이동하면 애플리케이션은 ISimpleAudioVolume::SetMasterVolume 메서드를 호출하여 세션 볼륨 수준을 적절하게 조정합니다. Sndvol은 이 메서드를 통해 수행된 볼륨 변경 내용을 모니터링하고 표시되는 볼륨 슬라이더의 변경 내용을 반영합니다. 또한 애플리케이션은 사용자가 Sndvol을 통해 수행한 세션 볼륨 변경에 대한 알림을 받을 수 있습니다. 이를 위해 애플리케이션은 IAudioSessionEvents 인터페이스를 구현하고 WASAPI에 인터페이스를 등록합니다. 그 후 사용자가 Sndvol을 통해 세션 볼륨 수준을 변경할 때마다 애플리케이션은 IAudioSessionEvents::OnSimpleVolumeChanged 메서드를 통해 알림 호출을 받습니다. IAudioSessionEvents 인터페이스를 구현하는 코드 예제는 오디오 세션 이벤트를 참조하세요. IAudioSessionEvents 인터페이스를 등록하는 코드 예제는 레거시 오디오 애플리케이션에 대한 오디오 이벤트를 참조하세요.

ISimpleAudioVolume 인터페이스는 오디오 세션의 모든 채널에 동일한 볼륨 수준을 균일하게 적용합니다. 이 인터페이스는 대부분의 애플리케이션의 볼륨 제어 요구 사항을 충족해야 하지만 일부 애플리케이션에는 보다 특수한 볼륨 제어 기능이 필요할 수 있습니다. IAudioStreamVolume 인터페이스는 세션의 다른 스트림을 기준으로 세션의 개별 스트림 볼륨을 제어합니다. 또한 IAudioStreamVolume 을 사용하면 클라이언트가 스트림에 있는 모든 채널의 볼륨 수준을 개별적으로 제어할 수 있습니다. 예를 들어 애플리케이션은 이 기능을 사용하여 왼쪽에서 오른쪽으로 이동하여 오디오 원본의 공간 이동을 시뮬레이션하는 등의 오디오 효과를 얻을 수 있습니다. 또 다른 특수 인터페이스인 IChannelAudioVolume은 세션의 개별 채널 볼륨 수준을 제어합니다. 예를 들어 애플리케이션은 IChannelAudioVolume 을 사용하여 스테레오포닉 사운드 시스템에 대한 균형 컨트롤을 구현할 수 있습니다.

Sndvol의 애플리케이션 상자에 있는 볼륨 슬라이더는 ISimpleAudioVolume 인터페이스를 통해 이루어진 볼륨 변경 내용만 반영합니다. IAudioStreamVolumeIChannelAudioVolume 인터페이스를 통해 수행된 볼륨 변경 내용은 반영되지 않습니다. 일부 애플리케이션을 사용하면 사용자가 IAudioStreamVolumeIChannelAudioVolume을 통해 볼륨 설정을 직접 또는 간접적으로 제어할 수 있지만 개발자는 사용자가 Sndvol의 볼륨 슬라이더와 혼동할 가능성이 있는 이러한 볼륨 설정에 대한 애플리케이션 슬라이더를 표시하지 않아야 합니다. 그렇지 않으면 사용자가 Sndvol 슬라이더에 변경 내용이 반영될 것으로 예상하는 애플리케이션 슬라이더를 이동하고 이러한 변경이 발생하지 않을 때 혼동될 수 있습니다. 개발자는 신중한 사용자 인터페이스 디자인을 통해 이 문제를 방지할 수 있습니다.

스피커에서 들리는 세션 서브믹스의 모든 채널의 유효 볼륨 수준은 다음 네 가지 볼륨 수준 요소의 산물입니다.

  • 클라이언트가 IAudioStreamVolume 인터페이스의 메서드를 통해 제어할 수 있는 세션 스트림의 채널별 볼륨 수준입니다.
  • 클라이언트가 IChannelAudioVolume 인터페이스의 메서드를 통해 제어할 수 있는 세션의 채널별 볼륨 수준입니다.
  • 클라이언트가 ISimpleAudioVolume 인터페이스의 메서드를 통해 제어할 수 있는 세션의 master 볼륨 수준입니다.
  • 시스템이 전역 혼합이 변경되면 동적으로 수정하는 세션의 정책 기반 볼륨 수준입니다.

이전 목록의 4개 볼륨 수준 요소는 각각 0.0~1.0 범위의 값입니다. 여기서 0.0은 무음, 1.0은 전체 볼륨(감쇠 없음)을 나타냅니다. 유효 볼륨 수준은 0.0~1.0 범위의 값이기도 합니다.

오디오 엔진은 스트림을 오디오 세션의 다른 스트림과 혼합하기 전에 스트림의 채널에 각 채널의 유효 볼륨 수준을 적용합니다. 오디오 엔진이 유효 볼륨 수준을 곱한 후 채널의 샘플 값이 0 데시벨을 초과하는 경우 엔진은 샘플을 세션 서브믹스에 추가하기 전에 클립합니다.

볼륨 컨트롤