語言

SoundPool 類別

定義

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

回傳此 Object的執行時類別。

(繼承來源 Object)
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
AutoPause()

暫停所有正在播放的直播。

AutoResume()

恢復所有先前活躍的串流。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

將此對等節點的建置委派給執行時的值管理器。

(繼承來源 JavaObject)
Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

請求值管理器處置此對等節點,除非其映射保留該受管理實例。

(繼承來源 JavaObject)
Equals(Object)

測試另一個受管理節點是否參考相同的 Java 物件。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Load(AssetFileDescriptor, Int32)

從資產檔案描述符載入音效。

Load(Context, Int32, Int32)

從指定的 APK 資源載入音效。

Load(FileDescriptor, Int64, Int64, Int32)

從 FileDescriptor 載入音訊。

Load(String, Int32)

從指定的路徑載入聲音。

LoadAsync(AssetFileDescriptor, Int32)

啟動一項任務,呼叫資產描述符載入操作。

LoadAsync(Context, Int32, Int32)

啟動一個任務,呼叫應用程式資源載入操作。

LoadAsync(FileDescriptor, Int64, Int64, Int32)

啟動一個任務,呼叫描述符與範圍載入操作。

LoadAsync(String, Int32)

啟動一個任務,呼叫檔案路徑載入操作。

Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
Pause(Int32)

暫停播放串流。

Play(Int32, Single, Single, Int32, Int32, Single)

播放一個聲音 ID 的聲音。

Release()

釋放 SoundPool 資源。

Resume(Int32)

繼續播放串流。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetLoop(Int32, Int32)

設定循環模式。

SetOnLoadCompleteListener(SoundPool+IOnLoadCompleteListener)

設定 OnLoadCompleteListener 的回調鉤子。

SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

在控制區塊中儲存參考值,但不建立 JNI 參考副本。

(繼承來源 JavaObject)
SetPriority(Int32, Int32)

更改串流優先權。

SetRate(Int32, Single)

更改播放速率。

SetVolume(Int32, Single, Single)

設定串流音量。

Stop(Int32)

停止播放串流。

ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
Unload(Int32)

從聲音 ID 中卸下一個聲音。

UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

事件

名稱 Description
LoadComplete

當提供原生取樣解碼結果時,會發生與載入任務是否完成無關。

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

標記此節點為處置,並以disposing設定為 true的呼叫Dispose。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

標記此節點為處置,並以disposing設定為 false的呼叫Dispose。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

取得此對等端使用的原生控制區塊指標。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

儲存執行時提供的身份雜湊碼。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

取代儲存的受管理對等狀態旗標。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

當引用無效時,更新對等節點並釋放已拋棄節點的控制區塊。

(繼承來源 JavaObject)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

重用相容的受管理對等端或取得請求型態的包裝器。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於