Cockatiel技術ブログ

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

Xamarin

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

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

Cockatielでは今年9月ごろからXamarinを導入して、モバイル向けにあれこれと調査研究をしています。

Xamarin を利用した Visual Studio でのアプリ開発 | Visual Studio

いいですよね!Xamarin。
C#一本で色々なプラットフォームに対応できるのは、とても魅力的です。

とはいえ、共通化できるのはコアなロジックと大まかなレイアウトくらいで、オーディオのようなハードウェアやOS由来の要素、また細かなデザインなどを触ろうとするのであれば、各プラットフォームの知識が必須となります。

しかし、Xamarinでオーディオプログラムはあまり需要がないのか、深い情報を集めようとすると少々ハードルが高い気がしています。
(おそらくゲーム開発とかであればUnityやUnrealEngineを使えばいいや、という感じだと思いますが……)

というわけで、Xamarinでオーディオをあれこれしてみたい!という自分含むニッチな層に向けて、実践を交えてまとめていきたいと思います。

各プラットフォームの音を扱うクラス

まず手始めに、AndroidとiOSではどんな音の鳴らし方があるかおさらいします。

Android iOS
手軽に鳴らせる MediaPlayer AVAudioPlayer
だいたい中間くらいの扱いやすさ・自由度 SoundPool AudioQueue
バッファレベルで自由自在 AudioTrack AudioUnit

実際はデータ変換など周辺のフレームワークを含めるともっと数があるのですが、ここではシンプルに三種類に区切ります。

何か動くモノを作ってみる

ただ解説だけでは退屈なので、実際に動くモノを作ってみましょう。
ひとまず、一番シンプルなMediaPlayerとAVAudioPlayerでの実装を目指します。

※以降はVisualStudio for Macの画面を利用した説明となります。
またファイル名やプロジェクト名などは環境に合わせて適宜読み替えてください。

共通部分の実装

ではさっそく作っていきましょう!
冒頭に書いたようにオーディオは各プラットフォームごとの実装になるので、DependencyServiceを使うことにしましょう。

DependencyService の概要 – Xamarin

DependencyServiceで使うインターフェースを新規に作成します。
とりあえず機能はシンプルに、再生開始と停止だけにしておきましょうか。

iOSの実装(AVAudioPlayer)

各プラットフォームの実装に移りましょう。
まずはiOSから。
iOSプロジェクト直下にRawフォルダを作成し、その中にリソースファイルを置きます。

リソースファイルのビルドアクションは、BundleResourceに設定しておきます。
ここ重要です。これでURLが取得できるようになります。

続けてコードを書きましょう。
DependencyServiceの概要を参考に、クラスを実装していきます。
メソッドとかは自動生成を使えばだいぶ楽できます。

AVAudioPlayerではNSUrlかNSDataを渡して、インスタンスを作成します。

  • Playメソッド内:プレイヤーのインスタンスが存在しない場合はインスタンスを作成し、演奏を開始します。
  • Stopメソッド内:インスタンスが存在する場合、演奏を停止します。

一点ポイントとして、Stopメソッド内でAVAudioPlayer.Stopの後にPrepareToPlayを呼び出しています。
停止した後に、すぐ再利用できるようにするプロセスです。

※ただ実際のところはAVAudioPlayerのPlayメソッド内部で、必要に応じて自動的にPrepareToPlayを呼んでいるそうです。
なので省略しても問題なく動作しますが、処理の流れを意識してここでは記述したまま進めます。
play – AVAudioPlayer | Apple Developer Documentation

Androidの実装(MediaPlayer)

続けてAndroidも実装していきます。
AndroidではResourcesフォルダ内にRawフォルダを作り、その中にリソースファイルを置きます。

ビルドアクションの設定はAndroidResourceです。
これでリソースIDを取得できるようになります。

では、コードを書きましょう。

リソースIDを渡して、MediaPlayerのインスタンスを作成します。
処理の流れはiOS版とほぼ同様です。

ちなみにMediaPlayerのStartメソッドは自動的にPrepareしてくれたりはしないので、停止や再生を繰り返しているとどこかのタイミングでほぼ確実にエラーを吐きます
注意してください。

再び共通部分の実装 – 完成

各プラットフォームの実装が終わりました!
あとは共通部分に戻って、DependencyServiceの呼び出しや再生・停止ボタンを実装しましょう。

あとはビルドしてあげればOKです。
どちらのプラットフォームも正しく再生・停止ができるか確認しましょう。
エラーが出るときは、リソースのビルドアクション設定などを確認してみてください。

終わりに

ひとまず、MediaPlayerとAVAudioPlayerでオーディオファイルを再生することができました。
手順としてはファイルを指定してインスタンスを作るだけなので、実にシンプルですね。

ただ、これだけでは本当に「ただ鳴るだけ」というレベルです。
さすがに物足りなさを感じるのではないでしょうか。

というわけで、次回からは各プレイヤーの制御など、さらに掘り下げてみたいと思います。

-Xamarin
-, ,

執筆者:


comment

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

six + seven =

関連記事

no image

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

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

no image

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

みなさま、おつかれさまです。 さて、これまで初級編としてXamarinでの簡単なオーディオ実装を解説してきましたが、もう一歩踏み込んだ内容に入っていきたいと思います。 まずはじめに注意点として、便宜上 …

no image

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

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