2012-10-23 74 views
3

使用FmodEx時我遇到了一些問題。我已經通過網絡徹底搜索,看看是否有人有我的同樣的問題,但我沒有找到任何相關的問題。 我做了一個類,加載和播放我的聲音,在這種情況下,流。這裏是我的代碼:FMOD Ex內存分配問題

Audio::Audio() 
{ 
//Create system object// 
m_Result = FMOD::System_Create(&m_pSystem); 
ErrorCheck(m_Result); 

//Check FMOD version// 
m_Result = m_pSystem->getVersion(&m_FmodVersion); 
if(m_FmodVersion < FMOD_VERSION) 
    MessageBox(NULL, FMOD_ErrorString(m_Result), "FMOD Version Error", MB_OK); 

//Check if hardware acceleration is disabled// 
m_pSystem->getDriverCaps(0, &m_Caps, 0, &m_SpeakerMode); 
if (m_Caps & FMOD_CAPS_HARDWARE_EMULATED) 
    MessageBox(NULL, FMOD_ErrorString(m_Result), "FMOD Acceleration Error", MB_OK); 

//Initialize system object// 
m_Result = m_pSystem->init(2, FMOD_INIT_NORMAL, 0); 
ErrorCheck(m_Result); 

m_pChannel = 0; 
m_IsLoaded = false; 
} 

void Audio::LoadMusic(char *filename) 
{ 
m_Result = m_pSystem->createStream(filename, FMOD_CREATESTREAM, 0, &m_pSound); 
ErrorCheck(m_Result); 
} 

void Audio::Play() 
{ 
SetPause(false); 
m_Result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound, false, &m_pChannel); 
ErrorCheck(m_Result); 
SetPause(true); 
} 

我只是這樣做後:

pAudio->LoadMusic("test.mp3"); 
pAudio->Play(); 

聲音播放沒有問題。加載流時會發生問題。使用的內存一直在增加,並且不會停止。我猜這是因爲它用來讀取mp3流的小緩衝區沒有被釋放,因此它尋找RAM中下一個可用內存塊,因此程序的內存使用量不會停止越來越多。 我認爲在每次播放後都可以使用「釋放」方法,但我注意到釋放釋放了聲音實例中的所有內存。

任何人都可以給我一些指針,我在做什麼錯在這裏?我如何防止這種情況? 我不確定我是否已經說清楚了。 在此先感謝您的幫助。

回答

1

每次調用pAudio-> LoadMusic時,都會分配(泄漏)更多的內存,因爲您正在創建一個新的FMOD :: Sound實例(正如您指出的那樣,它有自己的流緩衝區)。如果您只是想再次播放聲音,只需調用pAudio-> Play並重新開始播放。

如果您擔心FMOD內存使用情況,您可以致電Memory_GetStats進行監控,以防萬一我錯過了解您的使用情況並導致泄漏。