00001 00002 // 00003 // Copyright (c) 2006 Audiokinetic Inc. / All Rights Reserved 00004 // 00006 00009 00010 #ifndef _IAK_STREAM_MGR_H_ 00011 #define _IAK_STREAM_MGR_H_ 00012 00013 #include <AK/SoundEngine/Common/AkMemoryMgr.h> 00014 00015 //----------------------------------------------------------------------------- 00016 // Defines. 00017 //----------------------------------------------------------------------------- 00018 00020 00021 #define AK_MONITOR_STREAMNAME_MAXLENGTH (64) 00022 #define AK_MONITOR_DEVICENAME_MAXLENGTH (16) 00023 00024 00025 //----------------------------------------------------------------------------- 00026 // Enums. 00027 //----------------------------------------------------------------------------- 00028 00030 enum AkStmStatus 00031 { 00032 AK_StmStatusIdle = 0, 00033 AK_StmStatusCompleted = 1, 00034 AK_StmStatusPending = 2, 00035 AK_StmStatusCancelled = 3, 00036 AK_StmStatusError = 4 00037 }; 00038 00043 enum AkMoveMethod 00044 { 00045 AK_MoveBegin = 0, 00046 AK_MoveCurrent = 1, 00047 AK_MoveEnd = 2 00048 }; 00049 00051 enum AkOpenMode 00052 { 00053 AK_OpenModeRead = 0, 00054 AK_OpenModeWrite = 1, 00055 AK_OpenModeWriteOvrwr = 2, 00056 AK_OpenModeReadWrite = 3 00057 }; 00058 00060 struct AkFileSystemFlags 00061 { 00062 AkFileSystemFlags() 00063 : uCacheID( AK_INVALID_FILE_ID ) {} 00064 00065 AkFileSystemFlags( AkUInt32 in_uCompanyID, AkUInt32 in_uCodecID, AkUInt32 in_uCustomParamSize, void * in_pCustomParam, bool in_bIsLanguageSpecific, bool in_bIsFromRSX, AkFileID in_uCacheID ) 00066 : uCompanyID( in_uCompanyID ) 00067 , uCodecID( in_uCodecID ) 00068 , uCustomParamSize( in_uCustomParamSize ) 00069 , pCustomParam( in_pCustomParam ) 00070 , bIsLanguageSpecific( in_bIsLanguageSpecific ) 00071 , bIsFromRSX( in_bIsFromRSX ) 00072 , uCacheID( in_uCacheID ) 00073 , uNumBytesPrefetch( 0 ) {} 00074 00075 AkUInt32 uCompanyID; 00076 AkUInt32 uCodecID; 00077 AkUInt32 uCustomParamSize; 00078 void * pCustomParam; 00079 bool bIsLanguageSpecific; 00080 bool bIsFromRSX; 00081 bool bIsAutomaticStream; 00082 00083 AkFileID uCacheID; 00084 00085 AkUInt32 uNumBytesPrefetch; 00086 }; 00087 00092 struct AkStreamInfo 00093 { 00094 AkDeviceID deviceID; 00095 const AkOSChar * pszName; 00096 AkUInt64 uSize; 00097 bool bIsOpen; 00098 }; 00099 00101 struct AkAutoStmHeuristics 00102 { 00103 AkReal32 fThroughput; 00104 AkUInt32 uLoopStart; 00105 AkUInt32 uLoopEnd; 00106 AkUInt8 uMinNumBuffers; 00107 00108 00109 00110 AkPriority priority; 00111 }; 00112 00114 struct AkAutoStmBufSettings 00115 { 00116 AkUInt32 uBufferSize; 00117 00118 00119 AkUInt32 uMinBufferSize; 00120 00121 AkUInt32 uBlockSize; 00122 }; 00123 00125 00126 00128 struct AkDeviceDesc 00129 { 00130 AkDeviceID deviceID; 00131 bool bCanWrite; 00132 bool bCanRead; 00133 AkUtf16 szDeviceName[AK_MONITOR_DEVICENAME_MAXLENGTH]; 00134 AkUInt32 uStringSize; 00135 }; 00136 00138 struct AkDeviceData 00139 { 00140 AkDeviceID deviceID; 00141 AkUInt32 uMemSize; 00142 AkUInt32 uMemUsed; 00143 AkUInt32 uAllocs; 00144 AkUInt32 uFrees; 00145 AkUInt32 uPeakRefdMemUsed; 00146 AkUInt32 uUnreferencedCachedBytes; 00147 AkUInt32 uGranularity; 00148 AkUInt32 uNumActiveStreams; 00149 AkUInt32 uTotalBytesTransferred; 00150 AkUInt32 uLowLevelBytesTransferred; 00151 AkReal32 fAvgCacheEfficiency; 00152 AkUInt32 uNumLowLevelRequestsCompleted; 00153 AkUInt32 uNumLowLevelRequestsCancelled; 00154 AkUInt32 uNumLowLevelRequestsPending; 00155 AkUInt32 uCustomParam; 00156 AkUInt32 uCachePinnedBytes; 00157 }; 00158 00160 struct AkStreamRecord 00161 { 00162 AkUInt32 uStreamID; 00163 AkDeviceID deviceID; 00164 AkUtf16 szStreamName[AK_MONITOR_STREAMNAME_MAXLENGTH]; 00165 AkUInt32 uStringSize; 00166 AkUInt64 uFileSize; 00167 AkUInt32 uCustomParamSize; 00168 AkUInt32 uCustomParam; 00169 bool bIsAutoStream; 00170 bool bIsCachingStream; 00171 }; 00172 00174 struct AkStreamData 00175 { 00176 AkUInt32 uStreamID; 00177 // Status (replace) 00178 AkUInt32 uPriority; 00179 AkUInt64 uFilePosition; 00180 AkUInt32 uTargetBufferingSize; 00181 AkUInt32 uVirtualBufferingSize; 00182 AkUInt32 uBufferedSize; 00183 AkUInt32 uNumBytesTransfered; 00184 AkUInt32 uNumBytesTransferedLowLevel; 00185 AkUInt32 uMemoryReferenced; 00186 AkReal32 fEstimatedThroughput; 00187 bool bActive; 00188 }; 00190 00191 namespace AK 00192 { 00194 00195 00198 class IAkStreamProfile 00199 { 00200 protected: 00202 virtual ~IAkStreamProfile(){} 00203 00204 public: 00208 virtual void GetStreamRecord( 00209 AkStreamRecord & out_streamRecord 00210 ) = 0; 00211 00215 virtual void GetStreamData( 00216 AkStreamData & out_streamData 00217 ) = 0; 00218 00223 virtual bool IsNew() = 0; 00224 00228 virtual void ClearNew() = 0; 00229 }; 00230 00231 00234 class IAkDeviceProfile 00235 { 00236 protected: 00238 virtual ~IAkDeviceProfile(){} 00239 00240 public: 00241 00243 virtual void OnProfileStart() = 0; 00244 00246 virtual void OnProfileEnd() = 0; 00247 00251 virtual void GetDesc( 00252 AkDeviceDesc & out_deviceDesc 00253 ) = 0; 00254 00258 virtual void GetData( 00259 AkDeviceData & out_deviceData 00260 ) = 0; 00261 00266 virtual bool IsNew() = 0; 00267 00271 virtual void ClearNew() = 0; 00272 00277 virtual AkUInt32 GetNumStreams() = 0; 00278 00283 virtual IAkStreamProfile * GetStreamProfile( 00284 AkUInt32 in_uStreamIndex 00285 ) = 0; 00286 }; 00287 00290 class IAkStreamMgrProfile 00291 { 00292 protected: 00294 virtual ~IAkStreamMgrProfile(){} 00295 00296 public: 00301 virtual AKRESULT StartMonitoring() = 0; 00302 00306 virtual void StopMonitoring() = 0; 00307 00312 virtual AkUInt32 GetNumDevices() = 0; 00313 00319 virtual IAkDeviceProfile * GetDeviceProfile( 00320 AkUInt32 in_uDeviceIndex 00321 ) = 0; 00322 }; 00324 00326 00327 00331 class IAkStdStream 00332 { 00333 protected: 00335 virtual ~IAkStdStream(){} 00336 00337 public: 00339 00340 00341 00342 00343 virtual void Destroy() = 0; 00344 00348 virtual void GetInfo( 00349 AkStreamInfo & out_info 00350 ) = 0; 00351 00354 virtual void * GetFileDescriptor() = 0; 00355 00359 virtual AKRESULT SetStreamName( 00360 const AkOSChar * in_pszStreamName 00361 ) = 0; 00362 00369 virtual AkUInt32 GetBlockSize() = 0; 00371 00373 00374 00381 virtual AKRESULT Read( 00382 void * in_pBuffer, 00383 AkUInt32 in_uReqSize, 00384 bool in_bWait, 00385 AkPriority in_priority, 00386 AkReal32 in_fDeadline, 00387 AkUInt32 & out_uSize 00388 ) = 0; 00389 00396 virtual AKRESULT Write( 00397 void * in_pBuffer, 00398 AkUInt32 in_uReqSize, 00399 bool in_bWait, 00400 AkPriority in_priority, 00401 AkReal32 in_fDeadline, 00402 AkUInt32 & out_uSize 00403 ) = 0; 00404 00410 virtual AkUInt64 GetPosition( 00411 bool * out_pbEndOfStream 00412 ) = 0; 00413 00420 virtual AKRESULT SetPosition( 00421 AkInt64 in_iMoveOffset, 00422 AkMoveMethod in_eMoveMethod, 00423 AkInt64 * out_piRealOffset 00424 00425 ) = 0; 00426 00432 virtual void Cancel() = 0; 00433 00435 00437 00438 00439 00440 00441 00442 virtual void * GetData( 00443 AkUInt32 & out_uSize 00444 ) = 0; 00445 00450 virtual AkStmStatus GetStatus() = 0; 00451 00453 }; 00454 00455 00462 class IAkAutoStream 00463 { 00464 protected: 00466 virtual ~IAkAutoStream(){} 00467 00468 public: 00470 00471 00472 00473 00474 virtual void Destroy() = 0; 00475 00479 virtual void GetInfo( 00480 AkStreamInfo & out_info 00481 ) = 0; 00482 00485 virtual void * GetFileDescriptor() = 0; 00486 00490 virtual void GetHeuristics( 00491 AkAutoStmHeuristics & out_heuristics 00492 ) = 0; 00493 00497 virtual AKRESULT SetHeuristics( 00498 const AkAutoStmHeuristics & in_heuristics 00499 ) = 0; 00500 00507 virtual AKRESULT SetMinimalBufferSize( 00508 AkUInt32 in_uMinBufferSize 00509 ) = 0; 00510 00514 virtual AKRESULT SetStreamName( 00515 const AkOSChar * in_pszStreamName 00516 ) = 0; 00517 00524 virtual AkUInt32 GetBlockSize() = 0; 00525 00536 virtual AKRESULT QueryBufferingStatus( 00537 AkUInt32 & out_uNumBytesAvailable 00538 ) = 0; 00539 00543 virtual AkUInt32 GetNominalBuffering() = 0; 00544 00546 00548 00549 00554 virtual AKRESULT Start() = 0; 00555 00560 virtual AKRESULT Stop() = 0; 00561 00571 virtual AkUInt64 GetPosition( 00572 bool * out_pbEndOfStream 00573 ) = 0; 00574 00582 virtual AKRESULT SetPosition( 00583 AkInt64 in_iMoveOffset, 00584 AkMoveMethod in_eMoveMethod, 00585 AkInt64 * out_piRealOffset 00586 00587 ) = 0; 00588 00590 00591 00593 00594 00607 virtual AKRESULT GetBuffer( 00608 void *& out_pBuffer, 00609 AkUInt32 & out_uSize, 00610 bool in_bWait 00611 ) = 0; 00612 00619 virtual AKRESULT ReleaseBuffer() = 0; 00621 }; 00622 00624 00625 00628 class IAkStreamMgr 00629 { 00630 protected: 00632 virtual ~IAkStreamMgr(){} 00633 00634 public: 00639 inline static IAkStreamMgr * Get() 00640 { 00641 return m_pStreamMgr; 00642 } 00643 00647 virtual void Destroy() = 0; 00648 00649 00651 00652 00653 00654 virtual IAkStreamMgrProfile * GetStreamMgrProfile() = 0; 00656 00657 00659 00660 00661 // Standard stream creation methods. 00662 00668 virtual AKRESULT CreateStd( 00669 const AkOSChar* in_pszFileName, 00670 AkFileSystemFlags * in_pFSFlags, 00671 AkOpenMode in_eOpenMode, 00672 IAkStdStream *& out_pStream, 00673 bool in_bSyncOpen 00674 ) = 0; 00675 00681 virtual AKRESULT CreateStd( 00682 AkFileID in_fileID, 00683 AkFileSystemFlags * in_pFSFlags, 00684 AkOpenMode in_eOpenMode, 00685 IAkStdStream *& out_pStream, 00686 bool in_bSyncOpen 00687 ) = 0; 00688 00689 00690 // Automatic stream create methods. 00691 00698 virtual AKRESULT CreateAuto( 00699 const AkOSChar* in_pszFileName, 00700 AkFileSystemFlags * in_pFSFlags, 00701 const AkAutoStmHeuristics & in_heuristics, 00702 AkAutoStmBufSettings * in_pBufferSettings, 00703 IAkAutoStream *& out_pStream, 00704 bool in_bSyncOpen 00705 ) = 0; 00706 00713 virtual AKRESULT CreateAuto( 00714 AkFileID in_fileID, 00715 AkFileSystemFlags * in_pFSFlags, 00716 const AkAutoStmHeuristics & in_heuristics, 00717 AkAutoStmBufSettings * in_pBufferSettings, 00718 IAkAutoStream *& out_pStream, 00719 bool in_bSyncOpen 00720 ) = 0; 00721 00727 virtual AKRESULT PinFileInCache( 00728 AkFileID in_fileID, 00729 AkFileSystemFlags * in_pFSFlags, 00730 AkPriority in_uPriority 00731 ) = 0; 00732 00738 virtual AKRESULT UnpinFileInCache( 00739 AkFileID in_fileID, 00740 AkPriority in_uPriority 00741 ) = 0; 00742 00747 virtual AKRESULT UpdateCachingPriority( 00748 AkFileID in_fileID, 00749 AkPriority in_uPriority, 00750 AkPriority in_uOldPriority 00751 ) = 0; 00752 00756 virtual AKRESULT GetBufferStatusForPinnedFile( 00757 AkFileID in_fileID, 00758 AkReal32& out_fPercentBuffered, 00759 bool& out_bCacheFull 00760 ) = 0; 00761 00763 00764 protected: 00768 static AKSOUNDENGINE_API IAkStreamMgr * m_pStreamMgr; 00769 }; 00770 00771 } 00772 #endif //_IAK_STREAM_MGR_H_
Questions? Problems? Need more info? Contact us, and we can help!
Visit our Support pageRegister your project and we'll help you get started with no strings attached!
Get started with Wwise