/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. ******************************************************************************/ package com.badlogic.gdx.backends.android; import android.media.AudioManager; import android.media.SoundPool; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.utils.IntArray; final class AndroidSound implements Sound { final SoundPool soundPool; final AudioManager manager; final int soundId; final IntArray streamIds = new IntArray(8); AndroidSound(SoundPool pool, AudioManager manager, int soundId) { this.soundPool = pool; this.manager = manager; this.soundId = soundId; } @Override public void dispose() { soundPool.unload(soundId); } @Override public long play() { return play(1); } @Override public long play(float volume) { if (streamIds.size == 8) streamIds.pop(); int streamId = soundPool.play(soundId, volume, volume, 1, 0, 1); streamIds.add(streamId); return streamId; } public void stop() { for (int i = 0, n = streamIds.size; i < n; i++) soundPool.stop(streamIds.get(i)); } @Override public void stop(long soundId) { soundPool.stop((int) soundId); } @Override public void setPitch(long soundId, float pitch) { soundPool.setRate((int) soundId, pitch); } @Override public void setVolume(long soundId, float volume) { soundPool.setVolume((int) soundId, volume, volume); } @Override public long loop() { return loop(1); } @Override public long loop(float volume) { if (streamIds.size == 8) streamIds.pop(); int streamId = soundPool.play(soundId, volume, volume, 1, -1, 1); streamIds.add(streamId); return streamId; } @Override public void setLooping(long soundId, boolean looping) { soundPool.setLoop((int) soundId, looping ? -1 : 0); } @Override public void setPan(long soundId, float pan, float volume) { float leftVolume = volume; float rightVolume = volume; if (pan < 0) { rightVolume *= (1 - Math.abs(pan)); } else if (pan > 0) { leftVolume *= (1 - Math.abs(pan)); } soundPool.setVolume((int) soundId, leftVolume, rightVolume); } @Override public long play(float volume, float pitch, float pan) { if (streamIds.size == 8) streamIds.pop(); float leftVolume = volume; float rightVolume = volume; if (pan < 0) { rightVolume *= (1 - Math.abs(pan)); } else if (pan > 0) { leftVolume *= (1 - Math.abs(pan)); } int streamId = soundPool.play(soundId, leftVolume, rightVolume, 1, 0, pitch); streamIds.add(streamId); return streamId; } @Override public long loop(float volume, float pitch, float pan) { if (streamIds.size == 8) streamIds.pop(); float leftVolume = volume; float rightVolume = volume; if (pan < 0) { rightVolume *= (1 - Math.abs(pan)); } else if (pan > 0) { leftVolume *= (1 - Math.abs(pan)); } int streamId = soundPool.play(soundId, leftVolume, rightVolume, 1, -1, pitch); streamIds.add(streamId); return streamId; } @Override public void setPriority(long soundId, int priority) { soundPool.setPriority((int) soundId, priority); } }