nativeaudio

audio playback for Go
Log | Files | Refs | README | LICENSE

commit 52b0dafe866ca18b9f2f8f92e27ef91646c028e2
parent 7cc149941bfb12c0c82dddc7b63d1bbaae515ce4
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date:   Tue,  5 Mar 2024 04:51:20 +0800

audio: [Windows] return init error at runtime

For platforms that don't have MediaFoundation we can avoid panicking by
returning the error when Start is called.

Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>

Diffstat:
Maudio_windows.go | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 54 insertions(+), 12 deletions(-)

diff --git a/audio_windows.go b/audio_windows.go @@ -784,26 +784,68 @@ func (v *IMFMediaBuffer) Unlock() error { */ var ( - _mfplat = windows.NewLazySystemDLL("Mfplat.dll") - _shlwapi = windows.NewLazySystemDLL("Shlwapi.dll") - _mfreadwrite = windows.NewLazySystemDLL("Mfreadwrite.dll") + _mfplat *windows.DLL + _shlwapi *windows.DLL + _mfreadwrite *windows.DLL - _SHCreateMemStream = _shlwapi.NewProc("SHCreateMemStream") + _SHCreateMemStream *windows.Proc - _MFStartup = _mfplat.NewProc("MFStartup") - _MFShutdown = _mfplat.NewProc("MFShutdown") - _MFCreateMediaType = _mfplat.NewProc("MFCreateMediaType") - _MFCreateAttributes = _mfplat.NewProc("MFCreateAttributes") - _MFCreateMFByteStreamOnStream = _mfplat.NewProc("MFCreateMFByteStreamOnStream") + _MFStartup *windows.Proc + _MFShutdown *windows.Proc + _MFCreateMediaType *windows.Proc + _MFCreateAttributes *windows.Proc + _MFCreateMFByteStreamOnStream *windows.Proc - _MFCreateSourceReaderFromByteStream = _mfreadwrite.NewProc("MFCreateSourceReaderFromByteStream") + _MFCreateSourceReaderFromByteStream *windows.Proc ) -func MFStartup(version, flags uintptr) error { +func MFStartup(version, flags uintptr) (err error) { + _mfplat, err = windows.LoadDLL("Mfplat.dll") + if err != nil { + return fmt.Errorf("Mfplat.dll: %w", err) + } + _shlwapi, err = windows.LoadDLL("Shlwapi.dll") + if err != nil { + return fmt.Errorf("Shlwapi.dll: %w", err) + } + _mfreadwrite, err = windows.LoadDLL("Mfreadwrite.dll") + if err != nil { + return fmt.Errorf("Mfreadwrite.dll: %w", err) + } + _SHCreateMemStream, err = _shlwapi.FindProc("SHCreateMemStream") + if err != nil { + return fmt.Errorf("SHCreateMemStream: %w", err) + } + _MFStartup, err = _mfplat.FindProc("MFStartup") + if err != nil { + return fmt.Errorf("MFStartup: %w", err) + } + _MFShutdown, err = _mfplat.FindProc("MFShutdown") + if err != nil { + return fmt.Errorf("MFShutdown: %w", err) + } + _MFCreateMediaType, err = _mfplat.FindProc("MFCreateMediaType") + if err != nil { + return fmt.Errorf("MFCreateMediaType: %w", err) + } + _MFCreateAttributes, err = _mfplat.FindProc("MFCreateAttributes") + if err != nil { + return fmt.Errorf("MFCreateAttributes: %w", err) + } + _MFCreateMFByteStreamOnStream, err = _mfplat.FindProc("MFCreateMFByteStreamOnStream") + if err != nil { + return fmt.Errorf("MFCreateMFByteStreamOnStream: %w", err) + } + _MFCreateSourceReaderFromByteStream, err = _mfreadwrite.FindProc("MFCreateSourceReaderFromByteStream") + if err != nil { + return fmt.Errorf("MFCreateSourceReaderFromByteStream: %w", err) + } + r, _, _ := _MFStartup.Call(version, flags) if r != S_OK { return MFErr{Code: r} } + return nil } @@ -888,7 +930,7 @@ func (e MFErr) Error() string { out := make([]uint16, 300) size, err := windows.FormatMessage( windows.FORMAT_MESSAGE_FROM_SYSTEM|windows.FORMAT_MESSAGE_FROM_HMODULE|windows.FORMAT_MESSAGE_ARGUMENT_ARRAY, - _mfplat.Handle(), + uintptr(_mfplat.Handle), uint32(e.Code), 0, out,