同步发出声音

时间:2014-09-28 15:15:18

标签: java android audio

在我的应用程序中,我为图像设置动画,每次到达某一点时,我都希望使用MediaPlayer播放声音。声音是使用sound=MediaPlayer.create创建的,并以sound.start()开头。我的问题是声音并不总是播放:虽然它通常是正确播放的,但有时会丢失或缩短。 Android版本4.4中出现此问题,而4.3版本则没有。

首先,我的声音是从UI线程发出的。然后我尝试在第二个线程中管理它,但没有任何改进。我该怎么办?

以下是我专用线程中编写的代码:

private class EmitSound extends Thread implements OnCompletionListener,OnInfoListener,OnErrorListener{
    private MediaPlayer sound;
    private boolean killProcess=false;
    private Boolean emitSound=false;

    public EmitSound (){
        sound=MediaPlayer.create(myActivity,R.raw.sound);
        sound.setOnCompletionListener(this);
        sound.setOnInfoListener(this);
        sound.setOnErrorListener(this);
    }

    public void run(){
        while(!killProcess){
            synchronized(emitSound){
                if(emitSound){
                    Logger.getLogger("MyApp").log(Level.Info,"Sound started");

                    sound.start();

                    emitSound=false;
                }
            }
        }
    }

    public void EmitSound(){
        synchronized(emitSound){
            emitSound=true;
            Logger.getLogger("MyApp").log(Level.Info,"Demand");
        }
    }

    public void KillProcess(){
        sound.release();

        killProcess=true;
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        Logger.getLogger("MyApp").log(Level.INFO,"Sound finished");
    }

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {

        Logger.getLogger("MyApp").log(Level.INFO,"Info "+Integer.toString(what)+" / "+Integer.toString(extra));

        return false;
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {

        Logger.getLogger("MyApp").log(Level.INFO,"Error "+Integer.toString(what)+" / "+Integer.toString(extra));

        return false;
    }
}

当我想发出声音时,我从负责绘制myProcess.EmitSound() Canvas SurfaceView的线程中调用OnCompletionListener

我已经在我的帖子中添加了OnInfoListenerOnErrorListeneronInfo以及用于发出请求和声音开始的日志,一切似乎都可以:a需求,声音开始,声音完成,循环重新开始。我从来没有接到我的onError和我的MediaPlayer功能的电话,但声音有时仍未发出。看起来{{1}}似乎是错误的......

1 个答案:

答案 0 :(得分:0)

使用SounPool代替MediaPlayer解决了我的问题!