Skip to content

Commit

Permalink
Merge #628
Browse files Browse the repository at this point in the history
628: Add sdlinfo tool r=pathunstrom a=AstraLuma

Add a little tool that'll examine SDL and hopefully help track down any kind of "missing feature" problems.

Co-authored-by: Jamie Bliss <jamie@ivyleav.es>
  • Loading branch information
bors[bot] and AstraLuma authored Nov 1, 2021
2 parents 4e025a1 + cdcd184 commit 09d4cc8
Show file tree
Hide file tree
Showing 2 changed files with 261 additions and 0 deletions.
214 changes: 214 additions & 0 deletions ppb/debug/sdlinfo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
"""
Interrogates SDL and tells us about it.
"""
import ctypes

import sdl2
from sdl2 import sdlimage
from sdl2 import sdlmixer

from ppb.systems.sdl_utils import sdl_call


def sdl_version():
ver = sdl2.SDL_version()
sdl_call(
sdl2.SDL_GetVersion, ctypes.byref(ver)
)
return f"{ver.major}.{ver.minor}.{ver.patch}"


def sdl_revision():
return sdl_call(sdl2.SDL_GetRevision).decode('utf-8')


def iter_video_drivers():
num_drivers = sdl_call(
sdl2.SDL_GetNumVideoDrivers,
_check_error=lambda rv: rv <= 0
)
for i in range(num_drivers):
yield sdl_call(sdl2.SDL_GetVideoDriver, i).decode('utf-8')


def check_video_driver(name):
try:
sdl_call(
sdl2.SDL_VideoInit, name.encode('utf-8'),
_check_error=lambda rv: rv < 0
)
except Exception:
return False
else:
sdl_call(
sdl2.SDL_VideoQuit, name,
)
return True


def iter_render_drivers():
num_drivers = sdl_call(
sdl2.SDL_GetNumRenderDrivers,
_check_error=lambda rv: rv <= 0
)
for i in range(num_drivers):
info = sdl2.SDL_RendererInfo()
sdl_call(
sdl2.SDL_GetRenderDriverInfo, i, ctypes.byref(info),
_check_error=lambda rv: rv < 0
)
yield info.name.decode('utf-8'), info


def iter_audio_drivers():
num_drivers = sdl_call(
sdl2.SDL_GetNumAudioDrivers,
)
for i in range(num_drivers):
yield sdl_call(
sdl2.SDL_GetAudioDriver, i,
_check_error=lambda rv: rv is None,
).decode('utf-8')


def check_audio_driver(name):
try:
sdl_call(
sdl2.SDL_AudioInit, name.encode('utf-8'),
_check_error=lambda rv: rv < 0
)
except Exception:
return False
else:
sdl_call(
sdl2.SDL_AudioQuit, name,
)
return True


def check_audio_codecs():
sdl2.SDL_Init(sdl2.SDL_INIT_AUDIO)
try:
libs = {
'FLAC': sdlmixer.MIX_INIT_FLAC,
'MOD': sdlmixer.MIX_INIT_MOD,
'MP3': sdlmixer.MIX_INIT_MP3,
'OGG': sdlmixer.MIX_INIT_OGG,
'MIDI': sdlmixer.MIX_INIT_MID,
'OPUS': sdlmixer.MIX_INIT_OPUS
}
for lib, flags in libs.items():
sdlmixer.Mix_SetError(b"")
ret = sdlmixer.Mix_Init(flags)
err = sdlmixer.Mix_GetError()
if err:
yield lib, err.decode('utf-8')
if ret & flags == flags:
yield lib, None
else:
yield lib, True
sdlmixer.Mix_Quit()
finally:
sdl2.SDL_Quit()


def check_image_codecs():
sdl2.SDL_Init(0)
try:
libs = {
'JPEG': sdlimage.IMG_INIT_JPG,
'PNG': sdlimage.IMG_INIT_PNG,
'TIFF': sdlimage.IMG_INIT_TIF,
'WEBP': sdlimage.IMG_INIT_WEBP
}
for lib, flags in libs.items():
sdlimage.IMG_SetError(b"")
ret = sdlimage.IMG_Init(flags)
err = sdlimage.IMG_GetError()
if err:
yield lib, err.decode('utf-8')
if ret & flags == flags:
yield lib, None
else:
yield lib, True
sdlimage.IMG_Quit()
finally:
sdl2.SDL_Quit()


def iter_joysticks():
num_sticks = sdl_call(
sdl2.SDL_NumJoysticks,
_check_error=lambda rv: rv < 0,
)
for i in range(num_sticks):
name = sdl_call(
sdl2.SDL_JoystickNameForIndex, i,
_check_error=lambda rv: rv is None,
)
yield name.decode('utf-8')


# def iter_haptics():
# num_sticks = sdl_call(
# sdl2.SDL_NumHaptics,
# _check_error=lambda rv: rv < 0,
# )
# for i in range(num_sticks):
# name = sdl_call(
# sdl2.SDL_HapticName, i,
# _check_error=lambda rv: rv is None,
# )
# yield name.decode('utf-8')


def main():
print(f"SDL Version: {sdl_version()} ({sdl_revision()})")

print("Video Drivers:")
for name in iter_video_drivers():
if check_video_driver(name):
print(f" y {name}")
else:
print(f" n {name}")

print("Renderers:")
for name, _ in iter_render_drivers():
print(f" * {name}")

print("Audio Drivers:")
for name in iter_audio_drivers():
if check_audio_driver(name):
print(f" y {name}")
else:
print(f" n {name}")

print("Image Codecs:")
for name, err in check_image_codecs():
if err is None:
print(f" y {name}")
elif err is True:
print(f" n {name}")
else:
print(f" n {name} ({err})")

print("Audio Codecs:")
for name, err in check_audio_codecs():
if err is None:
print(f" y {name}")
elif err is True:
print(f" n {name}")
else:
print(f" n {name} ({err})")

print("Joysticks:")
for name in iter_joysticks():
print(f" * {name}")

# print("Haptics:")
# for name in iter_haptics():
# print(f" * {name}")


if __name__ == '__main__':
main()
47 changes: 47 additions & 0 deletions tests/debug/test_sdlinfo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import ppb.debug.sdlinfo as sdlinfo


# This mostly tests that it doesn't crash

def test_version():
sdlinfo.sdl_version()


def test_revision():
sdlinfo.sdl_revision()


def test_video_drivers():
list(sdlinfo.iter_video_drivers())


# def test_check_video_driver():
# sdlinfo.check_video_driver(...)


def test_render_drivers():
list(sdlinfo.iter_render_drivers())


def test_audio_drivers():
list(sdlinfo.iter_audio_drivers())


# def test_check_audio_driver():
# sdlinfo.check_audio_driver(...)


def test_audio_codecs():
list(sdlinfo.check_audio_codecs())


def test_image_codecs():
list(sdlinfo.check_image_codecs())


def test_joysticks():
list(sdlinfo.iter_joysticks())


# def test_haptics():
# list(sdlinfo.iter_haptics())

0 comments on commit 09d4cc8

Please sign in to comment.