我正在尝试使用 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
没有任何反应。