正规的;点击";使用javax.sound.sampled

正规的;点击";使用javax.sound.sampled,java,scala,audio,javasound,Java,Scala,Audio,Javasound,我尝试用Scala输出一些声音。我的问题是,我每秒都会收到一个简短的“噪音”/“咔嗒声”。我在使用类似的java程序时没有遇到这个问题。有人知道怎么回事吗 Scala 2.9.2 java 1.6.0_31 OS X 10.7.3 import javax.sound.sampled._ object SinSoundMain extends App { val SAMPLE_RATE = 44100 val SAMPLE_SIZE = 16 val CHANNELS = 1

我尝试用Scala输出一些声音。我的问题是,我每秒都会收到一个简短的“噪音”/“咔嗒声”。我在使用类似的java程序时没有遇到这个问题。有人知道怎么回事吗

Scala 2.9.2 java 1.6.0_31 OS X 10.7.3

import javax.sound.sampled._

object SinSoundMain extends App {
  val SAMPLE_RATE = 44100
  val SAMPLE_SIZE = 16
  val CHANNELS = 1
  val SIGNED = true
  val BIG_ENDIAN = true
  var format = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE, CHANNELS, SIGNED, BIG_ENDIAN)

  var info = new DataLine.Info(classOf[SourceDataLine], format);

  val auline = (AudioSystem.getLine(info)).asInstanceOf[SourceDataLine]
  auline.open(format)
  auline.start

  val start = System.currentTimeMillis()

  // play 10s
  while(System.currentTimeMillis() < (start + 10000)) {
    var index = 0

    // output blocks of 10000 samples
    var samples = 0.until(10000).map {x =>  math.sin((x+index) * 800.0 / 44100 * math.Pi)}

    // convert samples to Byte Array
    var byteSamples:Array[Byte] = samples.flatMap{ s => 
      val ss = (s * Short.MaxValue).toShort
      List((ss >> 8).toByte, (ss & 0xFF).toByte)
    }.toArray

    auline.write(byteSamples, 0, byteSamples.length)
  }

  // cleanup      
  auline.drain
  auline.close
}
import javax.sound.sampled_
对象SinSoundMain扩展应用程序{
val样本率=44100
val样本大小=16
val通道=1
val SIGNED=true
val BIG_ENDIAN=真
var格式=新的音频格式(采样率、采样大小、频道、签名、大端)
var info=new DataLine.info(classOf[SourceDataLine],格式);
val auline=(AudioSystem.getLine(info)).asInstanceOf[SourceDataLine]
auline.open(格式)
奥琳,开始
val start=System.currentTimeMillis()
//玩10秒
而(System.currentTimeMillis()<(开始+10000)){
var指数=0
//10000个样本的输出块
var samples=0.until(10000).map{x=>math.sin((x+索引)*800.0/44100*math.Pi)}
//将样本转换为字节数组
var byteSamples:Array[Byte]=samples.flatMap{s=>
val ss=(s*Short.MaxValue).toShort
列表((ss>>8).toByte,(ss&0xFF).toByte)
}.托雷
auline.write(字节数,0,字节数,长度)
}
//清理
奥林排水管
奥琳,闭嘴
}

代码中的错误是
var index=0
应该在while循环开始之前,并且在循环结束时(内部)应该有
index+=10000
。这样做听起来不错