PortAudio:默认帧数为每缓冲区

时间:2015-08-31 20:57:20

标签: go portaudio libsndfile

我尝试使用PortAudio以异步方式在Go中播放音频。据我所知,PortAudio处理自己的线程,因此我不需要使用Go的内置并发内容。我使用libsndfile加载文件(也是Go绑定)。这是我的代码:

type Track struct {
    stream   *portaudio.Stream
    playhead int
    buffer   []int32
}

func LoadTrackFilesize(filename string, loop bool, bytes int) *Track {
    // Load file
    var info sndfile.Info
    soundFile, err := sndfile.Open(filename, sndfile.Read, &info)
    if err != nil {
        fmt.Printf("Could not open file: %s\n", filename)
        panic(err)
    }
    buffer := make([]int32, bytes)
    numRead, err := soundFile.ReadItems(buffer)
    if err != nil {
        fmt.Printf("Error reading from file: %s\n", filename)
        panic(err)
    }
    defer soundFile.Close()

    // Create track
    track := Track{
        buffer: buffer[:numRead],
    }

    // Create stream
    stream, err := portaudio.OpenDefaultStream(
        0, 2, float64(44100), portaudio.FramesPerBufferUnspecified, track.playCallback,
    )
    if err != nil {
        fmt.Printf("Couldn't get stream for file: %s\n", filename)
    }
    track.stream = stream

    return &track
}

func (t *Track) playCallback(out []int32) {
    for i := range out {
        out[i] = t.buffer[(t.playhead+i)%len(t.buffer)]
    }
    t.playhead += len(out) % len(t.buffer)
}

func (t *Track) Play() {
    t.stream.Start()
}

使用这些功能,在初始化PortAudio和其他所有功能后,播放我提供的音轨 - 只是。它的非常滞后,并减慢了我的应用程序的其余部分(游戏循环)。

但是,如果我将每个缓冲区的帧数从FramesPerBufferUnspecified更改为高,例如1024,则音频播放正常并且不会干扰我的应用程序的其余部分。

这是为什么? PortAudio文档建议使用未指定的值将选择一个值以获得最佳延迟,但我绝对没有看到。

此外,当玩这个非常高的价值时,我注意到一些小小的文物 - 很少有人弹出'噪音 - 在音频中。

我的回调函数或其他任何东西是否有问题可能导致其中一个或两个问题?

我使用OSX 10.10.5,使用Go 1.3.3以及来自Homebrew的libsndfile和portaudio。

感谢。

1 个答案:

答案 0 :(得分:1)

转到评论的答案:

始终使用最新版本的Go进行测试。

此外,@ Joel发现您需要使用float32代替int32