/Mate20_9_0_0/src/main/java/android/media/AsyncPlayer.java

https://github.com/SivanLiu/HwFrameWorkSource · Java · 210 lines · 194 code · 16 blank · 0 comment · 36 complexity · f15dd4ae0cdc9f844b5fc842a1096f6d MD5 · raw file

  1. package android.media;
  2. import android.content.Context;
  3. import android.media.AudioAttributes.Builder;
  4. import android.net.Uri;
  5. import android.os.PowerManager;
  6. import android.os.PowerManager.WakeLock;
  7. import android.os.SystemClock;
  8. import android.util.Log;
  9. import java.util.LinkedList;
  10. public class AsyncPlayer {
  11. private static final int PLAY = 1;
  12. private static final int STOP = 2;
  13. private static final boolean mDebug = false;
  14. private final LinkedList<Command> mCmdQueue = new LinkedList();
  15. private MediaPlayer mPlayer;
  16. private int mState = 2;
  17. private String mTag;
  18. private Thread mThread;
  19. private WakeLock mWakeLock;
  20. private static final class Command {
  21. AudioAttributes attributes;
  22. int code;
  23. Context context;
  24. boolean looping;
  25. long requestTime;
  26. Uri uri;
  27. private Command() {
  28. }
  29. public String toString() {
  30. StringBuilder stringBuilder = new StringBuilder();
  31. stringBuilder.append("{ code=");
  32. stringBuilder.append(this.code);
  33. stringBuilder.append(" looping=");
  34. stringBuilder.append(this.looping);
  35. stringBuilder.append(" attr=");
  36. stringBuilder.append(this.attributes);
  37. stringBuilder.append(" uri=");
  38. stringBuilder.append(this.uri);
  39. stringBuilder.append(" }");
  40. return stringBuilder.toString();
  41. }
  42. }
  43. private final class Thread extends Thread {
  44. Thread() {
  45. StringBuilder stringBuilder = new StringBuilder();
  46. stringBuilder.append("AsyncPlayer-");
  47. stringBuilder.append(AsyncPlayer.this.mTag);
  48. super(stringBuilder.toString());
  49. }
  50. public void run() {
  51. while (true) {
  52. Command cmd;
  53. synchronized (AsyncPlayer.this.mCmdQueue) {
  54. cmd = (Command) AsyncPlayer.this.mCmdQueue.removeFirst();
  55. }
  56. switch (cmd.code) {
  57. case 1:
  58. AsyncPlayer.this.startSound(cmd);
  59. break;
  60. case 2:
  61. if (AsyncPlayer.this.mPlayer == null) {
  62. Log.w(AsyncPlayer.this.mTag, "STOP command without a player");
  63. break;
  64. }
  65. long delay = SystemClock.uptimeMillis() - cmd.requestTime;
  66. if (delay > 1000) {
  67. String access$000 = AsyncPlayer.this.mTag;
  68. StringBuilder stringBuilder = new StringBuilder();
  69. stringBuilder.append("Notification stop delayed by ");
  70. stringBuilder.append(delay);
  71. stringBuilder.append("msecs");
  72. Log.w(access$000, stringBuilder.toString());
  73. }
  74. AsyncPlayer.this.mPlayer.stop();
  75. AsyncPlayer.this.mPlayer.release();
  76. AsyncPlayer.this.mPlayer = null;
  77. break;
  78. }
  79. synchronized (AsyncPlayer.this.mCmdQueue) {
  80. if (AsyncPlayer.this.mCmdQueue.size() == 0) {
  81. AsyncPlayer.this.mThread = null;
  82. AsyncPlayer.this.releaseWakeLock();
  83. return;
  84. }
  85. }
  86. }
  87. while (true) {
  88. }
  89. }
  90. }
  91. private void startSound(Command cmd) {
  92. try {
  93. MediaPlayer player = new MediaPlayer();
  94. player.setAudioAttributes(cmd.attributes);
  95. player.setDataSource(cmd.context, cmd.uri);
  96. player.setLooping(cmd.looping);
  97. player.prepare();
  98. player.start();
  99. if (this.mPlayer != null) {
  100. this.mPlayer.release();
  101. }
  102. this.mPlayer = player;
  103. long delay = SystemClock.uptimeMillis() - cmd.requestTime;
  104. if (delay > 1000) {
  105. String str = this.mTag;
  106. StringBuilder stringBuilder = new StringBuilder();
  107. stringBuilder.append("Notification sound delayed by ");
  108. stringBuilder.append(delay);
  109. stringBuilder.append("msecs");
  110. Log.w(str, stringBuilder.toString());
  111. }
  112. } catch (Exception e) {
  113. String str2 = this.mTag;
  114. StringBuilder stringBuilder2 = new StringBuilder();
  115. stringBuilder2.append("error loading sound for ");
  116. stringBuilder2.append(cmd.uri);
  117. Log.w(str2, stringBuilder2.toString(), e);
  118. }
  119. }
  120. public AsyncPlayer(String tag) {
  121. if (tag != null) {
  122. this.mTag = tag;
  123. } else {
  124. this.mTag = "AsyncPlayer";
  125. }
  126. }
  127. public void play(Context context, Uri uri, boolean looping, int stream) {
  128. PlayerBase.deprecateStreamTypeForPlayback(stream, "AsyncPlayer", "play()");
  129. if (context != null && uri != null) {
  130. try {
  131. play(context, uri, looping, new Builder().setInternalLegacyStreamType(stream).build());
  132. } catch (IllegalArgumentException e) {
  133. Log.e(this.mTag, "Call to deprecated AsyncPlayer.play() method caused:", e);
  134. }
  135. }
  136. }
  137. public void play(Context context, Uri uri, boolean looping, AudioAttributes attributes) throws IllegalArgumentException {
  138. if (context == null || uri == null || attributes == null) {
  139. throw new IllegalArgumentException("Illegal null AsyncPlayer.play() argument");
  140. }
  141. Command cmd = new Command();
  142. cmd.requestTime = SystemClock.uptimeMillis();
  143. cmd.code = 1;
  144. cmd.context = context;
  145. cmd.uri = uri;
  146. cmd.looping = looping;
  147. cmd.attributes = attributes;
  148. synchronized (this.mCmdQueue) {
  149. enqueueLocked(cmd);
  150. this.mState = 1;
  151. }
  152. }
  153. public void stop() {
  154. synchronized (this.mCmdQueue) {
  155. if (this.mState != 2) {
  156. Command cmd = new Command();
  157. cmd.requestTime = SystemClock.uptimeMillis();
  158. cmd.code = 2;
  159. enqueueLocked(cmd);
  160. this.mState = 2;
  161. }
  162. }
  163. }
  164. private void enqueueLocked(Command cmd) {
  165. this.mCmdQueue.add(cmd);
  166. if (this.mThread == null) {
  167. acquireWakeLock();
  168. this.mThread = new Thread();
  169. this.mThread.start();
  170. }
  171. }
  172. public void setUsesWakeLock(Context context) {
  173. if (this.mWakeLock == null && this.mThread == null) {
  174. this.mWakeLock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE)).newWakeLock(1, this.mTag);
  175. return;
  176. }
  177. StringBuilder stringBuilder = new StringBuilder();
  178. stringBuilder.append("assertion failed mWakeLock=");
  179. stringBuilder.append(this.mWakeLock);
  180. stringBuilder.append(" mThread=");
  181. stringBuilder.append(this.mThread);
  182. throw new RuntimeException(stringBuilder.toString());
  183. }
  184. private void acquireWakeLock() {
  185. if (this.mWakeLock != null) {
  186. this.mWakeLock.acquire();
  187. }
  188. }
  189. private void releaseWakeLock() {
  190. if (this.mWakeLock != null) {
  191. this.mWakeLock.release();
  192. }
  193. }
  194. }