質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

1925閲覧

JavaでLWJGLを用いてOPENALで音楽を再生した際、異常な音が鳴る

KureteRubyLua

総合スコア206

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/11/28 14:54

編集2015/11/28 14:57

JavaでLWJGLというOpenGLやOpenALをまとめライブラリを用いてOpenaALで音楽を再生した際、やたら高速に再生される、ノイズまみれに鳴る等、異常な音が鳴ります。原因はDLLやPC環境に問題が無いという事以外、原因不明です。再生する度に違う音がなります。数値の部分をいじっても、全く解決できません。
一体どうすればいいのでしょうか?

以下がコードです。

Java

1import java.io.BufferedInputStream; 2import java.io.File; 3import java.io.FileInputStream; 4import java.io.FileNotFoundException; 5import java.io.IOException; 6import java.nio.FloatBuffer; 7import java.nio.IntBuffer; 8 9import org.lwjgl.BufferUtils; 10import org.lwjgl.LWJGLException; 11import org.lwjgl.openal.AL; 12import org.lwjgl.openal.AL10; 13import org.lwjgl.util.WaveData; 14 15public class OpenALSoundPlay { 16 /** Position of the source sound. */ 17 FloatBuffer sourcePos; 18 19 /** Velocity of the source sound. */ 20 FloatBuffer sourceVel; 21 22 /** Position of the listener. */ 23 FloatBuffer listenerPos; 24 25 /** Velocity of the listener. */ 26 FloatBuffer listenerVel; 27 28 /** Orientation of the listener. (first 3 elements are "at", second 3 are "up") */ 29 FloatBuffer listenerOri; 30 31 /** Buffers hold sound data. */ 32 IntBuffer buffer; 33 34 /** Sources are points emitting sound. */ 35 IntBuffer source; 36 37 public OpenALSoundPlay() 38 { 39 /** Buffers hold sound data. */ 40 buffer = BufferUtils.createIntBuffer(1); 41 42 /** Sources are points emitting sound. */ 43 source = BufferUtils.createIntBuffer(1); 44 45 /** Position of the source sound. */ 46 sourcePos = BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f}); 47 48 /** Velocity of the source sound. */ 49 sourceVel = BufferUtils.createFloatBuffer(3).put(new float[] {0.0f, 0.0f, 0.0f }); 50 51 /** Position of the listener. */ 52 listenerPos = BufferUtils.createFloatBuffer(3).put(new float[] {0.0f, 0.0f, 0.0f }); 53 54 /** Velocity of the listener. */ 55 listenerVel = BufferUtils.createFloatBuffer(3).put(new float[] {0.0f, 0.0f, 0.0f }); 56 57 /** Orientation of the listener. (first 3 elements are "at", second 3 are "up") */ 58 listenerOri = BufferUtils.createFloatBuffer(6).put(new float[] { 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f }); 59 } 60 int loadALData() 61 { 62 sourcePos.rewind(); 63 sourceVel.rewind(); 64 65 // Load wav data into a buffer. 66 AL10.alGenBuffers(buffer); 67 if(AL10.alGetError() != AL10.AL_NO_ERROR) 68 { 69 return AL10.AL_FALSE; 70 } 71 72 WaveData waveFile; 73 try { 74 //FileInputStream fin=new FileInputStream("18am01.wav"); 75 FileInputStream fin=new FileInputStream(new File("Battle1.wav")); 76 BufferedInputStream bin = new BufferedInputStream(fin); 77 waveFile = WaveData.create(bin); 78 AL10.alBufferData(buffer.get(0), waveFile.format, waveFile.data, waveFile.samplerate); 79 waveFile.dispose(); 80 bin.close(); 81 } catch (FileNotFoundException e) { 82 // TODO Auto-generated catch block 83 e.printStackTrace(); 84 } catch (IOException e) { 85 // TODO Auto-generated catch block 86 e.printStackTrace(); 87 } catch (Exception e) { 88 // TODO Auto-generated catch block 89 e.printStackTrace(); 90 } 91 92 // Bind the buffer with the source. 93 AL10.alGenSources(source); 94 95 if (AL10.alGetError() != AL10.AL_NO_ERROR) 96 { 97 return AL10.AL_FALSE; 98 } 99 100 AL10.alSourcei(source.get(0), AL10.AL_BUFFER, buffer.get(0) ); 101 102 AL10.alSourcef(source.get(0), AL10.AL_PITCH, 1.0f ); 103 AL10.alSourcef(source.get(0), AL10.AL_GAIN, 1.0f ); 104 AL10.alSource (source.get(0), AL10.AL_POSITION, sourcePos ); 105 AL10.alSource (source.get(0), AL10.AL_VELOCITY, sourceVel ); 106 107 //AL11.alSpeedOfSound(65.15f); 108 //AL10.alSourcef(source.get(0), AL11.AL_SPEED_OF_SOUND,100.5f); 109 // Do another error check and return. 110 if (AL10.alGetError() == AL10.AL_NO_ERROR) 111 { 112 return AL10.AL_TRUE; 113 } 114 return AL10.AL_FALSE; 115 } 116 /** 117 * void setListenerValues() 118 * 119 * We already defined certain values for the Listener, but we need 120 * to tell OpenAL to use that data. This function does just that. 121 */ 122 void setListenerValues() { 123 124 listenerPos.rewind(); 125 listenerVel.rewind(); 126 listenerOri.rewind(); 127 128 AL10.alListener(AL10.AL_POSITION, listenerPos); 129 AL10.alListener(AL10.AL_VELOCITY, listenerVel); 130 AL10.alListener(AL10.AL_ORIENTATION, listenerOri); 131 } 132 133 /** 134 * void killALData() 135 * 136 * We have allocated memory for our buffers and sources which needs 137 * to be returned to the system. This function frees that memory. 138 */ 139 void killALData() { 140 AL10.alDeleteSources(source); 141 AL10.alDeleteBuffers(buffer); 142 } 143 144 public void execute() 145 { 146 // Initialize OpenAL and clear the error bit. 147 try{ 148 AL.create(); 149 } catch (LWJGLException le) { 150 le.printStackTrace(); 151 return; 152 } 153 AL10.alGetError(); 154 155 // Load the wav data. 156 if(loadALData() == AL10.AL_FALSE) { 157 System.out.println("Error loading data."); 158 return; 159 } 160 setListenerValues(); 161 // Loop. 162 char c = ' '; 163 while(c != 'q') { 164 try { 165 c = (char) System.in.read(); 166 } catch (IOException ioe) { 167 c = 'q'; 168 } 169 170 switch(c) { 171 // Pressing 'p' will begin playing the sample. 172 case 'p': 173 System.out.println("before"); 174 AL10.alSourcePlay(source.get(0)); 175 System.out.println("After"); 176 break; 177 // Pressing 's' will stop the sample from playing. 178 case's': AL10.alSourceStop(source.get(0)); break; 179 180 // Pressing 'h' will pause the sample. 181 case 'h': AL10.alSourcePause(source.get(0)); break; 182 }; 183 } 184 killALData(); 185 AL.destroy(); 186 } 187 public static void main(String[] args) { 188 OpenALSoundPlay music= new OpenALSoundPlay(); 189 music.execute(); 190 } 191 192 /** 193 * 1) Identify the error code. 194 * 2) Return the error as a string. 195 */ 196 public static String getALErrorString(int err) { 197 switch (err) { 198 case AL10.AL_NO_ERROR: 199 return "AL_NO_ERROR"; 200 case AL10.AL_INVALID_NAME: 201 return "AL_INVALID_NAME"; 202 case AL10.AL_INVALID_ENUM: 203 return "AL_INVALID_ENUM"; 204 case AL10.AL_INVALID_VALUE: 205 return "AL_INVALID_VALUE"; 206 case AL10.AL_INVALID_OPERATION: 207 return "AL_INVALID_OPERATION"; 208 case AL10.AL_OUT_OF_MEMORY: 209 return "AL_OUT_OF_MEMORY"; 210 default: 211 return "No such error code"; 212 } 213 } 214}

このページを参考にしました。
http://wiki.lwjgl.org/wiki/OpenAL_Tutorial_1_-_Single_Static_Source

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

LWJGLとはまた別のラッパーであるJOALを使用して無理やり修正しました。
結局LWJGLでOpenALが動かないのかは原因不明です。

投稿2016/01/30 08:18

KureteRubyLua

総合スコア206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問