2014-03-28 74 views
1

我在Android上遇到了OpenSL ES的問題。我使用OpenSL播放聲音效果。目前,我每次播放聲音時都會創建一個新播放器。 (我知道這是不是非常有效的,但它是「足夠好」暫且。)OpenSL ES Android:「對象太多」SL_RESULT_MEMORY_FAILURE

一段時間回放後,我開始得到這些錯誤:

E/libOpenSLES(25131): Too many objects 
W/libOpenSLES(25131): Leaving Engine::CreateAudioPlayer (SL_RESULT_MEMORY_FAILURE) 

我跟蹤我的創建/銷燬模式,在任何時候我都不會超過4個優秀的對象,遠低於32的系統限制。當然,這是假設Destroy正常工作。

我現在唯一的猜測是,當我清理播放器對象時,我正在做一些不正確的事情。一個可能的問題是Destroy通常在播放器回調的環境中被調用(基本上在播放完成後摧毀播放器),儘管我找不到任何參考提示這是一個問題。除了「摧毀」玩家對象之外,還有其他的清理步驟嗎?需要以某種方式清理接口嗎?

- 新增 -

更多的測試後,將創建30後球員一貫發生(有發動機和搭配也讓使總數達到32個對象)。所以我不應該正確地銷燬對象。下面的代碼 - 我倒是很想知道發生了什麼事情不對:是不是需要

SLuint32 playerState = 0; 

SLresult result = (*pPlayerObject)->GetState(pPlayerObject, &playerState); 

return_if_fail(result); 

if (playerState == SL_OBJECT_STATE_REALIZED) 
{ 
    (*pPlayerObject)->AbortAsyncOperation(pPlayerObject); 
    (*pPlayerObject)->Destroy(pPlayerObject); 
} 
else 
{ 
    __android_log_print(1, LOG_TAG, "Player object in unexpected state (%d)", playerState); 
    return 1002; 
} 

回答

1
  1. if (playerState == SL_OBJECT_STATE_REALIZED)

    。試着總是這樣做。

  2. AbortAsyncOperation被稱爲Destroy =>不需要。
  3. 所以試試只需(*pPlayerObject)->Destroy(pPlayerObject);它應該就夠了。

編輯: 我測試,發現解決方案。 您不能從播放器callback撥打Destroy()。例如,在主線程中應該使「destroy」列表在其他地方列出並銷燬它。