SoundPool错误“擦除无法获取锁定”

时间:2012-05-15 10:22:46

标签: android soundpool

据我所知,我的应用程序运行正常,但我注意到SoundPool中的这个错误经常在logcat中报告。

E/SoundPool(28182): 2 mChannels.erase can not get the lock

关于导致这种情况的任何想法?我尝试删除我的线程同步代码,但我仍然收到错误。

这是使用运行Android 2.3.6的Galaxy S2(SC-02C)观察到的。

2 个答案:

答案 0 :(得分:2)

我建议的另一个解决方案:

  • 使用maxStreams = 1
  • 通过声音创建SoundPool实例
  • 将第0卷设置为play()方法
  • 返回的一个streamID

这个解决方案不是很干净我同意......


public class Sound {

    public final static int STREAM = AudioManager.STREAM_SYSTEM;

    private SoundPool pool;
    private int soundID;
    private int streamID;

    public Sound(Context context, int resID) {
        pool = new SoundPool(1, STREAM, 0);
        soundID = pool.load(context, resID, 1);
    }

    public final void play() {
        streamID = pool.play(soundID, 1, 1, 1, 0, 1);
    }

    public final void stop() {
        pool.setVolume(streamID, 0, 0);
    }

}

public class MyActivity extends Activity {

    public static Sound alarm1;
    public static Sound alarm2;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.main);

        setVolumeControlStream(Sound.STREAM);
        if(alarm1 == null) alarm1 = new Sound(this, R.raw.alarm1);
        if(alarm2 == null) alarm2 = new Sound(this, R.raw.alarm2);

        findViewById(R.id.play_1).setOnClickListener( new OnClickListener() {
            @Override public void onClick(View view) { alarm1.play(); }
        });
        findViewById(R.id.stop_1).setOnClickListener( new OnClickListener() {
            @Override public void onClick(View view) { alarm1.stop(); }
        });
        findViewById(R.id.play_2).setOnClickListener( new OnClickListener() {
            @Override public void onClick(View view) { alarm2.play(); }
        });
        findViewById(R.id.stop_2).setOnClickListener( new OnClickListener() {
            @Override public void onClick(View view) { alarm2.stop(); }
        });
    }

}

为了管理你所有的声音,我们可以设想像这样的图书馆:


public class Soundlib {

    private Context context;
    private HashMap<Integer, Sound> library;

    public Soundlib(Context context) {
        this.context = context;
        library = new HashMap<Integer, Sound>();
    }

    public final void add(int... rawID) {
        for(int id : rawID) library.put(id, new Sound(context, id));
    }

    public final void play(int... rawID) {
        for(int id : rawID) library.get(id).play();
    }

    public final void stop(int... rawID) {
        for(int id : rawID) library.get(id).stop();
    }

    public final void stopAll() {
        for(int id : library.keySet()) stop(id);
    }

}

// to initilize sound library
if(soundlib == null) soundlib = new Soundlib(this){{
    // to add one or more sounds
    add(R.raw.alarm1, R.raw.alarm2);
}};

// to play one or more sounds
soundlib.play(R.raw.alarm1);

// to stop one or more sounds
soundlib.stop(R.raw.alarm1);

// to stop all sounds
soundlib.stopAll();

答案 1 :(得分:0)

我认为此错误日志是由SoundPool实例的 play() / stop()方法引起的。

您是否尝试播放/停止音频流?