WwiseFileState.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*******************************************************************************
  2. The content of this file includes portions of the proprietary AUDIOKINETIC Wwise
  3. Technology released in source code form as part of the game integration package.
  4. The content of this file may not be used without valid licenses to the
  5. AUDIOKINETIC Wwise Technology.
  6. Note that the use of the game engine is subject to the Unreal(R) Engine End User
  7. License Agreement at https://www.unrealengine.com/en-US/eula/unreal
  8. License Usage
  9. Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use
  10. this file in accordance with the end user license agreement provided with the
  11. software or, alternatively, in accordance with the terms contained
  12. in a written agreement between you and Audiokinetic Inc.
  13. Copyright (c) 2023 Audiokinetic Inc.
  14. *******************************************************************************/
  15. #pragma once
  16. #include "Wwise/WwiseExecutionQueue.h"
  17. #include "Wwise/WwiseFileStateTools.h"
  18. #include <atomic>
  19. class FWwiseAsyncCycleCounter;
  20. class FWwiseStreamableFileStateInfo;
  21. enum class WWISEFILEHANDLER_API EWwiseFileStateOperationOrigin
  22. {
  23. Loading,
  24. Streaming
  25. };
  26. class WWISEFILEHANDLER_API FWwiseFileState : protected FWwiseFileStateTools
  27. {
  28. public:
  29. ~FWwiseFileState() override;
  30. template <typename RequestedType>
  31. RequestedType* GetStateAs()
  32. {
  33. #if defined(WITH_RTTI) || defined(_CPPRTTI) || defined(__GXX_RTTI)
  34. auto* Result = dynamic_cast<RequestedType*>(this);
  35. checkf(Result, TEXT("Invalid Type Cast"));
  36. #else
  37. auto* Result = static_cast<RequestedType*>(this);
  38. #endif
  39. return Result;
  40. }
  41. /// A serial queue of operations being processed for this state
  42. FWwiseExecutionQueue* FileStateExecutionQueue{ new FWwiseExecutionQueue(WWISE_EQ_NAME("FWwiseFileState")) };
  43. using FBasicFunction = FWwiseExecutionQueue::FBasicFunction;
  44. using FOpQueueItem = FWwiseExecutionQueue::FOpQueueItem;
  45. using FLaterOpQueue = TQueue<FOpQueueItem, EQueueMode::Spsc>;
  46. /// Operation queue containing operations waiting to be unclogged (such as a load time)
  47. FLaterOpQueue LaterOpQueue;
  48. /// Number of instances opened. Slightly equivalent to LoadCount, but set synchronously and updated at extremities.
  49. std::atomic<int> OpenedInstances{ 0 };
  50. /// Number of times the Loading operation got requested for this state
  51. int LoadCount{ 0 };
  52. /// Number of times the Streaming operation got requested for this state
  53. int StreamingCount{ 0 };
  54. /// Current operation serial # being processed. Used to return callbacks in order of calling.
  55. int CreationOpOrder{ 0 };
  56. /// Current operation serial # done. Used to return callbacks in order of calling.
  57. int DoneOpOrder{ 0 };
  58. enum class WWISEFILEHANDLER_API EState
  59. {
  60. Closed,
  61. Opening,
  62. Opened,
  63. Loading,
  64. Loaded,
  65. Unloading,
  66. Closing,
  67. WillReload, // While unloading, a task is waiting to load again
  68. CanReload, // Equivalent to Opened, but won't Close
  69. WillReopen, // While closing, a task is waiting to open again
  70. CanReopen // Equivalent to Closed, but won't Delete
  71. };
  72. EState State;
  73. enum class WWISEFILEHANDLER_API EResult
  74. {
  75. /**
  76. * @brief The File State operation is completed. It doesn't tell whether the result is successful or not.
  77. */
  78. Done,
  79. /**
  80. * @brief The File State operation got deferred at a later time.
  81. */
  82. Deferred
  83. };
  84. using FIncrementCountCallback = TUniqueFunction<void(bool bInResult)>;
  85. void IncrementCountAsync(EWwiseFileStateOperationOrigin InOperationOrigin, FIncrementCountCallback&& InCallback);
  86. using FDecrementCountCallback = TUniqueFunction<void()>;
  87. using FDeleteFileStateFunction = TUniqueFunction<void(FDecrementCountCallback&& InCallback)>;
  88. void DecrementCountAsync(EWwiseFileStateOperationOrigin InOperationOrigin, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback);
  89. virtual bool CanDelete() const;
  90. virtual const TCHAR* GetManagingTypeName() const { return TEXT("Invalid"); }
  91. virtual uint32 GetShortId() const { return 0; }
  92. virtual FWwiseStreamableFileStateInfo* GetStreamableFileStateInfo() { return nullptr; }
  93. virtual const FWwiseStreamableFileStateInfo* GetStreamableFileStateInfo() const { return nullptr; }
  94. virtual bool IsStreamedState() const { return GetStreamableFileStateInfo() != nullptr; }
  95. FWwiseFileState(FWwiseFileState const&) = delete;
  96. FWwiseFileState& operator=(FWwiseFileState const&) = delete;
  97. FWwiseFileState(FWwiseFileState&&) = delete;
  98. FWwiseFileState& operator=(FWwiseFileState&&) = delete;
  99. protected:
  100. FWwiseFileState();
  101. void Term();
  102. static void IncrementCountAsyncDone(FWwiseAsyncCycleCounter&& InOpCycleCounter, FIncrementCountCallback&& InCallback, bool bInResult);
  103. static void DecrementCountAsyncDone(FWwiseAsyncCycleCounter&& InOpCycleCounter, FDecrementCountCallback&& InCallback);
  104. virtual void IncrementCount(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FIncrementCountCallback&& InCallback);
  105. virtual void IncrementCountOpen(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FIncrementCountCallback&& InCallback);
  106. virtual void IncrementCountLoad(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FIncrementCountCallback&& InCallback);
  107. virtual void IncrementCountDone(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FIncrementCountCallback&& InCallback);
  108. virtual void DecrementCount(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback);
  109. virtual void DecrementCountUnload(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback);
  110. virtual void DecrementCountUnloadCallback(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback, EResult InDefer);
  111. virtual void DecrementCountClose(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback);
  112. virtual void DecrementCountCloseCallback(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback, EResult InDefer);
  113. virtual void DecrementCountDone(EWwiseFileStateOperationOrigin InOperationOrigin, int InCurrentOpOrder, FDeleteFileStateFunction&& InDeleteState, FDecrementCountCallback&& InCallback);
  114. using FOpenFileCallback = TUniqueFunction<void()>;
  115. using FLoadInSoundEngineCallback = TUniqueFunction<void()>;
  116. virtual void IncrementLoadCount(EWwiseFileStateOperationOrigin InOperationOrigin);
  117. virtual bool CanOpenFile() const;
  118. virtual void OpenFile(FOpenFileCallback&& InCallback) { OpenFileFailed(MoveTemp(InCallback)); }
  119. void OpenFileSucceeded(FOpenFileCallback&& InCallback);
  120. void OpenFileFailed(FOpenFileCallback&& InCallback);
  121. virtual bool CanLoadInSoundEngine() const;
  122. virtual void LoadInSoundEngine(FLoadInSoundEngineCallback&& InCallback) { LoadInSoundEngineFailed(MoveTemp(InCallback)); }
  123. void LoadInSoundEngineSucceeded(FLoadInSoundEngineCallback&& InCallback);
  124. void LoadInSoundEngineFailed(FLoadInSoundEngineCallback&& InCallback);
  125. using FUnloadFromSoundEngineCallback = TUniqueFunction<void(EResult InResult)>;
  126. using FCloseFileCallback = TUniqueFunction<void(EResult InResult)>;
  127. virtual void DecrementLoadCount(EWwiseFileStateOperationOrigin InOperationOrigin);
  128. virtual bool CanUnloadFromSoundEngine() const;
  129. virtual void UnloadFromSoundEngine(FUnloadFromSoundEngineCallback&& InCallback) { UnloadFromSoundEngineDone(MoveTemp(InCallback)); }
  130. void UnloadFromSoundEngineDone(FUnloadFromSoundEngineCallback&& InCallback);
  131. void UnloadFromSoundEngineToClosedFile(FUnloadFromSoundEngineCallback&& InCallback);
  132. void UnloadFromSoundEngineDefer(FUnloadFromSoundEngineCallback&& InCallback);
  133. virtual bool CanCloseFile() const;
  134. virtual void CloseFile(FCloseFileCallback&& InCallback) { CloseFileDone(MoveTemp(InCallback)); }
  135. void CloseFileDone(FCloseFileCallback&& InCallback);
  136. void CloseFileDefer(FCloseFileCallback&& InCallback);
  137. bool IsBusy() const;
  138. void AsyncOp(const TCHAR* InDebugName, FBasicFunction&& Fct);
  139. void AsyncOpLater(const TCHAR* InDebugName, FBasicFunction&& Fct);
  140. void ProcessLaterOpQueue();
  141. };
  142. using FWwiseFileStateSharedPtr = TSharedPtr<FWwiseFileState, ESPMode::ThreadSafe>;