Files
UnrealEngineUWP/Engine/Source/Runtime/HTML5/HTML5Audio/Public/HTML5AudioDevice.h
2014-03-14 14:13:41 -04:00

272 lines
7.1 KiB
C++

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
/*=============================================================================
ALAudioDevice.h: Unreal OpenAL audio interface object.
=============================================================================*/
#pragma once
/*------------------------------------------------------------------------------------
Dependencies, helpers & forward declarations.
------------------------------------------------------------------------------------*/
class FALAudioDevice;
#include "Engine.h"
#include "SoundDefinitions.h"
#include "AudioEffect.h"
#if SUPPORTS_PRAGMA_PACK
#pragma pack (push,8)
#endif
#define AL_NO_PROTOTYPES 1
#define ALC_NO_PROTOTYPES 1
#include "AL/al.h"
#include "AL/alc.h"
#if SUPPORTS_PRAGMA_PACK
#pragma pack (pop)
#endif
/**
* OpenAL implementation of FSoundBuffer, containing the wave data and format information.
*/
class FALSoundBuffer : public FSoundBuffer
{
public:
/**
* Constructor
*
* @param AudioDevice audio device this sound buffer is going to be attached to.
*/
FALSoundBuffer( FALAudioDevice* AudioDevice );
/**
* Destructor
*
* Frees wave data and detaches itself from audio device.
*/
~FALSoundBuffer( void );
/**
* Static function used to create a buffer.
*
* @param InWave USoundWave to use as template and wave source
* @param AudioDevice Audio device to attach created buffer to
* @return FALSoundBuffer pointer if buffer creation succeeded, NULL otherwise
*/
static FALSoundBuffer* Init( FALAudioDevice* ,USoundWave* );
/**
* Static function used to create a IOSAudio buffer and upload decompressed ogg vorbis data to.
*
* @param Wave USoundWave to use as template and wave source
* @param AudioDevice audio device to attach created buffer to
* @return FIOSAudioSoundBuffer pointer if buffer creation succeeded, NULL otherwise
*/
static FALSoundBuffer* CreateNativeBuffer(FALAudioDevice* , USoundWave* );
/**
* Returns the size of this buffer in bytes.
*
* @return Size in bytes
*/
int GetSize( void )
{
return( BufferSize );
}
/**
* Returns the number of channels for this buffer
*/
int GetNumChannels( void )
{
return( NumChannels );
}
/** Audio device this buffer is attached to */
FALAudioDevice* AudioDevice;
/** Array of buffer ids used to reference the data stored in AL. */
ALuint BufferIds[2];
/** Resource ID of associated USoundeWave */
int ResourceID;
/** Human readable name of resource, most likely name of UObject associated during caching. */
FString ResourceName;
/** Format of the data internal to OpenAL */
ALuint InternalFormat;
/** Number of bytes stored in OpenAL, or the size of the ogg vorbis data */
int BufferSize;
/** The number of channels in this sound buffer - should be directly related to InternalFormat */
int NumChannels;
/** Sample rate of the ogg vorbis data - typically 44100 or 22050 */
int SampleRate;
};
/**
* OpenAL implementation of FSoundSource, the interface used to play, stop and update sources
*/
class FALSoundSource : public FSoundSource
{
public:
/**
* Constructor
*
* @param InAudioDevice audio device this source is attached to
*/
FALSoundSource( class FAudioDevice* InAudioDevice )
: FSoundSource( InAudioDevice ),
SourceId( 0 ),
Buffer( NULL )
{}
/**
* Destructor
*/
~FALSoundSource( void );
/**
* Initializes a source with a given wave instance and prepares it for playback.
*
* @param WaveInstance wave instance being primed for playback
* @return TRUE if initialization was successful, FALSE otherwise
*/
virtual bool Init( FWaveInstance* WaveInstance );
/**
* Updates the source specific parameter like e.g. volume and pitch based on the associated
* wave instance.
*/
virtual void Update( void );
/**
* Plays the current wave instance.
*/
virtual void Play( void );
/**
* Stops the current wave instance and detaches it from the source.
*/
virtual void Stop( void );
/**
* Pauses playback of current wave instance.
*/
virtual void Pause( void );
/**
* Queries the status of the currently associated wave instance.
*
* @return TRUE if the wave instance/ source has finished playback and FALSE if it is
* currently playing or paused.
*/
virtual bool IsFinished( void );
/**
* Access function for the source id
*/
ALuint GetSourceId( void ) const { return( SourceId ); }
/**
* Returns TRUE if an OpenAL source has finished playing
*/
bool IsSourceFinished( void );
/**
* Handle dequeuing and requeuing of a single buffer
*/
void HandleQueuedBuffer( void );
protected:
/** OpenAL source voice associated with this source/ channel. */
ALuint SourceId;
/** Cached sound buffer associated with currently bound wave instance. */
FALSoundBuffer* Buffer;
friend class FALAudioDevice;
};
/**
* OpenAL implementation of an Unreal audio device.
*/
class FALAudioDevice : public FAudioDevice
{
public:
FALAudioDevice() {}
virtual ~FALAudioDevice() {}
virtual FName GetRuntimeFormat() OVERRIDE
{
static FName NAME_OGG(TEXT("OGG"));
return NAME_OGG;
}
/** Starts up any platform specific hardware/APIs */
virtual bool InitializeHardware() OVERRIDE;
/**
* Update the audio device and calculates the cached inverse transform later
* on used for spatialization.
*
* @param Realtime whether we are paused or not
*/
virtual void Update( bool bGameTicking );
/**
* Lists all the loaded sounds and their memory footprint
*/
virtual void ListSounds( const TCHAR* Cmd, FOutputDevice& Ar );
/**
* Frees the bulk resource data associated with this SoundNodeWave.
*
* @param SoundNodeWave wave object to free associated bulk data
*/
virtual void FreeResource( USoundWave* SoundWave );
void FindProcs( bool AllowExt );
// Error checking.
bool alError( const TCHAR* Text, bool Log = 1 );
protected:
virtual FSoundSource* CreateSoundSource() OVERRIDE;
/** Returns the enum for the internal format for playing a sound with this number of channels. */
ALuint GetInternalFormat( int NumChannels );
// Dynamic binding.
void FindProc( void*& ProcAddress, char* Name, char* SupportName, bool& Supports, bool AllowExt );
bool FindExt( const TCHAR* Name );
/**
* Tears down audio device by stopping all sounds, removing all buffers, destroying all sources, ... Called by both Destroy and ShutdownAfterError
* to perform the actual tear down.
*/
void Teardown( void );
// Variables.
/** All loaded resident buffers */
TArray<FALSoundBuffer*> Buffers;
/** Map from resource ID to sound buffer */
TMap<int, FALSoundBuffer*> WaveBufferMap;
/** Next resource ID value used for registering USoundWave objects */
int NextResourceID;
// AL specific
/** Device/context used to play back sounds (static so it can be initialized early) */
static ALCdevice* HardwareDevice;
static ALCcontext* SoundContext;
void* DLLHandle;
/** Formats for multichannel sounds */
ALenum Surround40Format;
ALenum Surround51Format;
ALenum Surround61Format;
ALenum Surround71Format;
friend class FALSoundBuffer;
};