blob: a3acb44ab8f6377851abb7b373fcb5b18bd71a7b [file] [log] [blame]
/*
* 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;
}
}
}