Intereting Posts
Android: Sugar ORM Нет такого исключения таблицы Установите равную ширину столбцов в макете таблицы в Android Как настроить высоту панели действий программно Как ограничить длину EditText до 7 целых чисел и 2 десятичных знаков? Есть ли способ позволить Android NDK-build использовать более новую версию gcc? Firebase предлагает приглашение отправлено, но не получено Как проверить, действительно ли позиция в StreetView на Android Не удается запустить Android-студию Службы Google Play с помощью AdMob. Проверить наличие свободных мест? Как CursorLoader с LoaderManager знает, как отправить курсор на CursorAdapter? Android – Работа с диалогом на экране Изменение ориентации Создание анимации Overlay ImageView Google Map Как изменить цвет текста в TextView при наведении, как в css? Экран Android + XAMARIN + Force останется в режиме «Портрет» (с помощью AndroidManifest) Лучший способ повторного использования нижнего колонтитула в Android

Воспроизведение нескольких звуков с помощью SoundManager

Если я воспроизвожу один звук, он работает нормально.

Добавление второго звука приводит к его сбою.

Кто-нибудь знает, что вызывает проблему?

private SoundManager mSoundManager; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sos); mSoundManager = new SoundManager(); mSoundManager.initSounds(getBaseContext()); mSoundManager.addSound(1,R.raw.dit); mSoundManager.addSound(1,R.raw.dah); Button SoundButton = (Button)findViewById(R.id.SoundButton); SoundButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mSoundManager.playSound(1); mSoundManager.playSound(2); } }); } 

Solutions Collecting From Web of "Воспроизведение нескольких звуков с помощью SoundManager"

  mSoundManager.addSound(1,R.raw.dit); mSoundManager.addSound(1,R.raw.dah); 

Вам нужно изменить вторую строку:

 mSoundManager.addSound(2,R.raw.dah); 

Чтобы воспроизводить сразу несколько звуков, сначала вам нужно сообщить SoundPool об этом. В объявлении SoundPool обратите внимание, что я указал 20 потоков. У меня много пушек и плохих парней, которые шумят в моей игре, и у каждого есть очень короткая звуковая петля, <3000 мс. Обратите внимание, что когда я добавляю звук ниже, я отслеживаю указанный индекс в векторе, называемом «mAvailibleSounds», таким образом моя игра может попробовать и воспроизводить звуки для предметов, которые не существуют и продолжают без сбоев. Каждый индекс в этом случае соответствует идентификатору спрайта. Именно поэтому вы понимаете, как я сопоставляю конкретные звуки конкретным спрайтам.

Затем мы помещаем в очередь звуки, используя playSound (). Каждый раз, когда это происходит, soundId отбрасывается в стек, который затем появляется, когда мой тайм-аут происходит. Это позволяет мне убить поток после его воспроизведения и повторно использовать его снова. Я выбираю 20 потоков, потому что моя игра очень шумная. После этого звуки размываются, поэтому каждое приложение потребует волшебного номера.

Я нашел этот источник здесь и добавил очередь runnable & kill.

 private SoundPool mSoundPool; private HashMap<Integer, Integer> mSoundPoolMap; private AudioManager mAudioManager; private Context mContext; private Vector<Integer> mAvailibleSounds = new Vector<Integer>(); private Vector<Integer> mKillSoundQueue = new Vector<Integer>(); private Handler mHandler = new Handler(); public SoundManager(){} public void initSounds(Context theContext) { mContext = theContext; mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0); mSoundPoolMap = new HashMap<Integer, Integer>(); mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); } public void addSound(int Index, int SoundID) { mAvailibleSounds.add(Index); mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1)); } public void playSound(int index) { // dont have a sound for this obj, return. if(mAvailibleSounds.contains(index)){ int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); int soundId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); mKillSoundQueue.add(soundId); // schedule the current sound to stop after set milliseconds mHandler.postDelayed(new Runnable() { public void run() { if(!mKillSoundQueue.isEmpty()){ mSoundPool.stop(mKillSoundQueue.firstElement()); } } }, 3000); } }