...
[SerializeField] private AudioSource music2Source;

private AudioSource _activeMusic;        
private AudioSource _inactiveMusic;

public float crossFadeRate = 1.5f;
private bool _crossFading;          
...
public float musicVolume {
   ...
   set {
      _musicVolume = value;

      if (music1Source != null && !_crossFading) {
         music1Source.volume = _musicVolume;
         music2Source.volume = _musicVolume;    
      }
   }
}
...
public bool musicMute {
   ...
   set {
      if (music1Source != null) {
         music1Source.mute = value;
         music2Source.mute = value;
      }
   }
}

public void Startup(NetworkService service) {
   Debug.Log("Uruchomienie menedżera dźwięku...");

   _network = service;

   music1Source.ignoreListenerVolume = true;
   music2Source.ignoreListenerVolume = true;
   music1Source.ignoreListenerPause = true;
   music2Source.ignoreListenerPause = true;
   soundVolume = 1f;
   musicVolume = 1f;

   _activeMusic = music1Source;    
   _inactiveMusic = music2Source;

   status = ManagerStatus.Started;
}
...
private void PlayMusic(AudioClip clip) {
   if (_crossFading) {return;}
   StartCoroutine(CrossFadeMusic(clip));  
}

private IEnumerator CrossFadeMusic(AudioClip clip) {
   _crossFading = true;

   _inactiveMusic.clip = clip;
   _inactiveMusic.volume = 0;
   _inactiveMusic.Play();

   float scaledRate = crossFadeRate * _musicVolume;
   while (_activeMusic.volume > 0) {
      _activeMusic.volume -= scaledRate * Time.deltaTime;
      _inactiveMusic.volume += scaledRate * Time.deltaTime;

      yield return null;       
   }

   AudioSource temp = _activeMusic;    
   
   _activeMusic = _inactiveMusic;
   _activeMusic.volume = _musicVolume;

   _inactiveMusic = temp;
   _inactiveMusic.Stop();

   _crossFading = false;
}

public void StopMusic() {
   _activeMusic.Stop();
   _inactiveMusic.Stop();
}
...
