blob: 8c27ee46136b8b258c646d781b48b65124bbad59 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.domokit.media;
import android.content.Context;
import android.util.Log;
import org.chromium.mojo.common.DataPipeUtils;
import org.chromium.mojo.system.Core;
import org.chromium.mojo.system.DataPipe;
import org.chromium.mojo.system.MojoException;
import org.chromium.mojom.media.MediaPlayer;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Executor;
/**
* Android implementation of MediaPlayer.
*/
public class MediaPlayerImpl implements MediaPlayer, android.media.MediaPlayer.OnPreparedListener {
private static final String TAG = "MediaPlayerImpl";
private final Core mCore;
private final Context mContext;
private final Executor mExecutor;
private final android.media.MediaPlayer mPlayer;
private PrepareResponse mPrepareResponse;
private File mTempFile;
public MediaPlayerImpl(Core core, Context context, Executor executor) {
mCore = core;
mContext = context;
mExecutor = executor;
mPlayer = new android.media.MediaPlayer();
mTempFile = null;
mPrepareResponse = null;
}
@Override
public void close() {
mPlayer.release();
if (mTempFile != null) {
mTempFile.delete();
}
}
@Override
public void onConnectionError(MojoException e) {
}
@Override
public void onPrepared(android.media.MediaPlayer mp) {
assert mPlayer == mp;
assert mPrepareResponse != null;
// ignored argument due to https://github.com/domokit/mojo/issues/282
boolean ignored = true;
mPrepareResponse.call(ignored);
}
public void copyComplete() {
try {
mPlayer.setOnPreparedListener(this);
mPlayer.setDataSource(mTempFile.getCanonicalPath());
mPlayer.prepare();
} catch (java.io.IOException e) {
Log.e(TAG, "Exception", e);
mPrepareResponse.call(false);
mPrepareResponse = null;
}
}
@Override
public void prepare(DataPipe.ConsumerHandle consumerHandle, PrepareResponse callback) {
// TODO(eseidel): Ideally we'll find a way to hand the data straight
// to Android's audio system w/o first having to dump it to a file.
File outputDir = mContext.getCacheDir();
mPrepareResponse = callback;
try {
mTempFile = File.createTempFile("sky_media_player", "temp", outputDir);
} catch (IOException e) {
Log.e(TAG, "Failed to create temporary file", e);
callback.call(false);
return; // TODO(eseidel): We should close the pipe?
}
DataPipeUtils.copyToFile(mCore, consumerHandle, mTempFile, mExecutor, new Runnable() {
@Override
public void run() {
copyComplete();
}
});
}
@Override
public void start() {
mPlayer.start();
}
@Override
public void seekTo(int msec) {
mPlayer.seekTo(msec);
}
@Override
public void pause() {
mPlayer.pause();
}
}