2017-02-27 236 views
0

在我的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

回答

0

我建议不要定义上面的MediaPlayer。 只需创建一个新的临时MediaPlayer的每一个ButtonClick

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

,它会同时播放声音

UPDATE

如果你想播放完声音后销毁的MediaPlayer,你可以做这使用此代码

new MediaPlayer.create(getApplicationContext(), R.raw.test) 
      .start() 
      .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mediaPlayer) { 
        mediaPlayer.release(); 
       } 
      }); 
+0

是的,它工作得很好,但按下几个按钮后,它停止鼓掌。我将留下一个链接到应用程序。如果你能亲眼看到它在击中10-15次后停止发出声音的方式。 https://drive.google.com/open?id=0B5whGfbIoM7KVE56clVXY2dSUFU – Shanu

+0

是的,这是由Media Player对象溢出引起的。您需要添加一个onCompletionListener,然后在播放完声音后释放(销毁)MediaPlayer。 –

+0

请您详细说明。我是新的声音 – Shanu

0

要播放的几个音轨同时,你应该使用AsyncTask并执行它THREAD_POOL_EXECUTOR。
如何做到这一点:
Thread类

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

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

媒体播放器

MediaPlayer[] players = new MediaPlayer[5]; 
//Then set source to each player... 
//... 
//Create objects of Thread class 
PlayThread[] playThreads = new PlayThread[5]; 
for (int i = 0; i < 5; i++) 
    playThreads[i] = new PlayThread(); 
//Set Media Players there and start play 
for (int i = 0; i < 5; i++) 
    playThreads[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, players[i]); 

AsyncTask可以同时执行只有5个线程,其他将要排队。


SoundPool缓冲区限制为1MB,所以它不是一个解决方案在所有。


这是非常重要的:
同时播放多音轨,你应该将它们混合到1个缓冲。
要做到这一点:将mp3解码为pcm(以流模式下的小缓冲区),将其混合到一个字节缓冲区并将其放到AudioTrack进行播放。

+0

其实,我有几个问题:这是什么意思是'doInBackground(MediaPlayer ... player)',我不明白为什么会有三个点?接下来你说要给玩家添加一些资源。我可以设置来源。但在接下来的部分中,您将设置Mediaplayer并开始播放。说实话,我是新来的声音和线程。所以,如果你能更清楚地说明你的代码,就像一对一的教程一样,我可以用它作为例子,并根据自己的需要进行编辑。我也不明白**这是非常重要的部分** – Shanu