private PropagatingSpeaker GetNextFree(int required) { for (int i = 0; i < audioSourcePool.Length; i++) { if (!audioSourcePool[poolIndex].Connected) { PropagatingSpeaker ps = audioSourcePool[poolIndex]; ps.Connected = true; return(ps); } poolIndex = (poolIndex + 1) % AudioClipPoolSize; } // Run "Garbage Collector" before extending pool if (GarbageCollect(required)) { poolIndex = 0; return(GetNextFree(required)); } else { if (AutoExtendAudioPool) { Debug.Log("Extending Audio Pool, initial size was not enough"); ExtendPool(required); return(GetNextFree(required)); } else { Debug.Log("Propagating Audio Pool ran out of audio sources"); return(null); } } }
private bool ConnectSpeakers(PropagatingAudioSource host) { if (!IsConnected(host)) { PropagatingSoundGateway[] gateways = RoomToNeighbourPositions[host.HostRoom]; PropagatingSpeaker[] speakers = new PropagatingSpeaker[gateways.Length]; for (int i = 0; i < speakers.Length; i++) { PropagatingSpeaker speaker = GetNextFree(speakers.Length); if (speaker == null) { FreeSpeakers(speakers); return(false); } else { speaker.Dampening = gateways[i].Dampening; speakers[i] = speaker; } } // All required speakers are available - position them correctly for (int i = 0; i < speakers.Length; i++) { speakers[i].audioSource.transform.position = gateways[i].SoundTarget; SpeakerToOrigin[speakers[i]] = host; } ConnectedSpeakers[host] = speakers; } return(true); }