Я разрабатываю простые барабанные колодки для своего телефона и запускаю блок, когда речь идет о двух звуках одновременно (т. Е. Во время мультитач-события, когда пользователь нажимает на два или более барабанных звука в то же время).Параллельный звук на устройстве 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;
}
Действительно извините за все эти изменения, это мой первый пост. – Aneem
Нет проблем. Похоже, вы создаете его с 6 потоками, чтобы он мог одновременно воспроизводить 6 звуков. Можете ли вы опубликовать код, в котором вы играете? И что он делает, когда вы пытаетесь сыграть более одного раза? Играет ли это последовательно или играет только 1 из них? – FoamyGuy
Я уже немного возился с приложением, и я думаю, что проблема на самом деле не в SoundPool, это то, как я работал с мультитач. Поэтому в основном, когда я пытаюсь сыграть более одного, играет только один из них. Я отправлю свой код для обработки событий касания. – Aneem