2014-02-24 29 views
4

什麼是「2」代表在以下幾點:什麼是SLDataLocator_AndroidSimpleBufferQueue(Android 4.3)?

SLDataLocator_AndroidSimpleBufferQueue loc_bq = 
{SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; 

從我讀過的東西,它是緩衝區的數目。

爲什麼2?爲什麼不只是1?如果2更好,那麼爲什麼不10更好呢?

感謝

+0

2是重疊播放與谷歌(谷歌「雙緩衝」)所需的最低限度。在回叫不規則地安排的情況下,2以上可以是有用的。我看過使用多於2個緩衝區的示例代碼。例如,PortAudio爲多個本地API使用多於2個緩衝區。 –

回答

6

爲什麼2?

如果你有2個緩衝區,你可以用另外一個數據填滿另一個緩衝區,而另一個正在播放。另外,如果您希望能夠使用Android的低延遲音頻路徑,那麼直到最近才需要您的緩衝區隊列中至少有2個緩衝區。

爲什麼不1?

填充了新數據的緩衝區變得相當棘手,如果你只得到了一個緩衝區,因爲你可能不能夠生成新的數據不夠快。

如果2更好,那麼爲什麼不10然後使它更好?

隨着您增加緩衝區的數量,您還會增加延遲(從排隊緩衝區時到該緩衝區將播放的時間),假設您保持緩衝區大小相同。

+0

我不確定我的理解。如果用戶的openSL揚聲器回調實現被調用,那是因爲音頻子系統準備好了更多的揚聲器數據。那麼你是否說這是不正確的?讓我們舉一個只有1個緩衝區的例子:[1]在t = 0時調用揚聲器回調函數。緩衝區充滿了10ms的音頻。 [2]揚聲器回調在t = 10ms時被調用。該緩衝區充滿了10毫秒的音頻......等等.....那麼你是說在[2]中寫入緩衝區的數據可能會覆蓋尚未渲染的數據(即使openSL調用爲更多的數據)? – user1884325

+0

你的緩衝區被玩家消費後,你會得到緩衝隊列回調,這意味着下一個要排隊的數據必須立即準備好(即使如此,我不確定你是否能夠對它進行查詢在玩家想要開始消費更多緩衝數據之前)。如果緩衝區隊列中有2個或更多緩衝區,則隊列中仍有1個或更多緩衝區,這會留出一些時間來生成並排入另一個緩衝區。 – Michael

+0

你說我的緩衝區已被使用後得到緩衝隊列回調,然後 - 在同一時間 - 你說你不確定在玩家想要開始消費更多的數據之前是否能排入數據。這沒有意義。如果你得到回調,玩家準備消耗更多的數據,對吧?因此,如果在調用回調時確保數據可用,則只需要一個緩衝區即可;即回調被調用,數據被入隊,並且在下一次調用回調時已經消耗了入隊數據,因此您排入下一個數據 – user1884325