commit 852abf67ebee4d6f5007240ef33c78a8fb2b3d43
parent ca92fe50f56e07bb9c6cf1b85ef8f3bb2a9411df
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date: Wed, 16 Sep 2026 21:27:25 -0400
audio: [Windows] use uint32 for DWORD parameters
Stream indices, stream flags and buffer lengths are DWORDs, but the
wrappers declared them as int64. Media Foundation wrote four bytes into
eight-byte fields, which only worked because the upper bytes started
zero and stayed zero. Lock's parameters were also named backwards: the
second output is the maximum length and the third the current length.
Diffstat:
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/audio_windows.go b/audio_windows.go
@@ -197,7 +197,7 @@ type SourceReader struct {
sample *IMFSample // sample object containing one or more streams
buffer *IMFMediaBuffer // buffer object containing the raw buffer
chunk *byte // start of chunk of audio data
- chunkSz int64 // size of chunk
+ chunkSz uint32 // size of chunk
prevTimestamp int64
currentTimestamp int64
@@ -231,7 +231,7 @@ func (s *SourceReader) Read(p []byte) (int, error) {
// next reads the next audio sample, returning true if found, or false if EOF.
func (s *SourceReader) next() bool {
for {
- var flags int64
+ var flags uint32
// Read the next sample; skipping samples with matching time stamps.
// For some reason ReadSample can produce more than one sample at time 0.
@@ -588,7 +588,7 @@ func (v *IMFSourceReader) Release() error {
return nil
}
-func (v *IMFSourceReader) SetStreamSelection(index int64, selected bool) error {
+func (v *IMFSourceReader) SetStreamSelection(index uint32, selected bool) error {
r, _, _ := syscall.SyscallN(
v.VTable.SetStreamSelection,
uintptr(unsafe.Pointer(v)),
@@ -601,7 +601,7 @@ func (v *IMFSourceReader) SetStreamSelection(index int64, selected bool) error {
return nil
}
-func (v *IMFSourceReader) SetCurrentMediaType(index int64, mt *IMFMediaType) error {
+func (v *IMFSourceReader) SetCurrentMediaType(index uint32, mt *IMFMediaType) error {
r, _, _ := syscall.SyscallN(
v.VTable.SetCurrentMediaType,
uintptr(unsafe.Pointer(v)),
@@ -615,7 +615,7 @@ func (v *IMFSourceReader) SetCurrentMediaType(index int64, mt *IMFMediaType) err
return nil
}
-func (v *IMFSourceReader) GetCurrentMediaType(index int64, mt **IMFMediaType) error {
+func (v *IMFSourceReader) GetCurrentMediaType(index uint32, mt **IMFMediaType) error {
r, _, _ := syscall.SyscallN(
v.VTable.GetCurrentMediaType,
uintptr(unsafe.Pointer(v)),
@@ -628,7 +628,7 @@ func (v *IMFSourceReader) GetCurrentMediaType(index int64, mt **IMFMediaType) er
return nil
}
-func (v *IMFSourceReader) ReadSample(index, controlFlags int64, actualIndex *int64, streamFlags *int64, timestamp *int64, sample **IMFSample) error {
+func (v *IMFSourceReader) ReadSample(index, controlFlags uint32, actualIndex *uint32, streamFlags *uint32, timestamp *int64, sample **IMFSample) error {
r, _, _ := syscall.SyscallN(
v.VTable.ReadSample,
uintptr(unsafe.Pointer(v)),
@@ -754,13 +754,13 @@ func (v *IMFMediaBuffer) Release() error {
return nil
}
-func (v *IMFMediaBuffer) Lock(buf **byte, length, capacity *int64) error {
+func (v *IMFMediaBuffer) Lock(buf **byte, maxLength, currentLength *uint32) error {
r, _, _ := syscall.SyscallN(
v.VTable.Lock,
uintptr(unsafe.Pointer(v)),
uintptr(unsafe.Pointer(buf)),
- uintptr(unsafe.Pointer(length)),
- uintptr(unsafe.Pointer(capacity)),
+ uintptr(unsafe.Pointer(maxLength)),
+ uintptr(unsafe.Pointer(currentLength)),
)
if r != S_OK {
return MFErr{Code: r}