| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * 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.android.camera; |
| |
| import android.content.res.AssetFileDescriptor; |
| import android.media.AudioManager; |
| import android.media.MediaPlayer; |
| import android.util.Log; |
| |
| import java.io.IOException; |
| |
| /** |
| * Plays an AssetFileDescriptor, but does all the hard work on another thread so |
| * that any slowness with preparing or loading doesn't block the calling thread. |
| */ |
| public class SoundPlayer implements Runnable { |
| private static final String TAG = "SoundPlayer"; |
| private Thread mThread; |
| private MediaPlayer mPlayer; |
| private int mPlayCount = 0; |
| private boolean mExit; |
| private AssetFileDescriptor mAfd; |
| private int mAudioStreamType; |
| |
| @Override |
| public void run() { |
| while(true) { |
| try { |
| if (mPlayer == null) { |
| MediaPlayer player = new MediaPlayer(); |
| player.setAudioStreamType(mAudioStreamType); |
| player.setDataSource(mAfd.getFileDescriptor(), mAfd.getStartOffset(), |
| mAfd.getLength()); |
| player.setLooping(false); |
| player.prepare(); |
| mPlayer = player; |
| mAfd.close(); |
| mAfd = null; |
| } |
| synchronized (this) { |
| while(true) { |
| if (mExit) { |
| return; |
| } else if (mPlayCount <= 0) { |
| wait(); |
| } else { |
| mPlayCount--; |
| break; |
| } |
| } |
| } |
| mPlayer.start(); |
| } catch (Exception e) { |
| Log.e(TAG, "Error playing sound", e); |
| } |
| } |
| } |
| |
| public SoundPlayer(AssetFileDescriptor afd) { |
| mAfd = afd; |
| mAudioStreamType = AudioManager.STREAM_MUSIC; |
| } |
| |
| public SoundPlayer(AssetFileDescriptor afd, boolean enforceAudible) { |
| mAfd = afd; |
| if (enforceAudible) { |
| mAudioStreamType = 7; // AudioManager.STREAM_SYSTEM_ENFORCED; currently hidden API. |
| } else { |
| mAudioStreamType = AudioManager.STREAM_MUSIC; |
| } |
| } |
| |
| public void play() { |
| if (mThread == null) { |
| mThread = new Thread(this); |
| mThread.start(); |
| } |
| synchronized (this) { |
| mPlayCount++; |
| notifyAll(); |
| } |
| } |
| |
| public void release() { |
| if (mThread != null) { |
| synchronized (this) { |
| mExit = true; |
| notifyAll(); |
| } |
| try { |
| mThread.join(); |
| } catch (InterruptedException e) { |
| } |
| mThread = null; |
| } |
| if (mAfd != null) { |
| try { |
| mAfd.close(); |
| } catch(IOException e) { |
| } |
| mAfd = null; |
| } |
| if (mPlayer != null) { |
| mPlayer.release(); |
| mPlayer = null; |
| } |
| } |
| } |