同时按下按钮播放声音

时间:2017-02-27 04:16:09

标签: java android android-studio audio

在我的Launchpad Simulator主要活动中有很多按钮。我想按下每个按钮播放声音。如果同时按下按钮,我想同时播放声音。从我现在的情况来看,似乎只要我按下按钮它就会播放声音,但是因为第一个声音是3秒长(例如,一个拍手声音文件在播放时间是3秒)。

在通过按钮产生任何其他声音之前,它等待3秒钟,如果3秒后按下任何按钮,则播放下一个声音,与其他32个按钮相同。

就像按下按钮时的启动板一样,我希望播放声音。在这种情况下拍手声。

这是Java代码:

  

MainActivity.java

package com.oniichansblog.launchpadify;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.media.MediaPlayer;

public class MainActivity extends AppCompatActivity {
    private MediaPlayer clap1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        clap1 = MediaPlayer.create(this, R.raw.clap1);
    }

    public void clap1(View v){
        clap1.start();
    }

}

每次按下按钮时,我只有一个函数clap1()被反复调用。

如果你想亲自检查我有一个存储库: GitHub Repository for LaunchPadify

2 个答案:

答案 0 :(得分:0)

要同时播放多个曲目,您应该使用AsyncTask并在THREAD_POOL_EXECUTOR上执行它。
怎么做:
主题类

export PATH

媒体播放器

class PlayThread extends AsyncTask<MediaPlayer, Void, Void>
{
    @Override
    protected Void doInBackground(MediaPlayer... player) {

        player[0].start();          
        return null;
    }
}

AsyncTask只能同时执行5个线程,其他的将进入队列。

SoundPool缓冲区限制为1Mb,因此根本不是解决方案。

非常重要:
要同时播放更多音频曲目,您应该将它们混合到1个缓冲区中 执行此操作的方法:将mp3解码为pcm(以流模式转换为小缓冲区),将其混合到一个字节缓冲区中并将其放入AudioTrack进行播放。

答案 1 :(得分:0)

我建议不要在上面定义MediaPlayer。 只需在每个ButtonClick

创建一个新的临时MediaPlayer
error TS2693: 'ServiceFunction' only refers to a type, but is being used as a value here.

它将同时播放声音

<强>更新

如果您想在完成播放声音后销毁MediaPlayer,可以使用此代码执行此操作

new MediaPlayer.create(this, R.raw.clap).start();