/* * Copyright (C) 2016 Google Inc. All Rights Reserved. * * 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.google.android.apps.santatracker; import android.content.Context; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.util.SparseArray; public class AudioPlayer { private Context mContext; private SparseArray<MediaPlayer> mStreams; private boolean mMuted = false; private static float VOLUME_MULTIPLIER = 0.25f; public AudioPlayer(Context context) { mContext = context; mStreams = new SparseArray<>(); this.mMuted = false; } public void playTrack(final int resId, final boolean loop) { MediaPlayer mediaPlayer = MediaPlayer.create(mContext, resId); // Not all devices support audio (i.e. watches) if (mediaPlayer != null) { mStreams.put(resId, mediaPlayer); mediaPlayer.setLooping(loop); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { startMedia(mp); } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { if (!mp.isLooping()) { mp.release(); mStreams.remove(resId); } } }); } } public void playTrackIfNotAlreadyPlaying(final int resId, final boolean loop) { if (mStreams.get(resId) == null) { playTrack(resId, loop); } } public void playTrackExclusive(final int resId, final boolean loop) { boolean restart = false; MediaPlayer mp = mStreams.get(resId); try { if (mp == null || !mp.isPlaying()) { restart = true; } } catch (IllegalStateException e) { // Media player was not initialised or was released restart = true; } if (restart) { stopAll(); playTrack(resId, loop); } } private void startMedia(MediaPlayer mp) { if (mMuted) { mp.setVolume(0f, 0f); } else { mp.setVolume(VOLUME_MULTIPLIER, VOLUME_MULTIPLIER); } mp.start(); } public void stop(int resId) { MediaPlayer mp = mStreams.get(resId); if (mp != null) { mp.stop(); mp.release(); mStreams.remove(resId); } } public void muteAll() { mMuted = true; for (int i = 0; i < mStreams.size(); i++) { mStreams.valueAt(i).setVolume(0f, 0f); } } public void unMuteAll() { mMuted = false; for (int i = 0; i < mStreams.size(); i++) { mStreams.valueAt(i).setVolume(VOLUME_MULTIPLIER, VOLUME_MULTIPLIER); } } public void pauseAll() { for (int i = 0; i < mStreams.size(); i++) { mStreams.valueAt(i).pause(); } } public void resumeAll() { for (int i = 0; i < mStreams.size(); i++) { startMedia(mStreams.valueAt(i)); } } public void stopAll() { // Stop all audio for (int i = 0; i < mStreams.size(); i++) { MediaPlayer mp = mStreams.valueAt(i); mp.release(); mStreams.removeAt(i); } } }