Элементы управления томами сеанса
Как описано ранее, клиенты WASAPI могут отдельно управлять уровнем громкости каждого звукового сеанса. WASAPI применяет параметр тома для сеанса равномерно ко всем потокам в сеансе. Каждый уровень тома — это значение в диапазоне от 0,0 до 1.0, где 0.0 указывает молчание, а 1.0 — полный том (без аттенуации).
Клиент неявно создает сеанс, назначив первый поток сеансу. Уровень тома по умолчанию нового сеанса — 1.0. Как упоминалось ранее, пользователь может настроить уровень тома сеанса через пользовательский интерфейс программы управления (например, Sndvol), который является клиентом WASAPI. Параметры элемента управления являются постоянными.
Помимо параметров тома, управляемого клиентом, система применяет собственные параметры тома к сеансам. Эти параметры основаны на политике аудио и динамически изменяются в ответ на изменения в потоках, составляющих глобальный аудиомикс. Дополнительные сведения о политике аудио см. в разделе "Компоненты аудио в режиме пользователя".
Системное программное обеспечение, реализующее управление томом для каждого потока, умножает примеры PCM в потоке на эффективный уровень тома. Эффективный уровень тома является результатом умножения параметров клиентского и системного тома. Таким образом, результирующее изменение амплитуды сигнала является линейной комбинацией уровней тома клиента и системы. Например, если уровень тома клиента равен 0,8, а системный уровень тома равен 0,5, то действующий уровень тома равен (0,8).(0.5) = 0,4.
Обратите внимание, что воспринимаемая громкость не является линейной относительно амплитуды сигнала. Вместо этого громкость изменяется примерно так же, как логарифм уровня громкости v:
громкость в децибелах = 20.log₁₀(v)
Таким образом, установка v = 0,5 затеняет громкость исходного сигнала (сигнал перед применением уровня громкости) на 6 децибелей, установив v = 0,25 затеняет сигнал на 12 децибелов и т. д. Уровень тома v = 1.0, соответствующий 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. Они не отражают изменения тома, внесенные через интерфейсы IAudioStreamVolume и IChannelAudioVolume. Хотя некоторые приложения могут позволить пользователям напрямую или косвенно управлять параметрами тома с помощью IAudioStreamVolume и IChannelAudioVolume, разработчики должны избегать представления ползунок приложений для этих параметров тома, которые пользователи, скорее всего, будут путать с ползунками томов в Sndvol. В противном случае пользователь может переместить ползунок приложения, ожидающий увидеть изменения, отраженные в ползунке Sndvol, и путаться, когда такое изменение не происходит. Разработчики могут избежать этой проблемы благодаря тщательному проектированию пользовательского интерфейса.
Действующий уровень громкости любого канала в подмиксе сеанса, как было слышно на докладчиках, является продуктом следующих четырех факторов уровня тома:
- Уровни тома каждого канала потоков в сеансе, которые клиенты могут управлять методами в интерфейсе IAudioStreamVolume .
- Уровень тома для каждого канала сеанса, который клиенты могут контролировать с помощью методов в интерфейсе IChannelAudioVolume .
- Главный уровень тома сеанса, который клиенты могут контролировать с помощью методов в интерфейсе ISimpleAudioVolume .
- Уровень тома на основе политики сеанса, который система динамически изменяет как глобальный набор изменений.
Каждый из четырех факторов уровня тома в предыдущем списке является значением в диапазоне от 0,0 до 1.0, где 0.0 указывает молчание, а 1.0 указывает полный том (без аттенуации). Эффективный уровень тома также является значением в диапазоне от 0,0 до 1.0.
Звуковой модуль применяет эффективный уровень громкости для каждого канала к каналам в потоке, прежде чем смешивать поток с другими потоками в звуковом сеансе. Если любые примеры значений в канале превышают 0 децибел после умножения звукового модуля на эффективный уровень громкости, подсистема обрезает образцы перед добавлением их в подмикс сеанса.
См. также