Wwise 버전

include/AK/SoundEngine/Common/IAkPlugin.h

Go to the documentation of this file.
00001 
00002 //
00003 // Copyright (c) 2006 Audiokinetic Inc. / All Rights Reserved
00004 //
00006 
00009 
00010 #ifndef _IAK_PLUGIN_H_
00011 #define _IAK_PLUGIN_H_
00012 
00013 #include <AK/SoundEngine/Common/AkCommonDefs.h>
00014 #include <AK/SoundEngine/Common/IAkRTPCSubscriber.h>
00015 #include <AK/SoundEngine/Common/IAkPluginMemAlloc.h>
00016 #include <AK/SoundEngine/Common/AkFPUtilities.h>
00017 #include <AK/Tools/Common/AkLock.h>
00018 #include <AK/Tools/Common/AkPlatformFuncs.h>
00019 #include <AK/Tools/Common/AkMonitorError.h>
00020 #include <AK/SoundEngine/Common/AkSoundEngineExport.h>
00021 #include <AK/SoundEngine/Common/IAkProcessorFeatures.h>
00022 #include <AK/SoundEngine/Common/AkMidiTypes.h>
00023 
00024 #ifndef AK_WII
00025 // math.h may cause conflicts on the Wii due to inclusion order.
00026 #include <math.h>
00027 #endif
00028 
00029 #if defined AK_CPU_X86  || defined AK_CPU_X86_64
00030 #include <xmmintrin.h>
00031 #endif
00032 
00033 #ifdef AK_XBOX360
00034 #include "ppcintrinsics.h"
00035 #endif
00036 
00037 #ifdef __PPU__
00038 #include <altivec.h>
00039 #include <ppu_intrinsics.h>
00040 #include <stdlib.h>
00041 #include <string.h>
00042 #endif
00043 
00044 #ifdef AK_PS3
00045 #include <AK/Plugin/PluginServices/PS3/MultiCoreServices.h>
00046 #endif
00047 
00048 #ifdef AK_WII
00049 #include <revolution/ax.h>
00050 #endif
00051 
00052 #ifdef AK_WIIU
00053 #include <cafe/ax.h>
00054 #endif
00055 
00056 #ifdef AK_3DS
00057 #include <nn/snd.h>
00058 #endif
00059 
00060 #ifdef AK_VITA_HW
00061 #include <ngs.h>
00062 #endif
00063 
00064 /*#ifdef AK_PS4
00065 #include <audioout.h>
00066 #endif*/
00067 
00068 
00072 enum AkPluginType
00073 {
00074     AkPluginTypeNone            = 0,    
00075     AkPluginTypeCodec           = 1,    
00076     AkPluginTypeSource          = 2,    
00077     AkPluginTypeEffect          = 3,    
00078     AkPluginTypeMotionDevice    = 4,    
00079     AkPluginTypeMotionSource    = 5,    
00080     AkPluginTypeMixer           = 6,    
00081     AkPluginTypeSink            = 7,    
00082     AkPluginTypeMask            = 0xf   
00083 };
00084 
00090 struct AkPluginInfo
00091 {
00092     AkPluginType eType;            
00093     bool         bIsInPlace;       
00094     bool         bIsAsynchronous;  
00095 };
00096 
00097 namespace AK
00098 {
00099     class IAkStreamMgr;
00100 
00102     class IAkGameObjectPluginInfo
00103     {
00104     protected:
00106         virtual ~IAkGameObjectPluginInfo(){}
00107 
00108     public:
00109 
00111         virtual AkGameObjectID GetGameObjectID() const = 0;
00112 
00127         virtual AkUInt32 GetNumEmitterListenerPairs() const = 0;
00128 
00143         virtual AKRESULT GetEmitterListenerPair(
00144             AkUInt32 in_uIndex,             
00145             AkEmitterListenerPair & out_emitterListenerPair 
00146             ) const = 0;
00147 
00154         virtual AkUInt32 GetNumGameObjectPositions() const = 0;
00155         
00164         virtual AKRESULT GetGameObjectPosition(
00165             AkUInt32 in_uIndex,             
00166             AkSoundPosition & out_position  
00167             ) const = 0;
00168 
00174         virtual SoundEngine::MultiPositionType GetGameObjectMultiPositionType() const = 0;
00175 
00179         virtual AkReal32 GetGameObjectScaling() const = 0;
00180 
00189         virtual AkUInt32 GetListenerMask() const = 0;
00190 
00199         virtual AKRESULT GetListenerData(
00200             AkUInt32 in_uListenerMask,      
00201             AkListener & out_listener       
00202             ) const = 0;
00203     };
00204 
00207     class IAkVoicePluginInfo : public IAkGameObjectPluginInfo
00208     {
00209     protected:
00211         virtual ~IAkVoicePluginInfo(){}
00212 
00213     public:
00214 
00216         virtual AkPlayingID GetPlayingID() const = 0;
00217 
00220         virtual AkPriority GetPriority() const = 0;
00221 
00224         virtual AkPriority ComputePriorityWithDistance(
00225             AkReal32 in_fDistance               
00226             ) const = 0;
00227     };
00228 
00230     class IAkPluginContextBase
00231     {
00232     protected:
00234         virtual ~IAkPluginContextBase(){}
00235 
00236     public:
00237 
00239         virtual IAkStreamMgr * GetStreamMgr() const = 0;
00240 
00244         virtual AkUInt16 GetMaxBufferLength() const = 0;
00245 
00253         virtual AKRESULT GetOutputID(
00254             AkUInt32 &          out_uOutputID,      
00255             AkUInt32 &          out_uDeviceType     
00256             ) const = 0;
00257 
00262         virtual void GetPluginMedia( 
00263             AkUInt32 in_dataIndex,      
00264             AkUInt8* &out_rpData,       
00265             AkUInt32 &out_rDataSize     
00266             ) = 0;
00267 
00274         virtual AKRESULT PostMonitorMessage(
00275             const char* in_pszError,                
00276             AK::Monitor::ErrorLevel in_eErrorLevel  
00277             ) = 0;
00278         
00292         virtual AKRESULT PostMonitorData(
00293             void *      in_pData,       
00294             AkUInt32    in_uDataSize    
00295             ) = 0;
00296 
00303         virtual bool     CanPostMonitorData() = 0;
00304 
00305 #if (defined AK_CPU_X86 || defined AK_CPU_X86_64) && !(defined AK_IOS)
00306 
00307         virtual IAkProcessorFeatures * GetProcessorFeatures() = 0;
00308 #endif
00309     };
00310 
00314     class IAkEffectPluginContext : public IAkPluginContextBase
00315     {
00316     protected:
00318         virtual ~IAkEffectPluginContext(){}
00319 
00320     public:
00321 
00325         virtual bool IsSendModeEffect() const = 0;
00326 
00329         virtual IAkVoicePluginInfo * GetVoiceInfo() = 0;
00330     };
00331 
00335     class IAkSourcePluginContext : public IAkPluginContextBase
00336     {
00337     protected:
00339         virtual ~IAkSourcePluginContext(){}
00340 
00341     public:
00342 
00345         virtual AkUInt16 GetNumLoops() const = 0;
00346 
00349         virtual IAkVoicePluginInfo * GetVoiceInfo() = 0;
00350 
00354         virtual AkMidiEvent GetMidiEvent() const = 0;
00355     };
00356 
00358     class IAkMixerPluginContext : public IAkPluginContextBase
00359     {
00360     protected:
00362         virtual ~IAkMixerPluginContext(){}
00363 
00364     public:
00365 
00369         virtual AkUniqueID GetBusID() = 0;
00370 
00375         virtual AkBusType GetBusType() = 0;
00376 
00379         virtual AkReal32 GetDownstreamGain() = 0;
00380 
00397         virtual AKRESULT GetSpeakerAngles(
00398             AkReal32 *          io_pfSpeakerAngles,         
00399             AkUInt32 &          io_uNumAngles,              
00400             AkReal32 &          out_fHeightAngle            
00401             ) = 0;
00402 
00404 
00405 
00407         virtual void ComputeSpeakerVolumesDirect(
00408             AkChannelConfig     in_inputConfig,             
00409             AkChannelConfig     in_outputConfig,            
00410             AkReal32            in_fCenterPerc,             
00411             AK::SpeakerVolumes::MatrixPtr out_mxVolumes     
00412             ) = 0;
00413 
00415         virtual void ComputeSpeakerVolumesPanner(
00416             const AkVector &    in_position,                
00417             AkReal32            in_fCenterPct,              
00418             AkChannelConfig     in_inputConfig,             
00419             AkChannelConfig     in_outputConfig,            
00420             AK::SpeakerVolumes::MatrixPtr out_mxVolumes     
00421             ) = 0;
00422 
00424         virtual AKRESULT ComputePlanarVBAPGains( 
00425             AkReal32            in_fAngle,                  
00426             AkChannelConfig     in_outputConfig,            
00427             AkReal32            in_fCenterPerc,             
00428             AK::SpeakerVolumes::VectorPtr out_vVolumes      
00429             ) = 0;
00430 
00432         virtual AKRESULT InitSphericalVBAP( 
00433             AK::IAkPluginMemAlloc* in_pAllocator,           
00434             const AkSphericalCoord* in_SphericalPositions,  
00435             const AkUInt32 in_NbPoints,                     
00436             void *& out_pPannerData                         
00437             ) = 0;
00438 
00440         virtual AKRESULT ComputeSphericalVBAPGains( 
00441             void*               in_pPannerData,             
00442             AkReal32            in_fAzimuth,                
00443             AkReal32            in_fElevation,              
00444             AkUInt32            in_uNumChannels,            
00445             AK::SpeakerVolumes::VectorPtr out_vVolumes      
00446             ) = 0;
00447 
00449         virtual AKRESULT TermSphericalVBAP( 
00450             AK::IAkPluginMemAlloc*  in_pAllocator,          
00451             void*                   in_pPannerData          
00452             ) = 0;
00453     
00455         virtual AKRESULT Compute3DPositioning( 
00456             AkReal32            in_fAngle,                  
00457             AkReal32            in_fSpread,                 
00458             AkReal32            in_fFocus,                  
00459             AkChannelConfig     in_inputConfig,             
00460             AkChannelConfig     in_outputConfig,            
00461             AkReal32            in_fCenterPerc,             
00462             AK::SpeakerVolumes::MatrixPtr out_mxVolumes     
00463             ) = 0;
00464 
00466         virtual void MixNinNChannels(
00467             AkAudioBuffer * in_pInputBuffer,                
00468             AkAudioBuffer * in_pMixBuffer,                  
00469             AkReal32        in_fPrevGain,                   
00470             AkReal32        in_fNextGain,                   
00471             AK::SpeakerVolumes::MatrixPtr in_mxPrevVolumes, 
00472             AK::SpeakerVolumes::MatrixPtr in_mxNextVolumes  
00473             ) = 0;
00474             
00476         virtual void Mix1inNChannels(
00477             AkReal32 * AK_RESTRICT in_pInChannel,           
00478             AkAudioBuffer * in_pMixBuffer,                  
00479             AkReal32        in_fPrevGain,                   
00480             AkReal32        in_fNextGain,                   
00481             AK::SpeakerVolumes::VectorPtr in_vPrevVolumes,  
00482             AK::SpeakerVolumes::VectorPtr in_vNextVolumes   
00483             ) = 0;
00484 
00486         virtual void MixChannel(
00487             AkReal32 * AK_RESTRICT in_pInBuffer,            
00488             AkReal32 * AK_RESTRICT in_pOutBuffer,           
00489             AkReal32        in_fPrevGain,                   
00490             AkReal32        in_fNextGain,                   
00491             AkUInt16        in_uNumFrames                   
00492             ) = 0;
00493 
00495 
00497 
00498         
00503         virtual void EnableMetering( AkMeteringFlags in_eFlags ) = 0;
00504     };
00505 
00511     class IAkPluginParam : public IAkRTPCSubscriber
00512     {
00513     protected:
00515         virtual ~IAkPluginParam(){}
00516 
00517     public:
00523         virtual IAkPluginParam * Clone( 
00524             IAkPluginMemAlloc * in_pAllocator   
00525             ) = 0;
00526 
00534         virtual AKRESULT Init( 
00535             IAkPluginMemAlloc * in_pAllocator,      
00536             const void *        in_pParamsBlock,    
00537             AkUInt32            in_uBlockSize       
00538             ) = 0;
00539 
00545         virtual AKRESULT Term( 
00546             IAkPluginMemAlloc * in_pAllocator       
00547             ) = 0;  
00548 
00553         virtual AKRESULT SetParamsBlock( 
00554             const void *in_pParamsBlock,    
00555             AkUInt32    in_uBlockSize       
00556             ) = 0;
00557 
00563         virtual AKRESULT SetParam( 
00564             AkPluginParamID in_paramID,     
00565             const void *    in_pValue,      
00566             AkUInt32        in_uParamSize   
00567             ) = 0;
00568 
00576         static const AkPluginParamID ALL_PLUGIN_DATA_ID = 0x7FFF;
00577     };
00578 
00582     class IAkPlugin
00583     {
00584     protected:
00586         virtual ~IAkPlugin(){}
00587 
00588     public:
00594         virtual AKRESULT Term( 
00595             IAkPluginMemAlloc * in_pAllocator   
00596             ) = 0;
00597 
00603         virtual AKRESULT Reset() = 0;
00604 
00610         virtual AKRESULT GetPluginInfo( 
00611             AkPluginInfo & out_rPluginInfo  
00612             ) = 0;
00613 
00621         virtual bool SupportMediaRelocation() const
00622         {
00623             return false;
00624         }
00625 
00638         virtual AKRESULT RelocateMedia( 
00639             AkUInt8* /*in_pNewMedia*/,  
00640             AkUInt8* /*in_pOldMedia*/ 
00641             )
00642         {
00643             return AK_NotImplemented;
00644         }
00645 
00646     };
00647 
00649     class IAkEffectPlugin : public IAkPlugin
00650     {
00651     protected:
00653         virtual ~IAkEffectPlugin(){}
00654 
00655     public:
00660         virtual AKRESULT Init( 
00661             IAkPluginMemAlloc *         in_pAllocator,              
00662             IAkEffectPluginContext *    in_pEffectPluginContext,    
00663             IAkPluginParam *            in_pParams,                 
00664             AkAudioFormat &             io_rFormat                  
00665             ) = 0;
00666 
00667 #if defined AK_WII_FAMILY_HW
00668 
00669         virtual AXAuxCallback GetFXCallback() = 0;
00670 
00672         virtual void* GetFXParams() = 0;
00673 
00679         virtual AkUInt32 GetTailTime() = 0;
00680 #endif
00681 #ifdef AK_3DS
00682 
00683         virtual void Update() = 0;
00684 
00686         virtual nn::snd::CTR::AuxCallback GetFXCallback() = 0;
00687 
00693         virtual AkUInt32 GetTailTime() = 0;
00694 #endif
00695 #ifdef AK_VITA_HW
00696         virtual const SceNgsVoiceDefinition * GetVoiceDefinition(){ AKASSERT( false && "Non hardware plugin called on Vita HW" ); return NULL; }
00697         virtual AKRESULT AttachVoice( SceNgsHVoice in_hVoice){ AKASSERT( false && "Non hardware plugin called on Vita HW" ); return AK_Fail; }
00698         virtual AkReal32 GetTailTime() const { AKASSERT( false && "Non hardware plugin called on Vita HW" ); return 0; }
00699         virtual AKRESULT SetBypass( SceUInt32 in_uBypassFlag ) { AKASSERT( false && "Non hardware plugin called on Vita HW" ); return AK_Fail; }
00700 #endif
00701     };
00702 
00704     class IAkInPlaceEffectPlugin : public IAkEffectPlugin
00705     {
00706     public:
00714         virtual void Execute( 
00715                 AkAudioBuffer *                         io_pBuffer      
00716 #ifdef AK_PS3
00717                 , AK::MultiCoreServices::DspProcess*&   out_pDspProcess 
00718 #endif
00719                 ) = 0;      
00720 
00724         virtual AKRESULT TimeSkip( 
00725             AkUInt32 in_uFrames 
00726             ) = 0;
00727     };
00728         
00729 
00731     class IAkOutOfPlaceEffectPlugin : public IAkEffectPlugin
00732     {
00733     public:
00740         virtual void Execute( 
00741                 AkAudioBuffer *                         in_pBuffer,     
00742                 AkUInt32                                in_uInOffset,   
00743                 AkAudioBuffer *                         out_pBuffer     
00744 #ifdef AK_PS3
00745                 , AK::MultiCoreServices::DspProcess*&   out_pDspProcess 
00746 #endif
00747                 ) = 0;
00748 
00752         virtual AKRESULT TimeSkip(
00753             AkUInt32 &io_uFrames    
00754             ) = 0;
00755     };
00756 
00758     class IAkMixerInputContext
00759     {
00760     protected:
00762         virtual ~IAkMixerInputContext(){}
00763 
00764     public:
00765 
00770         virtual IAkPluginParam * GetInputParam() = 0;
00771 
00774         virtual IAkVoicePluginInfo * GetVoiceInfo() = 0;
00775 
00778         virtual AkConnectionType GetConnectionType() = 0;
00779 
00789         virtual AkUniqueID GetAudioNodeID() = 0;
00790 
00794         virtual void * GetUserData() = 0;
00795 
00799         virtual void SetUserData( void * in_pUserData ) = 0;
00800 
00803 
00804 
00808         virtual bool IsPositioningEnabled() = 0;
00809 
00815         virtual AkReal32 GetCenterPerc() = 0;
00816         
00821         virtual AkPannerType GetPannerType() = 0;
00822 
00827         virtual AkPositionSourceType GetPositionSourceType() = 0;
00828 
00835         virtual void GetPannerPosition(
00836             AkVector & out_position         
00837             ) = 0;
00838 
00842         virtual AkUInt32 GetNum3DPositions() = 0;
00843 
00852         virtual AKRESULT Get3DPosition(
00853             AkUInt32 in_uIndex,                         
00854             AkEmitterListenerPair & out_soundPosition   
00855             ) = 0;
00856 
00863         virtual AkReal32 GetSpread(
00864             AkUInt32 in_uIndex              
00865             ) = 0;
00866 
00873         virtual AkReal32 GetFocus(
00874             AkUInt32 in_uIndex              
00875             ) = 0;
00876 
00879         virtual bool GetMaxAttenuationDistance(
00880             AkReal32 & out_fMaxAttenuationDistance  
00881             ) = 0;
00882         
00884         virtual void GetSpatializedVolumes(
00885             AK::SpeakerVolumes::MatrixPtr out_mxPrevVolumes,    
00886             AK::SpeakerVolumes::MatrixPtr out_mxNextVolumes     
00887             ) = 0;
00888         
00890     };
00891 
00895     class IAkSinkPluginContext : public IAkPluginContextBase
00896     {
00897     protected:
00899         virtual ~IAkSinkPluginContext(){}
00900 
00901     public:
00902         
00908         virtual bool IsPrimary() = 0;
00909         
00924         virtual AKRESULT SignalAudioThread() = 0;
00925 
00928         virtual AkUInt16 GetNumRefillsInVoice() = 0;
00929     };
00930     
00932     class IAkSinkPlugin : public IAkPlugin
00933     {
00934     public:
00935 
00938         virtual AKRESULT Init(
00939             IAkPluginMemAlloc *     in_pAllocator,          
00940             IAkSinkPluginContext *  in_pSinkPluginContext,  
00941             AkAudioFormat &         io_rFormat              
00942             ) = 0;
00943 
00951         virtual AKRESULT IsDataNeeded( 
00952             AkUInt32 &              out_uNumFramesNeeded    
00953             ) = 0;
00954 
00963         virtual void Consume(
00964             AkAudioBuffer *         in_pInputBuffer,        
00965             AkRamp                  in_gain                 
00966             ) = 0;
00967 
00971         virtual void OnFrameEnd() = 0;
00972 
00975         virtual bool IsStarved() = 0;
00976 
00978         virtual void ResetStarved() = 0;
00979     };
00980 
00982     class IAkSourcePlugin : public IAkPlugin
00983     {
00984     protected:
00986         virtual ~IAkSourcePlugin(){}
00987 
00988     public:
00993         virtual AKRESULT Init( 
00994             IAkPluginMemAlloc *         in_pAllocator,                  
00995             IAkSourcePluginContext *    in_pSourcePluginContext,        
00996             IAkPluginParam *            in_pParams,                     
00997             AkAudioFormat &             io_rFormat                      
00998             ) = 0;
00999 
01004         virtual AkReal32 GetDuration() const = 0;
01005 
01013         virtual AkReal32 GetEnvelope() const 
01014         { 
01015             return 1.f;
01016         }
01017 
01027         virtual AKRESULT StopLooping(){ return AK_Success; }
01028 
01041         virtual AKRESULT Seek( 
01042             AkUInt32 /* in_uPosition */ 
01043             ) { return AK_Success; }
01044 
01051         virtual AKRESULT TimeSkip(
01052             AkUInt32 & /*io_uFrames */ 
01053             ) { return AK_NotImplemented; }
01054 
01060         virtual void Execute( 
01061                 AkAudioBuffer *                         io_pBuffer      
01062 #ifdef AK_PS3
01063                 , AK::MultiCoreServices::DspProcess*&   out_pDspProcess 
01064 #endif
01065                 ) = 0;
01066     };
01067 
01068 #if defined AK_WII
01069 
01070     static AkForceInline AkInt16 AK_FLOAT_TO_SAMPLETYPE(AkReal32 in_fIn)
01071     {
01072         AkInt32 i32 = (AkInt32)(in_fIn * 0x7FFF);
01073         i32 -= ((i32<=32767)-1)&(i32-32767);
01074         i32 -= ((i32>=-32768)-1)&(i32+32768);
01075         AkInt16 i16 = (AkInt16)i32;
01076         return i16;
01077     }
01078 
01080     static AkForceInline AkInt16 AK_FLOAT_TO_SAMPLETYPE_NOCLIP(AkReal32 in_fIn)
01081     {
01082         return (AkInt16)(in_fIn * 0x7FFF);
01083     }
01084 
01086     static AkForceInline AkReal32 AK_SAMPLETYPE_TO_FLOAT(AkInt16 in_iIn)
01087     {
01088         return (((AkReal32)in_iIn) * (1.f/0x7FFF));
01089     }
01090 #else
01091 
01092     #define AK_FLOAT_TO_SAMPLETYPE( __in__ ) (__in__)
01093 
01094     #define AK_FLOAT_TO_SAMPLETYPE_NOCLIP( __in__ ) (__in__)
01095 
01096     #define AK_SAMPLETYPE_TO_FLOAT( __in__ ) (__in__)
01097 #endif
01098 
01099     #define AK_DBTOLIN( __db__ ) (powf(10.f,(__db__) * 0.05f))
01100 }
01101 
01103 AK_CALLBACK( AK::IAkPlugin*, AkCreatePluginCallback )( AK::IAkPluginMemAlloc * in_pAllocator );
01105 AK_CALLBACK( AK::IAkPluginParam*, AkCreateParamCallback )( AK::IAkPluginMemAlloc * in_pAllocator );
01106 
01107 #endif // _IAK_PLUGIN_H_