E ai galera GUJ, como vão?
Estou precisando de um help em um problema crítico que está ocorrendo em minha aplicação, o qual não consigo debugar a partir do ponto que o erro é gerado, muito menos capturar a exception.
A aplicação entra em um looping, no qual é iniciado a execução de sons MP3 e depois de um certo tempo (pré-definido) é chamado o metodo stop da classe Player do pacote javax.media. Esta rotina funciona bem, mas até certo momento só, sendo que isso ocorre de forma intermitente, sem uma sequencia lógica, gerando no console a seguinte mensagem de erro:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x747ebb39, pid=3488, tid=2700
#
# JRE version: 6.0_17-b04
# Java VM: Java HotSpot(TM) Client VM (14.3-b01 mixed mode windows-x86 )
# Problematic frame:
# C [quartz.dll+0x1bb39]
#
# An error report file with more information is saved as:
# D:\workspace\workspace_SDI\Java\PlayerSDI\hs_err_pid3488.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Debugando até o ponto que dá, constatei que o erro é gerado sempre quando se chama o método stop. Se não chamarmos este método e o looping continuar é executado um aúdio em paralelo com o outro, sem interrupções. Pode ser que eu esteja empregando mal as classes do JMF e a impressão que dá é que da estouro de memória, mas como a mensagem de erro do Java é muito genérica, mas não posso saber ao certo. Segue abaixo a classe que criei pra controlar os audios.
public class PlayAudio implements ControllerListener {
private Player _player = null;
public PlayAudio(File audioFile) throws PixelException {
Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, true);
try {
_player = Manager.createRealizedPlayer(audioFile.toURI().toURL());
_player.addControllerListener(this);
} catch (NoPlayerException ex) {
RegisterLog.LOGGER.error(ex.getStackTrace()[0]);
throw ex;
} catch (CannotRealizeException ex) {
RegisterLog.LOGGER.error(ex.getStackTrace()[0]);
throw ex;
} catch (IOException ex) {
RegisterLog.LOGGER.error(ex.getStackTrace()[0]);
throw new ex;
}
}
/**
* Inicia processo que executará o áudio carregado
*/
public void startAudio() {
if (_player != null) {
_player.start();
}
}
/**
* Interrompe a execução do áudio
*/
public void stopAudio() {
RegisterLog.LOGGER.debug("inicio de metodo parar áudio");
_player.setMediaTime(new Time(0));
_player.stop();
_player.close();
}
public Player getMediaPlayer() {
return _player;
}
public void setMediaPlayer(Player mediaPlayer) {
this._player = mediaPlayer;
}
public void finalizePlayAudio() {
try {
RegisterLog.LOGGER.debug("metodo antes do finalize");
finalize();
} catch (Throwable e) {
RegisterLog.LOGGER.error(e.getMessage());
}
}
public void controllerUpdate(ControllerEvent ce) {
if (ce instanceof EndOfMediaEvent) {
_player.setMediaTime(new Time(0));
_player.start();
}
}
}
Se alguém puder me ajudar.
Obrigado