Exemplo n.º 1
0
bool FAudioDeviceManager::ShutdownAllAudioDevices()
{
	for (FAudioDevice* AudioDevice : Devices)
	{
		if (AudioDevice)
		{
			ShutdownAudioDevice(AudioDevice->DeviceHandle);
		}
	}

	check(NumActiveAudioDevices == 0);
	check(NumWorldsUsingMainAudioDevice == 0);

	return true;
}
bool FAudioDeviceManager::CreateAudioDevice(bool bCreateNewDevice, FCreateAudioDeviceResults& OutResults)
{
	OutResults = FCreateAudioDeviceResults();

	// If we don't have an audio device module, then we can't create new audio devices.
	if (AudioDeviceModule == nullptr)
	{
		return false;
	}

	// If we are running without the editor, we only need one audio device.
	if (!GIsEditor)
	{
		if (NumActiveAudioDevices == 1)
		{
			FAudioDevice* MainAudioDevice = GEngine->GetMainAudioDevice();
			if (MainAudioDevice)
			{
				OutResults.Handle = MainAudioDevice->DeviceHandle;
				OutResults.AudioDevice = MainAudioDevice;
				return true;
			}
			return false;
		}
	}

	if (NumActiveAudioDevices < AUDIO_DEVICE_DEFAULT_ALLOWED_DEVICE_COUNT || (bCreateNewDevice && NumActiveAudioDevices < AUDIO_DEVICE_MAX_DEVICE_COUNT))
	{
		// Create the new audio device and make sure it succeeded
		OutResults.AudioDevice = AudioDeviceModule->CreateAudioDevice();
		if (OutResults.AudioDevice == nullptr)
		{
			return false;
		}

		// Now generation a new audio device handle for the device and store the
		// ptr to the new device in the array of audio devices.

		uint32 AudioDeviceIndex(INDEX_NONE);

		// First check to see if we should start recycling audio device indices, if not
		// then we add a new entry to the Generation array and generate a new index
		if (FreeIndicesSize > AUDIO_DEVICE_MINIMUM_FREE_AUDIO_DEVICE_INDICES)
		{
			FreeIndices.Dequeue(AudioDeviceIndex);
			--FreeIndicesSize;
			check(int32(AudioDeviceIndex) < Devices.Num());
			check(Devices[AudioDeviceIndex] == nullptr);
			Devices[AudioDeviceIndex] = OutResults.AudioDevice;
		}
		else
		{
			// Add a zeroth generation entry in the Generation array, get a brand new
			// index and append the created device to the end of the Devices array

			Generations.Add(0);
			AudioDeviceIndex = Generations.Num() - 1;
			check(AudioDeviceIndex < (1 << AUDIO_DEVICE_HANDLE_INDEX_BITS));
			Devices.Add(OutResults.AudioDevice);
		}

		OutResults.bNewDevice = true;
		OutResults.Handle = CreateHandle(AudioDeviceIndex, Generations[AudioDeviceIndex]);

		// Store the handle on the audio device itself
		OutResults.AudioDevice->DeviceHandle = OutResults.Handle;
	}
	else
	{
		++NumWorldsUsingMainAudioDevice;
		FAudioDevice* MainAudioDevice = GEngine->GetMainAudioDevice();
		if (MainAudioDevice)
		{
			OutResults.Handle = MainAudioDevice->DeviceHandle;
			OutResults.AudioDevice = MainAudioDevice;
		}
	}

	++NumActiveAudioDevices;

	const UAudioSettings* AudioSettings = GetDefault<UAudioSettings>();
	if (!OutResults.AudioDevice->Init(AudioSettings->GetQualityLevelSettings(GEngine->GetGameUserSettings()->GetAudioQualityLevel()).MaxChannels))
	{
		ShutdownAudioDevice(OutResults.Handle);
		OutResults = FCreateAudioDeviceResults();
	}

	return (OutResults.AudioDevice != nullptr);
}