blob: a25b2761aa77fa3dcd0e3cb7dbfcd618b94731c5 [file] [log] [blame]
/*******************************************************************************
* 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.iosrobovm;
import org.robovm.apple.foundation.NSArray;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.backends.iosrobovm.objectal.ALBuffer;
import com.badlogic.gdx.backends.iosrobovm.objectal.ALChannelSource;
import com.badlogic.gdx.backends.iosrobovm.objectal.ALSource;
import com.badlogic.gdx.backends.iosrobovm.objectal.OALSimpleAudio;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.IntArray;
/** @author tescott
* @author Tomski
*
* First pass at implementing OALSimpleAudio support. */
public class IOSSound implements Sound {
private ALBuffer soundBuffer;
private String soundPath;
private ALChannelSource channel;
private NSArray<ALSource> sourcePool;
private IntArray streamIds = new IntArray(8);
public IOSSound (FileHandle filePath) {
soundPath = filePath.file().getPath().replace('\\', '/');
soundBuffer = OALSimpleAudio.sharedInstance().preloadEffect(soundPath);
channel = OALSimpleAudio.sharedInstance().getChannelSource();
sourcePool = channel.getSourcePool().getSources();
}
@Override
public long play () {
return play(1, 1, 0, false);
}
@Override
public long play (float volume) {
return play(volume, 1, 0, false);
}
@Override
public long play (float volume, float pitch, float pan) {
return play(volume, pitch, pan, false);
}
public long play (float volume, float pitch, float pan, boolean loop) {
if (streamIds.size == 8) streamIds.pop();
ALSource soundSource = OALSimpleAudio.sharedInstance().playBuffer(soundBuffer, volume, pitch, pan, loop);
if (soundSource == null) return -1;
if (soundSource.getSourceId() == -1) return -1;
streamIds.insert(0, soundSource.getSourceId());
return soundSource.getSourceId();
}
@Override
public long loop () {
return play(1, 1, 0, true);
}
@Override
public long loop (float volume) {
return play(volume, 1, 0, true);
}
@Override
public long loop (float volume, float pitch, float pan) {
return play(volume, pitch, pan, true);
}
@Override
public void stop () {
ALSource source;
for (int i = 0; i < streamIds.size; i++) {
if ((source = getSoundSource(streamIds.get(i))) != null) source.stop();
}
}
@Override
public void dispose () {
stop();
soundBuffer.dispose();
}
@Override
public void stop (long soundId) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) source.stop();
}
@Override
public void setLooping (long soundId, boolean looping) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) source.setLooping(looping);
}
@Override
public void setPitch (long soundId, float pitch) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) source.setPitch(pitch);
}
@Override
public void setVolume (long soundId, float volume) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) source.setVolume(volume);
}
@Override
public void setPan (long soundId, float pan, float volume) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) {
source.setPan(pan);
source.setVolume(volume);
}
}
@Override
public void pause () {
ALSource source;
for (int i = 0; i < streamIds.size; i++) {
if ((source = getSoundSource(streamIds.get(i))) != null) source.setPaused(true);
}
}
@Override
public void resume () {
ALSource source;
for (int i = 0; i < streamIds.size; i++) {
if ((source = getSoundSource(streamIds.get(i))) != null) source.setPaused(false);
}
}
@Override
public void pause (long soundId) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) source.setPaused(true);
}
@Override
public void resume (long soundId) {
ALSource source;
if ((source = getSoundSource(soundId)) != null) source.setPaused(false);
}
private ALSource getSoundSource (long soundId) {
for (ALSource source : sourcePool) {
if (source.getSourceId() == soundId) return source;
}
return null;
}
}