세션 볼륨 컨트롤
앞에서 설명한 것처럼 WASAPI 클라이언트는 각 오디오 세션볼륨 수준을 개별적으로 제어할 수 있습니다. WASAPI는 세션의 볼륨 설정을 세션의 모든 스트림에 균일하게 적용합니다. 각 볼륨 수준은 0.0에서 1.0 범위의 값입니다. 여기서 0.0은 침묵을 나타내고 1.0은 전체 볼륨(감쇠 없음)을 나타냅니다.
클라이언트는 해당 세션에 첫 번째 스트림을 할당하여 세션을 암시적으로 만듭니다. 새 세션의 기본 볼륨 수준은 1.0입니다. 앞에서 설명한 것처럼 사용자는 WASAPI 클라이언트인 제어 프로그램(예: Sndvol)의 사용자 인터페이스를 통해 세션의 볼륨 수준을 조정할 수 있습니다. 컨트롤 설정은 영구적입니다.
클라이언트에서 제어하는 볼륨 설정 외에도 시스템은 세션에 자체 볼륨 설정을 적용합니다. 이러한 설정은 오디오 정책을 기반으로 하며 전역 오디오 믹스를 구성하는 스트림의 변경 내용에 따라 동적으로 변경됩니다. 오디오 정책에 대한 자세한 내용은 오디오 구성 요소 User-Mode 참조하세요.
각 스트림에 대한 볼륨 제어를 구현하는 시스템 소프트웨어는 스트림의 PCM 샘플을 유효 볼륨 수준으로 곱합니다. 유효 볼륨 수준은 클라이언트 및 시스템 볼륨 설정을 곱한 결과입니다. 따라서 신호 진폭의 결과 변경은 클라이언트와 시스템 볼륨 수준의 선형 조합입니다. 예를 들어 클라이언트 볼륨 수준이 0.8이고 시스템 볼륨 수준이 0.5인 경우 유효 볼륨 수준은 (0.8).(0.5) = 0.4.
인식된 음이 신호 진폭과 관련하여 선형이 아닙니다. 대신 음량은 볼륨 수준 v의 로그와 거의 유사합니다.
loudness in decibels = 20.log(v)
따라서 v = 0.5를 설정하면 원래 신호의 소리(볼륨 수준이 적용되기 전의 신호)가 6데시벨로 감쇠되고, v = 0.25를 설정하면 신호가 12데시벨로 감쇠됩니다. 0 데시벨에 해당하는 볼륨 수준 v = 1.0은 원래 신호 수준을 변경하지 않습니다.
볼륨 수준을 제어하기 위한 사용자 인터페이스가 있는 오디오 애플리케이션은 일반적으로 슬라이더 위치의 변경 내용에 선형으로 비례하는 인식된 음의 변화를 생성하는 슬라이더를 표시합니다. 인식된 음량과 슬라이더 위치 간에 선형 관계를 생성하려면 애플리케이션이 볼륨 수준 v와 슬라이더 위치 간에 비선형 관계를 정의해야 합니다. 자세한 내용은 볼륨 컨트롤 Audio-Tapered 참조하세요.
앞에서 설명한 것처럼 시스템 볼륨 제어 프로그램인 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 인터페이스를 통해 변경된 볼륨만 반영합니다. IAudioStreamVolume 및 IChannelAudioVolume 인터페이스를 통해 수행된 볼륨 변경 내용은 반영되지 않습니다. 일부 애플리케이션에서는 사용자가 IAudioStreamVolume 통해 볼륨 설정을 직접 또는 간접적으로 제어하고 IChannelAudioVolume 수 있지만 개발자는 사용자가 Sndvol의 볼륨 슬라이더와 혼동할 가능성이 있는 이러한 볼륨 설정에 대한 애플리케이션 슬라이더를 표시하지 않아야 합니다. 그렇지 않으면 사용자가 변경 내용이 Sndvol 슬라이더에 반영될 것으로 예상하는 애플리케이션 슬라이더를 이동하고 이러한 변경이 발생하지 않을 때 혼동될 수 있습니다. 개발자는 신중한 사용자 인터페이스 디자인을 통해 이 문제를 방지할 수 있습니다.
세션 서브믹스에 있는 채널의 유효 볼륨 수준은 스피커에서 들립니다. 다음 네 가지 볼륨 수준 요인의 산물입니다.
- 클라이언트가 IAudioStreamVolume 인터페이스의 메서드를 통해 제어할 수 있는 세션의 채널별 볼륨 수준입니다.
- 클라이언트가 IChannelAudioVolume 인터페이스의 메서드를 통해 제어할 수 있는 세션의 채널별 볼륨 수준입니다.
- 클라이언트가 ISimpleAudioVolume 인터페이스의 메서드를 통해 제어할 수 있는 세션의 마스터 볼륨 수준입니다.
- 시스템이 전역 혼합 변경으로 동적으로 수정하는 세션의 정책 기반 볼륨 수준입니다.
이전 목록의 4개 볼륨 수준 요소는 각각 0.0에서 1.0 범위의 값입니다. 여기서 0.0은 침묵을 나타내고 1.0은 전체 볼륨(감쇠 없음)을 나타냅니다. 유효 볼륨 수준은 0.0~1.0 범위의 값이기도 합니다.
오디오 엔진은 스트림을 오디오 세션의 다른 스트림과 혼합하기 전에 스트림의 채널에 각 채널의 유효 볼륨 수준을 적용합니다. 오디오 엔진이 유효 볼륨 수준을 곱한 후 채널의 샘플 값이 0 데시벨을 초과하는 경우 엔진은 샘플을 세션 서브믹스에 추가하기 전에 클립합니다.
관련 항목