/**
* Catroid: An on-device graphical programming language for Android devices
* Copyright (C) 2010-2011 The Catroid Team
* (<http://code.google.com/p/catroid/wiki/Credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://www.catroid.org/catroid_license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package at.tugraz.ist.catroid.test.io;
import java.io.File;
import java.io.IOException;
import android.media.MediaPlayer;
import android.test.InstrumentationTestCase;
import at.tugraz.ist.catroid.common.Consts;
import at.tugraz.ist.catroid.io.SoundManager;
import at.tugraz.ist.catroid.test.R;
import at.tugraz.ist.catroid.test.utils.TestUtils;
public class SoundManagerTest extends InstrumentationTestCase {
private static final int LONG_TEST_SOUND = R.raw.longtestsound;
private static final int TEST_SOUND = R.raw.testsound;
private File soundFile;
private File longSoundFile;
@Override
protected void setUp() throws Exception {
soundFile = TestUtils.createTestMediaFile(Consts.DEFAULT_ROOT + "testSound.mp3", TEST_SOUND,
getInstrumentation().getContext());
longSoundFile = TestUtils.createTestMediaFile(Consts.DEFAULT_ROOT + "longTestSound.mp3", LONG_TEST_SOUND,
getInstrumentation().getContext());
}
@Override
protected void tearDown() throws Exception {
if (soundFile != null && soundFile.exists()) {
soundFile.delete();
}
if (longSoundFile != null && longSoundFile.exists()) {
longSoundFile.delete();
}
SoundManager.getInstance().clear();
}
public void testGetInstance() {
SoundManager soundManager = SoundManager.getInstance();
assertNotNull("SoundManager could not be initialized", soundManager);
}
public void testGetMediaPlayer() {
MediaPlayer mediaPlayer = SoundManager.getInstance().getMediaPlayer();
assertNotNull("SoundManager failed to return a MediaPlayer", mediaPlayer);
assertFalse("SoundManager provided a MediaPlayer that was already playing", mediaPlayer.isPlaying());
}
public void testClear() {
SoundManager soundManager = SoundManager.getInstance();
soundManager.clear();
assertEquals("SoundManager was destroyed when calling clear", soundManager, SoundManager.getInstance());
MediaPlayer mediaPlayer = SoundManager.getInstance().getMediaPlayer();
assertNotNull("SoundManager failed to return a MediaPlayer after clear", mediaPlayer);
assertFalse("SoundManager provided a MediaPlayer that was already playing", mediaPlayer.isPlaying());
}
public void testPauseAndResume() throws IllegalStateException, IOException, InterruptedException {
final String soundFilePath = soundFile.getAbsolutePath();
assertNotNull("Could not open test sound file", soundFilePath);
assertTrue("Could not open test sound file", soundFilePath.length() > 0);
MediaPlayer mediaPlayer = SoundManager.getInstance().getMediaPlayer();
mediaPlayer.setDataSource(soundFilePath);
mediaPlayer.prepare();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
mediaPlayer.start();
assertTrue("MediaPlayer is not playing", mediaPlayer.isPlaying());
SoundManager.getInstance().pause();
assertFalse("MediaPlayer is still playing after SoundManager was paused", mediaPlayer.isPlaying());
SoundManager.getInstance().resume();
assertTrue("MediaPlayer is not playing after resume", mediaPlayer.isPlaying());
final int duration = mediaPlayer.getDuration() + 100;
Thread.sleep(duration);
assertFalse("MediaPlayer is not done playing after pause and resume", mediaPlayer.isPlaying());
}
/**
* TODO: Test was meaningless before (because it only really tested one MediaPlayer) and fails now.
* There seems to be a bigger problem with the SoundManager itself. See ticket "Improve MediaPlayer recycling" for
* details.
*/
// public void testPauseAndResumeMultiplePlayers() throws IllegalArgumentException, IllegalStateException, IOException {
// final String soundFilePath = soundFile.getAbsolutePath();
// assertNotNull("Could not open test sound file", soundFilePath);
// assertTrue("Could not open test sound file", soundFilePath.length() > 0);
//
// ArrayList<MediaPlayer> mediaPlayers = new ArrayList<MediaPlayer>();
// for (int i = 0; i < SoundManager.MAX_MEDIA_PLAYERS; i++) {
// MediaPlayer mediaPlayer = SoundManager.getInstance().getMediaPlayer();
// mediaPlayers.add(mediaPlayer);
// mediaPlayer.setDataSource(soundFilePath);
// mediaPlayer.prepare();
// mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// public void onCompletion(MediaPlayer mp) {
// mp.release();
// }
// });
// mediaPlayer.start();
// mediaPlayer.pause();
// }
//
// for (int i = 0; i < mediaPlayers.size(); i++) {
// for (int j = i + 1; j < mediaPlayers.size(); j++) {
// assertNotSame("SoundManager returned the same MediaPlayer twice. i = " + i + ", j = " + j,
// mediaPlayers.get(i), mediaPlayers.get(j));
// }
// }
//
// for (MediaPlayer mediaPlayer : mediaPlayers) {
// mediaPlayer.start();
// assertTrue("MediaPlayer is not playing", mediaPlayer.isPlaying());
// }
//
// SoundManager.getInstance().pause();
// for (MediaPlayer mediaPlayer : mediaPlayers) {
// assertFalse("MediaPlayer is still playing after SoundManager was paused", mediaPlayer.isPlaying());
// }
//
// SoundManager.getInstance().resume();
// for (MediaPlayer mediaPlayer : mediaPlayers) {
// assertTrue("MediaPlayer is not playing after resume", mediaPlayer.isPlaying());
// }
// }
public void testMediaPlayerLimit() throws IllegalArgumentException, IllegalStateException, IOException {
assertNotNull("Test sound file was not copied properly", longSoundFile);
final String soundFilePath = longSoundFile.getAbsolutePath();
assertNotNull("Could not open test sound file", soundFilePath);
assertTrue("Could not open test sound file", soundFilePath.length() > 0);
for (int i = 0; i < SoundManager.MAX_MEDIA_PLAYERS; i++) {
MediaPlayer mediaPlayer = SoundManager.getInstance().getMediaPlayer();
mediaPlayer.setDataSource(soundFilePath);
mediaPlayer.prepare();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
mediaPlayer.start();
assertTrue("MediaPlayer is not playing", mediaPlayer.isPlaying());
}
assertNull("Too many MediaPlayers created by SoundManager", SoundManager.getInstance().getMediaPlayer());
}
public void testSetVolume() {
float vol = 80.9f;
SoundManager.getInstance().setVolume(vol);
assertEquals("Volume loudness doesn't change", vol, SoundManager.getInstance().getVolume());
}
}