Closed timo-klarshift closed 1 year ago
func getBuffer(s *reflect.SliceHeader, p *C.PaStreamParameters) (unsafe.Pointer, int, error) {
if p.sampleFormat&C.paNonInterleaved == 0 {
n := int(p.channelCount)
if s.Len%n != 0 {
return nil, 0, fmt.Errorf("length of interleaved buffer not divisible by number of channels")
}
return unsafe.Pointer(s.Data), s.Len / n, nil
} else {
if s.Len != int(p.channelCount) {
return nil, 0, fmt.Errorf("buffer has wrong number of channels")
}
- buf := make([]uintptr, s.Len)
+ buf := make([]reflect.SliceHeader, s.Len)
frames := -1
- sp := s.Data
+ sp := (*[1 << 30]reflect.SliceHeader)(unsafe.Pointer(s.Data)) // convert s.Data to a SliceHeader slice
for i := range buf {
- ch := (*reflect.SliceHeader)(unsafe.Pointer(sp))
+ ch := &sp[i]
if frames == -1 {
frames = ch.Len
} else if ch.Len != frames {
return nil, 0, fmt.Errorf("channels have different lengths")
}
- buf[i] = ch.Data
+ buf[i] = *ch
- sp += unsafe.Sizeof(reflect.SliceHeader{})
}
- return unsafe.Pointer(&buf[0]), frames, nil
+ return unsafe.Pointer(&buf[0].Data), frames, nil
}
}
I am running Go 1.20.4
I was not fully sure and it seemed to work in my tests. Thanks for fixing so quickly!
Thanks for the report!
May I ask why you are not creating fixed Tags for this repo?
I guess it never crossed my mind. It's not a very active repo. What's the benefit?
To use it with clear versions as a dependency without having to specify commit hashes in go.mod. It's just easier to communicate a specific version. But it's not a big deal either..
I am getting the following trace when running a test with the
-race
flag:Without the race flag - everything works without issues.