Одновременный звук на устройстве Android - PullRequest
1 голос
/ 05 января 2012

Я разрабатывал простые барабанные пэды для своего телефона и столкнулся с блоком, когда речь заходит о воспроизведении двух звуков одновременно (т.е. во время мультитач-события, когда пользователь нажимает одновременно на два или более барабанных звука) .

Для воспроизведения звуков я использовал класс SoundPool. У меня есть HashMap, который хэширует точку на звук. Поэтому я подумал, что при нажатии на точку будет воспроизводиться соответствующий звук.

У меня такое ощущение, что для одновременного воспроизведения двух звуков требуется разветвление или создание новых потоков, но это не сработало так, как я это делал, а просто создавал новый поток в цикле "для каждого" для каждой точки. прессованный.

Заранее спасибо! -Aneem

РЕДАКТИРОВАТЬ:

SoundPool database = new SoundPool(6,AudioManager.STREAM_MUSIC,100);



protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    width = MeasureSpec.getSize(widthMeasureSpec); //switched for convenience
    height = MeasureSpec.getSize(heightMeasureSpec);
    screenFactor = (int)((height*width)/6);

    //have to add all points to the hash map
    widthIncrement = (int)(width/3);
    heightIncrement = (int)(height/2);

    pointMap.put(new Point(0,0), database.load(getContext(),R.raw.clv,1));
    pointMap.put(new Point(widthIncrement,0), database.load(getContext(),R.raw.pedalhh,1));
    pointMap.put(new Point((widthIncrement*2),0), database.load(getContext(),R.raw.shake,1));
    pointMap.put(new Point(0,heightIncrement), database.load(getContext(),R.raw.analoghat,1));
    pointMap.put(new Point(widthIncrement,heightIncrement), database.load(getContext(),R.raw.kick,1));
    pointMap.put(new Point((widthIncrement*2),heightIncrement), database.load(getContext(),R.raw.snare,1));

}

public boolean onTouchEvent (MotionEvent ev) {

    if(ev.getAction()==ev.ACTION_DOWN){
        AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
        int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
        PointF[] touchPoints = new PointF[ev.getPointerCount()];
        for(int i = 0; i < ev.getPointerCount(); i++){
            if(ev.getPointerId(i)==ev.ACTION_DOWN){
                touchPoints[i] = new PointF(ev.getX(i),ev.getY(i));
            }
        }
        int i = 1;
        for(final PointF point : touchPoints){
            new Thread(new Runnable(){
                public void run(){                      
                    forkSound(point);       
                }
            }).start();
        }
        return true;
    }
    return true;
}

1 Ответ

2 голосов
/ 05 января 2012

SoundPool способен воспроизводить несколько вещей одновременно.Вы передаете количество потоков при настройке SoundPool.

Опубликуйте весь свой код, который связан с созданием и настройкой звукового пула, и мы увидим, почему он работает не так, как вы хотите.

Конструктор SoundPool

Первый параметр - int maxStreams.Независимо от того, что вы передадите для этого параметра, будет количество потоков, которые ваш пул может воспроизводить одновременно

...