sdl

@kmamal/sdl

🎮 SDL2 bindings for Node.js

Showing:

Popularity

Downloads/wk

41

GitHub Stars

7

Maintenance

Last Commit

2mos ago

Contributors

1

Package

Dependencies

2

License

MIT

Type Definitions

Built-In

Tree-Shakeable

No?

Categories

Readme

@kmamal/sdl

Package Dependencies Vulnerabilities License: MIT

SDL2 bindings for Node.js. Provides window management, input events, audio playback/recording, and clipboard manipulation. Use together with @kmamal/gl for WebGL drawing.

It should work on Linux, Mac, and Windows. Prebuilt binaries are available for x64 architectures.

Installation

SDL2 is bundled along with the binaries so a separate installation is not necessary. This package is self-contained. Just run:

npm install @kmamal/sdl

(But if things go wrong do look over here)

Example

import sdl from '@kmamal/sdl'

sdl.video.createWindow({ title: "Hello, World!" })

There are more examples in the examples/ folder, covering several common use cases, including how to draw using Canvas and WebGL, as well as how to package the application for distribution.

API Reference

Contents

sdl

Event: 'beforeQuit'

  • prevent: <function (void) => void> Call this to prevent the application from closing.

Fired to indicate that the user has requested the application to close (usually by closing the last window). If you need to display any confirmation dialogs you should call event.prevent() and handle termination manually. If prevent is not called, then this event will be followed by a 'quit' event.

Event: 'quit'

Indicates that the application is about to close. Handle any cleanup here. This event will be followed by a call to process.exit().

sdl.info

  • <object>
    • version: <object>
      • compile: <object> The SDL2 version the bindings were compiled against.
        • major, minor, patch: <semver> The components of the version.
      • runtime: <object> The SDL2 version of the dynamic library the is loaded.
        • major, minor, patch: <semver> The components of the version.
    • platform: <string> The name of the platform we are running on. Possible values are: 'Linux', 'Windows', and 'Mac OS X'.
    • drivers: <object>
      • video: <object>
        • all: <string>[] A list of all video drivers.
        • current: <string> The video driver that is currently selected.
      • audio: <object>
        • all: <string>[] A list of all audio drivers.
        • current: <string> The audio driver that is currently selected.

This object is filled with the information produced during the initialization of SDL2. All the values will remain constant throughout the execution of the program. If you want to initialize SDL2 with drivers other than the default ones, you can do so via its environment variables.

Sample data for Ubuntu:

{
  version: {
    compile: { major: 2, minor: 0, patch: 10 },
    runtime: { major: 2, minor: 0, patch: 10 },
  },
  platform: 'Linux',
  drivers: {
    video: {
      all: [ 'x11', 'wayland', 'dummy' ],
      current: 'x11',
    },
    audio: {
      all: [ 'pulseaudio', 'alsa', 'sndio', 'dsp', 'disk', 'dummy' ],
      current: 'pulseaudio',
    },
  },
}

sdl.video

Image data

There are 3 places in the API where you will need to provide an image to the library:

All three of these functions accept the image as a series of arguments:

  • width: <number> The width of the image in pixels.
  • height: <number> The height of the image in pixels.
  • stride: <number> How many bytes each row of the image takes up in the buffer. This is usually equal to width * bytesPerPixel, but can be larger if the rows of the buffer are padded to always be some multiple of bytes.
  • format: <PixelFormat> The binary representation of the data in the buffer.
  • buffer: <Buffer> Holds the actual pixel data for the image, in the format and layout specified by all the above arguments.

So for example, to fill the window with a red+green gradient you could do:

const { width, height } = window
const stride = width * 4
const buffer = Buffer.alloc(stride * height)

let offset = 0
for (let i = 0; i < height; i++) {
  for (let j = 0; j < width; j++) {
    buffer[offset++] = Math.floor(256 * i / height) // R
    buffer[offset++] = Math.floor(256 * j / width)  // G
    buffer[offset++] = 0                            // B
    buffer[offset++] = 255                          // A
  }
}

window.render(width, height, stride, 'rgba32', buffer)

Pixel formats

String values used to represent how the pixels of an image are stored in a Buffer.

ValueCorresponding SDL_PixelFormatEnumComment
'rgb332'SDL_PIXELFORMAT_RGB332
'rgb444'SDL_PIXELFORMAT_RGB444
'rgb555'SDL_PIXELFORMAT_RGB555
'bgr555'SDL_PIXELFORMAT_BGR555
'argb4444'SDL_PIXELFORMAT_ARGB4444
'rgba4444'SDL_PIXELFORMAT_RGBA4444
'abgr4444'SDL_PIXELFORMAT_ABGR4444
'bgra4444'SDL_PIXELFORMAT_BGRA4444
'argb1555'SDL_PIXELFORMAT_ARGB1555
'rgba5551'SDL_PIXELFORMAT_RGBA5551
'abgr1555'SDL_PIXELFORMAT_ABGR1555
'bgra5551'SDL_PIXELFORMAT_BGRA5551
'rgb565'SDL_PIXELFORMAT_RGB565
'bgr565'SDL_PIXELFORMAT_BGR565
'rgb24'SDL_PIXELFORMAT_RGB24
'bgr24'SDL_PIXELFORMAT_BGR24
'rgb888'SDL_PIXELFORMAT_RGB888
'rgbx8888'SDL_PIXELFORMAT_RGBX8888
'bgr888'SDL_PIXELFORMAT_BGR888
'bgrx8888'SDL_PIXELFORMAT_BGRX8888
'argb8888'SDL_PIXELFORMAT_ARGB8888
'rgba8888'SDL_PIXELFORMAT_RGBA8888
'abgr8888'SDL_PIXELFORMAT_ABGR8888
'bgra8888'SDL_PIXELFORMAT_BGRA8888
'argb2101010'SDL_PIXELFORMAT_ARGB2101010
'rgba32'SDL_PIXELFORMAT_RGBA32alias for 'rgba8888' on big endian machines and for 'abgr8888' on little endian machines
'argb32'SDL_PIXELFORMAT_ARGB32alias for 'argb8888' on big endian machines and for 'bgra8888' on little endian machines
'bgra32'SDL_PIXELFORMAT_BGRA32alias for 'bgra8888' on big endian machines and for 'argb8888' on little endian machines
'abgr32'SDL_PIXELFORMAT_ABGR32alias for 'abgr8888' on big endian machines and for 'rgba8888' on little endian machines
'yv12'SDL_PIXELFORMAT_YV12planar mode: Y + V + U (3 planes)
'iyuv'SDL_PIXELFORMAT_IYUVplanar mode: Y + U + V (3 planes)
'yuy2'SDL_PIXELFORMAT_YUY2packed mode: Y0+U0+Y1+V0 (1 plane)
'uyvy'SDL_PIXELFORMAT_UYVYpacked mode: U0+Y0+V0+Y1 (1 plane)
'yvyu'SDL_PIXELFORMAT_YVYUpacked mode: Y0+V0+Y1+U0 (1 plane)
'nv12'SDL_PIXELFORMAT_NV12planar mode: Y + U/V interleaved (2 planes)
'nv21'SDL_PIXELFORMAT_NV21planar mode: Y + V/U interleaved (2 planes)

sdl.video.displays

  • <object>[]
    • name: <string> The name of the display.
    • format: <PixelFormat> The pixel format of the display.
    • frequency: <number> The refresh rate of the display.
    • geometry: <object> The desktop region represented by the display.
      • x, y, width, height: <Rect> The position and size of the display's geometry.
    • usable: <object> Similar to geometry, but excludes areas taken up by the OS or window manager such as menus, docks, e.t.c.
      • x, y, width, height: <Rect> The position and size of the display's usable region.
    • dpi: <object> Return pixel density for the display in dots/pixels-per-inch units.
      • horizontal: <number> The horizontal density.
      • vertical: <number> The vertical density.
      • diagonal: <number> The diagonal density.

A list of all detected displays. Sample output for two side-to-side monitors is below. Notice how the geometries don't overlap:

[
  {
    name: '0',
    format: 'rgb888',
    frequency: 60,
    geometry: { x: 0, y: 0, width: 1920, height: 1080 },
    usable: { x: 0, y: 27, width: 1920, height: 1053 },
    dpi: { horizontal: 141.76, vertical: 142.13, diagonal: 141.85 }
  },
  {
    name: '1',
    format: 'rgb888',
    frequency: 60,
    geometry: { x: 1920, y: 0, width: 1920, height: 1080 },
    usable: { x: 1920, y: 27, width: 1920, height: 1053 },
    dpi: { horizontal: 141.76, vertical: 142.13, diagonal: 141.85 }
  },
]

sdl.video.windows

A list of all open windows.

sdl.video.focused

The window that has the current keyboard focus, or null if no window has the keyboard focus.

sdl.video.hovered

The window that the mouse is hovered over, or null if the mouse is not over a window.

sdl.video.createWindow([options])

  • options: <object>
    • title: <string> Will appear in the window's title bar. Default: ''
    • display: <number> An object from sdl.video.displays to specify in which display the window will appear (if you have multiple displays). Default: sdl.video.displays[0]
    • x: <number> The x position in which the window will appear relative to the screen, or null for centered. Default: null
    • y: <number> The y position in which the window will appear relative to the screen, or null for centered. Default: null
    • width: <number> The width of the window. Default: 640
    • height: <number> The height of the window. Default: 480
    • visible: <boolean> Set to false to create a hidden window that will only be shown when you call window.show(). Default: true
    • fullscreen: <boolean> Set to true to create the window in fullscreen mode. Default: false
    • resizable: <boolean> Set to true to allow resizing the window by dragging its borders. Default: false
    • borderless: <boolean> Set to true to completely hide the window's borders and title bar. Default: false
    • opengl: <boolean> Set to true to create an OpenGL-compatible window (for use with @kmamal/gl). Default: false
  • Returns: <Window> an object representing the new window.

Creates a new window.

The following restrictions apply:

  • If you specify the display option, you can't also specify the x or y options, and vice-versa.
  • The resizable and borderless options can't both be true.

If you set the opengl option, then you can only render to the window with OpenGL calls. Calls to render() will fail.

class Window

This class is not directly exposed by the API so you can't use it with the new operator. Instead, objects returned by sdl.video.createWindow() are of this type.

Event: 'show'

Fired when a window becomes visible.

Event: 'hide'

Fired when a window becomes hidden.

Event: 'expose'

Fired when a window becomes exposed.

Event: 'minimize'

Fired when a window becomes minimized.

Event: 'maximize'

Fired when a window becomes maximized.

Event: 'restore'

Fired when a window gets restored.

Event: 'move'

  • x: <number> The window's new x position, relative to the screen.
  • y: <number> The window's new y position, relative to the screen.

Fired when the window changes position.

Event: 'resize'

  • width: <number> The window's new width.
  • height: <number> The window's new height.

Fired when the window changes size.

Event: 'focus'

Fired when a window gains the keyboard focus.

Event: 'blur'

Fired when a window loses the keyboard focus.

Event: 'hover'

Fired when the mouse enters the window.

Event: 'leave'

Fired when the mouse leaves the window.

Event: 'beforeClose'

  • prevent: <function (void) => void> Call this to prevent the window from closing.

Fired to indicate that the user has requested the window to close (usually by clicking the "x" button). If you need to display any confirmation dialogs you should call event.prevent() and handle destruction manually. If prevent is not called, then this event will be followed by a 'close' event.

Event: 'close'

Indicates that the application is about to be destroyed. Handle any cleanup here. This event will be followed by a call to window.destroy().

Event: 'keyDown'

  • scancode: <Scancode> The scancode of the key that caused the event.
  • key: <Key>|<null> The virtual key that caused the event, or null if the physical key does not correspond to any virtual key.
  • repeat: <boolean> Is true if the event was generated by holding down a key for a long time.
  • shift: <boolean> Is true if the Shift key was pressed when the event was generated.
  • ctrl: <boolean> Is true if the Ctrl key was pressed when the event was generated.
  • alt: <boolean> Is true if the Alt key was pressed when the event was generated.
  • super: <boolean> Is true if the "Windows" key was pressed when the event was generated.
  • altgr: <boolean> Is true if the AltGr key was pressed when the event was generated.
  • capslock: <boolean> Is true if CapsLock was active when the event was generated.
  • numlock: <boolean> Is true if NumLock was active when the event was generated.

Fired when a key is pressed, and will also be fired repeatedly afterwards if the key is held down.

Event: 'keyUp'

  • scancode: <Scancode> The scancode of the key that caused the event.
  • key: <Key>|<null> The virtual key that caused the event, or null if the physical key does not correspond to any virtual key.
  • shift: <boolean> Is true if the Shift key was pressed when the event was generated.
  • ctrl: <boolean> Is true if the Ctrl key was pressed when the event was generated.
  • alt: <boolean> Is true if the Alt key was pressed when the event was generated.
  • super: <boolean> Is true if the "Windows" key was pressed when the event was generated.
  • altgr: <boolean> Is true if the AltGr key was pressed when the event was generated.
  • capslock: <boolean> Is true if CapsLock was active when the event was generated.
  • numlock: <boolean> Is true if NumLock was active when the event was generated.

Fired when a key is released.

Event: 'textInput'

  • text: <string> The unicode representation of the character that was entered.

Fired when the user enters text via the keyboard.

Event: 'mouseButtonDown'

  • x: <number> The mouse's x position when the event happened, relative to the window.
  • y: <number> The mouse's y position when the event happened, relative to the window.
  • touch: <boolean> Will be true if the event was caused by a touch event.
  • button: <sdl.mouse.BUTTON> The button that was pressed.

Fired when a mouse button is pressed.

Event: 'mouseButtonUp'

  • x: <number> The mouse's x position when the event happened, relative to the window.
  • y: <number> The mouse's y position when the event happened, relative to the window.
  • touch: <boolean> Will be true if the event was caused by a touch event.
  • button: <sdl.mouse.BUTTON> The button that was released.

Fired when a mouse button is released.

Event: 'mouseMove'

  • x: <number> The mouse's x position when the event happened, relative to the window.
  • y: <number> The mouse's y position when the event happened, relative to the window.
  • touch: <boolean> Will be true if the event was caused by a touch event.

Fired when the mouse moves.

Event: 'mouseWheel'

  • x: <number> The mouse's x position when the event happened, relative to the window.
  • y: <number> The mouse's y position when the event happened, relative to the window.
  • touch: <boolean> Will be true if the event was caused by a touch event.
  • dx: <number> The wheel's x movement, relative to its last position.
  • dy: <number> The wheel's y movement, relative to its last position.
  • flipped: <boolean> Will be true if the underlying platform reverses the mouse wheel's scroll direction. Multiply dx and dy by -1 to get the correct values.

Fired when the mouse wheel is scrolled.

Event: 'dropBegin'

When dropping a set of items onto a window, first the 'drop-begin' event will be fired, then a number of 'drop-text' and/or 'drop-file' events will be fired corresponding to the contents of the drop, then finally the 'drop-complete' event will be fired.

Event: 'dropText'

  • text: <string>: The text that was dropped onto the window.

Fired when one of the drops is a text item.

Event: 'dropFile'

  • file: <string>: The path to the file that was dropped onto the window.

Fired when one of the drops is a file.

Event: 'dropComplete'

Fired after a set of items has been dropped on a window.

window.id

  • <number>

A unique identifier for the window.

window.title

  • <string>

The text that appears in the window's title bar.

window.setTitle(title)

  • title: <string>: The new title.

Changes the text that appears in the window's title bar.

window.x

  • <number>

The window's x position, relative to the screen.

window.y

  • <number>

The window's y position, relative to the screen.

window.setPosition(x, y)

  • x: <number>: The new x position, relative to the screen.
  • y: <number>: The new y position, relative to the screen.

Moves the window to a new position on the screen.

window.width

  • <number>

The window's width.

window.height

  • <number>

The window's height.

window.setSize(width, height)

  • width: <number>: The new width.
  • height: <number>: The new height.

Changes the size of the window.

window.visible

  • <boolean>

Will be true if the window is visible.

window.show([show])

  • show: <boolean> Set to true to make the window visible, false to hide it. Default: true

Shows or hides the window.

window.hide()

Equivalent to window.show(false).

window.fullscreen

  • <boolean>

Will be true if the window is fullscreen. A fullscreen window is displayed over the entire screen.

window.setFullscreen(fullscreen)

  • fullscreen: <boolean> The new value of the property.

Changes the window's fullscreen property.

window.resizable

  • <boolean>

Will be true if the window is resizable. A resizable window can be resized by dragging it's borders.

window.setResizable(resizable)

  • resizable: <boolean> The new value of the property.

Changes the window's resizable property.

window.borderless

  • <boolean>

Will be true if the window is borderless. A borderless window has no borders or title bar.

window.setBorderless(borderless)

  • borderless: <boolean> The new value of the property.

Changes the window's borderless property.

window.opengl

  • <boolean>

Will be true if the window was created in OpenGl mode. In OpenGL mode, you can only render to the window with OpenGL calls. Calls to render() will fail.

window.native

  • <any>

Holds a copy of the native (platform-specific) representation of the window. Only used for passing to @kmamal/gl.

window.maximized

  • <boolean>

Will be true if the window is maximized.

window.maximize()

Maximizes the window.

window.minimized

  • <boolean>

Will be true if the window is minimized.

window.minimize()

Minimizes the window.

window.restore()

Restores the window so it's neither minimized nor maximized.

window.focused

  • <boolean>

Will be true if the window has keyboard input.

window.focus()

Gives the window the keyboard focus.

window.hovered

  • <boolean>

Will be true if the mouse is over the window.

window.render(width, height, stride, format, buffer)

  • width, height, stride, format, buffer: <Image> The image to display on the window.

Displays an image in the window. The provided image's dimensions should be the same as the window's width and height.

window.setIcon(width, height, stride, format, buffer)

  • width, height, stride, format, buffer: <Image> The image to display as the icon of the window.

Set's the window's icon, usually displayed in the title bar and the taskbar.

window.destroyed

  • <boolean>

Will be true if the window is destroyed. A destroyed window object should not be used any further.

window.destroy()

Destroys the window.

sdl.audio

Audio data

The playbackInstance.enqueue() function expects a buffer of audio data as input and the recordingInstance.dequeue() function returns a buffer of audio data as output. The format of the data in these buffers depends on the options you passed to sdl.audio.openDevice().

Audio data are a sequence of frames, with each frame being a sequence of samples. A sample is a single number representing the intensity of a single audio channel at a specific point in time. For audio with multiple channels, each point in time is represented by one sample per channel. This is called a frame. The samples in a frame are arranged as follows:

  • For 1 channel (mono) a frame contains just the one sample.
  • For 2 channels (stereo) the frame's first sample will be the one for the left channel, followed by the one for the right channel.
  • For 4 channels (quad) the layout is front-left, front-right, rear-left, rear-right.
  • For 6 channels (5.1) the layout is front-left, front-right, center, low-freq, rear-left, rear-right.

So for example, to fill a buffer with 3 seconds of a 440Hz sine wave, you could do:

const TWO_PI = 2 * Math.PI

const {
  channels,
  frequency,
  bytesPerSample,
  minSampleValue,
  maxSampleValue,
  zeroSampleValue,
} = playbackInstance

const range = maxSampleValue - minSampleValue
const amplitude = range / 2

const sineAmplitude = 0.3 * amplitude
const sineNote = 440
const sinePeriod = 1 / sineNote

const duration = 3
const numFrames = duration * frequency
const numSamples = numFrames * channels
const numBytes = numSamples * bytesPerSample
const buffer = Buffer.alloc(numBytes)

let offset = 0
for (let i = 0; i < numFrames; i++) {
  const time = i / frequency
  const angle = time / sinePeriod * TWO_PI
  const sample = zeroSampleValue + Math.sin(angle) * sineAmplitude
  for (let j = 0; j < channels; j++) {
    offset = playbackInstance.writeSample(buffer, sample, offset)
  }
}

Sample formats

String values used to represent how audio samples are stored in a Buffer.

ValueCorresponding SDL_AudioFormatComment
's8'AUDIO_S8signed 8-bit samples
'u8'AUDIO_U8unsigned 8-bit samples
's16lsb'AUDIO_S16LSBsigned 16-bit samples in little-endian byte order
's16msb'AUDIO_S16MSBsigned 16-bit samples in big-endian byte order
's16sys'AUDIO_S16SYSsigned 16-bit samples in native byte order
's16'AUDIO_S16alias for 's16lsb'
'u16lsb'AUDIO_U16LSBunsigned 16-bit samples in little-endian byte order
'u16msb'AUDIO_U16MSBunsigned 16-bit samples in big-endian byte order
'u16sys'AUDIO_U16SYSunsigned 16-bit samples in native byte order
'u16'AUDIO_U16alias for 'u16lsb'
's32lsb'AUDIO_S32LSB32-bit integer samples in little-endian byte order
's32msb'AUDIO_S32MSB32-bit integer samples in big-endian byte order
's32sys'AUDIO_S32SYS32-bit integer samples in native byte order
's32'AUDIO_S32alias for 's32lsb'
'f32lsb'AUDIO_F32LSB32-bit floating point samples in little-endian byte order
'f32msb'AUDIO_F32MSB32-bit floating point samples in big-endian byte order
'f32sys'AUDIO_F32SYS32-bit floating point samples in native byte order
'f32'AUDIO_F32alias for 'f32lsb'

Event: 'deviceAdd'

  • device: <object>: An object from sdl.audio.devices indicating the device that caused the event.

Fired when a new audio device becomes available. Check sdl.audio.devices to get the new list of audio devices.

Event: 'deviceRemove'

  • device: <object>: An object from sdl.audio.devices indicating the device that caused the event.

Fired when an existing audio device is removed. Check sdl.audio.devices to get the new list of audio devices. When this event is emitted, all instances that were opened from the removed device are closed automatically.

sdl.audio.bytesPerSample(format)

  • format: <SampleFormat>: The desired sample format.
  • Returns: <number> The number of bytes.

Helper function which maps each sample format to the corresponding number of bytes its samples take up.

sdl.audio.minSampleValue(format)

  • format: <SampleFormat>: The desired sample format.
  • Returns: <number> The minimum sample value.

Helper function which maps each sample format to the corresponding minimum value its samples can take.

sdl.audio.maxSampleValue(format)

  • format: <SampleFormat>: The desired sample format.
  • Returns: <number> The maximum sample value.

Helper function which maps each sample format to the corresponding maximum value its samples can take.

sdl.audio.zeroSampleValue(format)

  • format: <SampleFormat>: The desired sample format.
  • Returns: <number> The zero sample value.

Helper function which maps each sample format to the sample value that corresponds to silence.

sdl.audio.readSample(format, buffer[, offset])

  • format: <SampleFormat>: The desired sample format.
  • buffer: <Buffer> The buffer to read the sample from.
  • offset: <number> The position from which to read the sample. Default: 0
  • Returns: <number> The value of the sample read.

Helper function which calls the appropriate read* method of Buffer based on the format argument. For example, a call to sdl.audio.readSample('f32', buffer, offset) would be equivalent to buffer.readFloatLE(offset).

sdl.audio.writeSample(format, buffer, value[, offset])

  • format: <SampleFormat>: The desired sample format.
  • buffer: <Buffer> The buffer to write the sample to.
  • value: <number> The value of the sample to write.
  • offset: <number> The position at which to write the sample. Default: 0
  • Returns: <number> The updated offset.

Helper function which calls the appropriate write* method of Buffer based on the format argument. For example, a call to sdl.audio.writeSample('f32', buffer, value, offset) would be equivalent to buffer.writeFloatLE(value, offset).

sdl.audio.devices

  • <object>[]
    • name: <string> The name of the device.
    • recording: <boolean> Will be true if this is a recording device.

A list of all the detected audio devices. Sample output for PulseAudio:

[
  { name: 'Built-in Audio Analog Stereo', recording: false },
  { name: 'Built-in Audio Analog Stereo', recording: true }
]

sdl.audio.openDevice(device[, options])

  • device: <object> An object from sdl.audio.devices that should be opened.
  • options: <object>
    • name: <string>: Some drivers accept custom names, such as a hostname/IP address for a remote audio server, or a filename in the diskaudio driver. Default: device.name.
    • channels: <number>: Number of audio channels. Valid values: 1, 2, 4, 6. Default 1.
    • frequency: <number>: The sampling frequency in frames per second. Default 48e3.
    • format: <SampleFormat>: The binary format for each sample. Default 'f32'.
    • buffered: <number>: Number of frames that will be buffered by the driver. Must be a power of 2. Default 4096.
  • Returns: <AudioInstance> an object representing the opened audio device instance.

Initializes an audio device for playback/recording and returns a corresponding instance. If the opened device is a playback device, then the returned object will be an AudioPlaybackInstance, otherwise it will be an AudioRecordingInstance.

The channels, frequency and format options together define what the data in the Buffer objects you read from or write to the instance will look like. See also the section on audio data.

The buffered option specifies the "delay" that you will experience between the application and the audio driver. With smaller values you will have smaller delays, but you will also have to read/write data from/to the driver more frequently. Applications such as virtual instruments that need to play audio in reaction to user input will want to change this option to lower values.

class AudioInstance

This class is not directly exposed by the API so you can't use it with the new operator. It only serves as the base class for AudioPlaybackInstance and AudioRecordingInstance.

audioInstance.id

  • <number>

A unique identifier for the instance.

audioInstance.device

  • <object>

The device from which this instance was opened.

audioInstance.name

  • <string>

The name the instance was opened with.

audioInstance.channels

  • <number>

The number of channels the instance was opened with.

audioInstance.frequency

  • <number>

The sampling frequency (in frames per second) the instance was opened with.

audioInstance.format

The audio sample format the instance was opened with.

audioInstance.bytesPerSample

  • <number>

The number of bytes that make up a single audio sample, based on the format the instance was opened with.

audioInstance.minSampleValue

  • <number>

The minimum value a sample can take, based on the format the instance was opened with.

audioInstance.maxSampleValue

  • <number>

The maximum value a sample can take, based on the format the instance was opened with.

audioInstance.zeroSampleValue

  • <number>

The sample value that corresponds to silence, based on the format the instance was opened with.

audioInstance.readSample(buffer[, offset])

  • buffer: <Buffer> The buffer to read the sample from.
  • offset: <number> The position from which to read the sample. Default: 0
  • Returns: <number> The value of the sample read.

Helper function which calls the appropriate read* method of Buffer based on the format the instance was opened with. For example, for an instance opened with the 'f32' sample format, a call to audioinstance.readSample(buffer, offset) would be equivalent to buffer.readFloatLE(offset).

audioInstance.writeSample(buffer, value[, offset])

  • buffer: <Buffer> The buffer to write the sample to.
  • value: <number> The value of the sample to write.
  • offset: <number> The position at which to write the sample. Default: 0
  • Returns: <number> The updated offset.

Helper function which calls the appropriate write* method of Buffer based on the format the instance was opened with. For example, for an instance opened with the 'f32' sample format, a call to audioinstance.writeSample(buffer, value, offset) would be equivalent to buffer.writeFloatLE(value, offset).

audioInstance.buffered

  • <number>

The buffer size (in frames) the instance was opened with.

audioInstance.playing

  • <boolean>

Will be true if the instance is currently playing.

audioInstance.play([play])

  • show: <boolean> Set to true to start the instance, false to stop. Default: true

Starts or stops the instance.

audioInstance.pause()

Equivalent to audioInstance.play(false)

audioInstance.queued

  • <number>

The number of bytes that are currently queued up, waiting to be either played by the instance or dequeued by the user.

audioInstance.clearQueue()

Clears the queued data.

audioInstance.closed

  • <boolean>

Will be true if the instance is closed. A closed instance object should not be used any further.

audioInstance.close()

Closes the instance.

class AudioPlaybackInstance extends AudioInstance

This class is not directly exposed by the API so you can't use it with the new operator. Instead, objects returned by sdl.audio.openDevice() are of this type, if a playback device is opened.

playbackInstance.enqueue(buffer[, bytes])

  • buffer: <Buffer> The buffer to read data from.
  • bytes: <number> The number of bytes to read from the buffer. Default: buffer.length

Takes generated audio data from the buffer, and writes it to the queue, from which it will be played back.

class AudioRecordingInstance extends AudioInstance

This class is not directly exposed by the API so you can't use it with the new operator. Instead, objects returned by sdl.audio.openDevice() are of this type, if a recording device is opened.

recordingInstance.dequeue(buffer[, bytes])

  • buffer: <Buffer> The buffer to write data to.
  • bytes: <number> The number of bytes to write to the buffer. Default: buffer.length
  • Returns: <number> The actual number of bytes read.

Takes recorded audio data that has been put on the queue, and writes it to the provided buffer.

sdl.keyboard

There are three levels at which you can deal with the keyboard: physical keys (scancodes), virtual keys (keys), and text ('textInput' events).

On the physical level, each of the physical keys corresponds to a number: the key's scancode. For any given keyboard, the same key will always produce the same scancode. If your application cares about the layout of the keyboard (for example using the "WASD" keys as a substitute for arrow keys), then you should handle key events at this level using the scancode property of 'keyDown' and 'keyUp' events.

For the most part it's better to treat scancode values as arbitrary/meaningless, but SDL does provide a scancode enumeration with values based on the USB usage page standard so you should be able to derive some meaning from the scancodes if your keyboard is compatible.

More commonly, you don't care about the physical key itself but about the "meaning" associated with each key: the character that it produces ("a", "b", "@", " ", .e.t.c) or the function that it corresponds to ("Esc", "F4", "Ctrl", e.t.c.). Your operating system provides a "keyboard mapping" that associates physical keys with their corresponding meaning. Changing the keyboard mapping (for example by changing the language from English to German) will also change the corresponding meaning for each key (in the English-German example: the "y" and "z" keys will be switched). These meanings are represented as virtual key strings. If your application cares about the meaning associated with individual keys then you should handle key events at this level using the key property of 'keyDown' and 'keyUp' events.

Note that not all physical keys correspond to a well-defined meaning and thus don't have a virtual key value associated with them. The key events for these keys will have a null value for the key property.

But sometimes the application doesn't care about individual keys at all, but about the resulting text that the user is entering. Consider for example what happens when a user on a Greek keyboard layout enters an accent mark "´" followed by the letter "α" to produce the character "ά": Two keys were pressed, but only a single character was produced. Trying to handle text input by manually translating key presses to text is not a very viable solution. It's better to let the OS handle all the text logic, and get the final text by handling the rasulting ('textInput') events.

Enum: SCANCODE

Used to represent physical keys on the keyboard. The same key will always produce the same scancode. Values are based on the USB usage page standard.

ValueCorresponding SDL_ScancodeComment
sdl.keyboard.SCANCODE.UNKNOWNSDL_SCANCODE_UNKNOWNvalue 0
sdl.keyboard.SCANCODE.ASDL_SCANCODE_A
sdl.keyboard.SCANCODE.BSDL_SCANCODE_B
sdl.keyboard.SCANCODE.CSDL_SCANCODE_C
sdl.keyboard.SCANCODE.DSDL_SCANCODE_D
sdl.keyboard.SCANCODE.ESDL_SCANCODE_E
sdl.keyboard.SCANCODE.FSDL_SCANCODE_F
sdl.keyboard.SCANCODE.GSDL_SCANCODE_G
sdl.keyboard.SCANCODE.HSDL_SCANCODE_H
sdl.keyboard.SCANCODE.ISDL_SCANCODE_I
sdl.keyboard.SCANCODE.JSDL_SCANCODE_J
sdl.keyboard.SCANCODE.KSDL_SCANCODE_K
sdl.keyboard.SCANCODE.LSDL_SCANCODE_L
sdl.keyboard.SCANCODE.MSDL_SCANCODE_M
sdl.keyboard.SCANCODE.NSDL_SCANCODE_N
sdl.keyboard.SCANCODE.OSDL_SCANCODE_O
sdl.keyboard.SCANCODE.PSDL_SCANCODE_P
sdl.keyboard.SCANCODE.QSDL_SCANCODE_Q
sdl.keyboard.SCANCODE.RSDL_SCANCODE_R
sdl.keyboard.SCANCODE.SSDL_SCANCODE_S
sdl.keyboard.SCANCODE.TSDL_SCANCODE_T
sdl.keyboard.SCANCODE.USDL_SCANCODE_U
sdl.keyboard.SCANCODE.VSDL_SCANCODE_V
sdl.keyboard.SCANCODE.WSDL_SCANCODE_W
sdl.keyboard.SCANCODE.XSDL_SCANCODE_X
sdl.keyboard.SCANCODE.YSDL_SCANCODE_Y
sdl.keyboard.SCANCODE.ZSDL_SCANCODE_Z
sdl.keyboard.SCANCODE.1SDL_SCANCODE_1
sdl.keyboard.SCANCODE.2SDL_SCANCODE_2
sdl.keyboard.SCANCODE.3SDL_SCANCODE_3
sdl.keyboard.SCANCODE.4SDL_SCANCODE_4
sdl.keyboard.SCANCODE.5SDL_SCANCODE_5
sdl.keyboard.SCANCODE.6SDL_SCANCODE_6
sdl.keyboard.SCANCODE.7SDL_SCANCODE_7
sdl.keyboard.SCANCODE.8SDL_SCANCODE_8
sdl.keyboard.SCANCODE.9SDL_SCANCODE_9
sdl.keyboard.SCANCODE.0SDL_SCANCODE_0
sdl.keyboard.SCANCODE.RETURNSDL_SCANCODE_RETURN
sdl.keyboard.SCANCODE.ESCAPESDL_SCANCODE_ESCAPE
sdl.keyboard.SCANCODE.BACKSPACESDL_SCANCODE_BACKSPACE
sdl.keyboard.SCANCODE.TABSDL_SCANCODE_TAB
sdl.keyboard.SCANCODE.SPACESDL_SCANCODE_SPACE
sdl.keyboard.SCANCODE.MINUSSDL_SCANCODE_MINUS
sdl.keyboard.SCANCODE.EQUALSSDL_SCANCODE_EQUALS
sdl.keyboard.SCANCODE.LEFTBRACKETSDL_SCANCODE_LEFTBRACKET
sdl.keyboard.SCANCODE.RIGHTBRACKETSDL_SCANCODE_RIGHTBRACKET
sdl.keyboard.SCANCODE.BACKSLASHSDL_SCANCODE_BACKSLASHLocated at the lower left of the return key on ISO keyboards and at the right end of the QWERTY row on ANSI keyboards. Produces REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US layout, REVERSE SOLIDUS and VERTICAL LINE in a UK Mac layout, NUMBER SIGN and TILDE in a UK Windows layout, DOLLAR SIGN and POUND SIGN in a Swiss German layout, NUMBER SIGN and APOSTROPHE in a German layout, GRAVE ACCENT and POUND SIGN in a French Mac layout, and ASTERISK and MICRO SIGN in a French Windows layout.
sdl.keyboard.SCANCODE.NONUSHASHSDL_SCANCODE_NONUSHASHISO USB keyboards actually use this code instead of 49 for the same key, but all OSes I've seen treat the two codes identically. So, as an implementor, unless your keyboard generates both of those codes and your OS treats them differently, you should generate SDL_SCANCODE_BACKSLASH instead of this code. As a user, you should not rely on this code because SDL will never generate it with most (all?) keyboards.
sdl.keyboard.SCANCODE.SEMICOLONSDL_SCANCODE_SEMICOLON
sdl.keyboard.SCANCODE.APOSTROPHESDL_SCANCODE_APOSTROPHE
sdl.keyboard.SCANCODE.GRAVESDL_SCANCODE_GRAVELocated in the top left corner (on both ANSI and ISO keyboards). Produces GRAVE ACCENT and TILDE in a US Windows layout and in US and UK Mac layouts on ANSI keyboards, GRAVE ACCENT and NOT SIGN in a UK Windows layout, SECTION SIGN and PLUS-MINUS SIGN in US and UK Mac layouts on ISO keyboards, SECTION SIGN and DEGREE SIGN in a Swiss German layout (Mac: only on ISO keyboards), CIRCUMFLEX ACCENT and DEGREE SIGN in a German layout (Mac: only on ISO keyboards), SUPERSCRIPT TWO and TILDE in a French Windows layout, COMMERCIAL AT and NUMBER SIGN in a French Mac layout on ISO keyboards, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French Mac layout on ANSI keyboards.
sdl.keyboard.SCANCODE.COMMASDL_SCANCODE_COMMA
sdl.keyboard.SCANCODE.PERIODSDL_SCANCODE_PERIOD
sdl.keyboard.SCANCODE.SLASHSDL_SCANCODE_SLASH
sdl.keyboard.SCANCODE.CAPSLOCKSDL_SCANCODE_CAPSLOCK
sdl.keyboard.SCANCODE.F1SDL_SCANCODE_F1
sdl.keyboard.SCANCODE.F2SDL_SCANCODE_F2
sdl.keyboard.SCANCODE.F3SDL_SCANCODE_F3
sdl.keyboard.SCANCODE.F4SDL_SCANCODE_F4
sdl.keyboard.SCANCODE.F5SDL_SCANCODE_F5
sdl.keyboard.SCANCODE.F6SDL_SCANCODE_F6
sdl.keyboard.SCANCODE.F7SDL_SCANCODE_F7
sdl.keyboard.SCANCODE.F8SDL_SCANCODE_F8
sdl.keyboard.SCANCODE.F9SDL_SCANCODE_F9
sdl.keyboard.SCANCODE.F10SDL_SCANCODE_F10
sdl.keyboard.SCANCODE.F11SDL_SCANCODE_F11
sdl.keyboard.SCANCODE.F12SDL_SCANCODE_F12
sdl.keyboard.SCANCODE.PRINTSCREENSDL_SCANCODE_PRINTSCREEN
sdl.keyboard.SCANCODE.SCROLLLOCKSDL_SCANCODE_SCROLLLOCK
sdl.keyboard.SCANCODE.PAUSESDL_SCANCODE_PAUSE
sdl.keyboard.SCANCODE.INSERTSDL_SCANCODE_INSERTinsert on PC, help on some Mac keyboards
sdl.keyboard.SCANCODE.HOMESDL_SCANCODE_HOME
sdl.keyboard.SCANCODE.PAGEUPSDL_SCANCODE_PAGEUP
sdl.keyboard.SCANCODE.DELETESDL_SCANCODE_DELETE
sdl.keyboard.SCANCODE.ENDSDL_SCANCODE_END
sdl.keyboard.SCANCODE.PAGEDOWNSDL_SCANCODE_PAGEDOWN
sdl.keyboard.SCANCODE.RIGHTSDL_SCANCODE_RIGHT
sdl.keyboard.SCANCODE.LEFTSDL_SCANCODE_LEFT
sdl.keyboard.SCANCODE.DOWNSDL_SCANCODE_DOWN
sdl.keyboard.SCANCODE.UPSDL_SCANCODE_UP
sdl.keyboard.SCANCODE.NUMLOCKCLEARSDL_SCANCODE_NUMLOCKCLEARnum lock on PC, clear on Mac keyboards
sdl.keyboard.SCANCODE.KP_DIVIDESDL_SCANCODE_KP_DIVIDE
sdl.keyboard.SCANCODE.KP_MULTIPLYSDL_SCANCODE_KP_MULTIPLY
sdl.keyboard.SCANCODE.KP_MINUSSDL_SCANCODE_KP_MINUS
sdl.keyboard.SCANCODE.KP_PLUSSDL_SCANCODE_KP_PLUS
sdl.keyboard.SCANCODE.KP_ENTERSDL_SCANCODE_KP_ENTER
sdl.keyboard.SCANCODE.KP_1SDL_SCANCODE_KP_1
sdl.keyboard.SCANCODE.KP_2SDL_SCANCODE_KP_2
sdl.keyboard.SCANCODE.KP_3SDL_SCANCODE_KP_3
sdl.keyboard.SCANCODE.KP_4SDL_SCANCODE_KP_4
sdl.keyboard.SCANCODE.KP_5SDL_SCANCODE_KP_5
sdl.keyboard.SCANCODE.KP_6SDL_SCANCODE_KP_6
sdl.keyboard.SCANCODE.KP_7SDL_SCANCODE_KP_7
sdl.keyboard.SCANCODE.KP_8SDL_SCANCODE_KP_8
sdl.keyboard.SCANCODE.KP_9SDL_SCANCODE_KP_9
sdl.keyboard.SCANCODE.KP_0SDL_SCANCODE_KP_0
sdl.keyboard.SCANCODE.KP_PERIODSDL_SCANCODE_KP_PERIOD
sdl.keyboard.SCANCODE.NONUSBACKSLASHSDL_SCANCODE_NONUSBACKSLASHThis is the additional key that ISO keyboards have over ANSI ones, located between left shift and Y. Produces GRAVE ACCENT and TILDE in a US or UK Mac layout, REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US or UK Windows layout, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French layout.
sdl.keyboard.SCANCODE.APPLICATIONSDL_SCANCODE_APPLICATIONwindows contextual menu, compose
sdl.keyboard.SCANCODE.POWERSDL_SCANCODE_POWERThe USB document says this is a status flag, not a physical key - but some Mac keyboards do have a power key.
sdl.keyboard.SCANCODE.KP_EQUALSSDL_SCANCODE_KP_EQUALS
sdl.keyboard.SCANCODE.F13SDL_SCANCODE_F13
sdl.keyboard.SCANCODE.F14SDL_SCANCODE_F14
sdl.keyboard.SCANCODE.F15SDL_SCANCODE_F15
sdl.keyboard.SCANCODE.F16SDL_SCANCODE_F16
sdl.keyboard.SCANCODE.F17SDL_SCANCODE_F17
sdl.keyboard.SCANCODE.F18SDL_SCANCODE_F18
sdl.keyboard.SCANCODE.F19SDL_SCANCODE_F19
sdl.keyboard.SCANCODE.F20SDL_SCANCODE_F20
sdl.keyboard.SCANCODE.F21SDL_SCANCODE_F21
sdl.keyboard.SCANCODE.F22SDL_SCANCODE_F22
sdl.keyboard.SCANCODE.F23SDL_SCANCODE_F23
sdl.keyboard.SCANCODE.F24SDL_SCANCODE_F24
sdl.keyboard.SCANCODE.EXECUTESDL_SCANCODE_EXECUTE
sdl.keyboard.SCANCODE.HELPSDL_SCANCODE_HELP
sdl.keyboard.SCANCODE.MENUSDL_SCANCODE_MENU
sdl.keyboard.SCANCODE.SELECTSDL_SCANCODE_SELECT
sdl.keyboard.SCANCODE.STOPSDL_SCANCODE_STOP
sdl.keyboard.SCANCODE.AGAINSDL_SCANCODE_AGAINredo
sdl.keyboard.SCANCODE.UNDOSDL_SCANCODE_UNDO
sdl.keyboard.SCANCODE.CUTSDL_SCANCODE_CUT
sdl.keyboard.SCANCODE.COPYSDL_SCANCODE_COPY
sdl.keyboard.SCANCODE.PASTESDL_SCANCODE_PASTE
sdl.keyboard.SCANCODE.FINDSDL_SCANCODE_FIND
sdl.keyboard.SCANCODE.MUTESDL_SCANCODE_MUTE
sdl.keyboard.SCANCODE.VOLUMEUPSDL_SCANCODE_VOLUMEUP
sdl.keyboard.SCANCODE.VOLUMEDOWNSDL_SCANCODE_VOLUMEDOWN
sdl.keyboard.SCANCODE.KP_COMMASDL_SCANCODE_KP_COMMA
sdl.keyboard.SCANCODE.KP_EQUALSAS400SDL_SCANCODE_KP_EQUALSAS400
sdl.keyboard.SCANCODE.INTERNATIONAL1SDL_SCANCODE_INTERNATIONAL1used on Asian keyboards, see footnotes in USB doc
sdl.keyboard.SCANCODE.INTERNATIONAL2SDL_SCANCODE_INTERNATIONAL2
sdl.keyboard.SCANCODE.INTERNATIONAL3SDL_SCANCODE_INTERNATIONAL3Yen
sdl.keyboard.SCANCODE.INTERNATIONAL4SDL_SCANCODE_INTERNATIONAL4
sdl.keyboard.SCANCODE.INTERNATIONAL5SDL_SCANCODE_INTERNATIONAL5
sdl.keyboard.SCANCODE.INTERNATIONAL6SDL_SCANCODE_INTERNATIONAL6
sdl.keyboard.SCANCODE.INTERNATIONAL7SDL_SCANCODE_INTERNATIONAL7
sdl.keyboard.SCANCODE.INTERNATIONAL8SDL_SCANCODE_INTERNATIONAL8
sdl.keyboard.SCANCODE.INTERNATIONAL9SDL_SCANCODE_INTERNATIONAL9
sdl.keyboard.SCANCODE.LANG1SDL_SCANCODE_LANG1Hangul/English toggle
sdl.keyboard.SCANCODE.LANG2SDL_SCANCODE_LANG2Hanja conversion
sdl.keyboard.SCANCODE.LANG3SDL_SCANCODE_LANG3Katakana
sdl.keyboard.SCANCODE.LANG4SDL_SCANCODE_LANG4Hiragana
sdl.keyboard.SCANCODE.LANG5SDL_SCANCODE_LANG5Zenkaku/Hankaku
sdl.keyboard.SCANCODE.LANG6SDL_SCANCODE_LANG6
sdl.keyboard.SCANCODE.LANG7SDL_SCANCODE_LANG7
sdl.keyboard.SCANCODE.LANG8SDL_SCANCODE_LANG8
sdl.keyboard.SCANCODE.LANG9SDL_SCANCODE_LANG9
sdl.keyboard.SCANCODE.ALTERASESDL_SCANCODE_ALTERASEErase-Eaze
sdl.keyboard.SCANCODE.SYSREQSDL_SCANCODE_SYSREQ
sdl.keyboard.SCANCODE.CANCELSDL_SCANCODE_CANCEL
sdl.keyboard.SCANCODE.CLEARSDL_SCANCODE_CLEAR
sdl.keyboard.SCANCODE.PRIORSDL_SCANCODE_PRIOR
sdl.keyboard.SCANCODE.RETURN2SDL_SCANCODE_RETURN2
sdl.keyboard.SCANCODE.SEPARATORSDL_SCANCODE_SEPARATOR
sdl.keyboard.SCANCODE.OUTSDL_SCANCODE_OUT
sdl.keyboard.SCANCODE.OPERSDL_SCANCODE_OPER
sdl.keyboard.SCANCODE.CLEARAGAINSDL_SCANCODE_CLEARAGAIN
sdl.keyboard.SCANCODE.CRSELSDL_SCANCODE_CRSEL
sdl.keyboard.SCANCODE.EXSELSDL_SCANCODE_EXSEL
sdl.keyboard.SCANCODE.KP_00SDL_SCANCODE_KP_00
sdl.keyboard.SCANCODE.KP_000SDL_SCANCODE_KP_000
sdl.keyboard.SCANCODE.THOUSANDSSEPARATORSDL_SCANCODE_THOUSANDSSEPARATOR
sdl.keyboard.SCANCODE.DECIMALSEPARATORSDL_SCANCODE_DECIMALSEPARATOR
sdl.keyboard.SCANCODE.CURRENCYUNITSDL_SCANCODE_CURRENCYUNIT
sdl.keyboard.SCANCODE.CURRENCYSUBUNITSDL_SCANCODE_CURRENCYSUBUNIT
sdl.keyboard.SCANCODE.KP_LEFTPARENSDL_SCANCODE_KP_LEFTPAREN
sdl.keyboard.SCANCODE.KP_RIGHTPARENSDL_SCANCODE_KP_RIGHTPAREN
sdl.keyboard.SCANCODE.KP_LEFTBRACESDL_SCANCODE_KP_LEFTBRACE
sdl.keyboard.SCANCODE.KP_RIGHTBRACESDL_SCANCODE_KP_RIGHTBRACE
sdl.keyboard.SCANCODE.KP_TABSDL_SCANCODE_KP_TAB
sdl.keyboard.SCANCODE.KP_BACKSPACESDL_SCANCODE_KP_BACKSPACE
sdl.keyboard.SCANCODE.KP_ASDL_SCANCODE_KP_A
sdl.keyboard.SCANCODE.KP_BSDL_SCANCODE_KP_B
sdl.keyboard.SCANCODE.KP_CSDL_SCANCODE_KP_C
sdl.keyboard.SCANCODE.KP_DSDL_SCANCODE_KP_D
sdl.keyboard.SCANCODE.KP_ESDL_SCANCODE_KP_E
sdl.keyboard.SCANCODE.KP_FSDL_SCANCODE_KP_F
sdl.keyboard.SCANCODE.KP_XORSDL_SCANCODE_KP_XOR
sdl.keyboard.SCANCODE.KP_POWERSDL_SCANCODE_KP_POWER
sdl.keyboard.SCANCODE.KP_PERCENTSDL_SCANCODE_KP_PERCENT
sdl.keyboard.SCANCODE.KP_LESSSDL_SCANCODE_KP_LESS
sdl.keyboard.SCANCODE.KP_GREATERSDL_SCANCODE_KP_GREATER
sdl.keyboard.SCANCODE.KP_AMPERSANDSDL_SCANCODE_KP_AMPERSAND
sdl.keyboard.SCANCODE.KP_DBLAMPERSANDSDL_SCANCODE_KP_DBLAMPERSAND
sdl.keyboard.SCANCODE.KP_VERTICALBARSDL_SCANCODE_KP_VERTICALBAR
sdl.keyboard.SCANCODE.KP_DBLVERTICALBARSDL_SCANCODE_KP_DBLVERTICALBAR
sdl.keyboard.SCANCODE.KP_COLONSDL_SCANCODE_KP_COLON
sdl.keyboard.SCANCODE.KP_HASHSDL_SCANCODE_KP_HASH
sdl.keyboard.SCANCODE.KP_SPACESDL_SCANCODE_KP_SPACE
sdl.keyboard.SCANCODE.KP_ATSDL_SCANCODE_KP_AT
sdl.keyboard.SCANCODE.KP_EXCLAMSDL_SCANCODE_KP_EXCLAM
sdl.keyboard.SCANCODE.KP_MEMSTORESDL_SCANCODE_KP_MEMSTORE
sdl.keyboard.SCANCODE.KP_MEMRECALLSDL_SCANCODE_KP_MEMRECALL
sdl.keyboard.SCANCODE.KP_MEMCLEARSDL_SCANCODE_KP_MEMCLEAR
sdl.keyboard.SCANCODE.KP_MEMADDSDL_SCANCODE_KP_MEMADD
sdl.keyboard.SCANCODE.KP_MEMSUBTRACTSDL_SCANCODE_KP_MEMSUBTRACT
sdl.keyboard.SCANCODE.KP_MEMMULTIPLYSDL_SCANCODE_KP_MEMMULTIPLY
sdl.keyboard.SCANCODE.KP_MEMDIVIDESDL_SCANCODE_KP_MEMDIVIDE
sdl.keyboard.SCANCODE.KP_PLUSMINUSSDL_SCANCODE_KP_PLUSMINUS
sdl.keyboard.SCANCODE.KP_CLEARSDL_SCANCODE_KP_CLEAR
sdl.keyboard.SCANCODE.KP_CLEARENTRYSDL_SCANCODE_KP_CLEARENTRY
sdl.keyboard.SCANCODE.KP_BINARYSDL_SCANCODE_KP_BINARY
sdl.keyboard.SCANCODE.KP_OCTALSDL_SCANCODE_KP_OCTAL
sdl.keyboard.SCANCODE.KP_DECIMALSDL_SCANCODE_KP_DECIMAL
sdl.keyboard.SCANCODE.KP_HEXADECIMALSDL_SCANCODE_KP_HEXADECIMAL
sdl.keyboard.SCANCODE.LCTRLSDL_SCANCODE_LCTRL
sdl.keyboard.SCANCODE.LSHIFTSDL_SCANCODE_LSHIFT
sdl.keyboard.SCANCODE.LALTSDL_SCANCODE_LALTalt, option
sdl.keyboard.SCANCODE.LGUISDL_SCANCODE_LGUIwindows, command (apple), meta
sdl.keyboard.SCANCODE.RCTRLSDL_SCANCODE_RCTRL
sdl.keyboard.SCANCODE.RSHIFTSDL_SCANCODE_RSHIFT
sdl.keyboard.SCANCODE.RALTSDL_SCANCODE_RALTalt gr, option
sdl.keyboard.SCANCODE.RGUISDL_SCANCODE_RGUIwindows, command (apple), meta
sdl.keyboard.SCANCODE.MODESDL_SCANCODE_MODE
sdl.keyboard.SCANCODE.AUDIONEXTSDL_SCANCODE_AUDIONEXT
sdl.keyboard.SCANCODE.AUDIOPREVSDL_SCANCODE_AUDIOPREV
sdl.keyboard.SCANCODE.AUDIOSTOPSDL_SCANCODE_AUDIOSTOP
sdl.keyboard.SCANCODE.AUDIOPLAYSDL_SCANCODE_AUDIOPLAY
sdl.keyboard.SCANCODE.AUDIOMUTESDL_SCANCODE_AUDIOMUTE
sdl.keyboard.SCANCODE.MEDIASELECTSDL_SCANCODE_MEDIASELECT
sdl.keyboard.SCANCODE.WWWSDL_SCANCODE_WWW
sdl.keyboard.SCANCODE.MAILSDL_SCANCODE_MAIL
sdl.keyboard.SCANCODE.CALCULATORSDL_SCANCODE_CALCULATOR
sdl.keyboard.SCANCODE.COMPUTERSDL_SCANCODE_COMPUTER
sdl.keyboard.SCANCODE.AC_SEARCHSDL_SCANCODE_AC_SEARCH
sdl.keyboard.SCANCODE.AC_HOMESDL_SCANCODE_AC_HOME
sdl.keyboard.SCANCODE.AC_BACKSDL_SCANCODE_AC_BACK
sdl.keyboard.SCANCODE.AC_FORWARDSDL_SCANCODE_AC_FORWARD
sdl.keyboard.SCANCODE.AC_STOPSDL_SCANCODE_AC_STOP
sdl.keyboard.SCANCODE.AC_REFRESHSDL_SCANCODE_AC_REFRESH
sdl.keyboard.SCANCODE.AC_BOOKMARKSSDL_SCANCODE_AC_BOOKMARKS
sdl.keyboard.SCANCODE.BRIGHTNESSDOWNSDL_SCANCODE_BRIGHTNESSDOWN
sdl.keyboard.SCANCODE.BRIGHTNESSUPSDL_SCANCODE_BRIGHTNESSUP
sdl.keyboard.SCANCODE.DISPLAYSWITCHSDL_SCANCODE_DISPLAYSWITCHdisplay mirroring/dual display switch, video mode switch
sdl.keyboard.SCANCODE.KBDILLUMTOGGLESDL_SCANCODE_KBDILLUMTOGGLE
sdl.keyboard.SCANCODE.KBDILLUMDOWNSDL_SCANCODE_KBDILLUMDOWN
sdl.keyboard.SCANCODE.KBDILLUMUPSDL_SCANCODE_KBDILLUMUP
sdl.keyboard.SCANCODE.EJECTSDL_SCANCODE_EJECT
sdl.keyboard.SCANCODE.SLEEPSDL_SCANCODE_SLEEP
sdl.keyboard.SCANCODE.APP1SDL_SCANCODE_APP1
sdl.keyboard.SCANCODE.APP2SDL_SCANCODE_APP2
sdl.keyboard.SCANCODE.AUDIOREWINDSDL_SCANCODE_AUDIOREWIND
sdl.keyboard.SCANCODE.AUDIOFASTFORWARDSDL_SCANCODE_AUDIOFASTFORWARD

Virtual keys

String values used to represent virtual keys in the context of the current keyboard mapping. Note that some keys do not correspond to any virtual key. A Key can be either one of the values below or any unicode character. Keys that produce characters are represented by that character. All others are represented by one of these values:

'&&', '+/-', '||', '00', '000', 'again', 'alt', 'altErase', 'app1', 'app2', 'application', 'audioFastForward', 'audioMute', 'audioNext', 'audioPlay', 'audioPrev', 'audioRewind', 'audioStop', 'back', 'backspace', 'binary', 'bookmarks', 'brightnessDown', 'brightnessUp', 'calculator', 'cancel', 'capsLock', 'clear', 'clearEntry', 'computer', 'copy', 'crSel', 'ctrl', 'currencySubUnit', 'currencyUnit', 'cut', 'decimal', 'decimalSeparator', 'delete', 'displaySwitch', 'down', 'eject', 'end', 'enter', 'escape', 'execute', 'exSel', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'f24', 'find', 'forward', 'gui', 'help', 'hexadecimal', 'home', 'illumDown', 'illumToggle', 'illumUp', 'insert', 'left', 'mail', 'mediaSelect', 'memAdd', 'memClear', 'memDivide', 'memMultiply', 'memRecall', 'memStore', 'memSubtract', 'menu', 'modeSwitch', 'mute', 'numlock', 'octal', 'oper', 'out', 'pageDown', 'pageUp', 'paste', 'pause', 'power', 'printScreen', 'prior', 'refresh', 'return', 'right', 'scrollLock', 'search', 'select', 'separator', 'shift', 'sleep', 'space', 'stop', 'sysReq', 'tab', 'thousandsSeparator', 'undo', 'up', 'volumeDown', 'volumeUp', 'www', 'xor'.

sdl.keyboard.getKey(scancode)

Maps a scancode to the corresponding key based on the current keyboard mapping.

sdl.keyboard.getScancode(key)

Maps a key to the corresponding scancode based on the current keyboard mapping. If multiple physical keys produce the same virtual key, then only the first one will be returned.

sdl.keyboard.getState()

  • Returns: <boolean[]> an object representing the state of each key.

The returned array can be indexed with Scancode values. Pressed keys will correspond to true values.

sdl.mouse

Mouse cursors

String values used to represent the types of cursors available on most systems.

ValueCorresponding SDL_SystemCursorDescription
'arrow'SDL_SYSTEM_CURSOR_ARROWarrow
'ibeam'SDL_SYSTEM_CURSOR_IBEAMi-beam
'wait'SDL_SYSTEM_CURSOR_WAITwait
'crosshair'SDL_SYSTEM_CURSOR_CROSSHAIRcrosshair
'waitarrow'SDL_SYSTEM_CURSOR_WAITARROWsmall wait cursor (or wait if not available)
'sizenwse'SDL_SYSTEM_CURSOR_SIZENWSEdouble arrow pointing northwest and southeast
'sizenesw'SDL_SYSTEM_CURSOR_SIZENESWdouble arrow pointing northeast and southwest
'sizewe'SDL_SYSTEM_CURSOR_SIZEWEdouble arrow pointing west and east
'sizens'SDL_SYSTEM_CURSOR_SIZENSdouble arrow pointing north and south
'sizeall'SDL_SYSTEM_CURSOR_SIZEALLfour pointed arrow pointing north, south, east, and west
'no'SDL_SYSTEM_CURSOR_NOslashed circle or crossbones
'hand'SDL_SYSTEM_CURSOR_HANDhand

Enum: BUTTON

Used to represent the buttons on a mouse. A mouse can have many buttons, but the values for the three most common ones are represented in this enum.

ValueCorresponding SDL_BUTTON_*
sdl.mouse.BUTTON.LEFTSDL_BUTTON_LEFT
sdl.mouse.BUTTON.MIDDLESDL_BUTTON_MIDDLE
sdl.mouse.BUTTON.RIGHTSDL_BUTTON_RIGHT

sdl.mouse.getButton(button)

  • button: <number> The index of the button.
  • Returns: <boolean> Will be true if the button is pressed.

Queries the state of a single mouse button.

sdl.mouse.position

  • <object>
    • x: <number> The x position of the mouse, relative to the screen.
    • y: <number> The y position of the mouse, relative to the screen.

The position of the mouse on the screen.

sdl.mouse.setPosition(x, y)

  • x: <number> The new x position of the mouse, relative to the screen.
  • y: <number> The new y position of the mouse, relative to the screen.

Moves the mouse to the specified position.

sdl.mouse.setCursor(cursor)

Changes the icon that is displayed for the mouse cursor.

sdl.mouse.setCursorImage(width, height, stride, format, buffer, x, y)

  • width, height, stride, format, buffer: <Image> The image to use as a cursor.
  • x: <number> The x position of the cursor image's hotspot.
  • y: <number> The y position of the cursor image's hotspot.

Sets a image to be the mouse cursor. The hotspot represents the pixel that is considered to be under the mouse.

sdl.mouse.showCursor([show])

  • show: <boolean> If true then the mouse cursor will be visible. Default true.

Changes the visibility of the mouse cursor.

sdl.mouse.hideCursor()

Equivalent to sdl.mouse.showCursor(false).

sdl.mouse.capture([capture])

  • capture: <boolean> If true the mouse will be captured by the current window. Default true.

When the mouse has been captured you will continue receiving mouse events even if the mouse is not over a window.

sdl.mouse.uncapture()

Equivalent to sdl.mouse.capture(false).

sdl.clipboard

Event: 'update'

Fired when the contents of the clipboard have changed. Check sdl.clipboard.text to get the new contents of the clipboard.

sdl.clipboard.text

  • <string>

The current text value on the clipboard.

sdl.clipboard.setText(text)

  • text: <string> The new value to save on the clipboard.

Changes the text contents of the clipboard.

Miscellanea

Installing SDL2

This should not be necessary, since this package bundles the SDL2 runtime library along with its binaries, but you never know...

This package depends on SDL2 >=2.0.5. To install it on your system you might have to download one of the SDL2 Runtime Binaries.

  • Linux: Run sudo apt install libsdl2-2.0-0 or whatever the equivalent command is for your package manager.
  • Mac: Download the .dmg file, open it, and copy the SDL2.framework to /Library/Frameworks.
  • Windows: Download the .zip file, extract it, and copy the .dll files to a path Node.js can link them from. This will usually be your system directory (C:\Windows) but see here for other paths where Windows will look for .dll files to link.

Building from source

// TODO

Rate & Review

Great Documentation0
Easy to Use0
Performant0
Highly Customizable0
Bleeding Edge0
Responsive Maintainers0
Poor Documentation0
Hard to Use0
Slow0
Buggy0
Abandoned0
Unwelcoming Community0
100