/*
This file is part of jpcsp.
Jpcsp is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jpcsp is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Jpcsp. If not, see <http://www.gnu.org/licenses/>.
*/
package jpcsp.format.rco.vsmx.objects;
import org.apache.log4j.Logger;
import jpcsp.GUI.UmdVideoPlayer;
import jpcsp.format.rco.vsmx.VSMX;
import jpcsp.format.rco.vsmx.interpreter.VSMXArray;
import jpcsp.format.rco.vsmx.interpreter.VSMXBaseObject;
import jpcsp.format.rco.vsmx.interpreter.VSMXFunction;
import jpcsp.format.rco.vsmx.interpreter.VSMXInterpreter;
import jpcsp.format.rco.vsmx.interpreter.VSMXNativeObject;
import jpcsp.format.rco.vsmx.interpreter.VSMXNumber;
import jpcsp.format.rco.vsmx.interpreter.VSMXObject;
import jpcsp.format.rco.vsmx.interpreter.VSMXString;
import jpcsp.format.rco.vsmx.interpreter.VSMXUndefined;
public class MoviePlayer extends BaseNativeObject {
// FWVGA display resolution as default (854x480)
public static final int DEFAULT_WIDTH = 854;
public static final int DEFAULT_HEIGHT = 480;
private static final Logger log = VSMX.log;
public static final String objectName = "movieplayer";
private VSMXInterpreter interpreter;
private UmdVideoPlayer umdVideoPlayer;
private VSMXNativeObject controller;
private boolean playing = false;
private boolean menuMode;
private int playListNumber;
private int chapterNumber;
private int videoNumber;
private int audioNumber;
private int audioFlag;
private int subtitleNumber;
private int subtitleFlag;
private int width = DEFAULT_WIDTH;
private int height = DEFAULT_HEIGHT;
private int x;
private int y;
public static VSMXNativeObject create(VSMXInterpreter interpreter, UmdVideoPlayer umdVideoPlayer, VSMXNativeObject controller) {
MoviePlayer moviePlayer = new MoviePlayer(interpreter, umdVideoPlayer, controller);
VSMXNativeObject object = new VSMXNativeObject(interpreter, moviePlayer);
moviePlayer.setObject(object);
object.setPropertyValue("audioLanguageCode", new VSMXString(interpreter, "en"));
object.setPropertyValue("subtitleLanguageCode", new VSMXString(interpreter, "en"));
return object;
}
private MoviePlayer(VSMXInterpreter interpreter, UmdVideoPlayer umdVideoPlayer, VSMXNativeObject controller) {
this.interpreter = interpreter;
this.umdVideoPlayer = umdVideoPlayer;
this.controller = controller;
if (umdVideoPlayer != null) {
umdVideoPlayer.setMoviePlayer(this);
}
}
public void play(VSMXBaseObject object,
VSMXBaseObject pauseMode,
VSMXBaseObject menuMode,
VSMXBaseObject playListNumber,
VSMXBaseObject chapterNumber,
VSMXBaseObject videoNumber,
VSMXBaseObject audioNumber,
VSMXBaseObject audioFlag,
VSMXBaseObject subtitleNumber,
VSMXBaseObject subtitleFlag,
VSMXBaseObject unknownBool) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.play pauseMode=%d, menuMode=%d, playListNumber=%d, chapterNumber=%d, videoNumber=0x%X, audioNumber=0x%X, audioFlag=0x%X, subtitleNumber=%d, subtitleFlag=0x%X, unknownBool=%b", pauseMode.getIntValue(), menuMode.getIntValue(), playListNumber.getIntValue(), chapterNumber.getIntValue(), videoNumber.getIntValue(), audioNumber.getIntValue(), audioFlag.getIntValue(), subtitleNumber.getIntValue(), subtitleFlag.getIntValue(), unknownBool.getBooleanValue()));
}
playing = true;
boolean previousMenuMode = this.menuMode;
this.menuMode = menuMode.getBooleanValue();
this.playListNumber = playListNumber.getIntValue();
this.chapterNumber = chapterNumber.getIntValue();
this.videoNumber = videoNumber.getIntValue();
this.audioNumber = audioNumber.getIntValue();
this.audioFlag = audioFlag.getIntValue();
this.subtitleNumber = subtitleNumber.getIntValue();
this.subtitleFlag = subtitleFlag.getIntValue();
if (umdVideoPlayer != null) {
umdVideoPlayer.play(this.playListNumber, this.chapterNumber, this.videoNumber, this.audioNumber, this.audioFlag, this.subtitleNumber, this.subtitleFlag);
}
// Going to menu mode?
if (!previousMenuMode && this.menuMode) {
// Call the "controller.onMenu" callback
VSMXBaseObject callback = controller.getPropertyValue("onMenu");
if (callback instanceof VSMXFunction) {
VSMXBaseObject arguments[] = new VSMXBaseObject[0];
interpreter.interpretFunction((VSMXFunction) callback, null, arguments);
}
}
}
public void stop(VSMXBaseObject object, VSMXBaseObject unknownInt, VSMXBaseObject unknownBool) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.stop unknownInt=%d, unknownBool=%b", unknownInt.getIntValue(), unknownBool.getBooleanValue()));
}
playing = false;
}
public void resume(VSMXBaseObject object) {
playing = true;
}
public VSMXBaseObject getResumeInfo(VSMXBaseObject object) {
VSMXBaseObject resumeInfo;
if (playing) {
resumeInfo = new VSMXObject(interpreter, "ResumeInfo");
resumeInfo.setPropertyValue("playListNumber", new VSMXNumber(interpreter, playListNumber));
} else {
resumeInfo = VSMXUndefined.singleton;
}
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.getResumeInfo() returning %s", resumeInfo));
}
return resumeInfo;
}
public void changeResumeInfo(VSMXBaseObject object, VSMXBaseObject videoNumber, VSMXBaseObject audioNumber, VSMXBaseObject audioFlag, VSMXBaseObject subtitleNumber, VSMXBaseObject subtitleFlag) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.changeResumeInfo videoNumber=0x%X, audioNumber=0x%X, audioFlag=0x%X, subtitleNumber=%d, subtitleFlag=0x%X", videoNumber.getIntValue(), audioNumber.getIntValue(), audioFlag.getIntValue(), subtitleNumber.getIntValue(), subtitleFlag.getIntValue()));
}
this.videoNumber = videoNumber.getIntValue();
this.audioNumber = audioNumber.getIntValue();
this.audioFlag = audioFlag.getIntValue();
this.subtitleNumber = subtitleNumber.getIntValue();
this.subtitleFlag = subtitleFlag.getIntValue();
}
public VSMXBaseObject getPlayerStatus(VSMXBaseObject object) {
VSMXBaseObject playerStatus;
if (playing) {
playerStatus = new VSMXObject(interpreter, "PlayerStatus");
playerStatus.setPropertyValue("playListNumber", new VSMXNumber(interpreter, playListNumber));
playerStatus.setPropertyValue("chapterNumber", new VSMXNumber(interpreter, chapterNumber));
playerStatus.setPropertyValue("videoNumber", new VSMXNumber(interpreter, videoNumber));
playerStatus.setPropertyValue("audioNumber", new VSMXNumber(interpreter, audioNumber));
playerStatus.setPropertyValue("audioFlag", new VSMXNumber(interpreter, audioFlag));
playerStatus.setPropertyValue("subtitleNumber", new VSMXNumber(interpreter, subtitleNumber));
playerStatus.setPropertyValue("subtitleFlag", new VSMXNumber(interpreter, subtitleFlag));
} else {
playerStatus = VSMXUndefined.singleton;
}
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.getPlayerStatus() returning %s", playerStatus));
}
return playerStatus;
}
public void onPlayListEnd(int playListNumber) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.onPlayListEnd playListNumber=%d", playListNumber));
}
VSMXBaseObject callback = getObject().getPropertyValue("onPlayListEnd");
if (callback instanceof VSMXFunction) {
VSMXBaseObject argument = new VSMXObject(interpreter, null);
argument.setPropertyValue("playListNumber", new VSMXNumber(interpreter, playListNumber));
VSMXBaseObject arguments[] = new VSMXBaseObject[1];
arguments[0] = argument;
interpreter.interpretFunction((VSMXFunction) callback, null, arguments);
}
}
public void onChapter(int chapterNumber) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.onChapter chapterNumber=%d", chapterNumber));
}
VSMXBaseObject callback = getObject().getPropertyValue("onChapter");
if (callback instanceof VSMXFunction) {
VSMXBaseObject argument = new VSMXObject(interpreter, null);
argument.setPropertyValue("chapterNumber", new VSMXNumber(interpreter, chapterNumber));
VSMXBaseObject arguments[] = new VSMXBaseObject[1];
arguments[0] = argument;
interpreter.interpretFunction((VSMXFunction) callback, null, arguments);
}
}
public VSMXBaseObject getSize(VSMXBaseObject object) {
VSMXInterpreter interpreter = object.getInterpreter();
VSMXArray size = new VSMXArray(interpreter, 2);
size.setPropertyValue(0, new VSMXNumber(interpreter, width));
size.setPropertyValue(1, new VSMXNumber(interpreter, height));
return size;
}
public void setSize(VSMXBaseObject object, VSMXBaseObject width, VSMXBaseObject height) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.setSize(%s, %s)", width, height));
}
this.width = width.getIntValue();
this.height = height.getIntValue();
}
public VSMXBaseObject getPos(VSMXBaseObject object) {
VSMXInterpreter interpreter = object.getInterpreter();
VSMXArray pos = new VSMXArray(interpreter, 2);
pos.setPropertyValue(0, new VSMXNumber(interpreter, x));
pos.setPropertyValue(1, new VSMXNumber(interpreter, y));
return pos;
}
public void setPos(VSMXBaseObject object, VSMXBaseObject x, VSMXBaseObject y) {
if (log.isDebugEnabled()) {
log.debug(String.format("MoviePlayer.setPos(%s, %s)", x, y));
}
this.x = x.getIntValue();
this.y = y.getIntValue();
}
public void onUp() {
((Controller) controller.getObject()).onUp();
}
public void onDown() {
((Controller) controller.getObject()).onDown();
}
public void onLeft() {
((Controller) controller.getObject()).onLeft();
}
public void onRight() {
((Controller) controller.getObject()).onRight();
}
public void onPush() {
((Controller) controller.getObject()).onPush();
}
}