badline 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +77 -0
  3. data/CLAUDE.md +10 -9
  4. data/README.md +135 -42
  5. data/doc/pinned-behaviour.md +131 -30
  6. data/exe/badline-ruby +28 -24
  7. data/lib/badline/address_bus/extra_sids.rb +30 -0
  8. data/lib/badline/address_bus/sid_slots.rb +42 -0
  9. data/lib/badline/address_bus.rb +15 -1
  10. data/lib/badline/audio/aiff.rb +2 -2
  11. data/lib/badline/audio/bare_player.rb +23 -12
  12. data/lib/badline/audio/cli.rb +167 -59
  13. data/lib/badline/audio/console.rb +2 -1
  14. data/lib/badline/audio/jukebox.rb +121 -36
  15. data/lib/badline/audio/machine_player.rb +25 -10
  16. data/lib/badline/audio/pcm_writer.rb +10 -6
  17. data/lib/badline/audio/playback.rb +6 -5
  18. data/lib/badline/audio/queued_tune.rb +89 -0
  19. data/lib/badline/audio/renderer.rb +57 -10
  20. data/lib/badline/audio/stereo.rb +97 -0
  21. data/lib/badline/audio/terminal.rb +39 -6
  22. data/lib/badline/audio/wav.rb +1 -1
  23. data/lib/badline/audio.rb +2 -3
  24. data/lib/badline/computer.rb +6 -3
  25. data/lib/badline/cpu/boundary.rb +54 -0
  26. data/lib/badline/cpu/core.rb +165 -0
  27. data/lib/badline/cpu.rb +3 -214
  28. data/lib/badline/drive1541/cpu.rb +29 -0
  29. data/lib/badline/drive1541.rb +1 -0
  30. data/lib/badline/ffi.rb +157 -0
  31. data/lib/badline/frontend/app.rb +225 -0
  32. data/lib/badline/frontend/audio_sink.rb +73 -0
  33. data/lib/badline/frontend/boot.rb +52 -0
  34. data/lib/badline/frontend/buttons.rb +90 -0
  35. data/lib/badline/frontend/controls.rb +163 -0
  36. data/lib/badline/frontend/drive_led.rb +51 -0
  37. data/lib/badline/frontend/filter_view.rb +96 -0
  38. data/lib/badline/frontend/frame_rate.rb +83 -0
  39. data/lib/badline/frontend/gamepads.rb +76 -0
  40. data/lib/badline/frontend/info_view.rb +120 -0
  41. data/lib/badline/frontend/keys.rb +48 -0
  42. data/lib/badline/frontend/pacer.rb +100 -0
  43. data/lib/badline/frontend/pad_port.rb +61 -0
  44. data/lib/badline/frontend/painter.rb +175 -0
  45. data/lib/badline/frontend/player_commands.rb +33 -0
  46. data/lib/badline/frontend/player_footer.rb +86 -0
  47. data/lib/badline/frontend/player_header.rb +60 -0
  48. data/lib/badline/frontend/player_screen.rb +124 -0
  49. data/lib/badline/frontend/player_state.rb +67 -0
  50. data/lib/badline/frontend/player_window.rb +228 -0
  51. data/lib/badline/frontend/scope.rb +42 -0
  52. data/lib/badline/frontend/screen.rb +65 -0
  53. data/lib/badline/frontend/screenshot.rb +22 -0
  54. data/lib/badline/frontend/sid_history.rb +175 -0
  55. data/lib/badline/frontend/sid_view.rb +140 -0
  56. data/lib/badline/frontend/snapshots.rb +60 -0
  57. data/lib/badline/frontend/sound.rb +153 -0
  58. data/lib/badline/frontend/timeline.rb +171 -0
  59. data/lib/badline/frontend/visualizer_view.rb +101 -0
  60. data/lib/badline/frontend.rb +32 -0
  61. data/lib/badline/media/queue.rb +158 -0
  62. data/lib/badline/media.rb +13 -8
  63. data/lib/badline/options/event.rb +94 -0
  64. data/lib/badline/options/help.rb +107 -0
  65. data/lib/badline/options/option.rb +29 -0
  66. data/lib/badline/options/table.rb +64 -0
  67. data/lib/badline/options/validation.rb +54 -0
  68. data/lib/badline/options.rb +204 -149
  69. data/lib/badline/reu/dma/saved_state.rb +50 -0
  70. data/lib/badline/reu/dma.rb +56 -47
  71. data/lib/badline/reu/saved_state.rb +2 -1
  72. data/lib/badline/reu.rb +19 -10
  73. data/lib/badline/sdl.rb +133 -51
  74. data/lib/badline/sid/catch_up.rb +11 -1
  75. data/lib/badline/sid/filter.rb +9 -0
  76. data/lib/badline/sid/voice.rb +6 -0
  77. data/lib/badline/sid/waveform/noise_writeback.rb +33 -11
  78. data/lib/badline/sid/waveform.rb +22 -8
  79. data/lib/badline/sid.rb +35 -3
  80. data/lib/badline/snapshot/state.rb +1 -1
  81. data/lib/badline/storage/hvsc.rb +41 -0
  82. data/lib/badline/storage/sid_file.rb +45 -25
  83. data/lib/badline/storage/song_lengths.rb +6 -29
  84. data/lib/badline/storage/stil/credit.rb +50 -0
  85. data/lib/badline/storage/stil.rb +126 -0
  86. data/lib/badline/storage.rb +8 -0
  87. data/lib/badline/version.rb +1 -1
  88. data/lib/badline/vic/bank.rb +21 -0
  89. data/lib/badline/vic.rb +15 -6
  90. metadata +49 -19
  91. data/.claude/hooks/session-start.sh +0 -57
  92. data/.claude/settings.json +0 -14
  93. data/lib/badline/audio/sdl_sink.rb +0 -70
  94. data/lib/badline/audio/stream.rb +0 -123
  95. data/lib/badline/gui/application.rb +0 -243
  96. data/lib/badline/gui/drive_led_pane.rb +0 -29
  97. data/lib/badline/gui/gamepads.rb +0 -104
  98. data/lib/badline/gui/joy_map.rb +0 -27
  99. data/lib/badline/gui/key_map.rb +0 -39
  100. data/lib/badline/gui/palette.rb +0 -35
  101. data/lib/badline/gui/pane.rb +0 -36
  102. data/lib/badline/gui/screen_pane.rb +0 -46
  103. data/lib/badline/gui/snapshots.rb +0 -67
  104. data/lib/badline/gui/window.rb +0 -61
  105. data/lib/badline/gui.rb +0 -14
  106. data/lib/badline/sdl/events.rb +0 -49
  107. data/lib/badline/sdl/functions.rb +0 -74
  108. data/vendor/.gitkeep +0 -0
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module GUI
5
- # Translates SDL key events into the emulator's key symbols.
6
- #
7
- # MAP is just the overrides, anything not covered simply falls though.
8
- class KeyMap
9
- MAP = {
10
- "Backspace" => :delete,
11
- "Return" => :return,
12
- "Right" => :cursor_h,
13
- "Down" => :cursor_v,
14
- "Left" => :cursor_left,
15
- "Up" => :cursor_up,
16
- "`" => :left,
17
- "]" => :up,
18
- "PageUp" => :restore,
19
- "Space" => :space,
20
- "Left Ctrl" => :control,
21
- "Left Alt" => :cbm,
22
- "Left Shift" => :lshift,
23
- "Right Shift" => :rshift,
24
- "Home" => :clr_home,
25
- "Escape" => :run_stop,
26
- "Backslash" => :"@",
27
- "'" => :":",
28
- "End" => :£,
29
- "Keypad +" => :+,
30
- "Keypad *" => :*
31
- }.freeze
32
-
33
- def self.parse(event)
34
- name = SDL.key_name(event.sym)
35
- MAP[name] || name.downcase.to_sym
36
- end
37
- end
38
- end
39
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module GUI
5
- class Palette
6
- COLORS = [
7
- "#000000", "#FFFFFF", "#924A40", "#84C5CC",
8
- "#9351B6", "#72B14B", "#483AAA", "#D5DF7C",
9
- "#675200", "#C33D00", "#C18178", "#606060",
10
- "#8A8A8A", "#B3EC91", "#867ADE", "#B3B3B3"
11
- ].freeze
12
-
13
- attr_reader :dwords
14
-
15
- def initialize
16
- @dwords = COLORS.map { |hex| dword(hex) }.freeze
17
- @entries = @dwords.map { |rgba| [rgba].pack("V") }.freeze
18
- end
19
-
20
- def [](color)
21
- @entries[color]
22
- end
23
-
24
- private
25
-
26
- # Color as a little-endian RGBA dword.
27
- def dword(hex)
28
- r = hex[1, 2].to_i(16)
29
- g = hex[3, 2].to_i(16)
30
- b = hex[5, 2].to_i(16)
31
- (255 << 24) | (b << 16) | (g << 8) | r
32
- end
33
- end
34
- end
35
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module GUI
5
- class Pane
6
- attr_reader :left, :top, :width, :height
7
-
8
- def initialize(width:, height:, left: 0, top: 0)
9
- @width = width
10
- @height = height
11
- @left = left
12
- @top = top
13
- @rect = [left, top, width, height].pack("l4")
14
- end
15
-
16
- def render(_renderer)
17
- raise NotImplementedError, "#{self.class} must implement #render"
18
- end
19
-
20
- private
21
-
22
- # The pixels are little-endian RGBA dwords, red in the low byte.
23
- def blit(renderer, pixels)
24
- surface = SDL::CreateRGBSurfaceFrom.call(
25
- pixels, width, height, 32, width * 4,
26
- 0x0000_00ff, 0x0000_ff00, 0x00ff_0000, 0xff00_0000
27
- )
28
- texture = SDL::CreateTextureFromSurface.call(renderer, surface)
29
- SDL::RenderCopy.call(renderer, texture, nil, @rect)
30
- ensure
31
- SDL::DestroyTexture.call(texture) if texture
32
- SDL::FreeSurface.call(surface) if surface
33
- end
34
- end
35
- end
36
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module GUI
5
- # The part of the VIC's raster the machine's region crops out.
6
- class ScreenPane < Pane
7
- def initialize(computer, left: 0, top: 0, palette: Palette.new)
8
- @col_offset, @row_offset, crop_width, crop_height = computer.region.crop
9
- super(width: crop_width, height: crop_height, left:, top:)
10
- @computer = computer
11
- @row_bytes = width * 4
12
- @palette = palette.dwords
13
- @buffer = ("\x00" * (height * @row_bytes)).b
14
- end
15
-
16
- def render(renderer)
17
- blit(renderer, framebuffer)
18
- end
19
-
20
- private
21
-
22
- # Repack only the scanlines the VIC has touched since the last frame.
23
- def framebuffer
24
- vic = @computer.vic
25
- display = vic.display
26
- vic_width = vic.width
27
- dirty = vic.dirty_lines
28
-
29
- height.times do |row|
30
- next unless dirty[row + @row_offset]
31
-
32
- @buffer[row * @row_bytes, @row_bytes] =
33
- pack_row(display, vic_width, row)
34
- end
35
- vic.clear_dirty_lines!
36
- @buffer
37
- end
38
-
39
- def pack_row(display, vic_width, row)
40
- line = display[((row + @row_offset) * vic_width) + @col_offset, width]
41
- line.map! { |c| @palette[c] }
42
- line.pack("V*")
43
- end
44
- end
45
- end
46
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module GUI
5
- # The window's snapshots: a .vsf opened as the media, F11 saving the
6
- # machine to a new badline-<date>-<time>.vsf in the working directory,
7
- # and F12 going back to the snapshot last saved or opened.
8
- class Snapshots
9
- def self.snapshot?(path) = !path.nil? && File.extname(path).casecmp?(".vsf")
10
-
11
- def initialize
12
- @last = nil
13
- end
14
-
15
- # The machine the window starts with: for a .vsf the machine it holds,
16
- # built with that machine's chip models, which F12 goes back to, and
17
- # otherwise one built from the machine options (Application.new) with
18
- # the media attached.
19
- def boot(media_path, machine, media)
20
- return load(media_path) if Snapshots.snapshot?(media_path)
21
-
22
- Computer.new(**machine_options(machine, media_path)).tap do |computer|
23
- Media::TrueDrive.plug(computer) if machine[:true_drive]
24
- puts Media.attach(computer, media_path, **media) if media_path
25
- end
26
- end
27
-
28
- # A new machine, built as the snapshot's was and restored from it.
29
- def load(path)
30
- computer = Snapshot.load(path) { |line| puts line }
31
- @last = path
32
- puts "Restored #{path}"
33
- computer
34
- end
35
-
36
- # Saves the machine, and warns when it can't.
37
- def save(computer)
38
- path = "badline-#{Time.now.strftime('%Y%m%d-%H%M%S')}.vsf"
39
- computer.save_snapshot(path)
40
- @last = path
41
- puts "Saved #{path}, F12 restores it"
42
- rescue Snapshot::FormatError, SystemCallError => e
43
- warn "badline: #{path}: #{e.message}"
44
- end
45
-
46
- # A new machine restored from the snapshot last saved or opened, or
47
- # nil when there is none or it fails, which it warns about.
48
- def restore
49
- return load(@last) if @last
50
-
51
- puts "No snapshot to restore, F11 saves one"
52
- nil
53
- rescue Snapshot::FormatError, SystemCallError => e
54
- warn "badline: #{@last}: #{e.message}"
55
- nil
56
- end
57
-
58
- private
59
-
60
- def machine_options(machine, media_path)
61
- options = { sid_model: machine[:sid_model] || Media.sid_model(media_path), **machine.slice(:reu) }
62
- options[:region] = Region::NTSC if machine[:ntsc]
63
- options
64
- end
65
- end
66
- end
67
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module GUI
5
- class Window
6
- DEFAULT_REFRESH_RATE = 60
7
-
8
- # SDL_DisplayMode: Uint32 format; int w, h, refresh_rate; then a pointer.
9
- DISPLAY_MODE_SIZE = 24
10
-
11
- attr_reader :renderer
12
-
13
- def initialize(title:, width:, height:, scale: 2, vsync: true)
14
- SDL.check(SDL::InitSubSystem.call(SDL::INIT_VIDEO | SDL::INIT_EVENTS))
15
- SDL::SetHint.call("SDL_RENDER_SCALE_QUALITY", "0") # nearest-neighbour
16
- SDL::SetHint.call("SDL_MOUSE_RELATIVE_SCALING", "0") # host pixels, whatever the window size
17
-
18
- @window = SDL.check_pointer(SDL::CreateWindow.call(
19
- title,
20
- SDL::WINDOWPOS_CENTERED, SDL::WINDOWPOS_CENTERED,
21
- width * scale, height * scale,
22
- SDL::WINDOW_RESIZABLE
23
- ))
24
-
25
- flags = SDL::RENDERER_ACCELERATED
26
- flags |= SDL::RENDERER_PRESENTVSYNC if vsync
27
- @renderer = SDL.check_pointer(SDL::CreateRenderer.call(@window, -1, flags))
28
- SDL.check(SDL::RenderSetLogicalSize.call(@renderer, width, height))
29
- end
30
-
31
- def title=(title)
32
- SDL::SetWindowTitle.call(@window, title)
33
- end
34
-
35
- def refresh_rate
36
- mode = "\0".b * DISPLAY_MODE_SIZE
37
- SDL.check(SDL::GetCurrentDisplayMode.call(0, mode))
38
- rate = mode.unpack1("l", offset: 12)
39
- rate.positive? ? rate : DEFAULT_REFRESH_RATE
40
- rescue SDL::Error
41
- DEFAULT_REFRESH_RATE
42
- end
43
-
44
- def draw(panes)
45
- SDL::SetRenderDrawColor.call(@renderer, 0, 0, 0, 255)
46
- SDL::RenderClear.call(@renderer)
47
- panes.each { |pane| pane.render(@renderer) }
48
- SDL::RenderPresent.call(@renderer)
49
- end
50
-
51
- def close
52
- return unless @window
53
-
54
- SDL::DestroyRenderer.call(@renderer)
55
- SDL::DestroyWindow.call(@window)
56
- SDL::QuitSubSystem.call(SDL::INIT_VIDEO | SDL::INIT_EVENTS)
57
- @window = nil
58
- end
59
- end
60
- end
61
- end
data/lib/badline/gui.rb DELETED
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "badline/sdl"
4
-
5
- require "badline/gui/palette"
6
- require "badline/gui/key_map"
7
- require "badline/gui/joy_map"
8
- require "badline/gui/gamepads"
9
- require "badline/gui/pane"
10
- require "badline/gui/screen_pane"
11
- require "badline/gui/drive_led_pane"
12
- require "badline/gui/window"
13
- require "badline/gui/snapshots"
14
- require "badline/gui/application"
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module SDL
5
- KEY_TAB = 0x09
6
- KEY_F10 = 0x4000_0043
7
- KEY_F11 = 0x4000_0044
8
- KEY_F12 = 0x4000_0045
9
- KMOD_SHIFT = 0x0003
10
-
11
- # The events the front end handles. SDL_Event is a 56-byte union, read
12
- # here at the offsets its keyboard, mouse and controller members use.
13
- Quit = Data.define
14
- # A held key sends repeats, flagged at byte 13 of the event.
15
- KeyDown = Data.define(:sym, :mod, :repeat) do
16
- def initialize(sym:, mod:, repeat: false) = super
17
- end
18
- KeyUp = Data.define(:sym, :mod)
19
- MouseMotion = Data.define(:xrel, :yrel)
20
- MouseButton = Data.define(:button, :pressed)
21
- ControllerDevice = Data.define
22
-
23
- EVENT_SIZE = 56
24
-
25
- # The next event the front end handles, skipping the others, or nil once
26
- # the queue is empty.
27
- def self.poll_event
28
- buffer = (@event ||= Fiddle::Pointer.malloc(EVENT_SIZE, Fiddle::RUBY_FREE))
29
- while PollEvent.call(buffer) == 1
30
- event = decode(buffer.to_str(EVENT_SIZE))
31
- return event if event
32
- end
33
- nil
34
- end
35
-
36
- def self.decode(bytes)
37
- case bytes.unpack1("L")
38
- when 0x100 then Quit.new
39
- when 0x300 then KeyDown.new(*bytes.unpack("lS", offset: 20), bytes.getbyte(13) != 0)
40
- when 0x301 then KeyUp.new(*bytes.unpack("lS", offset: 20))
41
- when 0x400 then MouseMotion.new(*bytes.unpack("l2", offset: 28))
42
- when 0x401, 0x402 then MouseButton.new(bytes.getbyte(16), bytes.getbyte(17) == 1)
43
- when 0x653..0x655 then ControllerDevice.new
44
- end
45
- end
46
-
47
- def self.key_name(sym) = GetKeyName.call(sym)
48
- end
49
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module SDL
5
- INIT_AUDIO = 0x10
6
- INIT_VIDEO = 0x20
7
- INIT_GAMECONTROLLER = 0x2000
8
- INIT_EVENTS = 0x4000
9
-
10
- WINDOWPOS_CENTERED = 0x2fff_0000
11
- WINDOW_RESIZABLE = 0x20
12
- RENDERER_ACCELERATED = 0x02
13
- RENDERER_PRESENTVSYNC = 0x04
14
-
15
- AUDIO_S16SYS = [1].pack("s").getbyte(0) == 1 ? 0x8010 : 0x9010
16
- AUDIO_ALLOW_FREQUENCY_CHANGE = 0x01
17
-
18
- CONTROLLER_AXIS_LEFTX = 0
19
- CONTROLLER_AXIS_LEFTY = 1
20
- CONTROLLER_BUTTON_A = 0
21
- CONTROLLER_BUTTON_B = 1
22
- CONTROLLER_BUTTON_X = 2
23
- CONTROLLER_BUTTON_Y = 3
24
- CONTROLLER_BUTTON_LEFTSHOULDER = 9
25
- CONTROLLER_BUTTON_RIGHTSHOULDER = 10
26
- CONTROLLER_BUTTON_DPAD_UP = 11
27
- CONTROLLER_BUTTON_DPAD_DOWN = 12
28
- CONTROLLER_BUTTON_DPAD_LEFT = 13
29
- CONTROLLER_BUTTON_DPAD_RIGHT = 14
30
-
31
- InitSubSystem = function("SDL_InitSubSystem", [UINT32], INT)
32
- QuitSubSystem = function("SDL_QuitSubSystem", [UINT32], VOID)
33
- GetError = function("SDL_GetError", [], STRING)
34
- SetHint = function("SDL_SetHint", [STRING, STRING], INT)
35
-
36
- CreateWindow = function("SDL_CreateWindow", [STRING, INT, INT, INT, INT, UINT32], POINTER)
37
- SetWindowTitle = function("SDL_SetWindowTitle", [POINTER, STRING], VOID)
38
- DestroyWindow = function("SDL_DestroyWindow", [POINTER], VOID)
39
- GetCurrentDisplayMode = function("SDL_GetCurrentDisplayMode", [INT, POINTER], INT)
40
- CreateRenderer = function("SDL_CreateRenderer", [POINTER, INT, UINT32], POINTER)
41
- DestroyRenderer = function("SDL_DestroyRenderer", [POINTER], VOID)
42
- RenderSetLogicalSize = function("SDL_RenderSetLogicalSize", [POINTER, INT, INT], INT)
43
- SetRenderDrawColor = function("SDL_SetRenderDrawColor", [POINTER, UINT8, UINT8, UINT8, UINT8], INT)
44
- RenderClear = function("SDL_RenderClear", [POINTER], INT)
45
- RenderFillRect = function("SDL_RenderFillRect", [POINTER, POINTER], INT)
46
- RenderCopy = function("SDL_RenderCopy", [POINTER, POINTER, POINTER, POINTER], INT)
47
- RenderPresent = function("SDL_RenderPresent", [POINTER], VOID)
48
- CreateRGBSurfaceFrom = function("SDL_CreateRGBSurfaceFrom",
49
- [POINTER, INT, INT, INT, INT, UINT32, UINT32, UINT32, UINT32], POINTER)
50
- FreeSurface = function("SDL_FreeSurface", [POINTER], VOID)
51
- CreateTextureFromSurface = function("SDL_CreateTextureFromSurface", [POINTER, POINTER], POINTER)
52
- DestroyTexture = function("SDL_DestroyTexture", [POINTER], VOID)
53
-
54
- PollEvent = function("SDL_PollEvent", [POINTER], INT)
55
- PushEvent = function("SDL_PushEvent", [POINTER], INT)
56
- GetKeyName = function("SDL_GetKeyName", [INT], STRING)
57
- SetRelativeMouseMode = function("SDL_SetRelativeMouseMode", [INT], INT)
58
-
59
- NumJoysticks = function("SDL_NumJoysticks", [], INT)
60
- IsGameController = function("SDL_IsGameController", [INT], INT)
61
- GameControllerOpen = function("SDL_GameControllerOpen", [INT], POINTER)
62
- GameControllerName = function("SDL_GameControllerName", [POINTER], STRING)
63
- GameControllerGetButton = function("SDL_GameControllerGetButton", [POINTER, INT], UINT8)
64
- GameControllerGetAxis = function("SDL_GameControllerGetAxis", [POINTER, INT], INT16)
65
- GameControllerClose = function("SDL_GameControllerClose", [POINTER], VOID)
66
-
67
- OpenAudioDevice = function("SDL_OpenAudioDevice", [STRING, INT, POINTER, POINTER, INT], UINT32)
68
- CloseAudioDevice = function("SDL_CloseAudioDevice", [UINT32], VOID)
69
- PauseAudioDevice = function("SDL_PauseAudioDevice", [UINT32, INT], VOID)
70
- QueueAudio = function("SDL_QueueAudio", [UINT32, POINTER, UINT32], INT)
71
- GetQueuedAudioSize = function("SDL_GetQueuedAudioSize", [UINT32], UINT32)
72
- ClearQueuedAudio = function("SDL_ClearQueuedAudio", [UINT32], VOID)
73
- end
74
- end
data/vendor/.gitkeep DELETED
File without changes