输出总是单音的

问题描述 投票:0回答:0

我正在尝试使用 PortAudio 的 Go 绑定来播放立体声数据。奇怪的是,两个频道只播放流的右频道,左频道被静音。

这是我的代码:

...

// Init
func NewParameters(out *portaudio.DeviceInfo) (p portaudio.StreamParameters) {
    if out != nil {
        p := &p.Output
        p.Device = out
        p.Channels = 2
        p.Latency = out.DefaultLowOutputLatency
    }
    // p.SampleRate = float64(44100)
    p.SampleRate = float64(44100 / 2)
    p.FramesPerBuffer = portaudio.FramesPerBufferUnspecified
    return p
}

func Init() {
    if paUp {
        return
    }
    err1 := portaudio.Initialize()
    if err1 != nil {
        log.Println(err1)
    }

    h, err := portaudio.DefaultOutputDevice()
    if err != nil {
        log.Fatalln(err)
    }
    paStream, err = portaudio.OpenStream(NewParameters(h), paCallback)
    if err != nil {
        log.Fatalln(err)
    }
    if err = paStream.Start(); err != nil {
        log.Fatalln(err)
    }
}

...

// Callback
func paCallback (out []int32) {
    ...
    pi := []int16{left, right}
    // Adjust volume
    pi[0] = int16(float32(pi[0]) * settings.Current.AudioVolume)
    pi[1] = int16(float32(pi[1]) * settings.Current.AudioVolume)
    return *(*int32)(unsafe.Pointer(&pi[0]))
}

...

这会单声道播放源的右声道。如果我交换

pi[0]
pi[1]
,则播放左声道。 如果我用这个替换
return *(*int32)(unsafe.Pointer(&pi[0]))

    var bin0 uint32 = *(*uint32)(unsafe.Pointer(&pi[0]))
    var bin uint32 = 0xFFFF
    var px uint32 = bin & bin0
    return *(*int32)(unsafe.Pointer(&px))

然后音频完全静音。或者

0xFFFF0000
没有任何反应。

go pointers audio unsafe portaudio
© www.soinside.com 2019 - 2024. All rights reserved.