- PR -

音声再生でプロセスが終了する

1
投稿者投稿内容
YFuji
会議室デビュー日: 2006/11/13
投稿数: 1
投稿日時: 2006-11-13 14:26
現在JAVAを利用して入力された数字をJavaTM Sound APIを利用して再生するソフトを作成しています。
仕組みとしては0〜999までのwavファイルと千(セン)と万(マン)のwavファイルを用意し、
入力された数字から利用するwavファイルを探して順番に再生するものです。
また、再生中に他の数字の入力があった場合はその現在の再生を中断し、入力された数字を再生する必要があります。

入力をゆっくりと行う場合だと問題ないのですが、入力を連続で行う場合に hs_err_pid2240.log といったファイルが作成されてプロセスが終了してしまいます。

ーーーーーーーーーーーーーーーーーーーー 以下ファイルの内容(一部) −−−−−−−−−−−−−−−−−−−

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d5126c8, pid=2240, tid=2352
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_06-b05 mixed mode)
# Problematic frame:
# C [jsoundds.dll+0x26c8]
#

--------------- T H R E A D ---------------

Current thread (0x008a03f0): JavaThread "Thread-7" [_thread_in_native, id=2352]

siginfo: ExceptionCode=0xc0000005, reading address 0x00000010

Registers:
EAX=0x0d9d70a0, EBX=0x0b70fad8, ECX=0x00000000, EDX=0x00000c22
ESP=0x0b70fa94, EBP=0x0b70faac, ESI=0x0e2700f0, EDI=0x0e272770
EIP=0x6d5126c8, EFLAGS=0x00210202

Top of Stack: (sp=0x0b70fa94)
0x0b70fa94: 0d9d70a0 0b70fad4 0b70fad8 0e272770
0x0b70faa4: 0e2700f0 008a03f0 0b70fadc 6d512a8b
0x0b70fab4: 0e2700f0 0b70fad4 0b70fad8 0b70fae4
0x0b70fac4: 00000001 00000c22 00000001 02c44e70
0x0b70fad4: 0e2700f0 0e2700f0 0b70fb08 6d511bae
0x0b70fae4: 0e2700f0 00000001 00d19c4d 008a04b0
0x0b70faf4: 0b70fb04 0e272770 00000000 00000001
0x0b70fb04: 07377b20 0b70fb68 00d0070d 00000001

Instructions: (pc=0x6d5126c8)
0x6d5126b8: 0f 84 9f 00 00 00 8b 5d 10 8b 08 53 ff 75 0c 50
0x6d5126c8: ff 51 10 85 c0 0f 8c 9f 00 00 00 8b 7d 14 8b 4e


Stack: [0x0b6d0000,0x0b710000), sp=0x0b70fa94, free space=254k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [jsoundds.dll+0x26c8]
C [jsoundds.dll+0x2a8b]
C [jsoundds.dll+0x1bae]
J com.sun.media.sound.DirectAudioDevice$DirectDL.drain()V
J com.abc.sound.SoundControl.play(Ljava/lang/String;)V
J com.abc.sound.SoundControl.pooling()V
v ~OSRAdapter
j com.abc.sound.SoundControl.run()V+1
v ~StubRoutines::call_stub
V [jvm.dll+0x845a9]
V [jvm.dll+0xd9317]
V [jvm.dll+0x8447a]
V [jvm.dll+0x841d7]
V [jvm.dll+0x9ed69]
V [jvm.dll+0x109fe3]
V [jvm.dll+0x109fb1]
C [MSVCRT.dll+0x2a3b0]
C [kernel32.dll+0xb683]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J com.sun.media.sound.DirectAudioDevice.nIsStillDraining(JZ)Z
J com.sun.media.sound.DirectAudioDevice$DirectDL.drain()V
J com.abc.sound.SoundControl.play(Ljava/lang/String;)V
J com.abc.sound.SoundControl.pooling()V
v ~OSRAdapter
j com.abc.sound.SoundControl.run()V+1
v ~StubRoutines::call_stub

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


ソースは以下のようになっています。

ーーーーーーーーーーーーーーーーーーーー 以下ソース −−−−−−−−−−−−−−−−−−−
package com.abc.sound;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import com.abc.center.Path;

public class CopyOfSoundControl extends Thread {

private List playlist = new LinkedList();

private AudioFormat format;

private SourceDataLine pline = null;

private AudioInputStream ais;

private boolean playflg = false;

private static final int EXTERNAL_BUFFER_SIZE = 15;

private ThreadWatch tw = ThreadWatch.getIncetance();

public void run(){
this.pooling();
}

public synchronized void pooling( ){
while( true ){
if( this.playlist.size() <= 0 ){
try{
this.wait();
}catch( Exception e ){
}
}
try{
this.play( (String)this.playlist.remove( 0 ) );
}catch( Exception e ){
}
}
}

public void addSound( List list ){
try{
this.playflg = false;
if( this.pline != null ){
this.pline.flush();
this.pline.stop();
}
if( this.playlist.size() > 0 ){
this.playlist.clear();
}
this.sync( list );
}catch( Exception e ){
}
}

public synchronized void sync( List list ){
try{
this.playlist.clear();
this.playlist.addAll( list );
notifyAll();
}catch( Exception e ){
}
}

private AudioInputStream getAudioInputStream( String name ) throws Exception {
AudioInputStream audioInputStream = null;
InputStream is = null;
try{
is = new FileInputStream( Path.SOUND_DIR + name + ".wav" );
}catch( Exception e ){
is = new FileInputStream( Path.SOUND_DIR + name + ".WAV" );
}
audioInputStream = AudioSystem.getAudioInputStream( is );
return audioInputStream;
}

private SourceDataLine createLine( AudioInputStream audioInputStream ) throws Exception {
this.format = audioInputStream.getFormat();
DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
line.open( this.format );
return line;
}

private void play( String name ) throws Exception {
AudioInputStream as = this.getAudioInputStream( name );
this.ais = as;
SourceDataLine line = createLine( as );
this.pline = line;
this.pline.addLineListener( new SoundControlListner( this.pline ) );
this.playflg = true;
this.pline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
long waittime = System.currentTimeMillis();
try{
while (nBytesRead != -1) {
if( !this.playflg ){
throw new Exception( );
}
nBytesRead = this.ais.read(abData, 0, abData.length);
if( !this.playflg ){
throw new Exception( );
}
if (nBytesRead >= 0) {
if( !this.playflg ){
throw new Exception( );
}
int nBytesWritten = this.pline.write(abData, 0, nBytesRead);
if( !this.pline.isOpen() ){
throw new Exception( );
}
if( !this.playflg ){
throw new Exception( );
}
}
if(System.currentTimeMillis() - waittime > 10000 ) {
break;
}
}
}catch( Exception e ){
} finally {
try {
this.pline.drain();
} catch (RuntimeException e) {
}
}
this.pline.stop();
this.ais.close();
this.pline.close();
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

入力があった場合には入力した数字を再生すために必要なwavファイルの名前をListに入れて addSound メソッドを
呼び出すように作ってあります。
また addSound は複数のスレッドから呼ばれる可能性があります。

利用しているJREは 1.5.0_06-b05 で WindowsXPをで動作しています。

何か情報およびご指摘があれば教えてください。よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-11-13 14:40
VM が落ちる場合のトラブルシューティング方法については以下のページが参考になります。
http://www.beasys.co.jp/cs/support_news/product_troubleshooting/System_Core_Pattern.html

今回は、jsoundds.dll という、VM 付属の DLL 内で落ちているようですので、 VM の問題です。
Bugdatabase にも、jsoundds.dll で落ちる問題がいくつか報告されていますね。必要に応じてVM ベンダにも問いあわせましょう。
http://bugs.sun.com/bugdatabase/search.do?process=1&subcategory=&type=&keyword=jsoundds.dll+0x26c8&category=&bugStatus=

1

スキルアップ/キャリアアップ(JOB@IT)