123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- /*******************************************************************************
- The content of this file includes portions of the proprietary AUDIOKINETIC Wwise
- Technology released in source code form as part of the game integration package.
- The content of this file may not be used without valid licenses to the
- AUDIOKINETIC Wwise Technology.
- Note that the use of the game engine is subject to the Unreal(R) Engine End User
- License Agreement at https://www.unrealengine.com/en-US/eula/unreal
-
- License Usage
-
- Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use
- this file in accordance with the end user license agreement provided with the
- software or, alternatively, in accordance with the terms contained
- in a written agreement between you and Audiokinetic Inc.
- Copyright (c) 2023 Audiokinetic Inc.
- *******************************************************************************/
- #include "Wwise/WwiseMediaFileState.h"
- #include "Wwise/WwiseMediaManager.h"
- #include "Wwise/WwiseStreamingManagerHooks.h"
- #include "Wwise/WwiseTask.h"
- #include "Wwise/API/WwiseSoundEngineAPI.h"
- #include "Wwise/Stats/FileHandlerMemory.h"
- #include "WwiseUnrealHelper.h"
- #include "Async/MappedFileHandle.h"
- #include <inttypes.h>
- #include "Wwise/WwiseSoundEngineUtils.h"
- FWwiseMediaFileState::FWwiseMediaFileState(const FWwiseMediaCookedData& InCookedData, const FString& InRootPath) :
- FWwiseMediaCookedData(InCookedData),
- RootPath(InRootPath)
- {
- INC_DWORD_STAT(STAT_WwiseFileHandlerKnownMedia);
- }
- FWwiseMediaFileState::~FWwiseMediaFileState()
- {
- DEC_DWORD_STAT(STAT_WwiseFileHandlerKnownMedia);
- }
- FWwiseInMemoryMediaFileState::FWwiseInMemoryMediaFileState(const FWwiseMediaCookedData& InCookedData, const FString& InRootPath) :
- FWwiseMediaFileState(InCookedData, InRootPath)
- {
- pMediaMemory = nullptr;
- sourceID = MediaId;
- uMediaSize = 0;
- }
- void FWwiseInMemoryMediaFileState::OpenFile(FOpenFileCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseInMemoryMediaFileState::OpenFile"));
- if (UNLIKELY(uMediaSize || pMediaMemory))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseInMemoryMediaFileState::OpenFile %" PRIu32 " (%s): Seems to be already opened."), MediaId, *DebugName.ToString());
- return OpenFileFailed(MoveTemp(InCallback));
- }
- const auto FullPathName = RootPath / MediaPathName.ToString();
- int64 FileSize = 0;
- if (LIKELY(GetFileToPtr(const_cast<const uint8*&>(pMediaMemory), FileSize,
- FullPathName, bDeviceMemory, MemoryAlignment, true,
- STAT_WwiseMemoryMedia_FName, STAT_WwiseMemoryMediaDevice_FName)))
- {
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseInMemoryMediaFileState::OpenFile %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- uMediaSize = FileSize;
- return OpenFileSucceeded(MoveTemp(InCallback));
- }
- else
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseInMemoryMediaFileState::OpenFile %" PRIu32 " (%s): Failed to open In-Memory Media (%s)."), MediaId, *DebugName.ToString(), *FullPathName);
- pMediaMemory = nullptr;
- FileSize = 0;
- return OpenFileFailed(MoveTemp(InCallback));
- }
- }
- void FWwiseInMemoryMediaFileState::LoadInSoundEngine(FLoadInSoundEngineCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseInMemoryMediaFileState::LoadInSoundEngine"));
- if (UNLIKELY(!uMediaSize || !pMediaMemory))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseInMemoryMediaFileState::LoadInSoundEngine %" PRIu32 " (%s): No data, but supposed to be loaded."), MediaId, *DebugName.ToString());
- return LoadInSoundEngineFailed(MoveTemp(InCallback));
- }
- auto* SoundEngine = IWwiseSoundEngineAPI::Get();
- if (UNLIKELY(!SoundEngine))
- {
- UE_LOG(LogWwiseFileHandler, Log, TEXT("FWwiseInMemoryMediaFileState::LoadInSoundEngine %" PRIu32 " (%s): Failed loading media without a SoundEngine."), MediaId, *DebugName.ToString());
- return LoadInSoundEngineFailed(MoveTemp(InCallback));
- }
- const auto SetMediaResult = SoundEngine->SetMedia(this, 1);
- if (LIKELY(SetMediaResult == AK_Success))
- {
- UE_LOG(LogWwiseFileHandler, VeryVerbose, TEXT("FWwiseInMemoryMediaFileState::LoadInSoundEngine %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- INC_DWORD_STAT(STAT_WwiseFileHandlerLoadedMedia);
- return LoadInSoundEngineSucceeded(MoveTemp(InCallback));
- }
- else
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseInMemoryMediaFileState::LoadInSoundEngine %" PRIu32 " (%s): Failed to load Media: %d (%s)."), MediaId, *DebugName.ToString(), SetMediaResult, WwiseUnrealHelper::GetResultString(SetMediaResult));
- return LoadInSoundEngineFailed(MoveTemp(InCallback));
- }
- }
- void FWwiseInMemoryMediaFileState::UnloadFromSoundEngine(FUnloadFromSoundEngineCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseInMemoryMediaFileState::UnloadFromSoundEngine"));
- auto* SoundEngine = IWwiseSoundEngineAPI::Get();
- if (UNLIKELY(!SoundEngine))
- {
- UE_LOG(LogWwiseFileHandler, Log, TEXT("FWwiseInMemoryMediaFileState::UnloadFromSoundEngine %" PRIu32 " (%s): Failed unloading media without a SoundEngine."), MediaId, *DebugName.ToString());
- return CloseFileDone(MoveTemp(InCallback));
- }
- const auto Result = SoundEngine->TryUnsetMedia(this, 1, nullptr);
- if (UNLIKELY(Result == AK_ResourceInUse))
- {
- UE_LOG(LogWwiseFileHandler, VeryVerbose, TEXT("FWwiseInMemoryMediaFileState::UnloadFromSoundEngine %" PRIu32 " (%s): Deferred."), MediaId, *DebugName.ToString());
- return UnloadFromSoundEngineDefer(MoveTemp(InCallback));
- }
- else
- {
- UE_CLOG(UNLIKELY(Result != AK_Success), LogWwiseFileHandler, Error, TEXT("FWwiseInMemoryMediaFileState::UnloadFromSoundEngine %" PRIu32 " (%s): TryUnsetMedia failed: %d (%s)"), MediaId, *DebugName.ToString(), Result, WwiseUnrealHelper::GetResultString(Result));
- UE_CLOG(LIKELY(Result == AK_Success), LogWwiseFileHandler, VeryVerbose, TEXT("FWwiseInMemoryMediaFileState::UnloadFromSoundEngine %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- DEC_DWORD_STAT(STAT_WwiseFileHandlerLoadedMedia);
- return UnloadFromSoundEngineDone(MoveTemp(InCallback));
- }
- }
- void FWwiseInMemoryMediaFileState::CloseFile(FCloseFileCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseInMemoryMediaFileState::CloseFile"));
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseInMemoryMediaFileState::CloseFile %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- DeallocateMemory(pMediaMemory, uMediaSize, bDeviceMemory, MemoryAlignment, true, STAT_WwiseMemoryMedia_FName, STAT_WwiseMemoryMediaDevice_FName);
- pMediaMemory = nullptr;
- uMediaSize = 0;
- CloseFileDone(MoveTemp(InCallback));
- }
- FWwiseStreamedMediaFileState::FWwiseStreamedMediaFileState(const FWwiseMediaCookedData& InCookedData,
- const FString& InRootPath, uint32 InStreamingGranularity) :
- FWwiseMediaFileState(InCookedData, InRootPath),
- StreamingGranularity(InStreamingGranularity),
- StreamedFile(nullptr)
- {
- sourceID = InCookedData.MediaId;
- pMediaMemory = nullptr;
- uMediaSize = 0;
- }
- void FWwiseStreamedMediaFileState::CloseStreaming()
- {
- auto* MediaManager = IWwiseMediaManager::Get();
- if (UNLIKELY(!MediaManager))
- {
- UE_LOG(LogWwiseFileHandler, Log, TEXT("FWwiseStreamedMediaFileState::CloseStreaming %" PRIu32 " (%s): Closing without a MediaManager."), MediaId, *DebugName.ToString());
- return;
- }
- MediaManager->GetStreamingHooks().CloseStreaming(MediaId, *this);
- }
- void FWwiseStreamedMediaFileState::OpenFile(FOpenFileCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseStreamedMediaFileState::OpenFile"));
- if (UNLIKELY(iFileSize != 0 || StreamedFile))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::OpenFile %" PRIu32 " (%s): Stream seems to be already opened."), MediaId, *DebugName.ToString());
- return OpenFileFailed(MoveTemp(InCallback));
- }
- if (PrefetchSize == 0)
- {
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseStreamedMediaFileState::OpenFile %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- return OpenFileSucceeded(MoveTemp(InCallback));
- }
- // Process PrefetchSize and send as SetMedia
- const auto FullPathName = RootPath / MediaPathName.ToString();
- int64 FileSize = 0;
- if (UNLIKELY(!GetFileToPtr(const_cast<const uint8*&>(pMediaMemory), FileSize,
- FullPathName, bDeviceMemory, MemoryAlignment, true,
- STAT_WwiseMemoryMediaPrefetch_FName, STAT_WwiseMemoryMediaPrefetchDevice_FName,
- PrefetchSize)))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::OpenFile %" PRIu32 " (%s): Failed to Read prefetch media (%s)."), MediaId, *DebugName.ToString(), *FullPathName);
- pMediaMemory = nullptr;
- return OpenFileFailed(MoveTemp(InCallback));
- }
- uMediaSize = FileSize;
- auto* SoundEngine = IWwiseSoundEngineAPI::Get();
- if (UNLIKELY(!SoundEngine))
- {
- UE_LOG(LogWwiseFileHandler, Log, TEXT("FWwiseStreamedMediaFileState::OpenFile %" PRIu32 " (%s): Failed prefetch media without a SoundEngine."), MediaId, *DebugName.ToString());
- DeallocateMemory(pMediaMemory, uMediaSize, bDeviceMemory, MemoryAlignment, true, STAT_WwiseMemoryMediaPrefetch_FName, STAT_WwiseMemoryMediaPrefetchDevice_FName);
- pMediaMemory = nullptr;
- uMediaSize = 0;
- return OpenFileFailed(MoveTemp(InCallback));
- }
- const auto SetMediaResult = SoundEngine->SetMedia(this, 1);
- if (LIKELY(SetMediaResult == AK_Success))
- {
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseStreamedMediaFileState::OpenFile %" PRIu32 " (%s): Prefetched %" PRIu32 " bytes."), MediaId, *DebugName.ToString(), uMediaSize);
- INC_DWORD_STAT(STAT_WwiseFileHandlerPrefetchedMedia);
- return OpenFileSucceeded(MoveTemp(InCallback));
- }
- else
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::OpenFile %" PRIu32 " (%s): Failed to prefetch media: %d (%s)."), MediaId, *DebugName.ToString(), SetMediaResult, WwiseUnrealHelper::GetResultString(SetMediaResult));
- DeallocateMemory(pMediaMemory, uMediaSize, bDeviceMemory, MemoryAlignment, true, STAT_WwiseMemoryMediaPrefetch_FName, STAT_WwiseMemoryMediaPrefetchDevice_FName);
- pMediaMemory = nullptr;
- uMediaSize = 0;
- return OpenFileFailed(MoveTemp(InCallback));
- }
- }
- void FWwiseStreamedMediaFileState::LoadInSoundEngine(FLoadInSoundEngineCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseStreamedMediaFileState::LoadInSoundEngine"));
- if (UNLIKELY(iFileSize != 0 || StreamedFile))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::LoadInSoundEngine %" PRIu32 " (%s): Stream seems to be already loaded."), MediaId, *DebugName.ToString());
- return LoadInSoundEngineFailed(MoveTemp(InCallback));
- }
- FWwiseFileCache* FileCache = FWwiseFileCache::Get();
- if (UNLIKELY(!FileCache))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::LoadInSoundEngine %" PRIu32 " (%s): WwiseFileCache not available."), MediaId, *DebugName.ToString());
- return LoadInSoundEngineFailed(MoveTemp(InCallback));
- }
- const auto FullPathName = RootPath / MediaPathName.ToString();
- UE_LOG(LogWwiseFileHandler, VeryVerbose, TEXT("FWwiseStreamedMediaFileState::LoadInSoundEngine %" PRIu32 " (%s): Opening file"), MediaId, *DebugName.ToString());
- FileCache->CreateFileCacheHandle(StreamedFile, FullPathName, [this, Callback = MoveTemp(InCallback)](bool bResult) mutable
- {
- if (UNLIKELY(!bResult))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::LoadInSoundEngine %" PRIu32 ": Failed to load Streaming Media (%s)."), MediaId, *DebugName.ToString());
- LaunchWwiseTask(WWISEFILEHANDLER_ASYNC_NAME("FWwiseStreamedMediaFileState::LoadInSoundEngine delete"), [StreamedFile=StreamedFile]
- {
- delete StreamedFile;
- });
- StreamedFile = nullptr;
- return LoadInSoundEngineFailed(MoveTemp(Callback));
- }
- iFileSize = StreamedFile->GetFileSize();
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseStreamedMediaFileState::LoadInSoundEngine %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- INC_DWORD_STAT(STAT_WwiseFileHandlerLoadedMedia);
- return LoadInSoundEngineSucceeded(MoveTemp(Callback));
- });
- }
- void FWwiseStreamedMediaFileState::UnloadFromSoundEngine(FUnloadFromSoundEngineCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseStreamedMediaFileState::UnloadFromSoundEngine"));
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseStreamedMediaFileState::UnloadFromSoundEngine %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- const auto* StreamedFileToDelete = StreamedFile;
- StreamedFile = nullptr;
- iFileSize = 0;
- delete StreamedFileToDelete;
- DEC_DWORD_STAT(STAT_WwiseFileHandlerLoadedMedia);
- UnloadFromSoundEngineDone(MoveTemp(InCallback));
- }
- void FWwiseStreamedMediaFileState::CloseFile(FCloseFileCallback&& InCallback)
- {
- SCOPED_WWISEFILEHANDLER_EVENT_3(TEXT("FWwiseStreamedMediaFileState::CloseFile"));
- if (pMediaMemory == nullptr)
- {
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseStreamedMediaFileState::CloseFile %" PRIu32 " (%s)"), MediaId, *DebugName.ToString());
- return CloseFileDone(MoveTemp(InCallback));
- }
- auto* SoundEngine = IWwiseSoundEngineAPI::Get();
- if (UNLIKELY(!SoundEngine))
- {
- UE_LOG(LogWwiseFileHandler, Log, TEXT("FWwiseStreamedMediaFileState::CloseFile %" PRIu32 " (%s): Failed closing prefetch without a SoundEngine. Leaking."), MediaId, *DebugName.ToString());
- pMediaMemory = nullptr;
- uMediaSize = 0;
- return CloseFileDone(MoveTemp(InCallback));
- }
- const auto Result = SoundEngine->TryUnsetMedia(this, 1, nullptr);
- if (UNLIKELY(Result == AK_ResourceInUse))
- {
- return CloseFileDefer(MoveTemp(InCallback));
- }
- else
- {
- if (LIKELY(Result == AK_Success))
- {
- UE_LOG(LogWwiseFileHandler, Verbose, TEXT("FWwiseStreamedMediaFileState::CloseFile %" PRIu32 " (%s): Unloaded prefetch."), MediaId, *DebugName.ToString());
- DEC_DWORD_STAT(STAT_WwiseFileHandlerPrefetchedMedia);
- DeallocateMemory(pMediaMemory, uMediaSize, bDeviceMemory, MemoryAlignment, true, STAT_WwiseMemoryMediaPrefetch_FName, STAT_WwiseMemoryMediaPrefetchDevice_FName);
- }
- else
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::CloseFile %" PRIu32 " (%s): TryUnsetMedia of prefetch failed: %d (%s). Leaking."), MediaId, *DebugName.ToString(), Result, WwiseUnrealHelper::GetResultString(Result));
- }
- pMediaMemory = nullptr;
- uMediaSize = 0;
- return CloseFileDone(MoveTemp(InCallback));
- }
- }
- bool FWwiseStreamedMediaFileState::CanProcessFileOp() const
- {
- if (UNLIKELY(State != EState::Loaded))
- {
- UE_LOG(LogWwiseFileHandler, Error, TEXT("FWwiseStreamedMediaFileState::CanProcessFileOp %" PRIu32 " (%s): IO Hook asked for a file operation, but state is not ready."), MediaId, *DebugName.ToString());
- return false;
- }
- return true;
- }
- AKRESULT FWwiseStreamedMediaFileState::ProcessRead(
- AkFileDesc& InFileDesc, const AkIoHeuristics& InHeuristics,
- AkAsyncIOTransferInfo& OutTransferInfo, FWwiseAkFileOperationDone&& InFileOpDoneCallback)
- {
- UE_LOG(LogWwiseFileHandler, VeryVerbose, TEXT("FWwiseStreamedMediaFileState::ProcessRead: Reading %" PRIu32 " bytes @ %" PRIu64 " in file %" PRIu32 " (%s)"),
- OutTransferInfo.uRequestedSize, OutTransferInfo.uFilePosition, MediaId, *DebugName.ToString());
- StreamedFile->ReadAkData(InHeuristics, OutTransferInfo, MoveTemp(InFileOpDoneCallback));
- return AK_Success;
- }
|