2012-01-04 3 views
0

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

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

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

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

EDIT:

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)); 

} 

общественного логический onTouchEvent (MotionEvent эв) {

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; 
} 

ответ

2

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

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

SoundPool Constructor

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

+0

Действительно извините за все эти изменения, это мой первый пост. – Aneem

+0

Нет проблем. Похоже, вы создаете его с 6 потоками, чтобы он мог одновременно воспроизводить 6 звуков. Можете ли вы опубликовать код, в котором вы играете? И что он делает, когда вы пытаетесь сыграть более одного раза? Играет ли это последовательно или играет только 1 из них? – FoamyGuy

+0

Я уже немного возился с приложением, и я думаю, что проблема на самом деле не в SoundPool, это то, как я работал с мультитач. Поэтому в основном, когда я пытаюсь сыграть более одного, играет только один из них. Я отправлю свой код для обработки событий касания. – Aneem

Смежные вопросы