0

特定の期間、サウンドファイルを同時に再生したいというAndroidメディアアプリケーションを使用しています。クラスを作成し、このクラス内で概念を使用SoundPoolThreadてサウンドを再生していますが、アプリケーションを実行すると、ANR 状態になり、log-cat に警告が表示されます

サンプル 2130968576 準備ができていません

誰でもこれを修正するのを手伝ってください...

クラス

    package com.kodspider.funk;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class CustomPlayer implements Runnable{

int song_id;
long time;
int button_id;
Context ctx;
SoundPool soundpool;

public CustomPlayer(int s_id, long Time, Context ct){

song_id = load(ctx, s_id, 0);
time = Time;
ctx = ct;

}
public void run(){
long start = System.currentTimeMillis();
System.out.println("set_time:"+time+"Song_id:"+song_id+"current_time:"+start);
long end = start + time;
while (System.currentTimeMillis() < end){

    //Initialization 
    soundpool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
    soundpool.play(song_id, 1.0f, 1.0f, 1, -1, 1.0f);

                    }
                    }
public int load (Context context, int resId, int priority){
    return resId;

}

                    }

ログキャット

07-07 10:57:51.828: I/ApplicationPackageManager(13625): cscCountry is not German : INS
07-07 10:57:57.656: I/ApplicationPackageManager(13625): cscCountry is not German : INS
07-07 10:57:59.343: W/KeyCharacterMap(13625): Can't open keycharmap file
07-07 10:57:59.343: W/KeyCharacterMap(13625): Error loading keycharmap file
07-07 10:57:59.343: W/KeyCharacterMap(13625): Using default keymap
07-07 10:58:44.820: I/ApplicationPackageManager(13625): cscCountry is not German : INS
07-07 10:58:49.718: I/System.out(13625): TAG------->60000---->2130968576
07-07 10:58:49.726: W/SoundPool(13625):   sample 2130968576 not READY
4

3 に答える 3

3

私は自分のアプリBeat Shakerで似たようなことをしていますが、同じ問題を抱えていました。onLoadCompleteListener を使用して解決しました。

// Sound pool new instance
SoundPool spool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
// Sound pool on load complete listener
spool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId,
                        int status) {
        Log.i("OnLoadCompleteListener","Sound "+sampleId+" loaded.");
        boolean loaded = true;
    }
});       
// Load the sample IDs
int soundId = new int[3];
soundId[0] = spool.load(this, R.raw.sound1, 1);
soundId[1] = spool.load(this, R.raw.sound2, 1);
soundId[2] = spool.load(this, R.raw.sound3, 1);

後でサウンドを再生する前に、ブール値の「loaded」を使用して適切にロードされているかどうかを確認できます。

于 2013-07-07T06:04:20.160 に答える
1

load()最初にあなたの音を出す必要があります。これにより、準備が整ったメモリにそれらがロードされますplay()。これは、保存して渡す必要があるIDを返しますplay()

サウンドプールのドキュメントから:

典型的な使用例を見てみましょう: ゲームはいくつかのレベルのプレイで構成されています。各レベルには、そのレベルでのみ使用される固有のサウンドのセットがあります。この場合、ゲーム ロジックは、最初のレベルが読み込まれるときに新しい SoundPool オブジェクトを作成する必要があります。レベル データ自体には、このレベルで使用されるサウンドのリストが含まれている場合があります。ロード ロジックは、適切な SoundPool.load() 関数を呼び出して、サウンドのリストを反復処理します。これは通常、再生に必要になる前にオーディオを生の PCM 形式に圧縮解除する時間を確保するために、プロセスの早い段階で行う必要があります。

http://developer.android.com/reference/android/media/SoundPool.html#load(android.content.res.AssetFileDescriptor, int)

この例の SoundPool セクションを見てください: http://www.vogella.com/articles/AndroidMedia/

于 2013-07-07T05:46:03.383 に答える
0

コードを見ることができます

public class SoundManager {

    public static int SOUNDPOOLSND_MENU_BTN = 0;
    public static int SOUNDPOOLSND_WIN = 1;
    public static int SOUNDPOOLSND_LOOSE = 2;
    public static int SOUNDPOOLSND_DRAW = 3;
    public static int SOUNDPOOLSND_TICK1 = 4;
    public static int SOUNDPOOLSND_TICK2 = 5;
    public static int SOUNDPOOLSND_OUT_OF_TIME = 6;
    public static int SOUNDPOOLSND_HISCORE = 7;
    public static int SOUNDPOOLSND_CORRECT_LETTER = 8;

    public static boolean isSoundTurnedOff;

    private static SoundManager mSoundManager;

    private SoundPool mSoundPool;
    private SparseArray<Integer> mSoundPoolMap;
    private AudioManager mAudioManager;

    public static final int maxSounds = 4;

    public static SoundManager getInstance(Context context) {
        if (mSoundManager == null) {
            mSoundManager = new SoundManager(context);
        }

        return mSoundManager;
    }

    public SoundManager(Context mContext) {
        mAudioManager = (AudioManager) mContext
                .getSystemService(Context.AUDIO_SERVICE);
        mSoundPool = new SoundPool(maxSounds, AudioManager.STREAM_MUSIC, 0);

        mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                    int status) {
                boolean loaded = true;
            }
        });

        mSoundPoolMap = new SparseArray<Integer>();
        mSoundPoolMap.put(SOUNDPOOLSND_MENU_BTN,
                mSoundPool.load(mContext, R.raw.rain, 0));
        mSoundPoolMap.put(SOUNDPOOLSND_WIN,
                mSoundPool.load(mContext, R.raw.nature, 1));
        mSoundPoolMap.put(SOUNDPOOLSND_LOOSE,
                mSoundPool.load(mContext, R.raw.piano, 2));
        mSoundPoolMap.put(SOUNDPOOLSND_TICK1,
                mSoundPool.load(mContext, R.raw.relax, 3));
        mSoundPoolMap.put(SOUNDPOOLSND_TICK2,
                mSoundPool.load(mContext, R.raw.storm, 4));


        // testing simultaneous playing
        int streamVolume = mAudioManager
                .getStreamVolume(AudioManager.STREAM_MUSIC);
        mSoundPool.play(mSoundPoolMap.get(0), streamVolume, streamVolume, 1,
                0, 1f);
        mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1, 0,
                1f);
        mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1, 0,
                1f);

    }

    public void playSound(int index) {
        if (isSoundTurnedOff)
            return;

        int streamVolume = mAudioManager
                .getStreamVolume(AudioManager.STREAM_MUSIC);
        mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume,
                1, 0, 1f);
    }

    public static void clear() {
        if (mSoundManager != null) {
            mSoundManager.mSoundPool = null;
            mSoundManager.mAudioManager = null;
            mSoundManager.mSoundPoolMap = null;
        }
        mSoundManager = null;
    }
}
于 2014-10-25T06:21:06.723 に答える