2015-06-22 27 views
0

我正在使用fmodex,我試圖在C++下使用FMOD_FILE_OPEN_CALLBACK。在C++中使用Fmodex回調

FMOD_RESULT F_CALLBACK FMOD_FILE_OPEN_CALLBACK(const char *name, unsigned int *filesize, void **handle, void *userdata); 

但我想執行一個類的方法。所以我想將當前對象作爲回調的userdata傳遞並執行我的回調方法,因爲它的建議是here。 但與Fmod Studio不同,FMOD_CREATESOUNDEXINFO中沒有fileuserdata,只有userdata指針。

和文檔說:

[W]可選。指定0以忽略。這是用戶數據附加到 創建期間的聲音。通過Sound :: getUserData訪問。注意:此 未傳遞給FMOD_FILE_OPENCALLBACK,這是與文件相關的不同用戶數據 。

但是我怎樣才能訪問這個文件特定的指針呢?或者有其他解決方案來做到這一點?

謝謝。

回答

0

當有問題的API沒有爲回調提供用戶數據指針,但確實提供了某種類型的句柄,就像這裏似乎是這種情況,那麼您可以將每個回調調用轉發給C++方法(非在兩種常規方法+ 1特定API-方式-static成員函數):

  • 使用API​​功能的C++對象指針與每個手柄相關聯,或

  • 使用靜態存儲std::mapstd::unordered_map那將每個句柄與一個C++對象指針相關聯,或者

  • 使用硬連接的對象地址的動態創建的蹦牀功能。

使用第三種選擇,例如,在90年代的Borland的ObjectWindows框架中,它通常是最快的,但它與當前的惡意軟件保護方案相沖突,而且由於C++標準庫不支持它(並且據我所知Boost也不支持它,儘管在SO的C++休息室中的好狗曾經提出過關於它的建議),它必然是平臺特定的機器代碼。因此,如果您不知道如何執行第一個選項,我建議您使用第二個,std::mapstd::unordered_map來處理與C++對象關聯的操作。

然後,剩下的主要技術障礙是決定創建地圖條目的適當時間,以及適當的時間將其刪除。這很大程度上取決於回調方案。不幸的是,我沒有與你的經驗,但也許其他人可以關於那個細節。

+0

謝謝。但處理必須在公開回調中給出。我想在opencallback中有我的對象。所以,請在公開回調中獲得我的對象。 – Maluna34

1

這個問題解決了嗎?如果不是這樣,我是如何做到的。

FMOD_CREATESOUNDEXINFO* info = new FMOD_CREATESOUNDEXINFO(); 
info->cbsize = sizeof(FMOD_CREATESOUNDEXINFO); 

// This is the field you want to set 
info->fileuserdata = someUserData; 

_system->createStream(file.c_str(), FMOD_DEFAULT, info, &_currentSound); 

您使用的是舊版本的fmod庫嗎?在我的系統上,fileuserdata字段確實存在。我正在使用fmod studio安裝附帶的fmodex低級api。

+0

感謝您的幫助,但我使用舊的fmodex api和fileuserdata不存在。與fmod studio低級有很多不同嗎? – Maluna34

+0

我建議你試試看。自從我使用fmod的舊版本以來,至少已經有4年了,所以我不確定發生了什麼變化。但我想大多數的東西在低級別的API中保持不變。 – Jop

+0

謝謝!我打算用fmod studio改變。 ;) – Maluna34