2015-08-31 37 views
2

我试图用GoA,异步地使用PortAudio播放音频。据我所知PortAudio处理自己的线程,所以我不需要使用任何Go的内置并发的东西。我使用libsndfile来加载文件(也是Go绑定)。这里是我的代码:PortAudio:每个缓冲区的默认帧播放滞后

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和所有其余后,可播放音轨我提供 - 而已。这是非常 laggy,并减缓我的应用程序(游戏循环)的其余部分。

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

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

此外,当玩这个非常高的价值时,我注意到音频中的一些微小的文物 - 一点'爆裂'噪音。

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

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

谢谢。

+0

我建议升级到1.5并再试一次,如果仍然存在相同的问题,请更新问题。 – OneOfOne

+0

你可以让一个教授找出'laggy'代码 –

+0

@OneOfOne谢谢,这似乎有助于第一个问题 - 但我仍然得到很多这些奇怪的音频文物,但。 –

回答

1

回答评论回答:

总是用最新版本的Go进行测试。

此外,@Joel知道您需要使用float32而不是int32