GameSoundManager.java

/*
 * Copyright © 2012 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example.spacemission;

import java.io.IOException;
import java.io.InputStream;

import javax.microedition.media.*;
import javax.microedition.media.control.ToneControl;

public class GameSoundManager {

    private Player[] gameSoundPlayers;
    private Player[] gameMIDIPlayers;
    private Player toneSequencePlayer;

    public GameSoundManager(String[] gameMIDIFiles, String[] gameSoundsFiles) {
        if (gameSoundsFiles != null) {
            gameSoundPlayers = new Player[gameSoundsFiles.length];
            for (int i = 0; i < gameSoundsFiles.length; i++) {
                gameSoundPlayers[i] = loadSound("/" + gameSoundsFiles[i],
                                                "audio/amr");
            }
        }

        if (gameMIDIFiles != null) {
            gameMIDIPlayers = new Player[gameMIDIFiles.length];
            for (int i = 0; i < gameMIDIFiles.length; i++) {
                gameMIDIPlayers[i] = loadSound("/" + gameMIDIFiles[i],
                                               "audio/midi", -1);
            }
        }

        try {
            toneSequencePlayer = createToneSequencePlayer();
        }
        catch (Exception e) {
            toneSequencePlayer = null;
        }

    }

    public void playGameSound(int i) {
        if (gameSoundPlayers[i] != null) {
            playSound(gameSoundPlayers[i]);
        }
    }

    public void playMIDISound(int i) {
        if (gameMIDIPlayers != null) {
            playSound(gameMIDIPlayers[i]);
        }
    }

    public void stopMIDISound(int i) {
        if (gameMIDIPlayers != null) {
            stopSound(gameMIDIPlayers[i]);
        }

    }

    public void playToneSequence() {
        if (toneSequencePlayer != null) {
            playSound(toneSequencePlayer);
        }
    }

    public void close() {

        if (gameSoundPlayers != null) {
            for (int i = 0; i < gameSoundPlayers.length; i++) {
                gameSoundPlayers[i].close();
            }
        }
        if (gameMIDIPlayers != null) {
            for (int i = 0; i < gameMIDIPlayers.length; i++) {
                gameMIDIPlayers[i].close();
            }
        }
    }

    private Player loadSound(String fn, String type, int loopCount) {
        Player p = null;
        try {
            InputStream in = getClass().getResourceAsStream(fn);
            p = Manager.createPlayer(in, type);
            p.setLoopCount(loopCount);
            p.prefetch(); // Player is in the UNREALIZED state, it will implicitly call realize.
        }
        catch (Exception ex) {
        }
        return p;
    }

    private Player createToneSequencePlayer() throws IOException,
            MediaException {
        Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
        p.realize();
        ToneControl c = (ToneControl) p.getControl("ToneControl");
        c.setSequence(createSequence());
        p.prefetch();
        return p;
    }

    private byte[] createSequence() {
        byte TEMPO = 30; // set tempo to 120 bpm, tempo is formed by multiplying the tempo modifier by 4
        byte volume = 100;
        byte d = 8; // eighth note
        byte C = ToneControl.C4;
        byte D = (byte) (C + 2);
        byte E = (byte) (C + 4);

        byte[] sequence = {
            ToneControl.VERSION, 1, // always 1
            ToneControl.TEMPO, TEMPO, // set the tempo
            ToneControl.SET_VOLUME, volume, // Set the new volume
            ToneControl.BLOCK_START, 0, // define block 0
            C, d, D, d, E, d, // define repeatable block of 3 eighth notes
            ToneControl.BLOCK_END, 0, // end block 0
            ToneControl.PLAY_BLOCK, 0, // play block 0
            ToneControl.SILENCE, d, E, d, D, d, C, d, // play some other
            ToneControl.PLAY_BLOCK, 0, // play block 0 again
        };
        return sequence;
    }

    private Player loadSound(String fn, String type) {
        return loadSound(fn, type, 1);
    }

    private void playSound(Player p) {
        if (p != null) {

            if (p.getState() == Player.PREFETCHED) {

                try {
                    p.setMediaTime(0); // rewind (a safety precaution)
                    p.start();
                }
                catch (Exception ex) {
                }
            }
        }
    }

    private void stopSound(Player p) {
        if (p != null) {
            if (p.getState() == Player.STARTED) {
                try {
                    p.stop();
                }
                catch (Exception ex) {
                }
            }
        }
    }
}