forked from google/santa-tracker-android
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAudioPlayer.java
More file actions
137 lines (120 loc) · 3.98 KB
/
AudioPlayer.java
File metadata and controls
137 lines (120 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
* Copyright (C) 2015 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);
}
}
}