SoundPool 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
SoundPool 類別負責管理並播放應用程式的音訊資源。
[Android.Runtime.Register("android/media/SoundPool", DoNotGenerateAcw=true)]
public class SoundPool : Java.Lang.Object
[<Android.Runtime.Register("android/media/SoundPool", DoNotGenerateAcw=true)>]
type SoundPool = class
inherit Object
- 繼承
- 屬性
備註
SoundPool 類別負責管理並播放應用程式的音訊資源。
SoundPool 是一組可從 APK 內的資源或檔案系統中的檔案載入記憶體的聲音樣本集合。 SoundPool 函式庫使用 MediaCodec 服務將音訊解碼成原始 16 位元 PCM。 這使得應用程式能以壓縮串流出貨,而無需承受播放時解壓時的 CPU 負載與延遲。
音池聲音預期會很短,因為它們是預先解碼到記憶體裡的。 每個解碼音訊內部限制為一兆位元組儲存空間,約代表 44.1kHz 立體聲時長 5.6 秒(在較低取樣率或單聲道遮罩時,持續時間會相應延長)。 若解碼音訊超過每個聲音一兆位元組的儲存空間,則會被截斷。
除了低延遲播放外,SoundPool 還能管理同時渲染的音訊串流數量。 當 SoundPool 物件建構時,maxStreams 參數會設定這個單一 SoundPool 一次可播放的最大串流數量。 SoundPool 會追蹤活躍串流的數量。 如果串流數超過最大,SoundPool 會根據優先順序自動停止先前播放的串流,接著依該優先權內的年齡來暫停。 限制最大串流數量有助於限制 CPU 負載,降低混音影響視覺或使用者介面效能的可能性。
聲音可以透過設定非零迴圈值來循環。 -1 值會讓聲音無限循環。 此時,應用程式必須明確呼叫 stop() 函式來停止聲音。 任何其他非零值都會使聲音重複指定次數,例如值為 3 會使聲音總共播放 4 次。
播放速率也可以調整。 播放速率為 1.0 時,聲音會以原始頻率播放(如有需要,會重新取樣至硬體輸出頻率)。 播放率為 2.0 時,聲音會以原本頻率的兩倍播放;播放率為 0.5 時,聲音會以原本頻率的一半播放。 播放率範圍為 0.5 到 2.0。
優先權從低到高不等,也就是說,數字越高,優先權越高。 當呼叫播放()導致活躍串流數量超過建立SoundPool時maxStreams參數所設定的值時,會使用優先權。 此時,串流分配器會停止優先權最低的串流。 如果有多條串流且優先權相同,它會選擇最早的串流停止。 若新串流的優先權低於所有活躍串流,則新聲音不會播放,play() 函式會回傳 streamID 為零。
讓我們來看看一個典型的使用案例:一場遊戲由多個層次的遊戲組成。 每個關卡都有一組獨特的音效,僅該關卡使用。 在這種情況下,遊戲邏輯應該會在載入第一級時建立一個新的 SoundPool 物件。 關卡資料本身可能包含該關卡將使用的音色清單。 載入邏輯會遍歷音色清單,呼叫相應的 SoundPool.load() 函式。 通常應在流程早期進行,以便有時間將音訊解壓縮成原始 PCM 格式,然後再進行播放。
當聲音載入並開始播放後,應用程式可以透過呼叫 SoundPool.play() 來觸發聲音。 串流播放可以暫停或繼續播放,應用程式也能即時調整播放速率以產生多普勒或合成效果。
請注意,由於串流可能因資源限制而被停止,streamID 是指向串流的特定實例。 如果為了讓優先權較高的串流播放而停止串流,該串流就不再有效。 然而,應用程式仍可無錯誤地呼叫 streamID 上的方法。 這有助於簡化程式邏輯,因為應用程式無需擔心串流生命週期。
在我們的範例中,當玩家完成關卡後,遊戲邏輯應該呼叫 SoundPool.release() 來釋放所有正在使用的原生資源,然後把 SoundPool 參考設為 null。 若玩家開始新關卡,會建立新的音池,載入音效後繼續遊玩。
Java 文件 android.media.SoundPool。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| SoundPool(Int32, Stream, Int32) |
已淘汰.
構造 函數。 |
| SoundPool(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
取得執行時最後指派的狀態旗標。 (繼承來源 JavaObject) |
| JniPeerMembers |
取得用於存取此 Java 綁定成員的 JNI 元資料。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
方法
事件
| 名稱 | Description |
|---|---|
| LoadComplete |
當提供原生取樣解碼結果時,會發生與載入任務是否完成無關。 |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
標記此節點為處置,並以 |
| IJavaPeerable.Finalized() |
標記此節點為處置,並以 |
| IJavaPeerable.JniObjectReferenceControlBlock |
取得此對等端使用的原生控制區塊指標。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
儲存執行時提供的身份雜湊碼。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
取代儲存的受管理對等狀態旗標。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
當引用無效時,更新對等節點並釋放已拋棄節點的控制區塊。 (繼承來源 JavaObject) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
重用相容的受管理對等端或取得請求型態的包裝器。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |