Параметры XAudio2 Source/Master Voice SetVolume
Я пытаюсь создать ползунок громкости для своего приложения WPF, чтобы применить его к файлам WAV, выводимым через XAudio2.
Я собрал все вместе и умею воспроизводить звуки. Большой!
Я просто не могу понять аргумент метода SetVolume.
Может кто-нибудь объяснить, какие значения подходят для ползунка громкости?
Я уверен, что упускаю что-то невероятно очевидное, и я просто не привык играть с аудиофайлами, так что я довольно невежественен при загрузке.
Я ожидаю, что я действительно хочу получить два ползунка, один для основного голоса, другой для исходного голоса.
1 ответ
Как правило, вы просто используете регулятор громкости на "mastering voice" для управления общим уровнем громкости выходного сигнала вашего приложения. Громкость голоса для каждого источника доступна для управления премиксом отдельных звуков, но это не совсем интуитивный способ для пользователя контролировать общую громкость приложения.
Что касается того, что volume
Параметр означает, что он определен следующим образом в MSDN:
Уровни громкости выражаются в виде множителей амплитуды с плавающей запятой между -XAUDIO2_MAX_VOLUME_LEVEL и XAUDIO2_MAX_VOLUME_LEVEL (от -2²⁴ до 2²⁴) с максимальным усилением 144,5 дБ. Уровень громкости 1,0 означает отсутствие затухания или усиления, а 0 означает тишину. Отрицательные уровни могут быть использованы для инвертирования фазы звука. См. XAudio2 Volume and Pitch Control для получения дополнительной информации о регулировке громкости.
С практической точки зрения, вы устанавливаете его на 0.0, чтобы не было звука, и 1.0, чтобы он был "полной громкостью" вашего оригинального освоенного микса, так что от 0.0 до 1.0 - разумное место для начала. В зависимости от громкости ваших отдельных звуков, эффектов, которые вы запускаете, и, в частности, от любого реверберации или трехмерного пространственного позиционирования, вы можете обнаружить, что установка общей громкости выше 1,0 приводит к "обрезанию".
Даже при мастеринге объемом 1,0 отсечение может происходить в сложных миксах. Решение здесь заключается в использовании FXMasteringLimiter
АПО на вашем мастеринге. Например, вот код, который добавляет ограничитель мастеринга в DirectX Tool Kit для аудио.
FXMASTERINGLIMITER_PARAMETERS params = {};
params.Release = FXMASTERINGLIMITER_DEFAULT_RELEASE;
params.Loudness = FXMASTERINGLIMITER_DEFAULT_LOUDNESS;
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
hr = CreateFX( __uuidof(FXMasteringLimiter),
mVolumeLimiter.ReleaseAndGetAddressOf(),
¶ms, sizeof(params) );
#else
hr = CreateFX( __uuidof(FXMasteringLimiter),
mVolumeLimiter.ReleaseAndGetAddressOf() );
#endif
if ( FAILED(hr) )
// error
XAUDIO2_EFFECT_DESCRIPTOR desc = {};
desc.InitialState = TRUE;
desc.OutputChannels = masterChannels;
desc.pEffect = mVolumeLimiter.Get();
XAUDIO2_EFFECT_CHAIN chain = { 1, &desc };
hr = mMasterVoice->SetEffectChain( &chain );
if ( FAILED(hr) )
// error
#if (_WIN32_WINNT < _WIN32_WINNT_WIN8)
hr = mMasterVoice->SetEffectParameters( 0, ¶ms, sizeof(params) );
if ( FAILED(hr) )
// error
#endif
Приведенные выше условные пути кода предназначены для обработки различий API XAudio 2.8 и XAudio 2.7. Смотрите этот пост в блоге.