Jump to content

[SOLVED] SetSourceVolume does not affect the sound volume


photo

Recommended Posts

Здравствуйте!

Метод Unigine.Sound.SetSourceVolume не влияет на громкость звука источников на конкретном канале. При этом, если регулировать громкость в отдельном канале через настройки, то громкость звука меняется и это явно слышно (изображение ниже).

Если Вызвать метод

Unigine.Sound.SetSourceVolume(source: 1, volume: 0.0f);

то

Scalar newVolume = Unigine.Sound.GetSourceVolume(source: 1);

вернёт обновленное значение 0, однако звук на этом канале никак не изменит свою громкость. Свойство Unigine.Sound.Volume же изменяет громкость всех источников корректно. Может есть какие-то дополнительные требования для изменения звука на отдельном канале через код?

Версия ректора: UNIGINE 2 Community 2.18.1.

image.png.d2a92553272cc40c0d0447995cc0349b.png

Link to comment

Добрый день!

Уточните, пожалуйста, каким образом настроены битовые маски "Source Mask" для объектов SoundSource? Вероятно, недопонимание связано с тем, что значению Volume будет соответствовать предварительно заданный бит маски на источнике звука. По умолчанию для SoundSource объектов Source Mask равен 0 (00 00 00 01) и все они будет регулироваться при помощи слайдера "Sound -> Volume 0" в редакторе или при помощи метода Sound.SetSourceVolume(0, 1) в коде. Пожалуйста, проверьте, что маски настроены правильно, так как быстрая проверка с нашей стороны не выявила никаких проблем.

image.png

Спасибо!

Link to comment
9 minutes ago, bmyagkov said:

Добрый день!

Уточните, пожалуйста, каким образом настроены битовые маски "Source Mask" для объектов SoundSource? Вероятно, недопонимание связано с тем, что значению Volume будет соответствовать предварительно заданный бит маски на источнике звука. По умолчанию для SoundSource объектов Source Mask равен 0 (00 00 00 01) и все они будет регулироваться при помощи слайдера "Sound -> Volume 0" в редакторе или при помощи метода Sound.SetSourceVolume(0, 1) в коде. Пожалуйста, проверьте, что маски настроены правильно, так как быстрая проверка с нашей стороны не выявила никаких проблем.

image.png

Спасибо!

У меня есть 3 источника звука на сцене: у двух их них маска UI (00 00 00 01) и у одного - environment (00 00 00 02). Громкость источников регулируется напрямую из редактора с помощью ползунков  Sound -> Volume 0 и 1 корректно. Но при вызове через код результата уже нет.image.thumb.png.3b4d50228f716e078cc6e1a024b3292b.png

image.thumb.png.e195f030076ee9f319d36f7e2a89d12e.png

Link to comment
53 minutes ago, sityrax said:

У меня есть 3 источника звука на сцене: у двух их них маска UI (00 00 00 01) и у одного - environment (00 00 00 02). Громкость источников регулируется напрямую из редактора с помощью ползунков  Sound -> Volume 0 и 1 корректно. Но при вызове через код результата уже нет.

А можно увидеть весь код примера? В нашем случае все происходит следующим образом:

using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "5b91d558ca6100289ef2ffdf5c24e60397af16da")]
public class soundtest : Component
{
    void Init()
    {
        // write here code to be called on component initialization
        
    }
    
    void Update()
    {

        if (Input.IsKeyDown(Input.KEY.DIGIT_1))
            Sound.SetSourceVolume(0, 0.1f);
        if (Input.IsKeyDown(Input.KEY.DIGIT_2))
            Sound.SetSourceVolume(0, 1);
        if (Input.IsKeyDown(Input.KEY.DIGIT_7))
            Sound.SetSourceVolume(1, 0.1f);
        if (Input.IsKeyDown(Input.KEY.DIGIT_8))
            Sound.SetSourceVolume(1, 1);
        // write here code to be called before updating each render frame

    }
}

Мир настроен как в примере выше, один из источников звука имеет маску Source Mask 0, а второй соответственно Source Mask 1. При нажатии кнопки 1 на клавиатуре, звук для источника с маской 0 уменьшается, а на 2 возвращается в исходное состояние. Тоже самое для клавиш 7 и 8, которые изменяют громкость звука для источника с маской 1.

  • Like 1
  • Thanks 1
Link to comment
Posted (edited)

Разобраться в чем проблема. Решение довольно неочевидное.

Для редактирования громкости звуков я написал скрипт, который по маске регулирует громкость определенного канала, но все источники звука по умолчанию имеют маску 00 00 00 01, а это равно 1, и получается, что для редактирования звука на самом первом канале нужно выполнять побитовый сдвиг в скрипте ниже от маски на 1, т.е. маска переданная в качестве параметра скрипту, не будет соответствовать маске настроенной на источнике звука. 

Таким образом, чтобы контролировать звук на источнике, которому присвоена маска 00 00 00 01 через редактор - нужно крутить параметр Volume 0, а для того чтобы изменять его через код, нужно от маски источника отнять единицу и отправить в качестве первого параметра методу SetSourceVolume маску 00 00 00 00. Если назначить источнику маску  80 00 00 00 (последний 32 бит) и отправить методу , то приложение вообще вылетит.

	[Component(PropertyGuid = "0b246ee8b197d2ca83dda4482cc655ffcb73e777")]
	public class SoundVolumeController : Component
	{
		[ShowInEditor][Parameter(Title = "Slider parameter")] SliderParameter _sliderParameter;
		[ShowInEditor][Parameter(Title = "Set specific sound source")] bool _setSpecificSoundSource;
		[ShowInEditor][ParameterMask(Title = "Source volume mask", MaskType = ParameterMaskAttribute.TYPE.SOUND_SOURCE)][ParameterCondition(nameof(_setSpecificSoundSource), 1)] int _sourceVolumeMask;

		const float _maxPercentValue = 100f;

		int _soundVolume;
		public int SoundVolume
		{
			get => _soundVolume;
			set
			{
				_soundVolume = value;
				Scalar volume = (float)_soundVolume / _maxPercentValue;
				if (_setSpecificSoundSource)
					Unigine.Sound.SetSourceVolume(_sourceVolumeMask, volume);
				else
					Unigine.Sound.Volume = volume;

				SoundVolumeChanged?.Invoke();
			}
		}

		public static event Action SoundVolumeChanged;

		void Init()
		{
			_sliderParameter.VolumeChanged += SoundVolumeUpdate;
			SoundVolume = _sliderParameter.CurrentVolume;
		}

		void SoundVolumeUpdate(int newValue) => SoundVolume = newValue;
	}

 

Edited by sityrax
Link to comment

Здравствуйте! 

метод SetSourceVolume принимает не маску, а номер канала, т.е. номер маски. 

 

если вы хотите управлять громкостью через маску - можно пройтись по всем битам в маске и применить громкость к активным. 

    void SetSourceVolumeByMask(int mask, float volume)
    {
        for (int i = 0; i < 32; i++)
            if ((mask & (1 << i)) > 0)
                Sound.SetSourceVolume(i, volume);
    }

    [ShowInEditor][ParameterMask(Title = "Source volume mask", MaskType = ParameterMaskAttribute.TYPE.SOUND_SOURCE)] int _sourceVolumeMask1;
    [ShowInEditor][ParameterMask(Title = "Source volume mask", MaskType = ParameterMaskAttribute.TYPE.SOUND_SOURCE)] int _sourceVolumeMask2;

    void Update()
    {

        if (Input.IsKeyDown(Input.KEY.DIGIT_1))
            SetSourceVolumeByMask(_sourceVolumeMask1, 0);
        if (Input.IsKeyDown(Input.KEY.DIGIT_2))
            SetSourceVolumeByMask(_sourceVolumeMask1, 1);
        if (Input.IsKeyDown(Input.KEY.DIGIT_3))
            SetSourceVolumeByMask(_sourceVolumeMask2, 0);
        if (Input.IsKeyDown(Input.KEY.DIGIT_4))
            SetSourceVolumeByMask(_sourceVolumeMask2, 1);
    }

 
если источнику звука назначить маску 31 ( 1 << 31) то и в метод SetSourceVolume нужно передавать 31 а не 80 00 00 00 или 1 << 31 (2147483648). ничего отнимать не надо. поэтому и крашило, потому что в SetSourceVolume пытались изменить канал больше 31.

  • Thanks 1
Link to comment
  • bmyagkov changed the title to [SOLVED] SetSourceVolume does not affect the sound volume
×
×
  • Create New...