- - PR -
音声再生でプロセスが終了する
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をで動作しています。 何か情報およびご指摘があれば教えてください。よろしくお願いします。 |
|
投稿日時: 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