2016-06-16 6 views
1

アプリケーションで通知音として再生するいくつかの小さなmp3ファイルがあります。ただ明確にするために、私はすでにResourcesの下に "raw"フォルダを作成しておき、そこでmp3ファイルを追加しました。最初のパスとして、私はちょうどこのようMediaPlayerのを使用していました:通知としてmp3サウンドを再生する適切な方法

MediaPlayer mPlayer;

mPlayer = MediaPlayer.Create(context, Resource.Raw.warning);

mPlayer.Start();

そして、それが働いていたが、私がやりたいすべてが使用されるとき、それは少し不格好に見えましたそれらは通知として、オーディオトラックを再生するためではありません。私はまた、プレーヤーが演奏、廃棄等を終えていることを確認するために、そのアプローチでオーバーヘッドが増えていると思います。

私はSoundPoolを見つけて実装しました。いくつかの初期の質問がありました。たとえば、SoundPoolにサウンドをロードすると、SoundIDのintが返され、後で再生するサウンドへの参照として使用されます。したがって、これらのプロパティも処理する別のクラスを作成する必要がありました。

これはこれまで私がこれまで行ってきたことですが、動作しているようですが、これがまだ最善の方法であるかどうか疑問に思っていますか?

まず、SoundPoolをラップするクラスを作成しました。それにSoundIDのクラスもあります。

「 」はAndroid.Contentを使用しています。 Android.Mediaを使用している ;

名前空間PocketPacTracAndroid.Media {publicクラスが {SoundPool soundPoolサウンド。 コンテキストコンテキスト。 int maxStreams = 1; bool isLoaded = false; `

その後

public bool IsLoaded 
    { 
     get { return isLoaded; } 
    } 

    public Sounds(Context oContext) 
    { 
     soundPool = new SoundPool(maxStreams, Stream.Music, 0); 
     context = oContext; 
     loadSoundPool(); 
    } 

    public Sounds(Context oContext, int streams) 
    { 
     maxStreams = streams; 
     soundPool = new SoundPool(maxStreams, Stream.Music, 0); 
     loadSoundPool(); 
    } 

    private void loadSoundPool() 
    { 
     soundPool.LoadComplete += SoundPool_LoadComplete; 
     SoundIDs sid = new SoundIDs(); 
     sid.Scan = soundPool.Load(context, Resource.Raw.scan, 1); 
     sid.PackageAdded = soundPool.Load(context, Resource.Raw.packageAdded, 1); 
     sid.HubTransfer = soundPool.Load(context, Resource.Raw.hubtransfer, 1); 
     sid.Alert = soundPool.Load(context, Resource.Raw.alert, 1); 
     sid.Warning = soundPool.Load(context, Resource.Raw.warning, 1); 
     sid.ScanChange = soundPool.Load(context, Resource.Raw.scanchange, 1); 
    } 

    private void SoundPool_LoadComplete(object sender, SoundPool.LoadCompleteEventArgs e) 
    { 
     isLoaded = true; 
    } 

    public void playSound(int sid) 
    { 
     if (isLoaded) 
     { 
      soundPool.Play(sid, 1f, 1f, 1, 0, 1f); 
     } 
    } 
} 

public class SoundIDs 
{ 
    int scan; 
    int packageAdded; 
    int hubTransfer; 
    int alert; 
    int warning; 
    int scanChange; 


    public int Scan 
    { 
     get { return scan; } 
     set { scan = value; } 
    } 

    public int PackageAdded 
    { 
     get { return packageAdded; } 
     set { packageAdded = value; } 
    } 

    public int HubTransfer 
    { 
     get { return hubTransfer; } 
     set { hubTransfer = value; } 
    } 

    public int Alert 
    { 
     get { return alert; } 
     set { alert = value; } 
    } 

    public int Warning 
    { 
     get { return warning; } 
     set { warning = value; } 
    } 

    public int ScanChange 
    { 
     get { return scanChange; } 
     set { scanChange = value; } 
    } 
} 

}は、どこにでも私のアプリでから、私はクラスのインスタンス化:

Sounds sounds; 
    SoundIDs sid; 

    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     context = Context; 
     getServiceTypes(); 
     sounds = new Sounds(context); 
     sid = new SoundIDs(); 
    } 

そして最後に、私がいた私のsoundIDに基づいて音を再生するには、これを呼び出すことができますファイルを読み込んだときに返されます。私はIsLoadedも公開していますが、外部からチェックしたいのですが、playSoundを呼び出すと内部的にチェックされます。

これは良いアプローチのようですか?それは最高ですか?任意の提案をいただければ幸いです。それはうまくいくように見えますが、アプリケーションライフサイクル中に同じまたは異なる通知を何度も繰り返して呼び出すと、リソースの問題や再生の問題がないことを確認したいだけです。

ありがとうございます!

答えて

0

はいSoundPoolは方法です。同時に異なる音を演奏するスレッドを見てみましょう。キューに入れない限り、スピーカーが1つしかないので、いくつかのサウンドは他のサウンドをブロックします。

関連する問題