You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Moved most of the contents of FAudioDevice::FreeResource to USoundWave::FreeResources so that we can be sure that all memory is cleared up during teardown. Removed FreeResource function from some subclasses of audio device, as they weren't doing anything different than the base one. Also removed ListSounds function from these same classes as that seems to have fallen behind current base class version and isn't used anyway. Removed platform specific audio buffer storage so that there isn't confusion about which is being used and ensured that casts are used when necessary. Fixed compile issue with STAT_AudioResourceCreationTime for HTML5. [CL 2109273 by Matthew Griffin in Main branch]
174 lines
4.8 KiB
C++
174 lines
4.8 KiB
C++
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
/*------------------------------------------------------------------------------------
|
|
Audio includes.
|
|
------------------------------------------------------------------------------------*/
|
|
|
|
#include "AndroidAudioDevice.h"
|
|
#include "AudioDecompress.h"
|
|
#include "AudioEffect.h"
|
|
#include "Engine.h"
|
|
|
|
DEFINE_LOG_CATEGORY(LogAndroidAudio);
|
|
|
|
|
|
class FSLESAudioDeviceModule : public IAudioDeviceModule
|
|
{
|
|
public:
|
|
|
|
/** Creates a new instance of the audio device implemented by the module. */
|
|
virtual FAudioDevice* CreateAudioDevice() override
|
|
{
|
|
return new FSLESAudioDevice;
|
|
}
|
|
};
|
|
|
|
IMPLEMENT_MODULE(FSLESAudioDeviceModule, AndroidAudio );
|
|
/*------------------------------------------------------------------------------------
|
|
UALAudioDevice constructor and UObject interface.
|
|
------------------------------------------------------------------------------------*/
|
|
|
|
void FSLESAudioDevice::Teardown( void )
|
|
{
|
|
// Flush stops all sources and deletes all buffers so sources can be safely deleted below.
|
|
Flush( NULL );
|
|
|
|
// Destroy all sound sources
|
|
for( int32 i = 0; i < Sources.Num(); i++ )
|
|
{
|
|
delete Sources[ i ];
|
|
}
|
|
|
|
UE_LOG( LogAndroidAudio, Warning, TEXT("OpenSLES Tearing Down HW"));
|
|
|
|
// Teardown OpenSLES..
|
|
// Destroy the SLES objects in reverse order of creation:
|
|
if (SL_OutputMixObject)
|
|
{
|
|
(*SL_OutputMixObject)->Destroy(SL_OutputMixObject);
|
|
SL_OutputMixObject = NULL;
|
|
}
|
|
if (SL_EngineObject)
|
|
{
|
|
(*SL_EngineObject)->Destroy(SL_EngineObject);
|
|
SL_EngineObject = NULL;
|
|
SL_EngineEngine = NULL;
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------------------
|
|
UAudioDevice Interface.
|
|
------------------------------------------------------------------------------------*/
|
|
/**
|
|
* Initializes the audio device and creates sources.
|
|
*
|
|
* @warning:
|
|
*
|
|
* @return TRUE if initialization was successful, FALSE otherwise
|
|
*/
|
|
bool FSLESAudioDevice::InitializeHardware( void )
|
|
{
|
|
UE_LOG( LogAndroidAudio, Warning, TEXT("SL Entered Init HW"));
|
|
|
|
SLresult result;
|
|
|
|
UE_LOG( LogAndroidAudio, Warning, TEXT("OpenSLES Initializing HW"));
|
|
|
|
SLEngineOption EngineOption[] = { {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} };
|
|
|
|
// create engine
|
|
result = slCreateEngine( &SL_EngineObject, 1, EngineOption, 0, NULL, NULL);
|
|
//check(SL_RESULT_SUCCESS == result);
|
|
if (SL_RESULT_SUCCESS != result)
|
|
{
|
|
UE_LOG( LogAndroidAudio, Error, TEXT("Engine create failed %d"), int32(result));
|
|
}
|
|
|
|
// realize the engine
|
|
result = (*SL_EngineObject)->Realize(SL_EngineObject, SL_BOOLEAN_FALSE);
|
|
check(SL_RESULT_SUCCESS == result);
|
|
|
|
// get the engine interface, which is needed in order to create other objects
|
|
result = (*SL_EngineObject)->GetInterface(SL_EngineObject, SL_IID_ENGINE, &SL_EngineEngine);
|
|
check(SL_RESULT_SUCCESS == result);
|
|
|
|
// create output mix, with environmental reverb specified as a non-required interface
|
|
result = (*SL_EngineEngine)->CreateOutputMix( SL_EngineEngine, &SL_OutputMixObject, 0, NULL, NULL );
|
|
check(SL_RESULT_SUCCESS == result);
|
|
|
|
// realize the output mix
|
|
result = (*SL_OutputMixObject)->Realize(SL_OutputMixObject, SL_BOOLEAN_FALSE);
|
|
check(SL_RESULT_SUCCESS == result);
|
|
|
|
UE_LOG( LogAndroidAudio, Warning, TEXT("OpenSLES Initialized"));
|
|
// ignore unsuccessful result codes for env
|
|
|
|
|
|
// Default to sensible channel count.
|
|
if( MaxChannels < 1 )
|
|
{
|
|
MaxChannels = 12;
|
|
}
|
|
|
|
|
|
// Initialize channels.
|
|
for( int32 i = 0; i < FMath::Min( MaxChannels, 12 ); i++ )
|
|
{
|
|
FSLESSoundSource* Source = new FSLESSoundSource( this );
|
|
Sources.Add( Source );
|
|
FreeSources.Add( Source );
|
|
}
|
|
|
|
if( Sources.Num() < 1 )
|
|
{
|
|
UE_LOG( LogAndroidAudio, Warning, TEXT( "OpenSLAudio: couldn't allocate any sources" ) );
|
|
return false;
|
|
}
|
|
|
|
// Update MaxChannels in case we couldn't create enough sources.
|
|
MaxChannels = Sources.Num();
|
|
UE_LOG( LogAndroidAudio, Warning, TEXT( "OpenSLAudioDevice: Allocated %i sources" ), MaxChannels );
|
|
|
|
// Set up a default (nop) effects manager
|
|
Effects = new FAudioEffectsManager( this );
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Update the audio device and calculates the cached inverse transform later
|
|
* on used for spatialization.
|
|
*
|
|
* @param Realtime whether we are paused or not
|
|
*/
|
|
void FSLESAudioDevice::Update( bool Realtime )
|
|
{
|
|
//Super::Update( Realtime );
|
|
|
|
//@todo android: UDPATE LISTENERS - Android OpenSLES doesn't support 3D, is there anything to do here?
|
|
}
|
|
|
|
FSoundSource* FSLESAudioDevice::CreateSoundSource()
|
|
{
|
|
return new FSLESSoundSource(this);
|
|
}
|
|
|
|
bool FSLESAudioDevice::HasCompressedAudioInfoClass(USoundWave* SoundWave)
|
|
{
|
|
#if WITH_OGGVORBIS
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
class ICompressedAudioInfo* FSLESAudioDevice::CreateCompressedAudioInfo(USoundWave* SoundWave)
|
|
{
|
|
#if WITH_OGGVORBIS
|
|
return new FVorbisAudioInfo();
|
|
#else
|
|
return NULL;
|
|
#endif
|
|
}
|