Cockatiel技術ブログ

株式会社ピュアサウンドのオーディオソリューション。いろいろ音を鳴らしています。

Xamarin

Xamarin(iOS/Android)オーディオ中級編-AndroidのSoundPoolを使ってみる

投稿日:2018年12月19日 更新日:

みなさま、おつかれさまです。

さて、これまで初級編としてXamarinでの簡単なオーディオ実装を解説してきましたが、もう一歩踏み込んだ内容に入っていきたいと思います。

まずはじめに注意点として、便宜上AndroidのSoundPoolとiOSのAudioQueueを中難易度として同列にしていましたが、実際のところ両者は性質がだいぶ異なります。

    • SoundPool:短いオーディオファイルを少ないレイテンシーで複数鳴らせる
    • AudioQueue:オーディオコールバックを実装し、バッファにデータを書き込んでいく

ご覧の通り、AudioQueueはコールバックの要素がでてくるなど、ほぼ低レベルAPIの様相です。
対して、SoundPoolは初級編で扱ったMediaPlayerとはまた違った方向性で、手軽に扱える高レベルAPIと言えます。

当然実装も大きく異なるため、ここからはプラットフォームごとに記事を分割して解説していきたいと思います。

今回は、AndroidのSoundPoolについてです。

AndroidのSoundPoolを知る

まずSoundPoolのリファレンスを見てみましょう。

SoundPool  |  Android Developers

MediaPlayerに比べると、できることはかなり限られることがわかります。
再生終了の検知や再生位置の取得などはできません。

SoundPoolの真骨頂は、下記の一文にあります。

In addition to low-latency playback, SoundPool can also manage the number of audio streams being rendered at once.
(訳:低レイテンシ再生に加えて、SoundPoolはレンダリングされるオーディオストリームの数を一度に管理することもできます。)

そう、SoundPoolはインスタンス一つで複数の音を同時に鳴らすことができるのです。
しかもオンメモリでの運用となるので、レイテンシを低く抑えられます。

SoundPoolの特徴を活かすような、複数のサウンドを鳴らす仕組みで実験してみましょう。

オーディオ素材の準備

実験のためには様々なサウンドファイルが不可欠です。
でも、素材を集めるのはちょっとめんどくさい……そんな時は!

RETRO SOUND EFFECTS – Asset Store

おおー、こんなところに良さそうな効果音が売ってるじゃないですかー(棒

……すみません、思い切り宣伝をしてしまいましたが、リソースファイルとして読み込める形式であればファイルはなんでもOKです。

インターフェースとネイティブの実装

それでは、いつものように実装していきましょう。

共通部分の実装

共通部分のインターフェースは実にシンプルです。
再生と停止以外では、初期化用のInitメソッドと破棄用のReleaseメソッドを用意しています。

結局今回のサンプルでStopとReleaseは使わないのですが、念のためということで。

Androidネイティブ部分の実装

続いてネイティブの実装です。
全文一気に書いてしまいます。

Initメソッドの中では、SoundPoolの初期化とオーディオファイルのロードを行なっています。
SoundPoolもかつてはコンストラクタでインスタンス作成をしていましたが、Android5.0(SDKレベル21)以降はBuilderを使うようになりました。
AudioAttributesで用途に適した設定を定義して、SoundPool#Builderに渡すという流れです。
今回はゲームに使うという仮の設定で、同時発音数は4にしてみました。

SoundPool#Loadメソッドは、ユニークな値を返してくれます。
この値をIDとして、再生や停止などで操作するオーディオの識別に使う、というわけですね。
今回は8個のオーディオファイルをロードして、各IDをリストに格納しています。

もちろん、オーディオリソースのビルドアクションはAndroidResourceに設定することをお忘れなく。

PlayメソッドとStopメソッドでは、先のユニークIDを引数として使用しています。
Playメソッドでは他に引数として左右のボリューム、プライオリティ(同時発音数が超過した場合、プライオリティが高い音が優先される)、ループ回数、再生レートが必要ですが、これらは後から変更することができます。

Releaseメソッドもシンプルな構造です。

ユーザーインターフェースの実装

初級編での実装にそのまま継ぎ足ししています。
画面下の方にGridでボタンを配置して……

次にコードビハインドに移ります。
まず、今回作成したインターフェースの初期化が必要ですね。
ハイライトした部分に処理を追加しています。

さらにボタンの実装です。
各ボタンに設定したTagIndexの番号をそのままインターフェースのPlayメソッドに渡しています。

以上です。
ビルドして、音を鳴らしまくってみましょう。


いい感じですね!
動画のように、MediaPlayerと並列して再生させることも可能です。

終わりに

MediaPlayerがまさしくプレイヤーとして様々な機能を持っていたのに対し、SoundPoolはゲームなどインタラクティブな用途に特化していると言えるでしょう。
実際、公式のリファレンスではゲームでステージごとにサウンドを入れ替える、といった使い方が例示されています。

うまく活用すれば、ミドルウェアに頼らずとも柔軟なサウンド運用ができそうですね!

-Xamarin
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

16 + 14 =

関連記事

no image

Xamarin(iOS/Android)オーディオ初級編 – 再生終了の検知

前回までで、AVAudioPlayerとMediaPlayerでオーディオファイルを鳴らし、再生位置の操作ができるようになりました。 Xamarin(iOS/Android)オーディオ初級編 – とり …

no image

Xamarin(iOS/Android)オーディオ初級編 – とりあえず鳴らしてみる

Cockatielでは今年9月ごろからXamarinを導入して、モバイル向けにあれこれと調査研究をしています。 Xamarin を利用した Visual Studio でのアプリ開発 | Visual …

no image

Xamarin(iOS/Android)オーディオ初級編 – 再生位置の操作

前回はXamarinでiOSのAVAudioPlayer、AndroidのMediaPlayerを使って音を鳴らしてみました。 Xamarin(iOS/Android)オーディオ初級編 – とりあえず …