00001 /******************************************************************************* 00002 The content of this file includes portions of the AUDIOKINETIC Wwise Technology 00003 released in source code form as part of the SDK installer package. 00004 00005 Commercial License Usage 00006 00007 Licensees holding valid commercial licenses to the AUDIOKINETIC Wwise Technology 00008 may use this file in accordance with the end user license agreement provided 00009 with the software or, alternatively, in accordance with the terms contained in a 00010 written agreement between you and Audiokinetic Inc. 00011 00012 Apache License Usage 00013 00014 Alternatively, this file may be used under the Apache License, Version 2.0 (the 00015 "Apache License"); you may not use this file except in compliance with the 00016 Apache License. You may obtain a copy of the Apache License at 00017 http://www.apache.org/licenses/LICENSE-2.0. 00018 00019 Unless required by applicable law or agreed to in writing, software distributed 00020 under the Apache License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES 00021 OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License for 00022 the specific language governing permissions and limitations under the License. 00023 00024 Version: <VERSION> Build: <BUILDNUMBER> 00025 Copyright (c) <COPYRIGHTYEAR> Audiokinetic Inc. 00026 *******************************************************************************/ 00027 00030 00031 #ifndef _IAK_PLUGIN_H_ 00032 #define _IAK_PLUGIN_H_ 00033 00034 #include <AK/SoundEngine/Common/AkCommonDefs.h> 00035 #include <AK/SoundEngine/Common/IAkRTPCSubscriber.h> 00036 #include <AK/SoundEngine/Common/IAkPluginMemAlloc.h> 00037 #include <AK/SoundEngine/Common/AkFPUtilities.h> 00038 #include <AK/Tools/Common/AkLock.h> 00039 #include <AK/Tools/Common/AkPlatformFuncs.h> 00040 #include <AK/Tools/Common/AkMonitorError.h> 00041 #include <AK/SoundEngine/Common/AkSoundEngineExport.h> 00042 #include <AK/SoundEngine/Common/IAkProcessorFeatures.h> 00043 #include <AK/SoundEngine/Common/AkMidiTypes.h> 00044 #include <AK/SoundEngine/Common/AkCallback.h> 00045 #include <AK/AkWwiseSDKVersion.h> 00046 00047 #ifndef AK_WII 00048 // math.h may cause conflicts on the Wii due to inclusion order. 00049 #include <math.h> 00050 #endif 00051 00052 #if defined AK_CPU_X86 || defined AK_CPU_X86_64 00053 #include <xmmintrin.h> 00054 #endif 00055 00056 #ifdef AK_XBOX360 00057 #include "ppcintrinsics.h" 00058 #endif 00059 00060 #ifdef __PPU__ 00061 #include <altivec.h> 00062 #include <ppu_intrinsics.h> 00063 #include <stdlib.h> 00064 #include <string.h> 00065 #endif 00066 00067 #ifdef AK_PS3 00068 #include <AK/Plugin/PluginServices/PS3/MultiCoreServices.h> 00069 #endif 00070 00071 #ifdef AK_WII 00072 #include <revolution/ax.h> 00073 #endif 00074 00075 #ifdef AK_WIIU 00076 #include <cafe/ax.h> 00077 #endif 00078 00079 #ifdef AK_3DS 00080 #include <nn/snd.h> 00081 #endif 00082 00083 #ifdef AK_VITA_HW 00084 #include <ngs.h> 00085 #endif 00086 00087 00088 #define AK_OLDEST_SUPPORTED_WWISESDK_VERSION ((2016<<8) | 1) 00089 00093 enum AkPluginType 00094 { 00095 AkPluginTypeNone = 0, 00096 AkPluginTypeCodec = 1, 00097 AkPluginTypeSource = 2, 00098 AkPluginTypeEffect = 3, 00099 AkPluginTypeMotionDevice = 4, 00100 AkPluginTypeMotionSource = 5, 00101 AkPluginTypeMixer = 6, 00102 AkPluginTypeSink = 7, 00103 AkPluginTypeMask = 0xf 00104 }; 00105 00111 struct AkPluginInfo 00112 { 00114 AkPluginInfo() 00115 : eType(AkPluginTypeNone) 00116 , uBuildVersion( 0 ) 00117 , bIsInPlace(true) 00118 , bCanChangeRate(false) 00119 , bIsAsynchronous(false) 00120 {} 00121 00122 AkPluginType eType; 00123 AkUInt32 uBuildVersion; 00124 bool bIsInPlace; 00125 bool bCanChangeRate; 00126 bool bIsAsynchronous; 00127 }; 00128 00129 //Forward declarations. 00130 namespace AK 00131 { 00132 class PluginRegistration; 00133 } 00134 extern "C" AK_DLLEXPORT AK::PluginRegistration * g_pAKPluginList; 00135 00136 struct AkAcousticTexture; 00137 struct AkDiffuseReverberator; 00138 00139 namespace AK 00140 { 00141 class IAkStreamMgr; 00142 class IAkGlobalPluginContext; 00143 00145 class IAkGameObjectPluginInfo 00146 { 00147 protected: 00149 virtual ~IAkGameObjectPluginInfo(){} 00150 00151 public: 00152 00154 virtual AkGameObjectID GetGameObjectID() const = 0; 00155 00170 virtual AkUInt32 GetNumEmitterListenerPairs() const = 0; 00171 00186 virtual AKRESULT GetEmitterListenerPair( 00187 AkUInt32 in_uIndex, 00188 AkEmitterListenerPair & out_emitterListenerPair 00189 ) const = 0; 00190 00197 virtual AkUInt32 GetNumGameObjectPositions() const = 0; 00198 00207 virtual AKRESULT GetGameObjectPosition( 00208 AkUInt32 in_uIndex, 00209 AkSoundPosition & out_position 00210 ) const = 0; 00211 00217 virtual SoundEngine::MultiPositionType GetGameObjectMultiPositionType() const = 0; 00218 00222 virtual AkReal32 GetGameObjectScaling() const = 0; 00223 00232 virtual AkUInt32 GetListenerMask() const = 0; 00233 00242 virtual AKRESULT GetListenerData( 00243 AkUInt32 in_uListenerMask, 00244 AkListener & out_listener 00245 ) const = 0; 00246 }; 00247 00250 class IAkVoicePluginInfo : public IAkGameObjectPluginInfo 00251 { 00252 protected: 00254 virtual ~IAkVoicePluginInfo(){} 00255 00256 public: 00257 00259 virtual AkPlayingID GetPlayingID() const = 0; 00260 00263 virtual AkPriority GetPriority() const = 0; 00264 00267 virtual AkPriority ComputePriorityWithDistance( 00268 AkReal32 in_fDistance 00269 ) const = 0; 00270 }; 00271 00273 class IAkPluginContextBase 00274 { 00275 protected: 00277 virtual ~IAkPluginContextBase(){} 00278 00279 public: 00280 00283 virtual IAkGlobalPluginContext* GlobalContext() const = 0; 00284 00292 virtual AKRESULT GetOutputID( 00293 AkUInt32 & out_uOutputID, 00294 AkUInt32 & out_uDeviceType 00295 ) const = 0; 00296 00301 virtual void GetPluginMedia( 00302 AkUInt32 in_dataIndex, 00303 AkUInt8* &out_rpData, 00304 AkUInt32 &out_rDataSize 00305 ) = 0; 00306 00311 virtual void GetPluginCustomGameData( 00312 void* &out_rpData, 00313 AkUInt32 &out_rDataSize 00314 ) = 0; 00315 00329 virtual AKRESULT PostMonitorData( 00330 void * in_pData, 00331 AkUInt32 in_uDataSize 00332 ) = 0; 00333 00340 virtual bool CanPostMonitorData() = 0; 00341 00348 virtual AKRESULT PostMonitorMessage( 00349 const char* in_pszError, 00350 AK::Monitor::ErrorLevel in_eErrorLevel 00351 ) = 0; 00352 00357 virtual AkReal32 GetDownstreamGain() = 0; 00358 00363 virtual AKRESULT GetParentChannelConfig( 00364 AkChannelConfig& out_channelConfig 00365 ) const = 0; 00366 00367 #if (defined AK_CPU_X86 || defined AK_CPU_X86_64) && !(defined AK_IOS) 00368 00369 virtual IAkProcessorFeatures * GetProcessorFeatures() = 0; 00370 #endif 00371 }; 00372 00376 class IAkEffectPluginContext : public IAkPluginContextBase 00377 { 00378 protected: 00380 virtual ~IAkEffectPluginContext(){} 00381 00382 public: 00383 00387 virtual bool IsSendModeEffect() const = 0; 00388 00391 virtual IAkVoicePluginInfo * GetVoiceInfo() = 0; 00392 00402 virtual AkUniqueID GetNodeID() const = 0; 00403 }; 00404 00408 class IAkSourcePluginContext : public IAkPluginContextBase 00409 { 00410 protected: 00412 virtual ~IAkSourcePluginContext(){} 00413 00414 public: 00415 00418 virtual AkUInt16 GetNumLoops() const = 0; 00419 00422 virtual IAkVoicePluginInfo * GetVoiceInfo() = 0; 00423 00427 virtual AkMIDIEvent GetMidiEvent() const = 0; 00428 00438 virtual AkUniqueID GetNodeID() const = 0; 00439 00442 virtual void* GetCookie() const = 0; 00443 00444 }; 00445 00447 class IAkMixerPluginContext : public IAkPluginContextBase 00448 { 00449 protected: 00451 virtual ~IAkMixerPluginContext(){} 00452 00453 public: 00454 00458 virtual AkUniqueID GetBusID() = 0; 00459 00464 virtual AkBusType GetBusType() = 0; 00465 00482 virtual AKRESULT GetSpeakerAngles( 00483 AkReal32 * io_pfSpeakerAngles, 00484 AkUInt32 & io_uNumAngles, 00485 AkReal32 & out_fHeightAngle 00486 ) = 0; 00487 00489 00490 00492 virtual void ComputeSpeakerVolumesDirect( 00493 AkChannelConfig in_inputConfig, 00494 AkChannelConfig in_outputConfig, 00495 AkReal32 in_fCenterPerc, 00496 AK::SpeakerVolumes::MatrixPtr out_mxVolumes 00497 ) = 0; 00498 00500 virtual void ComputeSpeakerVolumesPanner( 00501 const AkVector & in_position, 00502 AkReal32 in_fCenterPct, 00503 AkChannelConfig in_inputConfig, 00504 AkChannelConfig in_outputConfig, 00505 AK::SpeakerVolumes::MatrixPtr out_mxVolumes 00506 ) = 0; 00507 00510 virtual AKRESULT ComputePlanarVBAPGains( 00511 AkReal32 in_fAngle, 00512 AkChannelConfig in_outputConfig, 00513 AkReal32 in_fCenterPerc, 00514 AK::SpeakerVolumes::VectorPtr out_vVolumes 00515 ) = 0; 00516 00519 virtual AKRESULT InitSphericalVBAP( 00520 AK::IAkPluginMemAlloc* in_pAllocator, 00521 const AkSphericalCoord* in_SphericalPositions, 00522 const AkUInt32 in_NbPoints, 00523 void *& out_pPannerData 00524 ) = 0; 00525 00528 virtual AKRESULT ComputeSphericalVBAPGains( 00529 void* in_pPannerData, 00530 AkReal32 in_fAzimuth, 00531 AkReal32 in_fElevation, 00532 AkUInt32 in_uNumChannels, 00533 AK::SpeakerVolumes::VectorPtr out_vVolumes 00534 ) = 0; 00535 00538 virtual AKRESULT TermSphericalVBAP( 00539 AK::IAkPluginMemAlloc* in_pAllocator, 00540 void* in_pPannerData 00541 ) = 0; 00542 00545 virtual AKRESULT Compute3DPositioning( 00546 AkReal32 in_fAngle, 00547 AkReal32 in_fElevation, 00548 AkReal32 in_fSpread, 00549 AkReal32 in_fFocus, 00550 AkChannelConfig in_inputConfig, 00551 AkChannelMask in_uInputChanSel, 00552 AkChannelConfig in_outputConfig, 00553 AkReal32 in_fCenterPerc, 00554 AK::SpeakerVolumes::MatrixPtr out_mxVolumes 00555 ) = 0; 00556 00558 00560 00561 00566 virtual void EnableMetering( AkMeteringFlags in_eFlags ) = 0; 00567 00569 }; 00570 00576 class IAkPluginParam : public IAkRTPCSubscriber 00577 { 00578 protected: 00580 virtual ~IAkPluginParam(){} 00581 00582 public: 00588 virtual IAkPluginParam * Clone( 00589 IAkPluginMemAlloc * in_pAllocator 00590 ) = 0; 00591 00599 virtual AKRESULT Init( 00600 IAkPluginMemAlloc * in_pAllocator, 00601 const void * in_pParamsBlock, 00602 AkUInt32 in_uBlockSize 00603 ) = 0; 00604 00610 virtual AKRESULT Term( 00611 IAkPluginMemAlloc * in_pAllocator 00612 ) = 0; 00613 00618 virtual AKRESULT SetParamsBlock( 00619 const void *in_pParamsBlock, 00620 AkUInt32 in_uBlockSize 00621 ) = 0; 00622 00628 virtual AKRESULT SetParam( 00629 AkPluginParamID in_paramID, 00630 const void * in_pValue, 00631 AkUInt32 in_uParamSize 00632 ) = 0; 00633 00641 static const AkPluginParamID ALL_PLUGIN_DATA_ID = 0x7FFF; 00642 }; 00643 00647 class IAkPlugin 00648 { 00649 protected: 00651 virtual ~IAkPlugin(){} 00652 00653 public: 00659 virtual AKRESULT Term( 00660 IAkPluginMemAlloc * in_pAllocator 00661 ) = 0; 00662 00668 virtual AKRESULT Reset() = 0; 00669 00675 virtual AKRESULT GetPluginInfo( 00676 AkPluginInfo & out_rPluginInfo 00677 ) = 0; 00678 00686 virtual bool SupportMediaRelocation() const 00687 { 00688 return false; 00689 } 00690 00703 virtual AKRESULT RelocateMedia( 00704 AkUInt8* /*in_pNewMedia*/, 00705 AkUInt8* /*in_pOldMedia*/ 00706 ) 00707 { 00708 return AK_NotImplemented; 00709 } 00710 00711 }; 00712 00714 class IAkEffectPlugin : public IAkPlugin 00715 { 00716 protected: 00718 virtual ~IAkEffectPlugin(){} 00719 00720 public: 00725 virtual AKRESULT Init( 00726 IAkPluginMemAlloc * in_pAllocator, 00727 IAkEffectPluginContext * in_pEffectPluginContext, 00728 IAkPluginParam * in_pParams, 00729 AkAudioFormat & io_rFormat 00730 ) = 0; 00731 00732 #if defined AK_WII_FAMILY_HW 00733 00734 virtual AXAuxCallback GetFXCallback() = 0; 00735 00737 virtual void* GetFXParams() = 0; 00738 00744 virtual AkUInt32 GetTailTime() = 0; 00745 #endif 00746 #ifdef AK_3DS 00747 00748 virtual void Update() = 0; 00749 00751 virtual nn::snd::CTR::AuxCallback GetFXCallback() = 0; 00752 00758 virtual AkUInt32 GetTailTime() = 0; 00759 #endif 00760 #ifdef AK_VITA_HW 00761 virtual const SceNgsVoiceDefinition * GetVoiceDefinition(){ AKASSERT( false && "Non hardware plugin called on Vita HW" ); return NULL; } 00762 virtual AKRESULT AttachVoice( SceNgsHVoice in_hVoice){ AKASSERT( false && "Non hardware plugin called on Vita HW" ); return AK_Fail; } 00763 virtual AkReal32 GetTailTime() const { AKASSERT( false && "Non hardware plugin called on Vita HW" ); return 0; } 00764 virtual AKRESULT SetBypass( SceUInt32 in_uBypassFlag ) { AKASSERT( false && "Non hardware plugin called on Vita HW" ); return AK_Fail; } 00765 #endif 00766 }; 00767 00769 class IAkInPlaceEffectPlugin : public IAkEffectPlugin 00770 { 00771 public: 00779 virtual void Execute( 00780 AkAudioBuffer * io_pBuffer 00781 #ifdef AK_PS3 00782 , AK::MultiCoreServices::DspProcess*& out_pDspProcess 00783 #endif 00784 ) = 0; 00785 00789 virtual AKRESULT TimeSkip( 00790 AkUInt32 in_uFrames 00791 ) = 0; 00792 }; 00793 00794 00796 class IAkOutOfPlaceEffectPlugin : public IAkEffectPlugin 00797 { 00798 public: 00805 virtual void Execute( 00806 AkAudioBuffer * in_pBuffer, 00807 AkUInt32 in_uInOffset, 00808 AkAudioBuffer * out_pBuffer 00809 #ifdef AK_PS3 00810 , AK::MultiCoreServices::DspProcess*& out_pDspProcess 00811 #endif 00812 ) = 0; 00813 00817 virtual AKRESULT TimeSkip( 00818 AkUInt32 &io_uFrames 00819 ) = 0; 00820 }; 00821 00823 class IAkMixerInputContext 00824 { 00825 protected: 00827 virtual ~IAkMixerInputContext(){} 00828 00829 public: 00830 00835 virtual IAkPluginParam * GetInputParam() = 0; 00836 00839 virtual IAkVoicePluginInfo * GetVoiceInfo() = 0; 00840 00843 virtual AkConnectionType GetConnectionType() = 0; 00844 00854 virtual AkUniqueID GetAudioNodeID() = 0; 00855 00859 virtual void * GetUserData() = 0; 00860 00864 virtual void SetUserData( void * in_pUserData ) = 0; 00865 00868 00869 00875 virtual bool IsSpatializationEnabled() = 0; 00876 00882 virtual AkReal32 GetCenterPerc() = 0; 00883 00888 virtual AkPannerType GetPannerType() = 0; 00889 00894 virtual AkPositionSourceType GetPositionSourceType() = 0; 00895 00902 virtual void GetPannerPosition( 00903 AkVector & out_position 00904 ) = 0; 00905 00909 virtual AkUInt32 GetNum3DPositions() = 0; 00910 00919 virtual AKRESULT Get3DPosition( 00920 AkUInt32 in_uIndex, 00921 AkEmitterListenerPair & out_soundPosition 00922 ) = 0; 00923 00930 virtual AkReal32 GetSpread( 00931 AkUInt32 in_uIndex 00932 ) = 0; 00933 00940 virtual AkReal32 GetFocus( 00941 AkUInt32 in_uIndex 00942 ) = 0; 00943 00946 virtual bool GetMaxAttenuationDistance( 00947 AkReal32 & out_fMaxAttenuationDistance 00948 ) = 0; 00949 00951 virtual void GetSpatializedVolumes( 00952 AK::SpeakerVolumes::MatrixPtr out_mxPrevVolumes, 00953 AK::SpeakerVolumes::MatrixPtr out_mxNextVolumes 00954 ) = 0; 00955 00957 }; 00958 00962 class IAkSinkPluginContext : public IAkPluginContextBase 00963 { 00964 protected: 00966 virtual ~IAkSinkPluginContext(){} 00967 00968 public: 00969 00975 virtual bool IsPrimary() = 0; 00976 00991 virtual AKRESULT SignalAudioThread() = 0; 00992 00995 virtual AkUInt16 GetNumRefillsInVoice() = 0; 00996 }; 00997 00999 class IAkSinkPlugin : public IAkPlugin 01000 { 01001 protected: 01003 virtual ~IAkSinkPlugin(){} 01004 01005 public: 01006 01020 01021 virtual AKRESULT Init( 01022 IAkPluginMemAlloc * in_pAllocator, 01023 IAkSinkPluginContext * in_pSinkPluginContext, 01024 IAkPluginParam * in_pParams, 01025 AkAudioFormat & io_rFormat 01026 ) = 0; 01027 01035 virtual AKRESULT IsDataNeeded( 01036 AkUInt32 & out_uNumFramesNeeded 01037 ) = 0; 01038 01047 virtual void Consume( 01048 AkAudioBuffer * in_pInputBuffer, 01049 AkRamp in_gain 01050 ) = 0; 01051 01055 virtual void OnFrameEnd() = 0; 01056 01059 virtual bool IsStarved() = 0; 01060 01062 virtual void ResetStarved() = 0; 01063 }; 01064 01066 class IAkSourcePlugin : public IAkPlugin 01067 { 01068 protected: 01070 virtual ~IAkSourcePlugin(){} 01071 01072 public: 01077 virtual AKRESULT Init( 01078 IAkPluginMemAlloc * in_pAllocator, 01079 IAkSourcePluginContext * in_pSourcePluginContext, 01080 IAkPluginParam * in_pParams, 01081 AkAudioFormat & io_rFormat 01082 ) = 0; 01083 01088 virtual AkReal32 GetDuration() const = 0; 01089 01097 virtual AkReal32 GetEnvelope() const 01098 { 01099 return 1.f; 01100 } 01101 01111 virtual AKRESULT StopLooping(){ return AK_Success; } 01112 01125 virtual AKRESULT Seek( 01126 AkUInt32 /* in_uPosition */ 01127 ) { return AK_Success; } 01128 01135 virtual AKRESULT TimeSkip( 01136 AkUInt32 & /*io_uFrames */ 01137 ) { return AK_NotImplemented; } 01138 01144 virtual void Execute( 01145 AkAudioBuffer * io_pBuffer 01146 #ifdef AK_PS3 01147 , AK::MultiCoreServices::DspProcess*& out_pDspProcess 01148 #endif 01149 ) = 0; 01150 }; 01151 01152 #if defined AK_WII 01153 01154 static AkForceInline AkInt16 AK_FLOAT_TO_SAMPLETYPE(AkReal32 in_fIn) 01155 { 01156 AkInt32 i32 = (AkInt32)(in_fIn * 0x7FFF); 01157 i32 -= ((i32<=32767)-1)&(i32-32767); 01158 i32 -= ((i32>=-32768)-1)&(i32+32768); 01159 AkInt16 i16 = (AkInt16)i32; 01160 return i16; 01161 } 01162 01164 static AkForceInline AkInt16 AK_FLOAT_TO_SAMPLETYPE_NOCLIP(AkReal32 in_fIn) 01165 { 01166 return (AkInt16)(in_fIn * 0x7FFF); 01167 } 01168 01170 static AkForceInline AkReal32 AK_SAMPLETYPE_TO_FLOAT(AkInt16 in_iIn) 01171 { 01172 return (((AkReal32)in_iIn) * (1.f/0x7FFF)); 01173 } 01174 #else 01175 01176 #define AK_FLOAT_TO_SAMPLETYPE( __in__ ) (__in__) 01177 01178 #define AK_FLOAT_TO_SAMPLETYPE_NOCLIP( __in__ ) (__in__) 01179 01180 #define AK_SAMPLETYPE_TO_FLOAT( __in__ ) (__in__) 01181 #endif 01182 01183 #define AK_DBTOLIN( __db__ ) (powf(10.f,(__db__) * 0.05f)) 01184 } 01185 01187 AK_CALLBACK( AK::IAkPlugin*, AkCreatePluginCallback )( AK::IAkPluginMemAlloc * in_pAllocator ); 01189 AK_CALLBACK( AK::IAkPluginParam*, AkCreateParamCallback )( AK::IAkPluginMemAlloc * in_pAllocator ); 01190 01191 namespace AK 01192 { 01194 class IAkGlobalPluginContext 01195 { 01196 protected: 01198 virtual ~IAkGlobalPluginContext(){} 01199 01200 public: 01201 01203 virtual IAkStreamMgr * GetStreamMgr() const = 0; 01204 01208 virtual AkUInt16 GetMaxBufferLength() const = 0; 01209 01212 virtual bool IsRenderingOffline() const = 0; 01213 01216 virtual AkUInt32 GetSampleRate() const = 0; 01217 01224 virtual AKRESULT PostMonitorMessage( 01225 const char* in_pszError, 01226 AK::Monitor::ErrorLevel in_eErrorLevel 01227 ) = 0; 01228 01243 virtual AKRESULT RegisterPlugin( 01244 AkPluginType in_eType, 01245 AkUInt32 in_ulCompanyID, 01246 AkUInt32 in_ulPluginID, 01247 AkCreatePluginCallback in_pCreateFunc, 01248 AkCreateParamCallback in_pCreateParamFunc 01249 ) = 0; 01250 01264 virtual AKRESULT RegisterCodec( 01265 AkUInt32 in_ulCompanyID, 01266 AkUInt32 in_ulPluginID, 01267 AkCreateFileSourceCallback in_pFileCreateFunc, 01268 AkCreateBankSourceCallback in_pBankCreateFunc 01269 ) = 0; 01270 01283 virtual AKRESULT RegisterGlobalCallback( 01284 AkGlobalCallbackFunc in_pCallback, 01285 AkUInt32 in_eLocation = AkGlobalCallbackLocation_BeginRender, 01286 void * in_pCookie = NULL 01287 ) = 0; 01288 01298 virtual AKRESULT UnregisterGlobalCallback( 01299 AkGlobalCallbackFunc in_pCallback, 01300 AkUInt32 in_eLocation = AkGlobalCallbackLocation_BeginRender 01301 ) = 0; 01302 01304 virtual AK::IAkPluginMemAlloc * GetAllocator() = 0; 01305 01307 virtual AKRESULT SetRTPCValue( 01308 AkRtpcID in_rtpcID, 01309 AkRtpcValue in_value, 01310 AkGameObjectID in_gameObjectID = AK_INVALID_GAME_OBJECT, 01311 AkTimeMs in_uValueChangeDuration = 0, 01312 AkCurveInterpolation in_eFadeCurve = AkCurveInterpolation_Linear, 01313 bool in_bBypassInternalValueInterpolation = false 01314 ) = 0; 01315 01320 virtual AKRESULT SendPluginCustomGameData( 01321 AkUniqueID in_busID, 01322 AkUInt32 in_uFXIndex, 01323 const void* in_pData, 01324 AkUInt32 in_uSizeInBytes 01325 ) = 0; 01326 01328 virtual void MixNinNChannels( 01329 AkAudioBuffer * in_pInputBuffer, 01330 AkAudioBuffer * in_pMixBuffer, 01331 AkReal32 in_fPrevGain, 01332 AkReal32 in_fNextGain, 01333 AK::SpeakerVolumes::ConstMatrixPtr in_mxPrevVolumes, 01334 AK::SpeakerVolumes::ConstMatrixPtr in_mxNextVolumes 01335 ) = 0; 01336 01338 virtual void Mix1inNChannels( 01339 AkReal32 * AK_RESTRICT in_pInChannel, 01340 AkAudioBuffer * in_pMixBuffer, 01341 AkReal32 in_fPrevGain, 01342 AkReal32 in_fNextGain, 01343 AK::SpeakerVolumes::ConstVectorPtr in_vPrevVolumes, 01344 AK::SpeakerVolumes::ConstVectorPtr in_vNextVolumes 01345 ) = 0; 01346 01348 virtual void MixChannel( 01349 AkReal32 * AK_RESTRICT in_pInBuffer, 01350 AkReal32 * AK_RESTRICT in_pOutBuffer, 01351 AkReal32 in_fPrevGain, 01352 AkReal32 in_fNextGain, 01353 AkUInt16 in_uNumFrames 01354 ) = 0; 01355 01358 virtual void ComputeAmbisonicsEncoding( 01359 AkReal32 in_fAzimuth, 01360 AkReal32 in_fElevation, 01361 AkChannelConfig in_cfgAmbisonics, 01362 AK::SpeakerVolumes::VectorPtr out_vVolumes 01363 ) = 0; 01364 01371 virtual AKRESULT ComputeWeightedAmbisonicsDecodingFromSampledSphere( 01372 const AkVector in_samples[], 01373 AkUInt32 in_uNumSamples, 01374 AkChannelConfig in_cfgAmbisonics, 01375 AK::SpeakerVolumes::MatrixPtr out_mxVolume 01376 ) = 0; 01377 01380 virtual const AkAcousticTexture* GetAcousticTexture( 01381 AkAcousticTextureID in_AcousticTextureID 01382 ) = 0; 01383 01386 virtual const AkDiffuseReverberator* GetDiffuseReverberator( 01387 AkDiffuseReverberatorID in_DiffuseReverberatorID 01388 ) = 0; 01389 }; 01390 01393 class PluginRegistration 01394 { 01395 public: 01396 PluginRegistration( 01397 AkPluginType in_eType, 01398 AkUInt32 in_ulCompanyID, 01399 AkUInt32 in_ulPluginID, 01400 AkCreatePluginCallback in_pCreateFunc, 01401 AkCreateParamCallback in_pCreateParamFunc, 01402 AkGlobalCallbackFunc in_pRegisterCallback = NULL, 01403 void * in_pRegisterCallbackCookie = NULL 01404 ) 01405 : pNext(g_pAKPluginList) 01406 , m_eType(in_eType) 01407 , m_ulCompanyID(in_ulCompanyID) 01408 , m_ulPluginID(in_ulPluginID) 01409 , m_pCreateFunc(in_pCreateFunc) 01410 , m_pCreateParamFunc(in_pCreateParamFunc) 01411 , m_pFileCreateFunc(NULL) 01412 , m_pBankCreateFunc(NULL) 01413 , m_pRegisterCallback(in_pRegisterCallback) 01414 , m_pRegisterCallbackCookie(in_pRegisterCallbackCookie) 01415 { 01416 g_pAKPluginList = this; 01417 } 01418 01419 PluginRegistration( 01420 AkUInt32 in_ulCompanyID, 01421 AkUInt32 in_ulPluginID, 01422 AkCreateFileSourceCallback in_pCreateFile, 01423 AkCreateBankSourceCallback in_pCreateBank) 01424 : pNext(g_pAKPluginList) 01425 , m_eType(AkPluginTypeCodec) 01426 , m_ulCompanyID(in_ulCompanyID) 01427 , m_ulPluginID(in_ulPluginID) 01428 , m_pCreateFunc(NULL) 01429 , m_pCreateParamFunc(NULL) 01430 , m_pFileCreateFunc(in_pCreateFile) 01431 , m_pBankCreateFunc(in_pCreateBank) 01432 , m_pRegisterCallback(NULL) 01433 , m_pRegisterCallbackCookie(NULL) 01434 { 01435 g_pAKPluginList = this; 01436 } 01437 01438 PluginRegistration *pNext; 01439 AkPluginType m_eType; 01440 AkUInt32 m_ulCompanyID; 01441 AkUInt32 m_ulPluginID; 01442 AkCreatePluginCallback m_pCreateFunc; 01443 AkCreateParamCallback m_pCreateParamFunc; 01444 AkCreateFileSourceCallback m_pFileCreateFunc; 01445 AkCreateBankSourceCallback m_pBankCreateFunc; 01446 AkGlobalCallbackFunc m_pRegisterCallback; 01447 void * m_pRegisterCallbackCookie; 01448 }; 01449 } 01450 01451 #define AK_IMPLEMENT_PLUGIN_FACTORY(_pluginName_, _plugintype_, _companyid_, _pluginid_) \ 01452 AK::IAkPlugin* Create##_pluginName_(AK::IAkPluginMemAlloc * in_pAllocator); \ 01453 AK::IAkPluginParam * Create##_pluginName_##Params(AK::IAkPluginMemAlloc * in_pAllocator); \ 01454 AK::PluginRegistration _pluginName_##Registration(_plugintype_, _companyid_, _pluginid_, Create##_pluginName_, Create##_pluginName_##Params); 01455 01456 #define AK_STATIC_LINK_PLUGIN(_pluginName_) \ 01457 extern AK::PluginRegistration _pluginName_##Registration; \ 01458 void *_pluginName_##_linkonceonly = (void*)&_pluginName_##Registration; 01459 01460 #define DEFINE_PLUGIN_REGISTER_HOOK AK_DLLEXPORT AK::PluginRegistration * g_pAKPluginList = NULL; 01461 01462 #endif // _IAK_PLUGIN_H_
Des questions ? Des problèmes ? Besoin de plus d'informations ? Contactez-nous, nous pouvons vous aider !
Visitez notre page d'AideEnregistrez votre projet et nous vous aiderons à démarrer sans aucune obligation !
Partir du bon pied avec Wwise