update pyglet
fix crash
This commit is contained in:
parent
8c96116afb
commit
21e817000a
12
DR.py
12
DR.py
@ -38,16 +38,20 @@ if __name__ == '__main__':
|
||||
print(sys.path)
|
||||
print(hi)
|
||||
|
||||
DEBUGGING = True
|
||||
DEBUGGING = False
|
||||
import Difficult_Rocket
|
||||
from Difficult_Rocket.api.Exp import *
|
||||
from Difficult_Rocket.crash import crash
|
||||
try:
|
||||
import pyglet
|
||||
pyglet.options["win32_gdi_font"] = True
|
||||
|
||||
from Difficult_Rocket import main
|
||||
|
||||
game = main.Game()
|
||||
from libs.pyglet.gl import glClearColor
|
||||
glClearColor(0.5, 0.5, 0.5, 0)
|
||||
|
||||
# from libs.pyglet.gl import glClearColor
|
||||
# glClearColor(0, 0, 0, 0)
|
||||
game = main.Game()
|
||||
|
||||
cprofile = False
|
||||
if cprofile:
|
||||
|
@ -11,15 +11,22 @@ github: @shenjackyuanjie
|
||||
gitee: @shenjackyuanjie
|
||||
"""
|
||||
|
||||
from MCDR.version import Version
|
||||
from libs.MCDR.version import Version
|
||||
|
||||
game_version = Version("0.6.2")
|
||||
__version__ = game_version
|
||||
|
||||
DR_options = {
|
||||
'InputBox_use_TextEntry': False,
|
||||
'playing': False
|
||||
}
|
||||
|
||||
playing = False
|
||||
_DR_options_type = {
|
||||
'InputBox_use_TextEntry': bool,
|
||||
'playing': bool
|
||||
}
|
||||
|
||||
if playing:
|
||||
if DR_options['playing']:
|
||||
from .api import new_thread
|
||||
|
||||
@new_thread('think')
|
||||
|
@ -211,7 +211,7 @@ class ClientWindow(Window):
|
||||
def FPS_update(self, tick: Decimal):
|
||||
now_FPS = pyglet.clock.get_fps()
|
||||
self.fps_log.update_tick(tick)
|
||||
self.fps_label.text = f'FPS: {self.fps_log.fps: >5.1f}({self.fps_log.middle_fps: >5.1f})[{now_FPS}] {self.fps_log.max_fps: >7.1f} {self.fps_log.min_fps:>5.1f}'
|
||||
self.fps_label.text = f'FPS: {self.fps_log.fps: >5.1f}({self.fps_log.middle_fps: >5.1f})[{now_FPS}]\n {self.fps_log.max_fps: >7.1f} {self.fps_log.min_fps:>5.1f}'
|
||||
|
||||
def on_draw(self, *dt):
|
||||
# self.logger.debug('on_draw call dt: {}'.format(dt))
|
||||
|
@ -13,6 +13,7 @@ gitee: @shenjackyuanjie
|
||||
|
||||
from Difficult_Rocket import translate
|
||||
from Difficult_Rocket.guis.format import html
|
||||
from Difficult_Rocket import DR_options
|
||||
|
||||
# from libs import pyglet
|
||||
from libs.pyglet import font
|
||||
@ -21,7 +22,7 @@ from libs.pyglet.window import key
|
||||
from libs.pyglet.gui import widgets
|
||||
from libs.pyglet.sprite import Sprite
|
||||
from libs.pyglet.shapes import Rectangle
|
||||
from libs.pyglet.image import AbstractImage
|
||||
# from libs.pyglet.image import AbstractImage
|
||||
from libs.pyglet.graphics import Batch, Group
|
||||
from libs.pyglet.text.document import FormattedDocument
|
||||
from libs.pyglet.text.layout import IncrementalTextLayout
|
||||
@ -41,7 +42,8 @@ class Parts(widgets.WidgetBase):
|
||||
y: int,
|
||||
width: int,
|
||||
height: int,
|
||||
textures: AbstractImage,
|
||||
# textures: AbstractImage,
|
||||
textures,
|
||||
batch: Batch,
|
||||
parts_data: dict):
|
||||
super().__init__(x, y, width, height)
|
||||
@ -79,37 +81,39 @@ class InputBox(widgets.WidgetBase):
|
||||
dpi=font_dpi)
|
||||
self.font_height = self.font.ascent - self.font.descent
|
||||
self.out_bound = out_line
|
||||
# 基于IncrementalTextLayout的处理系统
|
||||
self._doc = FormattedDocument(message)
|
||||
# self._doc.set_style()
|
||||
self._layout = IncrementalTextLayout(self._doc, self.font, width, height,
|
||||
batch=batch, group=group)
|
||||
# 基于Label的处理系统
|
||||
self._input_box = Label(x=x + out_line, y=y + out_line,
|
||||
width=width, height=self.font_height + self.out_bound * 2,
|
||||
color=text_color,
|
||||
font_name=font_name, font_size=font_size,
|
||||
batch=batch, group=group,
|
||||
text=message)
|
||||
self._HTML_box = HTMLLabel(x=x + out_line, y=y + out_line + 30,
|
||||
width=width, height=self.font_height + self.out_bound * 2,
|
||||
batch=batch, group=group,
|
||||
text=message)
|
||||
self._out_box = Rectangle(x=x - out_line, y=y - out_line,
|
||||
color=out_line_color,
|
||||
width=width + (out_line * 2), height=height + (out_line * 2),
|
||||
batch=batch, group=group)
|
||||
self._光标 = Rectangle(x=x + out_line, y=y + out_line,
|
||||
color=cursor_color,
|
||||
width=1, height=self.font_height,
|
||||
batch=batch, group=group)
|
||||
self._选择框 = Rectangle(x=x, y=y, width=0, height=self.font_height,
|
||||
color=select_color)
|
||||
self._选择的字 = Label(x=x, y=y, width=0, height=self.font_height,
|
||||
color=text_color,
|
||||
font_name=font_name, font_size=font_size,
|
||||
batch=batch, group=group,
|
||||
text='')
|
||||
if DR_options['InputBox_use_TextEntry']:
|
||||
# 基于IncrementalTextLayout的处理系统
|
||||
self._doc = FormattedDocument(message)
|
||||
# self._doc.set_style()
|
||||
self._layout = IncrementalTextLayout(self._doc, self.font, width, height,
|
||||
batch=batch, group=group)
|
||||
else:
|
||||
# 基于Label的处理系统
|
||||
self._input_box = Label(x=x + out_line, y=y + out_line,
|
||||
width=width, height=self.font_height + self.out_bound * 2,
|
||||
color=text_color,
|
||||
font_name=font_name, font_size=font_size,
|
||||
batch=batch, group=group,
|
||||
text=message)
|
||||
self._HTML_box = HTMLLabel(x=x + out_line, y=y + out_line + 30,
|
||||
width=width, height=self.font_height + self.out_bound * 2,
|
||||
batch=batch, group=group,
|
||||
text=message)
|
||||
self._out_box = Rectangle(x=x - out_line, y=y - out_line,
|
||||
color=out_line_color,
|
||||
width=width + (out_line * 2), height=height + (out_line * 2),
|
||||
batch=batch, group=group)
|
||||
self._光标 = Rectangle(x=x + out_line, y=y + out_line,
|
||||
color=cursor_color,
|
||||
width=1, height=self.font_height,
|
||||
batch=batch, group=group)
|
||||
self._选择框 = Rectangle(x=x, y=y, width=0, height=self.font_height,
|
||||
color=select_color)
|
||||
self._选择的字 = Label(x=x, y=y, width=0, height=self.font_height,
|
||||
color=text_color,
|
||||
font_name=font_name, font_size=font_size,
|
||||
batch=batch, group=group,
|
||||
text='')
|
||||
|
||||
"""
|
||||
输入框的属性
|
||||
|
@ -1,30 +0,0 @@
|
||||
Copyright (c) 2006-2008 Alex Holkner
|
||||
Copyright (c) 2008-2021 pyglet contributors
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of pyglet nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
@ -44,7 +44,7 @@ import sys
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
#: The release version
|
||||
version = '2.0.dev13'
|
||||
version = '2.0.a3'
|
||||
__version__ = version
|
||||
|
||||
if sys.version_info < (3, 6):
|
||||
@ -54,7 +54,6 @@ if 'sphinx' in sys.modules:
|
||||
setattr(sys, 'is_pyglet_doc_run', True)
|
||||
_is_pyglet_doc_run = hasattr(sys, "is_pyglet_doc_run") and sys.is_pyglet_doc_run
|
||||
|
||||
|
||||
# pyglet platform treats *BSD systems as Linux
|
||||
compat_platform = sys.platform
|
||||
if "bsd" in compat_platform:
|
||||
@ -159,6 +158,7 @@ options = {
|
||||
'win32_gdi_font': False,
|
||||
'headless': False,
|
||||
'headless_device': 0,
|
||||
'win32_disable_shaping': False,
|
||||
}
|
||||
|
||||
_option_types = {
|
||||
@ -185,7 +185,8 @@ _option_types = {
|
||||
'search_local_libs': bool,
|
||||
'win32_gdi_font': bool,
|
||||
'headless': bool,
|
||||
'headless_device': int
|
||||
'headless_device': int,
|
||||
'win32_disable_shaping': bool
|
||||
}
|
||||
|
||||
|
||||
|
@ -47,7 +47,7 @@ from pyglet import image
|
||||
|
||||
_other_grapheme_extend = list(map(chr, [0x09be, 0x09d7, 0x0be3, 0x0b57, 0x0bbe, 0x0bd7, 0x0cc2,
|
||||
0x0cd5, 0x0cd6, 0x0d3e, 0x0d57, 0x0dcf, 0x0ddf, 0x200c,
|
||||
0x200d, 0xff9e, 0xff9f])) # skip codepoints above U+10000
|
||||
0x200d, 0xff9e, 0xff9f])) # skip codepoints above U+10000
|
||||
_logical_order_exception = list(map(chr, list(range(0xe40, 0xe45)) + list(range(0xec0, 0xec4))))
|
||||
|
||||
_grapheme_extend = lambda c, cc: cc in ('Me', 'Mn') or c in _other_grapheme_extend
|
||||
@ -57,7 +57,7 @@ _LF = u'\u000a'
|
||||
_control = lambda c, cc: cc in ('ZI', 'Zp', 'Cc', 'Cf') and not \
|
||||
c in list(map(chr, [0x000d, 0x000a, 0x200c, 0x200d]))
|
||||
_extend = lambda c, cc: _grapheme_extend(c, cc) or \
|
||||
c in list(map(chr, [0xe30, 0xe32, 0xe33, 0xe45, 0xeb0, 0xeb2, 0xeb3]))
|
||||
c in list(map(chr, [0xe30, 0xe32, 0xe33, 0xe45, 0xeb0, 0xeb2, 0xeb3]))
|
||||
_prepend = lambda c, cc: c in _logical_order_exception
|
||||
_spacing_mark = lambda c, cc: cc == 'Mc' and c not in _other_grapheme_extend
|
||||
|
||||
@ -72,7 +72,7 @@ def grapheme_break(left, right):
|
||||
# GB3
|
||||
if left == _CR and right == _LF:
|
||||
return False
|
||||
|
||||
|
||||
left_cc = unicodedata.category(left)
|
||||
|
||||
# GB4
|
||||
@ -98,7 +98,7 @@ def grapheme_break(left, right):
|
||||
# GB9b
|
||||
if _prepend(left, left_cc):
|
||||
return False
|
||||
|
||||
|
||||
# GB10
|
||||
return True
|
||||
|
||||
@ -148,12 +148,16 @@ class Glyph(image.TextureRegion):
|
||||
`vertices` : (int, int, int, int)
|
||||
The vertices of this glyph, with (0,0) originating at the
|
||||
left-side bearing at the baseline.
|
||||
`colored` : bool
|
||||
If a glyph is colored by the font renderer, such as an emoji, it may
|
||||
be treated differently by pyglet. For example, being omitted from text color shaders.
|
||||
|
||||
"""
|
||||
baseline = 0
|
||||
lsb = 0
|
||||
advance = 0
|
||||
vertices = (0, 0, 0, 0)
|
||||
colored = False
|
||||
|
||||
def set_bearings(self, baseline, left_side_bearing, advance, x_offset=0, y_offset=0):
|
||||
"""Set metrics for this glyph.
|
||||
@ -181,77 +185,47 @@ class Glyph(image.TextureRegion):
|
||||
left_side_bearing + self.width + x_offset,
|
||||
-baseline + self.height + y_offset)
|
||||
|
||||
# def draw(self):
|
||||
# """Debug method.
|
||||
#
|
||||
# Use the higher level APIs for performance and kerning.
|
||||
# """
|
||||
# glBindTexture(GL_TEXTURE_2D, self.owner.id)
|
||||
# glBegin(GL_QUADS)
|
||||
# self.draw_quad_vertices()
|
||||
# glEnd()
|
||||
#
|
||||
# def draw_quad_vertices(self):
|
||||
# """Debug method.
|
||||
#
|
||||
# Use the higher level APIs for performance and kerning.
|
||||
# """
|
||||
# glTexCoord3f(*self.tex_coords[:3])
|
||||
# glVertex2f(self.vertices[0], self.vertices[1])
|
||||
# glTexCoord3f(*self.tex_coords[3:6])
|
||||
# glVertex2f(self.vertices[2], self.vertices[1])
|
||||
# glTexCoord3f(*self.tex_coords[6:9])
|
||||
# glVertex2f(self.vertices[2], self.vertices[3])
|
||||
# glTexCoord3f(*self.tex_coords[9:12])
|
||||
# glVertex2f(self.vertices[0], self.vertices[3])
|
||||
|
||||
def get_kerning_pair(self, right_glyph):
|
||||
"""Not implemented.
|
||||
"""
|
||||
return 0
|
||||
|
||||
|
||||
class GlyphTextureAtlas(image.Texture):
|
||||
"""A texture within which glyphs can be drawn.
|
||||
"""
|
||||
class GlyphTexture(image.Texture):
|
||||
region_class = Glyph
|
||||
x = 0
|
||||
y = 0
|
||||
line_height = 0
|
||||
|
||||
def fit(self, image):
|
||||
"""Place `image` within this texture.
|
||||
|
||||
:Parameters:
|
||||
`image` : `pyglet.image.AbstractImage`
|
||||
Image to place within the texture.
|
||||
class GlyphTextureAtlas(image.atlas.TextureAtlas):
|
||||
"""A texture atlas containing glyphs."""
|
||||
texture_class = GlyphTexture
|
||||
|
||||
:rtype: `Glyph`
|
||||
:return: The glyph representing the image from this texture, or None
|
||||
if the image doesn't fit.
|
||||
"""
|
||||
if image.width > self.width or image.height > self.height:
|
||||
return None
|
||||
def __init__(self, width=2048, height=2048, fmt=GL_RGBA, min_filter=GL_LINEAR, mag_filter=GL_LINEAR):
|
||||
self.texture = self.texture_class.create(width, height, GL_TEXTURE_2D, fmt, min_filter, mag_filter)
|
||||
self.allocator = image.atlas.Allocator(width, height)
|
||||
|
||||
if self.x + image.width > self.width:
|
||||
self.x = 0
|
||||
self.y += self.line_height + 1
|
||||
self.line_height = 0
|
||||
if self.y + image.height > self.height:
|
||||
return None
|
||||
|
||||
self.line_height = max(self.line_height, image.height)
|
||||
region = self.get_region(
|
||||
self.x, self.y, image.width, image.height)
|
||||
if image.width > 0:
|
||||
region.blit_into(image, 0, 0, 0)
|
||||
self.x += image.width + 1
|
||||
return region
|
||||
class GlyphTextureBin(image.atlas.TextureBin):
|
||||
"""Same as a TextureBin but allows you to specify filter of Glyphs."""
|
||||
|
||||
def add(self, img, fmt=GL_RGBA, min_filter=GL_LINEAR, mag_filter=GL_LINEAR, border=0):
|
||||
for atlas in list(self.atlases):
|
||||
try:
|
||||
return atlas.add(img, border)
|
||||
except image.atlas.AllocatorException:
|
||||
# Remove atlases that are no longer useful (so that their textures
|
||||
# can later be freed if the images inside them get collected).
|
||||
if img.width < 64 and img.height < 64:
|
||||
self.atlases.remove(atlas)
|
||||
|
||||
atlas = GlyphTextureAtlas(self.texture_width, self.texture_height, fmt, min_filter, mag_filter)
|
||||
self.atlases.append(atlas)
|
||||
return atlas.add(img, border)
|
||||
|
||||
|
||||
class GlyphRenderer:
|
||||
"""Abstract class for creating glyph images.
|
||||
"""
|
||||
|
||||
def __init__(self, font):
|
||||
pass
|
||||
|
||||
@ -282,7 +256,10 @@ class Font:
|
||||
"""
|
||||
texture_width = 512
|
||||
texture_height = 512
|
||||
# TODO: rewrite text.layout._default_shader_program to use GL_R8 or GL_RED
|
||||
|
||||
optimize_fit = True
|
||||
glyph_fit = 100
|
||||
|
||||
texture_internalformat = GL_RGBA
|
||||
texture_min_filter = GL_LINEAR
|
||||
texture_mag_filter = GL_LINEAR
|
||||
@ -292,10 +269,10 @@ class Font:
|
||||
descent = 0
|
||||
|
||||
glyph_renderer_class = GlyphRenderer
|
||||
texture_class = GlyphTextureAtlas
|
||||
texture_class = GlyphTextureBin
|
||||
|
||||
def __init__(self):
|
||||
self.textures = []
|
||||
self.texture_bin = None
|
||||
self.glyphs = {}
|
||||
|
||||
@property
|
||||
@ -346,27 +323,41 @@ class Font:
|
||||
|
||||
:rtype: `Glyph`
|
||||
"""
|
||||
glyph = None
|
||||
self._adapt_texture_size(image)
|
||||
for texture in self.textures:
|
||||
glyph = texture.fit(image)
|
||||
if glyph:
|
||||
break
|
||||
if not glyph:
|
||||
texture = self.texture_class.create(self.texture_width,
|
||||
self.texture_height,
|
||||
GL_TEXTURE_2D,
|
||||
self.texture_internalformat,
|
||||
self.texture_min_filter,
|
||||
self.texture_mag_filter)
|
||||
self.textures.insert(0, texture)
|
||||
glyph = texture.fit(image)
|
||||
if self.texture_bin is None:
|
||||
if self.optimize_fit:
|
||||
self.texture_width, self.texture_height = self._get_optimal_atlas_size(image)
|
||||
self.texture_bin = GlyphTextureBin(self.texture_width, self.texture_height)
|
||||
|
||||
glyph = self.texture_bin.add(
|
||||
image, self.texture_internalformat, self.texture_min_filter, self.texture_mag_filter, border=1)
|
||||
|
||||
return glyph
|
||||
|
||||
def _adapt_texture_size(self, image):
|
||||
if image.width > self.texture_width or image.height > self.texture_height:
|
||||
largest_dimension = max(image.width, image.height)
|
||||
self.texture_height = self.texture_width = largest_dimension * 4
|
||||
def _get_optimal_atlas_size(self, image_data):
|
||||
"""Return the smallest size of atlas that can fit around 100 glyphs based on the image_data provided."""
|
||||
# A texture glyph sheet should be able to handle all standard keyboard characters in one sheet.
|
||||
# 26 Alpha upper, 26 lower, 10 numbers, 33 symbols, space = around 96 characters. (Glyph Fit)
|
||||
aw, ah = self.texture_width, self.texture_height
|
||||
|
||||
atlas_size = None
|
||||
|
||||
# Just a fast check to get the smallest atlas size possible to fit.
|
||||
i = 0
|
||||
while not atlas_size:
|
||||
fit = ((aw - (image_data.width + 2)) // (image_data.width + 2) + 1) * (
|
||||
(ah - (image_data.height + 2)) // (image_data.height + 2) + 1)
|
||||
|
||||
if fit >= self.glyph_fit:
|
||||
atlas_size = (aw, ah)
|
||||
|
||||
if i % 2:
|
||||
aw *= 2
|
||||
else:
|
||||
ah *= 2
|
||||
|
||||
i += 1
|
||||
|
||||
return atlas_size
|
||||
|
||||
def get_glyphs(self, text):
|
||||
"""Create and return a list of Glyphs for `text`.
|
||||
@ -381,7 +372,7 @@ class Font:
|
||||
:rtype: list of `Glyph`
|
||||
"""
|
||||
glyph_renderer = None
|
||||
glyphs = [] # glyphs that are committed.
|
||||
glyphs = [] # glyphs that are committed.
|
||||
for c in get_grapheme_clusters(str(text)):
|
||||
# Get the glyph for 'c'. Hide tabs (Windows and Linux render
|
||||
# boxes)
|
||||
@ -420,8 +411,8 @@ class Font:
|
||||
:see: `GlyphString`
|
||||
"""
|
||||
glyph_renderer = None
|
||||
glyph_buffer = [] # next glyphs to be added, as soon as a BP is found
|
||||
glyphs = [] # glyphs that are committed.
|
||||
glyph_buffer = [] # next glyphs to be added, as soon as a BP is found
|
||||
glyphs = [] # glyphs that are committed.
|
||||
for c in text:
|
||||
if c == '\n':
|
||||
glyphs += glyph_buffer
|
||||
@ -433,11 +424,11 @@ class Font:
|
||||
glyph_renderer = self.glyph_renderer_class(self)
|
||||
self.glyphs[c] = glyph_renderer.render(c)
|
||||
glyph = self.glyphs[c]
|
||||
|
||||
|
||||
# Add to holding buffer and measure
|
||||
glyph_buffer.append(glyph)
|
||||
width -= glyph.advance
|
||||
|
||||
|
||||
# If over width and have some committed glyphs, finish.
|
||||
if width <= 0 < len(glyphs):
|
||||
break
|
||||
|
@ -2,6 +2,7 @@ import copy
|
||||
|
||||
import pyglet
|
||||
from pyglet.font import base
|
||||
from pyglet.util import debug_print
|
||||
from pyglet.image.codecs.wic import IWICBitmap, GUID_WICPixelFormat32bppBGR, WICDecoder, GUID_WICPixelFormat32bppBGRA, \
|
||||
GUID_WICPixelFormat32bppPBGRA
|
||||
|
||||
@ -32,6 +33,7 @@ except OSError as err:
|
||||
# Doesn't exist? Should stop import of library.
|
||||
pass
|
||||
|
||||
_debug_font = debug_print('debug_font')
|
||||
|
||||
def DWRITE_MAKE_OPENTYPE_TAG(a, b, c, d):
|
||||
return ord(d) << 24 | ord(c) << 16 | ord(b) << 8 | ord(a)
|
||||
@ -101,6 +103,32 @@ name_to_stretch = {"undefined": DWRITE_FONT_STRETCH_UNDEFINED,
|
||||
"extraexpanded": DWRITE_FONT_STRETCH_EXTRA_EXPANDED,
|
||||
}
|
||||
|
||||
DWRITE_GLYPH_IMAGE_FORMATS = c_int
|
||||
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_NONE = 0x00000000
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE = 0x00000001
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_CFF = 0x00000002
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_COLR = 0x00000004
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_SVG = 0x00000008
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_PNG = 0x00000010
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_JPEG = 0x00000020
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_TIFF = 0x00000040
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8 = 0x00000080
|
||||
|
||||
DWRITE_MEASURING_MODE = UINT
|
||||
DWRITE_MEASURING_MODE_NATURAL = 0
|
||||
DWRITE_MEASURING_MODE_GDI_CLASSIC = 1
|
||||
DWRITE_MEASURING_MODE_GDI_NATURAL = 2
|
||||
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_ALL = DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_CFF | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_COLR | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_SVG | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_PNG | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_JPEG | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_TIFF | \
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8
|
||||
|
||||
DWRITE_FONT_STYLE = UINT
|
||||
DWRITE_FONT_STYLE_NORMAL = 0
|
||||
DWRITE_FONT_STYLE_OBLIQUE = 1
|
||||
@ -118,6 +146,33 @@ UINT32 = c_uint32
|
||||
UINT64 = c_uint64
|
||||
|
||||
|
||||
class D2D_POINT_2F(Structure):
|
||||
_fields_ = (
|
||||
('x', FLOAT),
|
||||
('y', FLOAT),
|
||||
)
|
||||
|
||||
|
||||
class D2D1_RECT_F(Structure):
|
||||
_fields_ = (
|
||||
('left', FLOAT),
|
||||
('top', FLOAT),
|
||||
('right', FLOAT),
|
||||
('bottom', FLOAT),
|
||||
)
|
||||
|
||||
|
||||
class D2D1_COLOR_F(Structure):
|
||||
_fields_ = (
|
||||
('r', FLOAT),
|
||||
('g', FLOAT),
|
||||
('b', FLOAT),
|
||||
('a', FLOAT),
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
class DWRITE_TEXT_METRICS(ctypes.Structure):
|
||||
_fields_ = (
|
||||
('left', FLOAT),
|
||||
@ -197,7 +252,7 @@ class IDWriteFontFace(com.pIUnknown):
|
||||
('GetMetrics',
|
||||
com.METHOD(c_void, POINTER(DWRITE_FONT_METRICS))),
|
||||
('GetGlyphCount',
|
||||
com.STDMETHOD()),
|
||||
com.METHOD(UINT16)),
|
||||
('GetDesignGlyphMetrics',
|
||||
com.STDMETHOD(POINTER(UINT16), UINT32, POINTER(DWRITE_GLYPH_METRICS), BOOL)),
|
||||
('GetGlyphIndices',
|
||||
@ -249,6 +304,18 @@ class IDWriteFontFace1(IDWriteFontFace, com.pIUnknown):
|
||||
]
|
||||
|
||||
|
||||
class DWRITE_GLYPH_RUN(ctypes.Structure):
|
||||
_fields_ = (
|
||||
('fontFace', IDWriteFontFace),
|
||||
('fontEmSize', FLOAT),
|
||||
('glyphCount', UINT32),
|
||||
('glyphIndices', POINTER(UINT16)),
|
||||
('glyphAdvances', POINTER(FLOAT)),
|
||||
('glyphOffsets', POINTER(DWRITE_GLYPH_OFFSET)),
|
||||
('isSideways', BOOL),
|
||||
('bidiLevel', UINT32),
|
||||
)
|
||||
|
||||
DWRITE_SCRIPT_SHAPES = UINT
|
||||
DWRITE_SCRIPT_SHAPES_DEFAULT = 0
|
||||
|
||||
@ -369,6 +436,7 @@ class TextAnalysis(com.COMObject):
|
||||
self._textlength = text_length
|
||||
self._glyphstart = 0
|
||||
self._glyphcount = 0
|
||||
self._ptrs.clear()
|
||||
|
||||
self._start_run = Run()
|
||||
self._start_run.text_length = text_length
|
||||
@ -395,7 +463,7 @@ class TextAnalysis(com.COMObject):
|
||||
return 0
|
||||
# return 0x80004001
|
||||
|
||||
def GetTextBeforePosition(self, this):
|
||||
def GetTextBeforePosition(self, this, textPosition, textString, textLength):
|
||||
raise Exception("Currently not implemented.")
|
||||
|
||||
def GetTextAtPosition(self, this, textPosition, textString, textLength):
|
||||
@ -405,6 +473,7 @@ class TextAnalysis(com.COMObject):
|
||||
# textPosition - The index of the first character of the text to retrieve.
|
||||
# textString - The pointer to the first character of text at the index requested.
|
||||
# textLength - The characters available at/after the textString pointer (string length).
|
||||
|
||||
if textPosition >= self._textlength:
|
||||
self._no_ptr = c_wchar_p(None)
|
||||
textString[0] = self._no_ptr
|
||||
@ -658,9 +727,9 @@ class IDWriteTextFormat(com.pIUnknown):
|
||||
('GetFontCollection',
|
||||
com.STDMETHOD()),
|
||||
('GetFontFamilyNameLength',
|
||||
com.STDMETHOD()),
|
||||
com.STDMETHOD(UINT32, POINTER(UINT32))),
|
||||
('GetFontFamilyName',
|
||||
com.STDMETHOD()),
|
||||
com.STDMETHOD(UINT32, c_wchar_p, UINT32)),
|
||||
('GetFontWeight',
|
||||
com.STDMETHOD()),
|
||||
('GetFontStyle',
|
||||
@ -740,9 +809,9 @@ class IDWriteTextLayout(IDWriteTextFormat, com.pIUnknown):
|
||||
('GetFontCollection2',
|
||||
com.STDMETHOD()),
|
||||
('GetFontFamilyNameLength2',
|
||||
com.STDMETHOD()),
|
||||
com.STDMETHOD(UINT32, POINTER(UINT32), c_void_p)),
|
||||
('GetFontFamilyName2',
|
||||
com.STDMETHOD()),
|
||||
com.STDMETHOD(UINT32, c_wchar_p, UINT32, c_void_p)),
|
||||
('GetFontWeight2',
|
||||
com.STDMETHOD(UINT32, POINTER(DWRITE_FONT_WEIGHT), POINTER(DWRITE_TEXT_RANGE))),
|
||||
('GetFontStyle2',
|
||||
@ -1055,7 +1124,7 @@ class IDWriteFactory1(IDWriteFactory, com.pIUnknown):
|
||||
class IDWriteFontFallback(com.pIUnknown):
|
||||
_methods_ = [
|
||||
('MapCharacters',
|
||||
com.STDMETHOD(POINTER(IDWriteTextAnalysisSource), UINT32, UINT32, POINTER(IDWriteFontCollection), c_wchar_p,
|
||||
com.STDMETHOD(POINTER(IDWriteTextAnalysisSource), UINT32, UINT32, IDWriteFontCollection, c_wchar_p,
|
||||
DWRITE_FONT_WEIGHT, DWRITE_FONT_STYLE, DWRITE_FONT_STRETCH, POINTER(UINT32),
|
||||
POINTER(IDWriteFont),
|
||||
POINTER(FLOAT))),
|
||||
@ -1138,14 +1207,24 @@ class IDWriteFactory3(IDWriteFactory2, com.pIUnknown):
|
||||
com.STDMETHOD()),
|
||||
('GetFontDownloadQueue',
|
||||
com.STDMETHOD()),
|
||||
('GetSystemFontSet',
|
||||
com.STDMETHOD()),
|
||||
#('GetSystemFontSet',
|
||||
# com.STDMETHOD()),
|
||||
]
|
||||
|
||||
|
||||
class IDWriteColorGlyphRunEnumerator1(com.pIUnknown):
|
||||
_methods_ = [
|
||||
('MoveNext',
|
||||
com.STDMETHOD()),
|
||||
('GetCurrentRun',
|
||||
com.STDMETHOD()),
|
||||
]
|
||||
|
||||
class IDWriteFactory4(IDWriteFactory3, com.pIUnknown):
|
||||
_methods_ = [
|
||||
('TranslateColorGlyphRun',
|
||||
('TranslateColorGlyphRun4', # Renamed to prevent clash from previous factories.
|
||||
com.STDMETHOD(D2D_POINT_2F, DWRITE_GLYPH_RUN, c_void_p, DWRITE_GLYPH_IMAGE_FORMATS, DWRITE_MEASURING_MODE, c_void_p, UINT32, POINTER(IDWriteColorGlyphRunEnumerator1))),
|
||||
('ComputeGlyphOrigins_',
|
||||
com.STDMETHOD()),
|
||||
('ComputeGlyphOrigins',
|
||||
com.STDMETHOD()),
|
||||
@ -1180,49 +1259,12 @@ class IDWriteFactory5(IDWriteFactory4, IDWriteFactory3, IDWriteFactory2, IDWrite
|
||||
]
|
||||
|
||||
|
||||
class DWRITE_GLYPH_RUN(ctypes.Structure):
|
||||
_fields_ = (
|
||||
('fontFace', IDWriteFontFace),
|
||||
('fontEmSize', FLOAT),
|
||||
('glyphCount', UINT32),
|
||||
('glyphIndices', POINTER(UINT16)),
|
||||
('glyphAdvances', POINTER(FLOAT)),
|
||||
('glyphOffsets', POINTER(DWRITE_GLYPH_OFFSET)),
|
||||
('isSideways', BOOL),
|
||||
('bidiLevel', UINT32),
|
||||
)
|
||||
|
||||
|
||||
DWriteCreateFactory = dwrite_lib.DWriteCreateFactory
|
||||
DWriteCreateFactory.restype = HRESULT
|
||||
DWriteCreateFactory.argtypes = [DWRITE_FACTORY_TYPE, com.REFIID, POINTER(com.pIUnknown)]
|
||||
|
||||
|
||||
class D2D_POINT_2F(Structure):
|
||||
_fields_ = (
|
||||
('x', FLOAT),
|
||||
('y', FLOAT),
|
||||
)
|
||||
|
||||
|
||||
class D2D1_RECT_F(Structure):
|
||||
_fields_ = (
|
||||
('left', FLOAT),
|
||||
('top', FLOAT),
|
||||
('right', FLOAT),
|
||||
('bottom', FLOAT),
|
||||
)
|
||||
|
||||
|
||||
class D2D1_COLOR_F(Structure):
|
||||
_fields_ = (
|
||||
('r', FLOAT),
|
||||
('g', FLOAT),
|
||||
('b', FLOAT),
|
||||
('a', FLOAT),
|
||||
)
|
||||
|
||||
|
||||
class ID2D1Resource(com.pIUnknown):
|
||||
_methods_ = [
|
||||
('GetFactory',
|
||||
@ -1288,11 +1330,6 @@ D2D1_DRAW_TEXT_OPTIONS_DISABLE_COLOR_BITMAP_SNAPPING = 0x00000008
|
||||
D2D1_DRAW_TEXT_OPTIONS_NONE = 0x00000000
|
||||
D2D1_DRAW_TEXT_OPTIONS_FORCE_DWORD = 0xffffffff
|
||||
|
||||
DWRITE_MEASURING_MODE = UINT
|
||||
DWRITE_MEASURING_MODE_NATURAL = 0
|
||||
DWRITE_MEASURING_MODE_GDI_CLASSIC = 1
|
||||
DWRITE_MEASURING_MODE_GDI_NATURAL = 2
|
||||
|
||||
|
||||
class D2D1_PIXEL_FORMAT(Structure):
|
||||
_fields_ = (
|
||||
@ -1533,10 +1570,13 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
width, height = int(math.ceil(layout_metrics.width)), int(math.ceil(layout_metrics.height))
|
||||
|
||||
bitmap = IWICBitmap()
|
||||
wic_decoder._factory.CreateBitmap(width, height,
|
||||
GUID_WICPixelFormat32bppPBGRA,
|
||||
WICBitmapCacheOnDemand,
|
||||
byref(bitmap))
|
||||
wic_decoder._factory.CreateBitmap(
|
||||
width,
|
||||
height,
|
||||
GUID_WICPixelFormat32bppPBGRA,
|
||||
WICBitmapCacheOnDemand,
|
||||
byref(bitmap)
|
||||
)
|
||||
|
||||
rt = ID2D1RenderTarget()
|
||||
d2d_factory.CreateWicBitmapRenderTarget(bitmap, default_target_properties, byref(rt))
|
||||
@ -1549,14 +1589,11 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
|
||||
rt.CreateSolidColorBrush(white, None, byref(self._brush))
|
||||
|
||||
# This offsets the characters if needed.
|
||||
point = D2D_POINT_2F(0, 0)
|
||||
|
||||
rt.BeginDraw()
|
||||
|
||||
rt.Clear(transparent)
|
||||
|
||||
rt.DrawTextLayout(point,
|
||||
rt.DrawTextLayout(no_offset,
|
||||
text_layout,
|
||||
self._brush,
|
||||
self.draw_options)
|
||||
@ -1569,8 +1606,7 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
|
||||
return image_data
|
||||
|
||||
def get_string_info(self, text):
|
||||
|
||||
def get_string_info(self, text, font_face):
|
||||
"""Converts a string of text into a list of indices and advances used for shaping."""
|
||||
text_length = len(text.encode('utf-16-le')) // 2
|
||||
|
||||
@ -1591,44 +1627,47 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
glyph_props = (DWRITE_SHAPING_GLYPH_PROPERTIES * max_glyph_size)()
|
||||
actual_count = UINT32()
|
||||
|
||||
self._analyzer.GetGlyphs(text_buffer,
|
||||
length,
|
||||
self.font.font_face,
|
||||
False, # sideways
|
||||
False, # righttoleft
|
||||
self._text_analysis._script, # scriptAnalysis
|
||||
None, # localName
|
||||
None, # numberSub
|
||||
None, # typo features
|
||||
None, # feature range length
|
||||
0, # feature range
|
||||
max_glyph_size, # max glyph size
|
||||
clusters, # cluster map
|
||||
text_props, # text props
|
||||
indices, # glyph indices
|
||||
glyph_props, # glyph pops
|
||||
byref(actual_count) # glyph count
|
||||
)
|
||||
self._analyzer.GetGlyphs(
|
||||
text_buffer,
|
||||
length,
|
||||
font_face,
|
||||
False, # sideways
|
||||
False, # righttoleft
|
||||
self._text_analysis._script, # scriptAnalysis
|
||||
None, # localName
|
||||
None, # numberSub
|
||||
None, # typo features
|
||||
None, # feature range length
|
||||
0, # feature range
|
||||
max_glyph_size, # max glyph size
|
||||
clusters, # cluster map
|
||||
text_props, # text props
|
||||
indices, # glyph indices
|
||||
glyph_props, # glyph pops
|
||||
byref(actual_count) # glyph count
|
||||
)
|
||||
|
||||
advances = (FLOAT * length)()
|
||||
offsets = (DWRITE_GLYPH_OFFSET * length)()
|
||||
self._analyzer.GetGlyphPlacements(text_buffer,
|
||||
clusters,
|
||||
text_props,
|
||||
text_length,
|
||||
indices,
|
||||
glyph_props,
|
||||
actual_count,
|
||||
self.font.font_face,
|
||||
self.font._font_metrics.designUnitsPerEm,
|
||||
False, False,
|
||||
self._text_analysis._script,
|
||||
self.font.locale,
|
||||
None,
|
||||
None,
|
||||
0,
|
||||
advances,
|
||||
offsets)
|
||||
self._analyzer.GetGlyphPlacements(
|
||||
text_buffer,
|
||||
clusters,
|
||||
text_props,
|
||||
text_length,
|
||||
indices,
|
||||
glyph_props,
|
||||
actual_count,
|
||||
font_face,
|
||||
self.font._font_metrics.designUnitsPerEm,
|
||||
False, False,
|
||||
self._text_analysis._script,
|
||||
self.font.locale,
|
||||
None,
|
||||
None,
|
||||
0,
|
||||
advances,
|
||||
offsets
|
||||
)
|
||||
|
||||
return text_buffer, actual_count.value, indices, advances, offsets, clusters
|
||||
|
||||
@ -1674,6 +1713,26 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
)
|
||||
return run
|
||||
|
||||
def is_color_run(self, run):
|
||||
"""Will return True if the run contains a colored glyph."""
|
||||
enumerator = IDWriteColorGlyphRunEnumerator1()
|
||||
try:
|
||||
color = self.font._write_factory.TranslateColorGlyphRun4(no_offset,
|
||||
run,
|
||||
None,
|
||||
DWRITE_GLYPH_IMAGE_FORMATS_ALL,
|
||||
DWRITE_MEASURING_MODE_NATURAL,
|
||||
None,
|
||||
0,
|
||||
enumerator)
|
||||
|
||||
return True
|
||||
except OSError:
|
||||
# HRESULT returns -2003283956 (DWRITE_E_NOCOLOR) if no color run is detected.
|
||||
pass
|
||||
|
||||
return False
|
||||
|
||||
def render_single_glyph(self, font_face, indice, advance, offset, metrics):
|
||||
"""Renders a single glyph using D2D DrawGlyphRun"""
|
||||
glyph_width, glyph_height, lsb, font_advance, bsb = metrics # We use a shaped advance instead of the fonts.
|
||||
@ -1682,13 +1741,19 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
new_indice = (UINT16 * 1)(indice)
|
||||
new_advance = (FLOAT * 1)(advance)
|
||||
|
||||
run = self._get_single_glyph_run(font_face,
|
||||
self.font._real_size,
|
||||
new_indice, # indice,
|
||||
new_advance, # advance,
|
||||
pointer(offset), # offset,
|
||||
False,
|
||||
False)
|
||||
run = self._get_single_glyph_run(
|
||||
font_face,
|
||||
self.font._real_size,
|
||||
new_indice, # indice,
|
||||
new_advance, # advance,
|
||||
pointer(offset), # offset,
|
||||
False,
|
||||
False
|
||||
)
|
||||
|
||||
# If it's colored, return to render it using layout.
|
||||
if self.draw_options & D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT and self.is_color_run(run):
|
||||
return None
|
||||
|
||||
render_width = int(math.ceil((glyph_width) * self.font.font_scale_ratio))
|
||||
render_offset_x = int(math.floor(abs(lsb * self.font.font_scale_ratio)))
|
||||
@ -1708,6 +1773,7 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
baseline_offset = D2D_POINT_2F(-render_offset_x - offset.advanceOffset,
|
||||
self.font.ascent + offset.ascenderOffset)
|
||||
|
||||
|
||||
self._render_target.BeginDraw()
|
||||
|
||||
self._render_target.Clear(transparent)
|
||||
@ -1738,8 +1804,13 @@ class DirectWriteGlyphRenderer(base.GlyphRenderer):
|
||||
layout_metrics = DWRITE_TEXT_METRICS()
|
||||
text_layout.GetMetrics(byref(layout_metrics))
|
||||
|
||||
self._create_bitmap(int(math.ceil(layout_metrics.width)),
|
||||
int(math.ceil(layout_metrics.height)))
|
||||
width = int(math.ceil(layout_metrics.width))
|
||||
height = int(math.ceil(layout_metrics.height))
|
||||
|
||||
if width == 0 or height == 0:
|
||||
return None
|
||||
|
||||
self._create_bitmap(width, height)
|
||||
|
||||
# This offsets the characters if needed.
|
||||
point = D2D_POINT_2F(0, 0)
|
||||
@ -1806,6 +1877,7 @@ class Win32DirectWriteFont(base.Font):
|
||||
_default_name = 'Segoe UI' # Default font for Win7/10.
|
||||
|
||||
_glyph_renderer = None
|
||||
_empty_glyph = None
|
||||
|
||||
glyph_renderer_class = DirectWriteGlyphRenderer
|
||||
texture_internalformat = pyglet.gl.GL_RGBA
|
||||
@ -1867,24 +1939,28 @@ class Win32DirectWriteFont(base.Font):
|
||||
# Create the text format this font will use permanently.
|
||||
# Could technically be recreated, but will keep to be inline with other font objects.
|
||||
self._text_format = IDWriteTextFormat()
|
||||
self._write_factory.CreateTextFormat(self._name,
|
||||
self._collection,
|
||||
self._weight,
|
||||
self._style,
|
||||
self._stretch,
|
||||
self._real_size,
|
||||
create_unicode_buffer(self.locale),
|
||||
byref(self._text_format))
|
||||
self._write_factory.CreateTextFormat(
|
||||
self._name,
|
||||
self._collection,
|
||||
self._weight,
|
||||
self._style,
|
||||
self._stretch,
|
||||
self._real_size,
|
||||
create_unicode_buffer(self.locale),
|
||||
byref(self._text_format)
|
||||
)
|
||||
|
||||
# All this work just to get a font face and its metrics!
|
||||
font_family = IDWriteFontFamily1()
|
||||
self._collection.GetFontFamily(self._font_index, byref(font_family))
|
||||
|
||||
write_font = IDWriteFont()
|
||||
font_family.GetFirstMatchingFont(self._weight,
|
||||
self._stretch,
|
||||
self._style,
|
||||
byref(write_font))
|
||||
font_family.GetFirstMatchingFont(
|
||||
self._weight,
|
||||
self._stretch,
|
||||
self._style,
|
||||
byref(write_font)
|
||||
)
|
||||
|
||||
font_face = IDWriteFontFace()
|
||||
write_font.CreateFontFace(byref(font_face))
|
||||
@ -1903,6 +1979,14 @@ class Win32DirectWriteFont(base.Font):
|
||||
self.max_glyph_height = (self._font_metrics.ascent + self._font_metrics.descent) * self.font_scale_ratio
|
||||
self.line_gap = self._font_metrics.lineGap * self.font_scale_ratio
|
||||
|
||||
self._fallback = None
|
||||
if WINDOWS_8_1_OR_GREATER:
|
||||
self._fallback = IDWriteFontFallback()
|
||||
self._write_factory.GetSystemFontFallback(byref(self._fallback))
|
||||
else:
|
||||
assert _debug_font("Windows 8.1+ is required for font fallback. Colored glyphs cannot be omitted.")
|
||||
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
@ -1928,18 +2012,121 @@ class Win32DirectWriteFont(base.Font):
|
||||
"""This takes the existing glyph texture and puts it into a new Glyph with a new advance.
|
||||
Texture memory is shared between both glyphs."""
|
||||
new_glyph = base.Glyph(glyph.x, glyph.y, glyph.z, glyph.width, glyph.height, glyph.owner)
|
||||
new_glyph.set_bearings(glyph.baseline,
|
||||
glyph.lsb,
|
||||
advance * self.font_scale_ratio,
|
||||
offset.advanceOffset * self.font_scale_ratio,
|
||||
offset.ascenderOffset * self.font_scale_ratio)
|
||||
new_glyph.set_bearings(
|
||||
glyph.baseline,
|
||||
glyph.lsb,
|
||||
advance * self.font_scale_ratio,
|
||||
offset.advanceOffset * self.font_scale_ratio,
|
||||
offset.ascenderOffset * self.font_scale_ratio
|
||||
)
|
||||
return new_glyph
|
||||
|
||||
def _render_layout_glyph(self, text_buffer, i, clusters, check_color=True):
|
||||
formatted_clusters = clusters[:]
|
||||
|
||||
# Some glyphs can be more than 1 char. We use the clusters to determine how many of an index exist.
|
||||
text_length = formatted_clusters.count(i)
|
||||
|
||||
# Amount of glyphs don't always match 1:1 with text as some can be substituted or omitted. Get
|
||||
# actual text buffer index.
|
||||
text_index = formatted_clusters.index(i)
|
||||
|
||||
# Get actual text based on the index and length.
|
||||
actual_text = text_buffer[text_index:text_index + text_length]
|
||||
|
||||
# Since we can't store as indice 0 without overriding, we have to store as text
|
||||
if actual_text not in self.glyphs:
|
||||
glyph = self._glyph_renderer.render_using_layout(text_buffer[text_index:text_index + text_length])
|
||||
if glyph:
|
||||
if check_color and self._glyph_renderer.draw_options & D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT:
|
||||
fb_ff = self._get_fallback_font_face(text_index, text_length)
|
||||
if fb_ff:
|
||||
glyph.colored = self.is_fallback_str_colored(fb_ff, actual_text)
|
||||
else:
|
||||
glyph = self._empty_glyph
|
||||
|
||||
self.glyphs[actual_text] = glyph
|
||||
|
||||
return self.glyphs[actual_text]
|
||||
|
||||
def is_fallback_str_colored(self, font_face, text):
|
||||
indice = UINT16()
|
||||
code_points = (UINT32 * len(text))(*[ord(c) for c in text])
|
||||
|
||||
font_face.GetGlyphIndices(code_points, len(text), byref(indice))
|
||||
|
||||
new_indice = (UINT16 * 1)(indice)
|
||||
new_advance = (FLOAT * 1)(100) # dummy
|
||||
offset = (DWRITE_GLYPH_OFFSET * 1)()
|
||||
|
||||
run = self._glyph_renderer._get_single_glyph_run(
|
||||
font_face,
|
||||
self._real_size,
|
||||
new_indice, # indice,
|
||||
new_advance, # advance,
|
||||
offset, # offset,
|
||||
False,
|
||||
False
|
||||
)
|
||||
|
||||
return self._glyph_renderer.is_color_run(run)
|
||||
|
||||
def _get_fallback_font_face(self, text_index, text_length):
|
||||
if WINDOWS_8_1_OR_GREATER:
|
||||
out_length = UINT32()
|
||||
fb_font = IDWriteFont()
|
||||
scale = FLOAT()
|
||||
|
||||
self._fallback.MapCharacters(
|
||||
self._glyph_renderer._text_analysis,
|
||||
text_index,
|
||||
text_length,
|
||||
None,
|
||||
None,
|
||||
self._weight,
|
||||
self._style,
|
||||
self._stretch,
|
||||
byref(out_length),
|
||||
byref(fb_font),
|
||||
byref(scale)
|
||||
)
|
||||
|
||||
if fb_font:
|
||||
fb_font_face = IDWriteFontFace()
|
||||
fb_font.CreateFontFace(byref(fb_font_face))
|
||||
|
||||
return fb_font_face
|
||||
|
||||
return None
|
||||
|
||||
def get_glyphs_no_shape(self, text):
|
||||
"""This differs in that it does not attempt to shape the text at all. May be useful in cases where your font
|
||||
has no special shaping requirements, spacing is the same, or some other reason where faster performance is
|
||||
wanted and you can get away with this."""
|
||||
if not self._glyph_renderer:
|
||||
self._glyph_renderer = self.glyph_renderer_class(self)
|
||||
self._empty_glyph = self._glyph_renderer.render_using_layout(" ")
|
||||
|
||||
glyphs = []
|
||||
for c in text:
|
||||
if c == '\t':
|
||||
c = ' '
|
||||
|
||||
if c not in self.glyphs:
|
||||
self.glyphs[c] = self._glyph_renderer.render_using_layout(c)
|
||||
if not self.glyphs[c]:
|
||||
self.glyphs[c] = self._empty_glyph
|
||||
|
||||
glyphs.append(self.glyphs[c])
|
||||
|
||||
return glyphs
|
||||
|
||||
def get_glyphs(self, text):
|
||||
if not self._glyph_renderer:
|
||||
self._glyph_renderer = self.glyph_renderer_class(self)
|
||||
self._empty_glyph = self._glyph_renderer.render_using_layout(" ")
|
||||
|
||||
text_buffer, actual_count, indices, advances, offsets, clusters = self._glyph_renderer.get_string_info(text)
|
||||
text_buffer, actual_count, indices, advances, offsets, clusters = self._glyph_renderer.get_string_info(text, self.font_face)
|
||||
|
||||
metrics = self._glyph_renderer.get_glyph_metrics(self.font_face, indices, actual_count)
|
||||
|
||||
@ -1950,24 +2137,8 @@ class Win32DirectWriteFont(base.Font):
|
||||
# If an indice is 0, it will return no glyph. In this case we attempt to render leveraging
|
||||
# the built in text layout from MS. Which depending on version can use fallback fonts and other tricks
|
||||
# to possibly get something of use.
|
||||
formatted_clusters = clusters[:]
|
||||
|
||||
# Some glyphs can be more than 1 char. We use the clusters to determine how many of an index exist.
|
||||
text_length = formatted_clusters.count(i)
|
||||
|
||||
# Amount of glyphs don't always match 1:1 with text as some can be substituted or omitted. Get
|
||||
# actual text buffer index.
|
||||
text_index = formatted_clusters.index(i)
|
||||
|
||||
# Get actual text based on the index and length.
|
||||
actual_text = text_buffer[text_index:text_index + text_length]
|
||||
|
||||
# Since we can't store as indice 0 without overriding, we have to store as text
|
||||
if actual_text not in self.glyphs:
|
||||
glyph = self._glyph_renderer.render_using_layout(text_buffer[text_index:text_index + text_length])
|
||||
self.glyphs[actual_text] = glyph
|
||||
|
||||
glyphs.append(self.glyphs[actual_text])
|
||||
glyph = self._render_layout_glyph(text_buffer, i, clusters)
|
||||
glyphs.append(glyph)
|
||||
else:
|
||||
# Glyphs can vary depending on shaping. We will cache it by indice, advance, and offset.
|
||||
# Possible to just cache without offset and set them each time. This may be faster?
|
||||
@ -1981,6 +2152,10 @@ class Win32DirectWriteFont(base.Font):
|
||||
else:
|
||||
glyph = self._glyph_renderer.render_single_glyph(self.font_face, indice, advances[i], offsets[i],
|
||||
metrics[i])
|
||||
if glyph is None: # Will only return None if a color glyph is found. Use DW to render it directly.
|
||||
glyph = self._render_layout_glyph(text_buffer, i, clusters, check_color=False)
|
||||
glyph.colored = True
|
||||
|
||||
self.glyphs[indice] = glyph
|
||||
self._advance_cache[(indice, advances[i], offsets[i].advanceOffset, offsets[i].ascenderOffset)] = glyph
|
||||
|
||||
@ -2188,3 +2363,8 @@ WICBitmapCacheOnLoad = 0x2
|
||||
|
||||
transparent = D2D1_COLOR_F(0.0, 0.0, 0.0, 0.0)
|
||||
white = D2D1_COLOR_F(1.0, 1.0, 1.0, 1.0)
|
||||
no_offset = D2D_POINT_2F(0, 0)
|
||||
|
||||
# If we are not shaping, monkeypatch to no shape function.
|
||||
if pyglet.options["win32_disable_shaping"]:
|
||||
Win32DirectWriteFont.get_glyphs = Win32DirectWriteFont.get_glyphs_no_shape
|
@ -647,6 +647,8 @@ class Group:
|
||||
self.parent.unset_state_recursive()
|
||||
|
||||
|
||||
# Example Groups.
|
||||
|
||||
class ShaderGroup(Group):
|
||||
def __init__(self, program, order=0, parent=None):
|
||||
super().__init__(order, parent)
|
||||
@ -674,8 +676,6 @@ class TextureGroup(Group):
|
||||
Texture groups are equal if their textures' targets and names are equal.
|
||||
"""
|
||||
|
||||
# Don't use this, create your own group classes that are more specific.
|
||||
# This is just an example.
|
||||
def __init__(self, texture, order=0, parent=None):
|
||||
"""Create a texture group.
|
||||
|
||||
@ -687,7 +687,7 @@ class TextureGroup(Group):
|
||||
`parent` : `~pyglet.graphics.Group`
|
||||
Parent group.
|
||||
"""
|
||||
super(TextureGroup, self).__init__(order, parent)
|
||||
super().__init__(order, parent)
|
||||
self.texture = texture
|
||||
|
||||
def set_state(self):
|
||||
@ -711,7 +711,7 @@ class TextureGroup(Group):
|
||||
return '%s(id=%d)' % (self.__class__.__name__, self.texture.id)
|
||||
|
||||
|
||||
#: The default Shaders
|
||||
# The default Shader source:
|
||||
|
||||
_vertex_source = """#version 330 core
|
||||
in vec3 position;
|
||||
|
@ -216,7 +216,7 @@ class Shader:
|
||||
raise GLException("The {0} shader failed to compile. "
|
||||
"\n{1}".format(self.type, self._get_shader_log(shader_id)))
|
||||
elif _debug_gl_shaders:
|
||||
print(f"Shader '{shader_id}' compilation log: '{self._get_shader_log(shader_id)}'")
|
||||
print(self._get_shader_log(shader_id))
|
||||
|
||||
self._id = shader_id
|
||||
|
||||
@ -233,7 +233,7 @@ class Shader:
|
||||
return ("OpenGL returned the following message when compiling the {0} shader: "
|
||||
"\n{1}".format(self.type, result_str.value.decode('utf8')))
|
||||
else:
|
||||
return "Compiled {0} shader successfully.".format(self.type)
|
||||
return f"{self.type.capitalize()} Shader '{shader_id}' compiled successfully."
|
||||
|
||||
def __del__(self):
|
||||
try:
|
||||
@ -265,8 +265,9 @@ class ShaderProgram:
|
||||
"""
|
||||
assert shaders, "At least one Shader object is required."
|
||||
self._id = self._link_program(shaders)
|
||||
if _debug_gl_shaders:
|
||||
print(self._get_program_log())
|
||||
self._context = pyglet.gl.current_context
|
||||
|
||||
# Query if Direct State Access is available:
|
||||
self._dsa = gl_info.have_version(4, 1) or gl_info.have_extension("GL_ARB_separate_shader_objects")
|
||||
|
||||
@ -274,9 +275,6 @@ class ShaderProgram:
|
||||
self._uniforms = self._introspect_uniforms()
|
||||
self._uniform_blocks = self._introspect_uniform_blocks()
|
||||
|
||||
if _debug_gl_shaders:
|
||||
print(self._get_program_log())
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self._id
|
||||
@ -342,7 +340,6 @@ class ShaderProgram:
|
||||
raise Exception(f"A Uniform with the name `{key}` was not found.\n"
|
||||
f"The spelling may be incorrect, or if not in use it "
|
||||
f"may have been optimized out by the OpenGL driver.")
|
||||
|
||||
try:
|
||||
uniform.set(value)
|
||||
except GLException:
|
||||
@ -352,8 +349,9 @@ class ShaderProgram:
|
||||
try:
|
||||
uniform = self._uniforms[item]
|
||||
except KeyError:
|
||||
raise Exception("Uniform with the name `{0}` was not found.".format(item))
|
||||
|
||||
raise Exception(f"A Uniform with the name `{item}` was not found.\n"
|
||||
f"The spelling may be incorrect, or if not in use it "
|
||||
f"may have been optimized out by the OpenGL driver.")
|
||||
try:
|
||||
return uniform.get()
|
||||
except GLException:
|
||||
@ -376,7 +374,7 @@ class ShaderProgram:
|
||||
|
||||
if _debug_gl_shaders:
|
||||
for attribute in attributes.values():
|
||||
print(f"Found attribute: {attribute}")
|
||||
print(f" Found attribute: {attribute}")
|
||||
|
||||
return attributes
|
||||
|
||||
@ -391,8 +389,8 @@ class ShaderProgram:
|
||||
uniforms[u_name] = _Uniform(program, u_name, u_type, loc, self._dsa)
|
||||
|
||||
if _debug_gl_shaders:
|
||||
for uniform in self._uniforms.values():
|
||||
print(f"Found uniform: {uniform}")
|
||||
for uniform in uniforms.values():
|
||||
print(f" Found uniform: {uniform}")
|
||||
|
||||
return uniforms
|
||||
|
||||
@ -428,6 +426,10 @@ class ShaderProgram:
|
||||
|
||||
uniform_blocks[name] = UniformBlock(self, name, index, block_data_size.value, uniforms)
|
||||
|
||||
if _debug_gl_shaders:
|
||||
for block in uniform_blocks.values():
|
||||
print(f" Found uniform block: {block}")
|
||||
|
||||
return uniform_blocks
|
||||
|
||||
def _get_uniform_block_name(self, index):
|
||||
|
@ -188,7 +188,8 @@ class BufferObject(AbstractBuffer):
|
||||
self.id = buffer_id.value
|
||||
|
||||
glBindBuffer(target, self.id)
|
||||
glBufferData(target, self.size, None, self.usage)
|
||||
data = (GLubyte * self.size)()
|
||||
glBufferData(target, self.size, data, self.usage)
|
||||
|
||||
def invalidate(self):
|
||||
glBufferData(self.target, self.size, None, self.usage)
|
||||
|
@ -141,8 +141,9 @@ from pyglet.gl import gl_info
|
||||
from pyglet.util import asbytes
|
||||
|
||||
from .codecs import ImageEncodeException, ImageDecodeException
|
||||
from .codecs import add_default_image_codecs, add_decoders, add_encoders
|
||||
from .codecs import get_animation_decoders, get_decoders, get_encoders
|
||||
from .codecs import registry as _codec_registry
|
||||
from .codecs import add_default_codecs as _add_default_codecs
|
||||
|
||||
from .animation import Animation, AnimationFrame
|
||||
from .buffer import *
|
||||
from . import atlas
|
||||
@ -172,36 +173,10 @@ def load(filename, file=None, decoder=None):
|
||||
|
||||
:rtype: AbstractImage
|
||||
"""
|
||||
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
opened_file = file
|
||||
if decoder:
|
||||
return decoder.decode(filename, file)
|
||||
else:
|
||||
opened_file = None
|
||||
|
||||
if not hasattr(file, 'seek'):
|
||||
file = BytesIO(file.read())
|
||||
|
||||
try:
|
||||
if decoder:
|
||||
return decoder.decode(file, filename)
|
||||
else:
|
||||
first_exception = None
|
||||
for decoder in get_decoders(filename):
|
||||
try:
|
||||
image = decoder.decode(file, filename)
|
||||
return image
|
||||
except ImageDecodeException as e:
|
||||
if not first_exception or first_exception.exception_priority < e.exception_priority:
|
||||
first_exception = e
|
||||
file.seek(0)
|
||||
|
||||
if not first_exception:
|
||||
raise ImageDecodeException('No image decoders are available')
|
||||
raise first_exception
|
||||
finally:
|
||||
if opened_file:
|
||||
opened_file.close()
|
||||
return _codec_registry.decode(filename, file)
|
||||
|
||||
|
||||
def load_animation(filename, file=None, decoder=None):
|
||||
@ -222,26 +197,10 @@ def load_animation(filename, file=None, decoder=None):
|
||||
|
||||
:rtype: Animation
|
||||
"""
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
if not hasattr(file, 'seek'):
|
||||
file = BytesIO(file.read())
|
||||
|
||||
if decoder:
|
||||
return decoder.decode_animation(file, filename)
|
||||
return decoder.decode_animation(filename, file)
|
||||
else:
|
||||
first_exception = None
|
||||
for decoder in get_animation_decoders(filename):
|
||||
try:
|
||||
image = decoder.decode_animation(file, filename)
|
||||
return image
|
||||
except ImageDecodeException as e:
|
||||
first_exception = first_exception or e
|
||||
file.seek(0)
|
||||
|
||||
if not first_exception:
|
||||
raise ImageDecodeException('No image decoders are available')
|
||||
raise first_exception
|
||||
return _codec_registry.decode_animation(filename, file)
|
||||
|
||||
|
||||
def create(width, height, pattern=None):
|
||||
@ -452,13 +411,12 @@ class AbstractImage:
|
||||
file = open(filename, 'wb')
|
||||
|
||||
if encoder:
|
||||
encoder.encode(self, file, filename)
|
||||
encoder.encode(self, filename, file)
|
||||
else:
|
||||
first_exception = None
|
||||
for encoder in get_encoders(filename):
|
||||
for encoder in _codec_registry.get_encoders(filename):
|
||||
try:
|
||||
encoder.encode(self, file, filename)
|
||||
return
|
||||
return encoder.encode(self, filename, file)
|
||||
except ImageEncodeException as e:
|
||||
first_exception = first_exception or e
|
||||
file.seek(0)
|
||||
@ -1992,7 +1950,7 @@ class TextureGrid(TextureRegion, UniformTextureSequence):
|
||||
|
||||
|
||||
# Initialise default codecs
|
||||
add_default_image_codecs()
|
||||
_add_default_codecs()
|
||||
|
||||
# Default Framebuffer classes:
|
||||
###############################################################
|
||||
|
@ -52,12 +52,12 @@ Modules must also implement the two functions::
|
||||
|
||||
import os.path
|
||||
|
||||
from pyglet.util import Codecs, Decoder, Encoder, DecodeException, EncodeException
|
||||
from pyglet.util import CodecRegistry, Decoder, Encoder, DecodeException, EncodeException
|
||||
from pyglet import compat_platform
|
||||
|
||||
|
||||
class _ImageCodecs(Codecs):
|
||||
"""Subclass of Codecs that adds support for animation methods."""
|
||||
class _ImageCodecRegistry(CodecRegistry):
|
||||
"""Subclass of CodecRegistry that adds support for animation methods."""
|
||||
|
||||
def __init__(self):
|
||||
self._decoder_animation_extensions = {}
|
||||
@ -74,25 +74,43 @@ class _ImageCodecs(Codecs):
|
||||
self._decoder_animation_extensions[extension].append(decoder)
|
||||
|
||||
def get_animation_decoders(self, filename=None):
|
||||
"""Get an ordered list of all animation decoders. If a `filename` is
|
||||
provided, decoders supporting that extension will be ordered first
|
||||
in the list.
|
||||
"""Get a list of animation decoders. If a `filename` is provided, only
|
||||
decoders supporting that extension will be returned. An empty list
|
||||
will be return if no encoders for that extension are available.
|
||||
"""
|
||||
decoders = []
|
||||
if filename:
|
||||
extension = os.path.splitext(filename)[1].lower()
|
||||
decoders += self._decoder_animation_extensions.get(extension, [])
|
||||
decoders += [e for e in self._decoders if e not in decoders]
|
||||
return decoders
|
||||
return self._decoder_animation_extensions.get(extension, [])
|
||||
return self._decoders
|
||||
|
||||
def decode_animation(self, filename, file, **kwargs):
|
||||
first_exception = None
|
||||
|
||||
for decoder in self.get_animation_decoders(filename):
|
||||
try:
|
||||
return decoder.decode_animation(filename, file, **kwargs)
|
||||
except DecodeException as e:
|
||||
if not first_exception:
|
||||
first_exception = e
|
||||
file.seek(0)
|
||||
|
||||
for decoder in self.get_animation_decoders(): # Try ALL codecs
|
||||
try:
|
||||
return decoder.decode_animation(filename, file, **kwargs)
|
||||
except DecodeException:
|
||||
file.seek(0)
|
||||
|
||||
if not first_exception:
|
||||
raise DecodeException(f"No decoders available for this file type: {filename}")
|
||||
raise first_exception
|
||||
|
||||
|
||||
_codecs = _ImageCodecs()
|
||||
|
||||
add_decoders = _codecs.add_decoders
|
||||
get_decoders = _codecs.get_decoders
|
||||
add_encoders = _codecs.add_encoders
|
||||
get_encoders = _codecs.get_encoders
|
||||
get_animation_decoders = _codecs.get_animation_decoders
|
||||
registry = _ImageCodecRegistry()
|
||||
add_decoders = registry.add_decoders
|
||||
add_encoders = registry.add_encoders
|
||||
get_animation_decoders = registry.get_animation_decoders
|
||||
get_decoders = registry.get_decoders
|
||||
get_encoders = registry.get_encoders
|
||||
|
||||
|
||||
class ImageDecodeException(DecodeException):
|
||||
@ -111,14 +129,14 @@ class ImageDecoder(Decoder):
|
||||
"""
|
||||
return []
|
||||
|
||||
def decode(self, file, filename):
|
||||
def decode(self, filename, file):
|
||||
"""Decode the given file object and return an instance of `Image`.
|
||||
Throws ImageDecodeException if there is an error. filename
|
||||
can be a file type hint.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def decode_animation(self, file, filename):
|
||||
def decode_animation(self, filename, file):
|
||||
"""Decode the given file object and return an instance of :py:class:`~pyglet.image.Animation`.
|
||||
Throws ImageDecodeException if there is an error. filename
|
||||
can be a file type hint.
|
||||
@ -133,7 +151,7 @@ class ImageDecoder(Decoder):
|
||||
|
||||
class ImageEncoder(Encoder):
|
||||
|
||||
def encode(self, image, file, filename):
|
||||
def encode(self, image, filename, file):
|
||||
"""Encode the given image to the given file. filename
|
||||
provides a hint to the file format desired.
|
||||
"""
|
||||
@ -143,15 +161,15 @@ class ImageEncoder(Encoder):
|
||||
return "{0}{1}".format(self.__class__.__name__, self.get_file_extensions())
|
||||
|
||||
|
||||
def add_default_image_codecs():
|
||||
def add_default_codecs():
|
||||
# Add the codecs we know about. These should be listed in order of
|
||||
# preference. This is called automatically by pyglet.image.
|
||||
|
||||
# Compressed texture in DDS format
|
||||
try:
|
||||
from pyglet.image.codecs import dds
|
||||
add_encoders(dds)
|
||||
add_decoders(dds)
|
||||
registry.add_encoders(dds)
|
||||
registry.add_decoders(dds)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
@ -159,8 +177,8 @@ def add_default_image_codecs():
|
||||
if compat_platform == 'darwin':
|
||||
try:
|
||||
from pyglet.image.codecs import quartz
|
||||
add_encoders(quartz)
|
||||
add_decoders(quartz)
|
||||
registry.add_encoders(quartz)
|
||||
registry.add_decoders(quartz)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
@ -170,8 +188,8 @@ def add_default_image_codecs():
|
||||
if WINDOWS_7_OR_GREATER: # Supports Vista and above.
|
||||
try:
|
||||
from pyglet.image.codecs import wic
|
||||
add_encoders(wic)
|
||||
add_decoders(wic)
|
||||
registry.add_encoders(wic)
|
||||
registry.add_decoders(wic)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
@ -179,8 +197,8 @@ def add_default_image_codecs():
|
||||
if compat_platform in ('win32', 'cygwin'):
|
||||
try:
|
||||
from pyglet.image.codecs import gdiplus
|
||||
add_encoders(gdiplus)
|
||||
add_decoders(gdiplus)
|
||||
registry.add_encoders(gdiplus)
|
||||
registry.add_decoders(gdiplus)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
@ -188,31 +206,31 @@ def add_default_image_codecs():
|
||||
if compat_platform.startswith('linux'):
|
||||
try:
|
||||
from pyglet.image.codecs import gdkpixbuf2
|
||||
add_encoders(gdkpixbuf2)
|
||||
add_decoders(gdkpixbuf2)
|
||||
registry.add_encoders(gdkpixbuf2)
|
||||
registry.add_decoders(gdkpixbuf2)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Fallback: PIL
|
||||
try:
|
||||
from pyglet.image.codecs import pil
|
||||
add_encoders(pil)
|
||||
add_decoders(pil)
|
||||
registry.add_encoders(pil)
|
||||
registry.add_decoders(pil)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Fallback: PNG loader (slow)
|
||||
try:
|
||||
from pyglet.image.codecs import png
|
||||
add_encoders(png)
|
||||
add_decoders(png)
|
||||
registry.add_encoders(png)
|
||||
registry.add_decoders(png)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Fallback: BMP loader (slow)
|
||||
try:
|
||||
from pyglet.image.codecs import bmp
|
||||
add_encoders(bmp)
|
||||
add_decoders(bmp)
|
||||
registry.add_encoders(bmp)
|
||||
registry.add_decoders(bmp)
|
||||
except ImportError:
|
||||
pass
|
||||
|
@ -149,7 +149,7 @@ class BMPImageDecoder(ImageDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.bmp']
|
||||
|
||||
def decode(self, file, filename):
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
bytes = file.read()
|
||||
|
@ -152,7 +152,10 @@ class DDSImageDecoder(codecs.ImageDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.dds']
|
||||
|
||||
def decode(self, file, filename):
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
|
||||
header = file.read(DDSURFACEDESC2.get_size())
|
||||
desc = DDSURFACEDESC2(header)
|
||||
if desc.dwMagic != b'DDS ' or desc.dwSize != 124:
|
||||
|
@ -190,15 +190,14 @@ gdiplus.GdiplusStartup.argtypes = [c_void_p, c_void_p, c_void_p]
|
||||
|
||||
class GDIPlusDecoder(ImageDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.bmp', '.gif', '.jpg', '.jpeg', '.exif', '.png', '.tif',
|
||||
'.tiff']
|
||||
return ['.bmp', '.gif', '.jpg', '.jpeg', '.exif', '.png', '.tif', '.tiff']
|
||||
|
||||
def get_animation_file_extensions(self):
|
||||
# TIFF also supported as a multi-page image; but that's not really an
|
||||
# animation, is it?
|
||||
return ['.gif']
|
||||
|
||||
def _load_bitmap(self, file, filename):
|
||||
def _load_bitmap(self, filename, file):
|
||||
data = file.read()
|
||||
|
||||
# Create a HGLOBAL with image data
|
||||
@ -272,14 +271,18 @@ class GDIPlusDecoder(ImageDecoder):
|
||||
gdiplus.GdipDisposeImage(bitmap)
|
||||
self.stream.Release()
|
||||
|
||||
def decode(self, file, filename):
|
||||
bitmap = self._load_bitmap(file, filename)
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
bitmap = self._load_bitmap(filename, file)
|
||||
image = self._get_image(bitmap)
|
||||
self._delete_bitmap(bitmap)
|
||||
return image
|
||||
|
||||
def decode_animation(self, file, filename):
|
||||
bitmap = self._load_bitmap(file, filename)
|
||||
def decode_animation(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
bitmap = self._load_bitmap(filename, file)
|
||||
|
||||
dimension_count = c_uint()
|
||||
gdiplus.GdipImageGetFrameDimensionsCount(bitmap, byref(dimension_count))
|
||||
|
@ -92,9 +92,9 @@ class GdkPixBufLoader:
|
||||
"""
|
||||
Wrapper around GdkPixBufLoader object.
|
||||
"""
|
||||
def __init__(self, file_, filename):
|
||||
def __init__(self, filename, file):
|
||||
self.closed = False
|
||||
self._file = file_
|
||||
self._file = file
|
||||
self._filename = filename
|
||||
self._loader = gdkpixbuf.gdk_pixbuf_loader_new()
|
||||
if self._loader is None:
|
||||
@ -108,7 +108,6 @@ class GdkPixBufLoader:
|
||||
gdk.g_object_unref(self._loader)
|
||||
|
||||
def _load_file(self):
|
||||
assert self._file is not None
|
||||
self._file.seek(0)
|
||||
data = self._file.read()
|
||||
self.write(data)
|
||||
@ -305,12 +304,16 @@ class GdkPixbuf2ImageDecoder(ImageDecoder):
|
||||
def get_animation_file_extensions(self):
|
||||
return ['.gif', '.ani']
|
||||
|
||||
def decode(self, file, filename):
|
||||
loader = GdkPixBufLoader(file, filename)
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
loader = GdkPixBufLoader(filename, file)
|
||||
return loader.get_pixbuf().to_image()
|
||||
|
||||
def decode_animation(self, file, filename):
|
||||
loader = GdkPixBufLoader(file, filename)
|
||||
def decode_animation(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
loader = GdkPixBufLoader(filename, file)
|
||||
return loader.get_animation().to_animation()
|
||||
|
||||
|
||||
@ -325,5 +328,5 @@ def get_encoders():
|
||||
def init():
|
||||
gdk.g_type_init()
|
||||
|
||||
init()
|
||||
|
||||
init()
|
||||
|
@ -38,10 +38,7 @@ import os.path
|
||||
from pyglet.image import *
|
||||
from pyglet.image.codecs import *
|
||||
|
||||
try:
|
||||
import Image
|
||||
except ImportError:
|
||||
from PIL import Image
|
||||
from PIL import Image
|
||||
|
||||
|
||||
class PILImageDecoder(ImageDecoder):
|
||||
@ -53,12 +50,14 @@ class PILImageDecoder(ImageDecoder):
|
||||
# def get_animation_file_extensions(self):
|
||||
# return ['.gif', '.ani']
|
||||
|
||||
def decode(self, file, filename):
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
|
||||
try:
|
||||
image = Image.open(file)
|
||||
except Exception as e:
|
||||
raise ImageDecodeException(
|
||||
'PIL cannot read %r: %s' % (filename or file, e))
|
||||
raise ImageDecodeException('PIL cannot read %r: %s' % (filename or file, e))
|
||||
|
||||
try:
|
||||
image = image.transpose(Image.FLIP_TOP_BOTTOM)
|
||||
@ -73,43 +72,7 @@ class PILImageDecoder(ImageDecoder):
|
||||
raise ImageDecodeException('Unsupported mode "%s"' % image.mode)
|
||||
width, height = image.size
|
||||
|
||||
# tostring is deprecated, replaced by tobytes in Pillow (PIL fork)
|
||||
# (1.1.7) PIL still uses it
|
||||
try:
|
||||
image_data_fn = getattr(image, "tobytes")
|
||||
except AttributeError:
|
||||
image_data_fn = getattr(image, "tostring")
|
||||
return ImageData(width, height, image.mode, image_data_fn())
|
||||
|
||||
# def decode_animation(self, file, filename):
|
||||
# try:
|
||||
# image = Image.open(file)
|
||||
# except Exception as e:
|
||||
# raise ImageDecodeException('PIL cannot read %r: %s' % (filename or file, e))
|
||||
#
|
||||
# frames = []
|
||||
#
|
||||
# for image in ImageSequence.Iterator(image):
|
||||
# try:
|
||||
# image = image.transpose(Image.FLIP_TOP_BOTTOM)
|
||||
# except Exception as e:
|
||||
# raise ImageDecodeException('PIL failed to transpose %r: %s' % (filename or file, e))
|
||||
#
|
||||
# # Convert bitmap and palette images to component
|
||||
# if image.mode in ('1', 'P'):
|
||||
# image = image.convert()
|
||||
#
|
||||
# if image.mode not in ('L', 'LA', 'RGB', 'RGBA'):
|
||||
# raise ImageDecodeException('Unsupported mode "%s"' % image.mode)
|
||||
#
|
||||
# duration = None if image.info['duration'] == 0 else image.info['duration']
|
||||
# # Follow Firefox/Mac behaviour: use 100ms delay for any delay less than 10ms.
|
||||
# if duration <= 10:
|
||||
# duration = 100
|
||||
#
|
||||
# frames.append(AnimationFrame(ImageData(*image.size, image.mode, image.tobytes()), duration / 1000))
|
||||
#
|
||||
# return Animation(frames)
|
||||
return ImageData(width, height, image.mode, image.tobytes())
|
||||
|
||||
|
||||
class PILImageEncoder(ImageEncoder):
|
||||
@ -118,9 +81,8 @@ class PILImageEncoder(ImageEncoder):
|
||||
return ['.bmp', '.eps', '.gif', '.jpg', '.jpeg',
|
||||
'.pcx', '.png', '.ppm', '.tiff', '.xbm']
|
||||
|
||||
def encode(self, image, file, filename):
|
||||
# File format is guessed from filename extension, otherwise defaults
|
||||
# to PNG.
|
||||
def encode(self, image, filename, file):
|
||||
# File format is guessed from filename extension, otherwise defaults to PNG.
|
||||
pil_format = (filename and os.path.splitext(filename)[1][1:]) or 'png'
|
||||
|
||||
if pil_format.lower() == 'jpg':
|
||||
|
@ -49,7 +49,10 @@ class PNGImageDecoder(ImageDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.png']
|
||||
|
||||
def decode(self, file, filename):
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
|
||||
try:
|
||||
reader = pypng.Reader(file=file)
|
||||
width, height, pixels, metadata = reader.asDirect()
|
||||
@ -76,7 +79,7 @@ class PNGImageEncoder(ImageEncoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.png']
|
||||
|
||||
def encode(self, image, file, filename):
|
||||
def encode(self, image, filename, file):
|
||||
image = image.get_image_data()
|
||||
|
||||
has_alpha = 'A' in image.format
|
||||
|
106
libs/pyglet/image/codecs/qoi.py
Normal file
106
libs/pyglet/image/codecs/qoi.py
Normal file
@ -0,0 +1,106 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
# pyglet
|
||||
# Copyright (c) 2006-2008 Alex Holkner
|
||||
# Copyright (c) 2008-2021 pyglet contributors
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of pyglet nor the names of its
|
||||
# contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
"""Encoder and decoder for the QOI image format.
|
||||
"""
|
||||
|
||||
from ctypes import Structure, BigEndianStructure
|
||||
from ctypes import c_uint8, c_uint32, c_char
|
||||
|
||||
from pyglet.image import ImageData, ImageDecodeException
|
||||
from pyglet.image.codecs import ImageDecoder, ImageEncoder
|
||||
|
||||
|
||||
class Header(BigEndianStructure):
|
||||
_pack_ = 1
|
||||
_fields_ = (
|
||||
('magic', c_char * 4), # char magic[4]; // magic bytes "qoif"
|
||||
('width', c_uint32), # uint32_t width; // image width in pixels (BE)
|
||||
('height', c_uint32), # uint32_t height; // image height in pixels (BE)
|
||||
('channels', c_uint8), # uint8_t channels; // 3 = RGB, 4 = RGBA
|
||||
('colorspace', c_uint8) # uint8_t colorspace; // 0 = sRGB with linear alpha, 1 = all channels linear
|
||||
)
|
||||
|
||||
|
||||
class QOImageDecoder(ImageDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.qoi']
|
||||
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
|
||||
header = Header()
|
||||
file.readinto(header)
|
||||
|
||||
if header.magic != b'qoif':
|
||||
raise ImageDecodeException('Invalid QOI header.')
|
||||
|
||||
# TODO: finish
|
||||
|
||||
# pixels = array.array('BH'[metadata['bitdepth'] > 8], itertools.chain(*pixels))
|
||||
# return ImageData(width, height, fmt, pixels.tobytes(), -pitch)
|
||||
|
||||
|
||||
class QOImageEncoder(ImageEncoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.qoi']
|
||||
|
||||
def encode(self, image, filename, file):
|
||||
image = image.get_image_data()
|
||||
|
||||
has_alpha = 'A' in image.format
|
||||
greyscale = len(image.format) < 3
|
||||
if has_alpha:
|
||||
if greyscale:
|
||||
image.format = 'LA'
|
||||
else:
|
||||
image.format = 'RGBA'
|
||||
else:
|
||||
if greyscale:
|
||||
image.format = 'L'
|
||||
else:
|
||||
image.format = 'RGB'
|
||||
|
||||
image.pitch = -(image.width * len(image.format))
|
||||
# TODO: finish
|
||||
|
||||
|
||||
def get_decoders():
|
||||
return [QOImageDecoder()]
|
||||
|
||||
|
||||
def get_encoders():
|
||||
return [QOImageEncoder()]
|
@ -90,7 +90,9 @@ class QuartzImageDecoder(ImageDecoder):
|
||||
pitch = bytesPerRow
|
||||
return ImageData(width, height, format, buffer, -pitch)
|
||||
|
||||
def decode(self, file, filename):
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
file_bytes = file.read()
|
||||
data = c_void_p(cf.CFDataCreate(None, file_bytes, len(file_bytes)))
|
||||
# Second argument is an options dictionary. It might be a good idea to provide
|
||||
@ -103,7 +105,9 @@ class QuartzImageDecoder(ImageDecoder):
|
||||
|
||||
return image
|
||||
|
||||
def decode_animation(self, file, filename):
|
||||
def decode_animation(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
# If file is not an animated GIF, it will be loaded as a single-frame animation.
|
||||
file_bytes = file.read()
|
||||
data = c_void_p(cf.CFDataCreate(None, file_bytes, len(file_bytes)))
|
||||
|
@ -52,9 +52,9 @@ split_16byte = re.compile('.' * 16, flags=re.DOTALL)
|
||||
class PackedImageData(AbstractImage):
|
||||
_current_texture = None
|
||||
|
||||
def __init__(self, width, height, format, packed_format, data):
|
||||
super(PackedImageData, self).__init__(width, height)
|
||||
self.format = format
|
||||
def __init__(self, width, height, fmt, packed_format, data):
|
||||
super().__init__(width, height)
|
||||
self.format = fmt
|
||||
self.packed_format = packed_format
|
||||
self.data = data
|
||||
|
||||
|
@ -451,7 +451,7 @@ class WICDecoder(ImageDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.bmp', '.jpg', '.jpeg', '.png', '.tif', '.tiff', '.ico', '.jxr', '.hdp', '.wdp']
|
||||
|
||||
def _load_bitmap_decoder(self, file, filename):
|
||||
def _load_bitmap_decoder(self, filename, file):
|
||||
data = file.read()
|
||||
|
||||
# Create a HGLOBAL with image data
|
||||
@ -536,8 +536,10 @@ class WICDecoder(ImageDecoder):
|
||||
bitmap_decoder.Release()
|
||||
stream.Release()
|
||||
|
||||
def decode(self, file, filename):
|
||||
bitmap_decoder, stream = self._load_bitmap_decoder(file, filename)
|
||||
def decode(self, filename, file):
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
bitmap_decoder, stream = self._load_bitmap_decoder(filename, file)
|
||||
bitmap = self._get_bitmap_frame(bitmap_decoder, 0)
|
||||
image = self.get_image(bitmap)
|
||||
self._delete_bitmap_decoder(bitmap_decoder, stream)
|
||||
@ -582,7 +584,7 @@ class WICEncoder(ImageEncoder):
|
||||
def get_file_extensions(self):
|
||||
return [ext for ext in extension_to_container]
|
||||
|
||||
def encode(self, image, file, filename):
|
||||
def encode(self, image, filename, file):
|
||||
image = image.get_image_data()
|
||||
|
||||
stream = IWICStream()
|
||||
|
@ -101,6 +101,9 @@ class DirectInputDevice(base.Device):
|
||||
self.id_name = device_instance.tszProductName
|
||||
self.id_product_guid = format(device_instance.guidProduct.Data1, "08x")
|
||||
|
||||
def __del__(self):
|
||||
self._device.Release()
|
||||
|
||||
def get_guid(self):
|
||||
"""Generate an SDL2 style GUID from the product guid."""
|
||||
first = self.id_product_guid[6:8] + self.id_product_guid[4:6]
|
||||
|
@ -1,219 +0,0 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
# pyglet
|
||||
# Copyright (c) 2006-2008 Alex Holkner
|
||||
# Copyright (c) 2008-2021 pyglet contributors
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of pyglet nor the names of its
|
||||
# contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# ----------------------------------------------------------------------------
|
||||
"""Game Controller support.
|
||||
|
||||
This module provides an interface for Game Controller devices, which are a
|
||||
subset of Joysticks. Game Controllers have consistent button and axis mapping,
|
||||
which resembles common dual-stick home video game console controllers.
|
||||
Devices that are of this design can be automatically mapped to the "virtual"
|
||||
Game Controller layout, providing a consistent abstraction for a large number
|
||||
of different devices, with no tedious button and axis mapping for each one.
|
||||
To achieve this, an internal mapping database contains lists of device ids
|
||||
and their corresponding button and axis mappings. The mapping database is in
|
||||
the same format as originated by the `SDL` library, which has become a
|
||||
semi-standard and is in common use. Most popular controllers are included in
|
||||
the built-in database, and additional mappings can be added at runtime.
|
||||
|
||||
|
||||
Some Joysticks, such as Flight Sticks, etc., do not necessarily fit into the
|
||||
layout (and limitations) of GameControllers. For those such devices, it is
|
||||
recommended to use the Joystick interface instead.
|
||||
|
||||
To query which GameControllers are available, call :py:func:`get_game_controllers`.
|
||||
|
||||
.. versionadded:: 2.0
|
||||
"""
|
||||
import os
|
||||
|
||||
from .gamecontrollerdb import mapping_list
|
||||
|
||||
|
||||
env_config = os.environ.get('SDL_GAMECONTROLLERCONFIG')
|
||||
if env_config:
|
||||
mapping_list.append(env_config)
|
||||
|
||||
|
||||
class _Relation:
|
||||
__slots__ = 'control_type', 'index', 'inverted'
|
||||
|
||||
def __init__(self, control_type, index, inverted=False):
|
||||
self.control_type = control_type
|
||||
self.index = index
|
||||
self.inverted = inverted
|
||||
|
||||
def __repr__(self):
|
||||
return f"Relation(type={self.control_type}, index={self.index}, inverted={self.inverted})"
|
||||
|
||||
|
||||
def _map_pair(raw_relation):
|
||||
inverted = False
|
||||
relation_string = raw_relation.split(":")[1]
|
||||
if relation_string.startswith("+"):
|
||||
relation_string = relation_string[1:]
|
||||
inverted = False
|
||||
elif relation_string.startswith("-"):
|
||||
relation_string = relation_string[1:]
|
||||
inverted = True
|
||||
if "~" in relation_string:
|
||||
# TODO: handle this
|
||||
return None
|
||||
if relation_string.startswith("b"): # Button
|
||||
return _Relation("button", int(relation_string[1:]), inverted)
|
||||
elif relation_string.startswith("a"): # Axis
|
||||
return _Relation("axis", int(relation_string[1:]), inverted)
|
||||
elif relation_string.startswith("h0"): # Hat
|
||||
return _Relation("hat0", int(relation_string.split(".")[1]), inverted)
|
||||
|
||||
|
||||
def _parse_mapping(mapping_string):
|
||||
"""Parse a SDL2 style GameController mapping string.
|
||||
|
||||
:Parameters:
|
||||
`mapping_string` : str
|
||||
A raw string containing an SDL style controller mapping.
|
||||
|
||||
:rtype: A dict containing axis/button mapping relations.
|
||||
"""
|
||||
relations = dict(guid=None, name=None, guide=None, a=None, b=None,
|
||||
x=None, y=None, leftshoulder=None, leftstick=None,
|
||||
rightshoulder=None, rightstick=None, back=None,
|
||||
start=None, dpup=None, dpdown=None, dpleft=None,
|
||||
dpright=None, lefttrigger=None, righttrigger=None,
|
||||
leftx=None, lefty=None, rightx=None, righty=None)
|
||||
|
||||
split_mapping = mapping_string.strip().split(",")
|
||||
|
||||
relations["guid"] = split_mapping[0]
|
||||
relations["name"] = split_mapping[1]
|
||||
for item in split_mapping:
|
||||
if item.startswith("guide:"):
|
||||
relations["guide"] = _map_pair(item)
|
||||
elif item.startswith("a:"):
|
||||
relations["a"] = _map_pair(item)
|
||||
elif item.startswith("b:"):
|
||||
relations["b"] = _map_pair(item)
|
||||
elif item.startswith("x:"):
|
||||
relations["x"] = _map_pair(item)
|
||||
elif item.startswith("y:"):
|
||||
relations["y"] = _map_pair(item)
|
||||
elif item.startswith("leftshoulder:"):
|
||||
relations["leftshoulder"] = _map_pair(item)
|
||||
elif item.startswith("leftstick:"):
|
||||
relations["leftstick"] = _map_pair(item)
|
||||
elif item.startswith("rightshoulder:"):
|
||||
relations["rightshoulder"] = _map_pair(item)
|
||||
elif item.startswith("rightstick:"):
|
||||
relations["rightstick"] = _map_pair(item)
|
||||
elif item.startswith("back:"):
|
||||
relations["back"] = _map_pair(item)
|
||||
elif item.startswith("start:"):
|
||||
relations["start"] = _map_pair(item)
|
||||
elif item.startswith("lefttrigger:"):
|
||||
relations["lefttrigger"] = _map_pair(item)
|
||||
elif item.startswith("righttrigger:"):
|
||||
relations["righttrigger"] = _map_pair(item)
|
||||
elif item.startswith("dpup"):
|
||||
relations["dpup"] = _map_pair(item)
|
||||
elif item.startswith("dpdown"):
|
||||
relations["dpdown"] = _map_pair(item)
|
||||
elif item.startswith("dpleft"):
|
||||
relations["dpleft"] = _map_pair(item)
|
||||
elif item.startswith("dpright"):
|
||||
relations["dpright"] = _map_pair(item)
|
||||
elif item.startswith("leftx"):
|
||||
relations["leftx"] = _map_pair(item)
|
||||
elif item.startswith("lefty"):
|
||||
relations["lefty"] = _map_pair(item)
|
||||
elif item.startswith("rightx"):
|
||||
relations["rightx"] = _map_pair(item)
|
||||
elif item.startswith("righty"):
|
||||
relations["righty"] = _map_pair(item)
|
||||
|
||||
return relations
|
||||
|
||||
|
||||
def is_game_controller(device):
|
||||
"""Check if the passed device is a GameController.
|
||||
|
||||
:Parameters:
|
||||
`device` : `~pyglet.input.Device`
|
||||
A pyglet input device
|
||||
|
||||
:rtype True if this device is a GameController.
|
||||
"""
|
||||
guid = device.get_guid()
|
||||
return any(m.startswith(guid) for m in mapping_list)
|
||||
|
||||
|
||||
def get_mapping(guid):
|
||||
"""Return a mapping for the passed device GUID.
|
||||
|
||||
:Parameters:
|
||||
`guid` : str
|
||||
A pyglet input device GUID
|
||||
|
||||
:rtype: dict of the Game Controller axis/button mapping relations.
|
||||
"""
|
||||
for mapping in mapping_list:
|
||||
if mapping.startswith(guid):
|
||||
return _parse_mapping(mapping)
|
||||
|
||||
|
||||
def add_mappings_from_file(filename) -> None:
|
||||
"""Add mappings from a file.
|
||||
|
||||
Given a file path, open and parse the file for mappings.
|
||||
|
||||
:Parameters:
|
||||
`filename` : str
|
||||
A file path.
|
||||
"""
|
||||
assert os.path.exists(filename), f"Invalid path: {filename}"
|
||||
with open(filename) as f:
|
||||
add_mappings_from_string(f.read())
|
||||
|
||||
|
||||
def add_mappings_from_string(string) -> None:
|
||||
"""Add one or more mappings from a raw string.
|
||||
|
||||
:Parameters:
|
||||
`string` : str
|
||||
A string containing one or more mappings,
|
||||
"""
|
||||
for line in string.splitlines():
|
||||
if line.startswith('#'):
|
||||
continue
|
||||
line = line.strip()
|
||||
mapping_list.append(line)
|
@ -1,742 +0,0 @@
|
||||
from pyglet import compat_platform
|
||||
|
||||
|
||||
# This file is automatically generated by 'pyglet/tools/gen_controller_db.py'
|
||||
# Generated on: Wed May 19 15:41:53 2021
|
||||
|
||||
if compat_platform.startswith("linux"):
|
||||
mapping_list = [
|
||||
"xinput,*,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000650000011010000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a5,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000012ab000010010000,8BitDo NES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000012ab000010010000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000022000000090000011010000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000203800000900000000010000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000102800000900000000010000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000102800000900000000010000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00003028000000010000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00003028000000010000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000020ab000010010000,8BitDo SNES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000020ab000010010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b0,b:b1,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001890000011010000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00003032000000010000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000a00500003232000001000000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000a00500003232000001000000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000a00500003232000008010000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000a00500003232000008010000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000031000011010000,8Bitdo Receiver,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,",
|
||||
"03000000c82d00001290000011010000,8Bitdo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001290000011010000,8Bitdo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00006228000000010000,8Bitdo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000c82d00006228000000010000,8Bitdo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,",
|
||||
"05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,",
|
||||
"030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"05000000710100001904000000010000,Amazon Luna Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
||||
"03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"03000000c62400001b89000011010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000b40400000a01000000010000,CYPRESS USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,",
|
||||
"03000000ffff0000ffff000000010000,Chinese-made Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,",
|
||||
"03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,",
|
||||
"03000000a306000022f6000011010000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"0500000047532067616d657061640000,GS Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000c01100000140000011010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000008f0e00000800000010010000,Gasia Co. Ltd PS(R) Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000280400000140000000010000,Gravis Gamepad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00000610000000010000,GreenAsia Electronics 4Axes 12Keys Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,",
|
||||
"030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"03000000c9110000f055000011010000,HJC Game GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006a00000011010000,HORI CO. LTD. Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006b00000011010000,HORI CO. LTD. Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008400000011010000,HORI Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008500000010010000,HORI Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f0000d800000072056800,HORI Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
||||
"030000000d0f0000aa00000011010000,HORI Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"030000000d0f00006e00000011010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006600000011010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006700000001010000,HORIPAD ONE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,",
|
||||
"030000000d0f00005f00000011010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005e00000011010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008600000002010000,Hori Fighting Commander,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,",
|
||||
"03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000d80400008200000003000000,IMS PCU#0 Gamepad Interface,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,",
|
||||
"03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,",
|
||||
"05000000491900000204000000000000,Ipega PG-9087S,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,",
|
||||
"03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,",
|
||||
"03000000c62400002b89000011010000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"05000000c62400002a89000000010000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"05000000c62400001a89000000010000,MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000250900006688000000010000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"05000000380700006652000025010000,Mad Catz C.T.R.L.R ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700005032000011010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700005082000011010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008433000011010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008483000011010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,",
|
||||
"03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller (SFIV),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000380700008034000011010000,Mad Catz fightstick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008084000011010000,Mad Catz fightstick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,",
|
||||
"030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,",
|
||||
"030000005e0400008e02000004010000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400008e02000062230000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000d102000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000d102000001010000,Microsoft X-Box One pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,",
|
||||
"030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,",
|
||||
"030000005e0400008902000020010000,Microsoft Xbox Controller S,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,",
|
||||
"05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
||||
"030000006b140000010c000010010000,NACON GC-400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,",
|
||||
"03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,",
|
||||
"03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"030000004b120000014d000000010000,NYKO AIRFLO EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000790000004318000010010000,Nintendo GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000790000004318000010010000,Nintendo GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,",
|
||||
"050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,",
|
||||
"05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,",
|
||||
"05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,",
|
||||
"05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,",
|
||||
"030000005e0400000202000000010000,Old Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,",
|
||||
"03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006f0e00000901000011010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,",
|
||||
"03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,",
|
||||
"030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000da0c000011010000,Playstation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,",
|
||||
"03000000c62400003a54000001010000,PowerA XBox One Controller,a:b0,b:b1,back:b6,dpdown:h0.7,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000300f00001211000011010000,QanBa Arcade JoyStick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,",
|
||||
"030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000321500000204000011010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000104000011010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000010000011010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000321500000011000011010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||
"03000000790000001100000010010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000632500007505000010010000,SHANWAN PS3/PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000341a00000908000010010000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000457500002211000010010000,SZMY-POWER PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,",
|
||||
"03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,",
|
||||
"03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,",
|
||||
"03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,",
|
||||
"03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,",
|
||||
"03000000f025000021c1000010010000,ShanWan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000632500002305000010010000,ShanWan USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||
"03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||
"03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||
"03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||
"05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||
"05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||
"03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b6,leftstick:b13,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:+a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000ad1b000038f0000090040000,Street Fighter IV FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||
"030000004f0400000ed0000011010000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,",
|
||||
"030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,",
|
||||
"030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,",
|
||||
"030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,",
|
||||
"03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000790000000600000007010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,",
|
||||
"05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000702000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000a102000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000a102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000450c00002043000010010000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,",
|
||||
"030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"050000005e040000050b000003090000,Xbox One Elite Series 2,a:b0,b:b1,back:b121,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"030000005e040000ea02000000000000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000ea02000001030000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,",
|
||||
"03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,",
|
||||
"03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000120c0000101e000011010000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000666600006706000000010000,boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,",
|
||||
"030000000d0f00000d00000000010000,hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftx:b4,lefty:b5,rightshoulder:b7,start:b9,x:b1,y:b2,",
|
||||
"03000000830500006020000010010000,iBuffalo SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"050000006964726f69643a636f6e0000,idroid:con,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000b50700001503000010010000,impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,",
|
||||
]
|
||||
elif compat_platform.startswith("darwin"):
|
||||
mapping_list = [
|
||||
"03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000650000001000000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a5,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000650000001000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a5,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000022000000090000001000000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000203800000900000000010000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001890000001000000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00003032000000010000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000a00500003232000008010000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000a00500003232000008010000,8BitDo Zero Gamepad,a:b1,b:b2,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000a00500003232000009010000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000a00500003232000009010000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000710100001904000000010000,Amazon Luna Gamepad,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
||||
"03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,",
|
||||
"03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,",
|
||||
"03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008400000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008500000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000790000000600000000000000,G-Shark GP-702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000ad1b000001f9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000000d0f00005f00000000000000,HORI Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005e00000000000000,HORI Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00004d00000000000000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f0000aa00000072050000,HORI Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"030000000d0f00006e00000000010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006600000000010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006600000000000000,HORIPAD FPS PLUS 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005f00000000010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005e00000000010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,",
|
||||
"030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d8140000cecf000000000000,MC Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"03000000c62400002a89000000010000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000c62400002b89000000010000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000380700005032000000010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700005082000000010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008433000000010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008483000000010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,",
|
||||
"03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,",
|
||||
"030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,",
|
||||
"03000000550900001472000025050000,NVIDIA Controller v01.04,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,",
|
||||
"030000004b120000014d000000010000,NYKO AIRFLO EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000006f0e00000901000002010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
|
||||
"030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"03000000321500000204000000010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000104000000010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000010000000010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000321500000011000000010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"03000000790000001100000000000000,Retrolink Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a3,lefty:a4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,",
|
||||
"03000000457500002211000000010000,SZMY-POWER PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,",
|
||||
"03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,",
|
||||
"030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,",
|
||||
"03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,",
|
||||
"03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,",
|
||||
"03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,",
|
||||
"03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,",
|
||||
"030000004f0400000ed0000000020000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,",
|
||||
"030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,",
|
||||
"03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"03000000bd12000015d0000000010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,",
|
||||
"030000006f0e00000302000025040000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000702000003060000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,",
|
||||
"050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,",
|
||||
"030000005e0400008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"03000000c6240000045d000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000005e040000050b000003090000,Xbox Elite Wireless Controller,a:b0,b:b1,back:b38,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"030000005e040000d102000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000005e040000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000005e040000e302000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000005e040000e002000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000e002000003090000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000005e040000ea02000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
|
||||
"030000005e040000fd02000003090000,Xbox Wireless Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,",
|
||||
"03000000120c0000100e000000010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000120c0000101e000000010000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000830500006020000000010000,iBuffalo SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000830500006020000000010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000830500006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,",
|
||||
]
|
||||
elif compat_platform.startswith("win"):
|
||||
mapping_list = [
|
||||
"03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,",
|
||||
"03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001038000000000000,8BitDo FC30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001038000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000650000000000000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000650000000000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00005106000000000000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00005106000000000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000012ab000000000000,8BitDo NES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000012ab000000000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000022000000090000000000000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000203800000900000000000000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001290000000000000,8BitDo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001290000000000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00006228000000000000,8BitDo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00006228000000000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000020ab000000000000,8BitDo SNES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000003512000020ab000000000000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001890000000000000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00003032000000000000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000a00500003232000000000000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000a00500003232000000000000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000008f0e00001200000000000000,Acme GA-02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"03000000fa190000f0ff000000000000,Acteck AGJ-3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d62000001d57000000000000,Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series ,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,",
|
||||
"03000000d6200000e557000000000000,Batarang,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,",
|
||||
"030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000bc2000000055000000000000,Betop BFM Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,",
|
||||
"0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,",
|
||||
"03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000791d00000103000000000000,Dual Box WII,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000bd12000002e0000000000000,Dual USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,",
|
||||
"030000006f0e00003001000000000000,EA SPORTS PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,",
|
||||
"03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,",
|
||||
"03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,",
|
||||
"03000000852100000201000000000000,FF-GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008700000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008800000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,",
|
||||
"78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,",
|
||||
"03000000790000000600000000000000,G-Shark GS-GP702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"030000008f0e00000d31000000000000,GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,",
|
||||
"03000000ac0500003d03000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000ac0500004d04000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000260900002625000000000000,Gamecube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||
"03000000280400000140000000000000,Gamepad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000f0250000c383000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000f0250000c483000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000f0250000c283000000000000,Gioteck,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000632500002605000000000000,HJD-X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"030000000d0f00008400000000000000,HORI Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008500000000000000,HORI Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006e00000000000000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006600000000000000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f0000ee00000000000000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000250900000017000000000000,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,",
|
||||
"03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d81400000862000000000000,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005f00000000000000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005e00000000000000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,",
|
||||
"030000006f0e00002401000000000000,INJUSTICE FightStick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"03000000ac0500002c02000000000000,IPEGA,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"03000000491900000204000000000000,Ipega PG-9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"030000006e0500000520000000000000,JC-P301U,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,",
|
||||
"030000006e0500000320000000000000,JC-U3613M (DInput),a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,",
|
||||
"030000006e0500000720000000000000,JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,",
|
||||
"03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,",
|
||||
"030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000018c2000000000000,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006d04000019c2000000000000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008081000000000000,MADCATZ SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700006382000000000000,MLG Gamepad PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000c62400002a89000000000000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000c62400002b89000000000000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000c62400001a89000000000000,MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000c62400001b89000000000000,MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"03000000380700006652000000000000,Mad Catz C.T.R.L.R,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000380700005032000000000000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700005082000000000000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008433000000000000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008483000000000000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008134000000000000,Mad Catz FightStick TE2+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008184000000000000,Mad Catz FightStick TE2+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700006252000000000000,Mad Catz Micro C.T.R.L.R,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000380700001888000000000000,MadCatz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000380700008532000000000000,Madcatz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000380700003888000000000000,Madcatz Arcade Fightstick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,",
|
||||
"03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,",
|
||||
"03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,",
|
||||
"0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,",
|
||||
"03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"030000006b140000010c000000000000,NACON GC-400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,",
|
||||
"03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"030000004b120000014d000000000000,NYKO AIRFLO EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"03000000790000004318000000000000,Nintendo GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000790000004318000000000000,Nintendo GameCube Controller,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000bd12000015d0000000000000,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,",
|
||||
"03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000362800000100000000000000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,",
|
||||
"03000000782300000a10000000000000,Onlive Wireless Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,",
|
||||
"030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,",
|
||||
"03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000901000000000000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"03000000632500002306000000000000,PS Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||
"03000000e30500009605000000000000,PS to USB convert cable,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,",
|
||||
"030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,",
|
||||
"030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,",
|
||||
"03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,",
|
||||
"030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000003807000056a8000000000000,PS3 RF pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000100000008200000000000000,PS360+ v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000222c00000020000000000000,QANBA DRONE ARCADE JOYSTICK,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000300f00000011000000000000,QanBa Arcade JoyStick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,",
|
||||
"03000000300f00001611000000000000,QanBa Arcade JoyStick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,",
|
||||
"03000000300f00001210000000000000,QanBa Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,",
|
||||
"03000000341a00000104000000000000,QanBa Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,",
|
||||
"03000000222c00000223000000000000,Qanba Obsidian Arcade Joystick PS3 Mode,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000222c00000023000000000000,Qanba Obsidian Arcade Joystick PS4 Mode,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00001100000000000000,REAL ARCADE PRO.3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00007000000000000000,REAL ARCADE PRO.4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00002200000000000000,REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"03000000321500000204000000000000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000104000000000000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000321500000011000000000000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||
"030000000d0f00006a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00006b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00008b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005b00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000000d0f00005c00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||
"0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||
"03000000790000001100000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||
"030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000341a00000208000000000000,SL-6555-SBK,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,",
|
||||
"03000000341a00000908000000000000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000790000001c18000000000000,STK-7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000ff1100003133000000000000,SVEN X-PAD,a:b2,b:b3,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a4,start:b5,x:b0,y:b1,",
|
||||
"03000000457500002211000000000000,SZMY-POWER PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,x:b0,y:b1,",
|
||||
"03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,",
|
||||
"03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,",
|
||||
"03000000a30600002106000000000000,Saitek PS1000,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000a306000020f6000000000000,Saitek PS2700,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||
"03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,",
|
||||
"030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,",
|
||||
"030000008f0e00000800000000000000,SpeedLink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,",
|
||||
"03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,",
|
||||
"03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000d620000011a7000000000000,Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000007d0000000000000,T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||
"030000004f0400000ed0000000000000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,",
|
||||
"030000004f04000023b3000000000000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,",
|
||||
"030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,",
|
||||
"03000000666600000488000000000000,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,",
|
||||
"03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000300f00000701000000000000,USB 4-Axis 12-Button Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000341a00002308000000000000,USB Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"030000005509000000b4000000000000,USB Gamepad,a:b10,b:b11,back:b5,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,guide:b14,leftshoulder:b8,leftstick:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b4,x:b12,y:b13,",
|
||||
"030000006b1400000203000000000000,USB Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000790000000a00000000000000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,",
|
||||
"03000000f0250000c183000000000000,USB Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||
"03000000ff1100004133000000000000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,",
|
||||
"03000000632500002305000000000000,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000302000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"030000006f0e00000702000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||
"03000000450c00002043000000000000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||
"03000000172700004431000000000000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,",
|
||||
"03000000790000004f18000000000000,ZD-T Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||
"03000000120c0000101e000000000000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000d81d00000f00000000000000,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000d81d00001000000000000000,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
"03000000830500006020000000000000,iBuffalo SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"03000000830500006020000000000000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||
"030000004f04000003d0000000000000,run'n'drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||
"03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||
]
|
||||
else:
|
||||
mapping_list = []
|
@ -75,30 +75,16 @@ the application performance can be delayed.
|
||||
The player provides a :py:meth:`Player.delete` method that can be used to
|
||||
release resources immediately.
|
||||
"""
|
||||
|
||||
from .drivers import get_audio_driver
|
||||
from .exceptions import MediaDecodeException
|
||||
from .player import Player, PlayerGroup
|
||||
from .codecs import get_decoders, get_encoders, add_decoders, add_encoders
|
||||
from .codecs import add_default_media_codecs, have_ffmpeg
|
||||
from .codecs import Source, StaticSource, StreamingSource, SourceGroup
|
||||
from .codecs import registry as _codec_registry
|
||||
from .codecs import add_default_codecs as _add_default_codecs
|
||||
from .codecs import Source, StaticSource, StreamingSource, SourceGroup, have_ffmpeg
|
||||
|
||||
from . import synthesis
|
||||
|
||||
|
||||
__all__ = (
|
||||
'load',
|
||||
'get_audio_driver',
|
||||
'Player',
|
||||
'PlayerGroup',
|
||||
'SourceGroup',
|
||||
'StaticSource',
|
||||
'StreamingSource',
|
||||
'get_encoders',
|
||||
'get_decoders',
|
||||
'add_encoders',
|
||||
'add_decoders',
|
||||
)
|
||||
__all__ = 'load', 'get_audio_driver', 'Player', 'PlayerGroup', 'SourceGroup', 'StaticSource', 'StreamingSource'
|
||||
|
||||
|
||||
def load(filename, file=None, streaming=True, decoder=None):
|
||||
@ -124,22 +110,9 @@ def load(filename, file=None, streaming=True, decoder=None):
|
||||
:rtype: StreamingSource or Source
|
||||
"""
|
||||
if decoder:
|
||||
return decoder.decode(file, filename, streaming)
|
||||
return decoder.decode(filename, file, streaming=streaming)
|
||||
else:
|
||||
first_exception = None
|
||||
for decoder in get_decoders(filename):
|
||||
try:
|
||||
loaded_source = decoder.decode(file, filename, streaming)
|
||||
return loaded_source
|
||||
except MediaDecodeException as e:
|
||||
if not first_exception or first_exception.exception_priority < e.exception_priority:
|
||||
first_exception = e
|
||||
|
||||
# TODO: Review this:
|
||||
# The FFmpeg codec attempts to decode anything, so this codepath won't be reached.
|
||||
if not first_exception:
|
||||
raise MediaDecodeException('No decoders are available for this media format.')
|
||||
raise first_exception
|
||||
return _codec_registry.decode(filename, file, streaming=streaming)
|
||||
|
||||
|
||||
add_default_media_codecs()
|
||||
_add_default_codecs()
|
||||
|
@ -33,7 +33,7 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
from pyglet.util import Codecs, Decoder, Encoder
|
||||
from pyglet.util import CodecRegistry, Decoder, Encoder
|
||||
from .base import *
|
||||
|
||||
import pyglet
|
||||
@ -41,20 +41,19 @@ import pyglet
|
||||
|
||||
_debug = pyglet.options['debug_media']
|
||||
|
||||
_codecs = Codecs()
|
||||
|
||||
add_decoders = _codecs.add_decoders
|
||||
get_decoders = _codecs.get_decoders
|
||||
add_encoders = _codecs.add_encoders
|
||||
get_encoders = _codecs.get_encoders
|
||||
registry = CodecRegistry()
|
||||
add_decoders = registry.add_decoders
|
||||
add_encoders = registry.add_encoders
|
||||
get_decoders = registry.get_decoders
|
||||
get_encoders = registry.get_encoders
|
||||
|
||||
|
||||
class MediaDecoder(Decoder):
|
||||
|
||||
def decode(self, file, filename, streaming):
|
||||
def decode(self, filename, file, streaming):
|
||||
"""Read the given file object and return an instance of `Source`
|
||||
or `StreamingSource`.
|
||||
Throws MediaDecodeException if there is an error. `filename`
|
||||
Throws DecodeException if there is an error. `filename`
|
||||
can be a file type hint.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
@ -62,7 +61,7 @@ class MediaDecoder(Decoder):
|
||||
|
||||
class MediaEncoder(Encoder):
|
||||
|
||||
def encode(self, source, file, filename):
|
||||
def encode(self, source, filename, file):
|
||||
"""Encode the given source to the given file. `filename`
|
||||
provides a hint to the file format desired. options are
|
||||
encoder-specific, and unknown options should be ignored or
|
||||
@ -71,21 +70,21 @@ class MediaEncoder(Encoder):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def add_default_media_codecs():
|
||||
def add_default_codecs():
|
||||
# Add all bundled codecs. These should be listed in order of
|
||||
# preference. This is called automatically by pyglet.media.
|
||||
|
||||
try:
|
||||
from . import wave
|
||||
add_decoders(wave)
|
||||
add_encoders(wave)
|
||||
registry.add_decoders(wave)
|
||||
registry.add_encoders(wave)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
if pyglet.compat_platform.startswith('linux'):
|
||||
try:
|
||||
from . import gstreamer
|
||||
add_decoders(gstreamer)
|
||||
registry.add_decoders(gstreamer)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
@ -94,20 +93,20 @@ def add_default_media_codecs():
|
||||
from pyglet.libs.win32.constants import WINDOWS_VISTA_OR_GREATER
|
||||
if WINDOWS_VISTA_OR_GREATER: # Supports Vista and above.
|
||||
from . import wmf
|
||||
add_decoders(wmf)
|
||||
registry.add_decoders(wmf)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
try:
|
||||
if have_ffmpeg():
|
||||
from . import ffmpeg
|
||||
add_decoders(ffmpeg)
|
||||
registry.add_decoders(ffmpeg)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
try:
|
||||
from . import pyogg
|
||||
add_decoders(pyogg)
|
||||
registry.add_decoders(pyogg)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
@ -35,9 +35,7 @@
|
||||
|
||||
import io
|
||||
|
||||
import pyglet
|
||||
|
||||
from pyglet.media.exceptions import MediaException, CannotSeekException, MediaEncodeException
|
||||
from pyglet.media.exceptions import MediaException, CannotSeekException
|
||||
|
||||
|
||||
class AudioFormat:
|
||||
@ -348,27 +346,11 @@ class Source:
|
||||
attempted is raised.
|
||||
|
||||
"""
|
||||
if not file:
|
||||
file = open(filename, 'wb')
|
||||
|
||||
if encoder:
|
||||
encoder.encode(self, file, filename)
|
||||
return encoder.enccode(self, filename, file)
|
||||
else:
|
||||
first_exception = None
|
||||
for encoder in pyglet.media.get_encoders(filename):
|
||||
|
||||
try:
|
||||
encoder.encode(self, file, filename)
|
||||
return
|
||||
except MediaEncodeException as e:
|
||||
first_exception = first_exception or e
|
||||
file.seek(0)
|
||||
|
||||
if not first_exception:
|
||||
raise MediaEncodeException(f"No Encoders are available for this extension: '{filename}'")
|
||||
raise first_exception
|
||||
|
||||
file.close()
|
||||
import pyglet.media.codecs
|
||||
return pyglet.media.codecs.registry.encode(self, filename, file)
|
||||
|
||||
# Internal methods that Player calls on the source:
|
||||
|
||||
|
@ -40,7 +40,7 @@ import tempfile
|
||||
from ctypes import (c_int, c_uint16, c_int32, c_int64, c_uint32, c_uint64,
|
||||
c_uint8, c_uint, c_double, c_float, c_ubyte, c_size_t, c_char, c_char_p,
|
||||
c_void_p, addressof, byref, cast, POINTER, CFUNCTYPE, Structure, Union,
|
||||
create_string_buffer, memmove)
|
||||
create_string_buffer, memmove, pointer)
|
||||
from collections import deque
|
||||
|
||||
import pyglet
|
||||
@ -124,6 +124,96 @@ def ffmpeg_init():
|
||||
protocols."""
|
||||
pass
|
||||
|
||||
class MemoryFileObject:
|
||||
"""A class to manage reading and seeking of a ffmpeg file object."""
|
||||
buffer_size = 32768
|
||||
|
||||
def __init__(self, file):
|
||||
self.file = file
|
||||
self.fmt_context = None
|
||||
self.buffer = None
|
||||
|
||||
if not getattr(self.file, 'seek', None) or not getattr(self.file, 'tell', None):
|
||||
raise Exception("File object does not support seeking.")
|
||||
|
||||
# Seek to end of file to get the filesize.
|
||||
self.file.seek(0, 2)
|
||||
self.file_size = self.file.tell()
|
||||
self.file.seek(0) # Put cursor back at the beginning.
|
||||
|
||||
def read_data_cb(_, buff, buf_size):
|
||||
data = self.file.read(buf_size)
|
||||
read_size = len(data)
|
||||
memmove(buff, data, read_size)
|
||||
return read_size
|
||||
|
||||
def seek_data_cb(_, offset, whence):
|
||||
if whence == libavformat.AVSEEK_SIZE:
|
||||
return self.file_size
|
||||
|
||||
pos = self.file.seek(offset, whence)
|
||||
return pos
|
||||
|
||||
self.read_func = libavformat.ffmpeg_read_func(read_data_cb)
|
||||
self.seek_func = libavformat.ffmpeg_seek_func(seek_data_cb)
|
||||
|
||||
def __del__(self):
|
||||
"""These are usually freed when the source is, but no guarantee."""
|
||||
if self.buffer:
|
||||
try:
|
||||
avutil.av_freep(self.buffer)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
if self.fmt_context:
|
||||
try:
|
||||
avutil.av_freep(self.fmt_context)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
def ffmpeg_open_memory_file(filename, file_object):
|
||||
"""Open a media file from a file object.
|
||||
:rtype: FFmpegFile
|
||||
:return: The structure containing all the information for the media.
|
||||
"""
|
||||
file = FFmpegFile()
|
||||
|
||||
file.context = libavformat.avformat.avformat_alloc_context()
|
||||
file.context.contents.seekable = 1
|
||||
|
||||
memory_file = MemoryFileObject(file_object)
|
||||
|
||||
av_buf = libavutil.avutil.av_malloc(memory_file.buffer_size)
|
||||
memory_file.buffer = cast(av_buf, c_char_p)
|
||||
|
||||
ptr = create_string_buffer(memory_file.buffer_size)
|
||||
|
||||
memory_file.fmt_context = libavformat.avformat.avio_alloc_context(
|
||||
memory_file.buffer,
|
||||
memory_file.buffer_size,
|
||||
0,
|
||||
ptr,
|
||||
memory_file.read_func,
|
||||
None,
|
||||
memory_file.seek_func
|
||||
)
|
||||
|
||||
file.context.contents.pb = memory_file.fmt_context
|
||||
file.context.contents.flags |= libavformat.AVFMT_FLAG_CUSTOM_IO
|
||||
|
||||
result = avformat.avformat_open_input(byref(file.context), filename, None, None)
|
||||
|
||||
if result != 0:
|
||||
raise FFmpegException('avformat_open_input in ffmpeg_open_filename returned an error opening file '
|
||||
+ filename.decode("utf8")
|
||||
+ ' Error code: ' + str(result))
|
||||
|
||||
result = avformat.avformat_find_stream_info(file.context, None)
|
||||
if result < 0:
|
||||
raise FFmpegException('Could not find stream info')
|
||||
|
||||
return file, memory_file
|
||||
|
||||
def ffmpeg_open_filename(filename):
|
||||
"""Open the media file.
|
||||
@ -136,6 +226,7 @@ def ffmpeg_open_filename(filename):
|
||||
filename,
|
||||
None,
|
||||
None)
|
||||
|
||||
if result != 0:
|
||||
raise FFmpegException('avformat_open_input in ffmpeg_open_filename returned an error opening file '
|
||||
+ filename.decode("utf8")
|
||||
@ -212,7 +303,9 @@ def ffmpeg_stream_info(file, stream_index):
|
||||
"""Open the stream
|
||||
"""
|
||||
av_stream = file.context.contents.streams[stream_index].contents
|
||||
|
||||
context = av_stream.codecpar.contents
|
||||
|
||||
if context.codec_type == AVMEDIA_TYPE_VIDEO:
|
||||
if _debug:
|
||||
print("codec_type=", context.codec_type)
|
||||
@ -315,6 +408,7 @@ def ffmpeg_open_stream(file, index):
|
||||
result = avcodec.avcodec_open2(codec_context, codec, None)
|
||||
if result < 0:
|
||||
raise FFmpegException('Could not open the media with the codec.')
|
||||
|
||||
stream = FFmpegStream()
|
||||
stream.format_context = file.context
|
||||
stream.codec_context = codec_context
|
||||
@ -375,7 +469,7 @@ def ffmpeg_get_packet_pts(file, packet):
|
||||
|
||||
|
||||
def ffmpeg_get_frame_ts(stream):
|
||||
ts = avutil.av_frame_get_best_effort_timestamp(stream.frame)
|
||||
ts = stream.frame.contents.best_effort_timestamp
|
||||
timestamp = avutil.av_rescale_q(ts,
|
||||
stream.time_base,
|
||||
AV_TIME_BASE_Q)
|
||||
@ -430,7 +524,6 @@ class VideoPacket(_Packet):
|
||||
|
||||
def __init__(self, packet, timestamp):
|
||||
super(VideoPacket, self).__init__(packet, timestamp)
|
||||
|
||||
# Decoded image. 0 == not decoded yet; None == Error or discarded
|
||||
self.image = 0
|
||||
self.id = self._next_id
|
||||
@ -450,14 +543,13 @@ class FFmpegSource(StreamingSource):
|
||||
self._video_stream = None
|
||||
self._audio_stream = None
|
||||
self._file = None
|
||||
self._memory_file = None
|
||||
|
||||
if file:
|
||||
file.seek(0)
|
||||
self._tempfile = tempfile.NamedTemporaryFile(buffering=False)
|
||||
self._tempfile.write(file.read())
|
||||
filename = self._tempfile.name
|
||||
self._file, self._memory_file = ffmpeg_open_memory_file(asbytes_filename(filename), file)
|
||||
else:
|
||||
self._file = ffmpeg_open_filename(asbytes_filename(filename))
|
||||
|
||||
self._file = ffmpeg_open_filename(asbytes_filename(filename))
|
||||
if not self._file:
|
||||
raise FFmpegException('Could not open "{0}"'.format(filename))
|
||||
|
||||
@ -485,7 +577,6 @@ class FFmpegSource(StreamingSource):
|
||||
info = ffmpeg_stream_info(self._file, i)
|
||||
|
||||
if isinstance(info, StreamVideoInfo) and self._video_stream is None:
|
||||
|
||||
stream = ffmpeg_open_stream(self._file, i)
|
||||
|
||||
self.video_format = VideoFormat(
|
||||
@ -517,6 +608,7 @@ class FFmpegSource(StreamingSource):
|
||||
|
||||
sample_rate = stream.codec_context.contents.sample_rate
|
||||
sample_format = stream.codec_context.contents.sample_fmt
|
||||
|
||||
if sample_format in (AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8P):
|
||||
self.tgt_format = AV_SAMPLE_FMT_U8
|
||||
elif sample_format in (AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P):
|
||||
@ -543,12 +635,12 @@ class FFmpegSource(StreamingSource):
|
||||
self._events = [] # They don't seem to be used!
|
||||
|
||||
self.audioq = deque()
|
||||
# Make queue big enough to accomodate 1.2 sec?
|
||||
# # Make queue big enough to accomodate 1.2 sec?
|
||||
self._max_len_audioq = 50 # Need to figure out a correct amount
|
||||
if self.audio_format:
|
||||
# Buffer 1 sec worth of audio
|
||||
nbytes = ffmpeg_get_audio_buffer_size(self.audio_format)
|
||||
self._audio_buffer = (c_uint8 * nbytes)()
|
||||
# Buffer 1 sec worth of audio
|
||||
nbytes = ffmpeg_get_audio_buffer_size(self.audio_format)
|
||||
self._audio_buffer = (c_uint8 * nbytes)()
|
||||
|
||||
self.videoq = deque()
|
||||
self._max_len_videoq = 50 # Need to figure out a correct amount
|
||||
@ -568,8 +660,6 @@ class FFmpegSource(StreamingSource):
|
||||
self.seek(0.0)
|
||||
|
||||
def __del__(self):
|
||||
if hasattr(self, '_tempfile'):
|
||||
self._tempfile.close()
|
||||
if self._packet and ffmpeg_free_packet is not None:
|
||||
ffmpeg_free_packet(self._packet)
|
||||
if self._video_stream and swscale is not None:
|
||||
@ -584,6 +674,7 @@ class FFmpegSource(StreamingSource):
|
||||
def seek(self, timestamp):
|
||||
if _debug:
|
||||
print('FFmpeg seek', timestamp)
|
||||
|
||||
ffmpeg_seek_file(
|
||||
self._file,
|
||||
timestamp_to_ffmpeg(timestamp + self.start_time)
|
||||
@ -646,11 +737,13 @@ class FFmpegSource(StreamingSource):
|
||||
the queues if space is available. Multiple calls to this method will
|
||||
only result in one scheduled call to `_fillq`.
|
||||
"""
|
||||
|
||||
audio_data = self.audioq.popleft()
|
||||
low_lvl = self._check_low_level()
|
||||
if not low_lvl and not self._fillq_scheduled:
|
||||
pyglet.clock.schedule_once(lambda dt: self._fillq(), 0)
|
||||
self._fillq_scheduled = True
|
||||
|
||||
return audio_data
|
||||
|
||||
def _get_video_packet(self):
|
||||
@ -738,14 +831,16 @@ class FFmpegSource(StreamingSource):
|
||||
|
||||
while len(data) < num_bytes:
|
||||
if not self.audioq:
|
||||
data = None
|
||||
break
|
||||
|
||||
audio_packet = self._get_audio_packet()
|
||||
buffer, timestamp, duration = self._decode_audio_packet(audio_packet, compensation_time)
|
||||
if not buffer:
|
||||
break
|
||||
data += buffer
|
||||
|
||||
if not data:
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
audio_data = AudioData(data, len(data), timestamp, duration, [])
|
||||
@ -763,7 +858,6 @@ class FFmpegSource(StreamingSource):
|
||||
return audio_data
|
||||
|
||||
def _decode_audio_packet(self, audio_packet, compensation_time):
|
||||
|
||||
while True:
|
||||
try:
|
||||
size_out = self._ffmpeg_decode_audio(
|
||||
@ -783,89 +877,97 @@ class FFmpegSource(StreamingSource):
|
||||
duration = float(len(buffer)) / self.audio_format.bytes_per_second
|
||||
timestamp = ffmpeg_get_frame_ts(self._audio_stream)
|
||||
timestamp = timestamp_from_ffmpeg(timestamp)
|
||||
|
||||
return buffer, timestamp, duration
|
||||
|
||||
return None, 0, 0
|
||||
|
||||
def _ffmpeg_decode_audio(self, packet, data_out, compensation_time):
|
||||
stream = self._audio_stream
|
||||
data_in = packet.data
|
||||
size_in = packet.size
|
||||
|
||||
if stream.type != AVMEDIA_TYPE_AUDIO:
|
||||
raise FFmpegException('Trying to decode audio on a non-audio stream.')
|
||||
|
||||
got_frame = c_int(0)
|
||||
bytes_used = avcodec.avcodec_decode_audio4(
|
||||
sent_result = avcodec.avcodec_send_packet(
|
||||
stream.codec_context,
|
||||
stream.frame,
|
||||
byref(got_frame),
|
||||
byref(packet))
|
||||
if bytes_used < 0:
|
||||
packet,
|
||||
)
|
||||
|
||||
if sent_result < 0:
|
||||
buf = create_string_buffer(128)
|
||||
avutil.av_strerror(bytes_used, buf, 128)
|
||||
avutil.av_strerror(sent_result, buf, 128)
|
||||
descr = buf.value
|
||||
raise FFmpegException('Error occured while decoding audio. ' +
|
||||
descr.decode())
|
||||
raise FFmpegException('Error occurred sending packet to decoder. {}'.format(descr.decode()))
|
||||
|
||||
receive_result = avcodec.avcodec_receive_frame(
|
||||
stream.codec_context,
|
||||
stream.frame
|
||||
)
|
||||
|
||||
if receive_result < 0:
|
||||
buf = create_string_buffer(128)
|
||||
avutil.av_strerror(receive_result, buf, 128)
|
||||
descr = buf.value
|
||||
raise FFmpegException('Error occurred receiving frame. {}'.format(descr.decode()))
|
||||
|
||||
plane_size = c_int(0)
|
||||
if got_frame:
|
||||
data_size = avutil.av_samples_get_buffer_size(
|
||||
byref(plane_size),
|
||||
stream.codec_context.contents.channels,
|
||||
stream.frame.contents.nb_samples,
|
||||
stream.codec_context.contents.sample_fmt,
|
||||
1)
|
||||
if data_size < 0:
|
||||
raise FFmpegException('Error in av_samples_get_buffer_size')
|
||||
if len(self._audio_buffer) < data_size:
|
||||
raise FFmpegException('Output audio buffer is too small for current audio frame!')
|
||||
|
||||
nb_samples = stream.frame.contents.nb_samples
|
||||
sample_rate = stream.codec_context.contents.sample_rate
|
||||
bytes_per_sample = avutil.av_get_bytes_per_sample(self.tgt_format)
|
||||
channels_out = min(2, self.audio_format.channels)
|
||||
data_size = avutil.av_samples_get_buffer_size(
|
||||
byref(plane_size),
|
||||
stream.codec_context.contents.channels,
|
||||
stream.frame.contents.nb_samples,
|
||||
stream.codec_context.contents.sample_fmt,
|
||||
1)
|
||||
if data_size < 0:
|
||||
raise FFmpegException('Error in av_samples_get_buffer_size')
|
||||
if len(self._audio_buffer) < data_size:
|
||||
raise FFmpegException('Output audio buffer is too small for current audio frame!')
|
||||
|
||||
wanted_nb_samples = nb_samples + compensation_time * sample_rate
|
||||
min_nb_samples = (nb_samples * (100 - self.SAMPLE_CORRECTION_PERCENT_MAX) / 100)
|
||||
max_nb_samples = (nb_samples * (100 + self.SAMPLE_CORRECTION_PERCENT_MAX) / 100)
|
||||
wanted_nb_samples = min(max(wanted_nb_samples, min_nb_samples), max_nb_samples)
|
||||
wanted_nb_samples = int(wanted_nb_samples)
|
||||
nb_samples = stream.frame.contents.nb_samples
|
||||
sample_rate = stream.codec_context.contents.sample_rate
|
||||
bytes_per_sample = avutil.av_get_bytes_per_sample(self.tgt_format)
|
||||
channels_out = min(2, self.audio_format.channels)
|
||||
|
||||
if wanted_nb_samples != nb_samples:
|
||||
res = swresample.swr_set_compensation(
|
||||
self.audio_convert_ctx,
|
||||
(wanted_nb_samples - nb_samples),
|
||||
wanted_nb_samples
|
||||
)
|
||||
if res < 0:
|
||||
raise FFmpegException('swr_set_compensation failed.')
|
||||
wanted_nb_samples = nb_samples + compensation_time * sample_rate
|
||||
min_nb_samples = (nb_samples * (100 - self.SAMPLE_CORRECTION_PERCENT_MAX) / 100)
|
||||
max_nb_samples = (nb_samples * (100 + self.SAMPLE_CORRECTION_PERCENT_MAX) / 100)
|
||||
wanted_nb_samples = min(max(wanted_nb_samples, min_nb_samples), max_nb_samples)
|
||||
wanted_nb_samples = int(wanted_nb_samples)
|
||||
|
||||
data_in = stream.frame.contents.extended_data
|
||||
p_data_out = cast(data_out, POINTER(c_uint8))
|
||||
if wanted_nb_samples != nb_samples:
|
||||
res = swresample.swr_set_compensation(
|
||||
self.audio_convert_ctx,
|
||||
(wanted_nb_samples - nb_samples),
|
||||
wanted_nb_samples
|
||||
)
|
||||
|
||||
out_samples = swresample.swr_get_out_samples(self.audio_convert_ctx, nb_samples)
|
||||
total_samples_out = swresample.swr_convert(self.audio_convert_ctx,
|
||||
byref(p_data_out), out_samples,
|
||||
data_in, nb_samples)
|
||||
while True:
|
||||
# We loop because there could be some more samples buffered in
|
||||
# SwrContext. We advance the pointer where we write our samples.
|
||||
offset = (total_samples_out * channels_out * bytes_per_sample)
|
||||
p_data_offset = cast(
|
||||
addressof(p_data_out.contents) + offset,
|
||||
POINTER(c_uint8)
|
||||
)
|
||||
samples_out = swresample.swr_convert(self.audio_convert_ctx,
|
||||
byref(p_data_offset),
|
||||
out_samples - total_samples_out, None, 0)
|
||||
if samples_out == 0:
|
||||
# No more samples. We can continue.
|
||||
break
|
||||
total_samples_out += samples_out
|
||||
if res < 0:
|
||||
raise FFmpegException('swr_set_compensation failed.')
|
||||
|
||||
data_in = stream.frame.contents.extended_data
|
||||
p_data_out = cast(data_out, POINTER(c_uint8))
|
||||
|
||||
out_samples = swresample.swr_get_out_samples(self.audio_convert_ctx, nb_samples)
|
||||
total_samples_out = swresample.swr_convert(self.audio_convert_ctx,
|
||||
byref(p_data_out), out_samples,
|
||||
data_in, nb_samples)
|
||||
while True:
|
||||
# We loop because there could be some more samples buffered in
|
||||
# SwrContext. We advance the pointer where we write our samples.
|
||||
offset = (total_samples_out * channels_out * bytes_per_sample)
|
||||
p_data_offset = cast(
|
||||
addressof(p_data_out.contents) + offset,
|
||||
POINTER(c_uint8)
|
||||
)
|
||||
samples_out = swresample.swr_convert(self.audio_convert_ctx,
|
||||
byref(p_data_offset),
|
||||
out_samples - total_samples_out, None, 0)
|
||||
if samples_out == 0:
|
||||
# No more samples. We can continue.
|
||||
break
|
||||
total_samples_out += samples_out
|
||||
|
||||
size_out = (total_samples_out * channels_out * bytes_per_sample)
|
||||
|
||||
size_out = (total_samples_out * channels_out * bytes_per_sample)
|
||||
else:
|
||||
size_out = 0
|
||||
return size_out
|
||||
|
||||
def _decode_video_packet(self, video_packet):
|
||||
@ -895,7 +997,7 @@ class FFmpegSource(StreamingSource):
|
||||
video_packet.image = image_data
|
||||
|
||||
if _debug:
|
||||
print('Decoding video packet at timestamp', video_packet.timestamp)
|
||||
print('Decoding video packet at timestamp', video_packet, video_packet.timestamp)
|
||||
|
||||
# t2 = clock.time()
|
||||
# pr.disable()
|
||||
@ -914,16 +1016,27 @@ class FFmpegSource(StreamingSource):
|
||||
if stream.type != AVMEDIA_TYPE_VIDEO:
|
||||
raise FFmpegException('Trying to decode video on a non-video stream.')
|
||||
|
||||
got_picture = c_int(0)
|
||||
bytes_used = avcodec.avcodec_decode_video2(
|
||||
sent_result = avcodec.avcodec_send_packet(
|
||||
stream.codec_context,
|
||||
stream.frame,
|
||||
byref(got_picture),
|
||||
byref(packet))
|
||||
if bytes_used < 0:
|
||||
raise FFmpegException('Error decoding a video packet.')
|
||||
if not got_picture:
|
||||
raise FFmpegException('No frame could be decompressed')
|
||||
packet,
|
||||
)
|
||||
|
||||
if sent_result < 0:
|
||||
buf = create_string_buffer(128)
|
||||
avutil.av_strerror(sent_result, buf, 128)
|
||||
descr = buf.value
|
||||
raise FFmpegException('Video: Error occurred sending packet to decoder. {}'.format(descr.decode()))
|
||||
|
||||
receive_result = avcodec.avcodec_receive_frame(
|
||||
stream.codec_context,
|
||||
stream.frame
|
||||
)
|
||||
|
||||
if receive_result < 0:
|
||||
buf = create_string_buffer(128)
|
||||
avutil.av_strerror(receive_result, buf, 128)
|
||||
descr = buf.value
|
||||
raise FFmpegException('Video: Error occurred receiving frame. {}'.format(descr.decode()))
|
||||
|
||||
avutil.av_image_fill_arrays(rgba_ptrs, rgba_stride, data_out,
|
||||
AV_PIX_FMT_RGBA, width, height, 1)
|
||||
@ -942,7 +1055,7 @@ class FFmpegSource(StreamingSource):
|
||||
height,
|
||||
rgba_ptrs,
|
||||
rgba_stride)
|
||||
return bytes_used
|
||||
return receive_result
|
||||
|
||||
def get_next_video_timestamp(self):
|
||||
if not self.video_format:
|
||||
@ -1041,7 +1154,7 @@ class FFmpegDecoder(MediaDecoder):
|
||||
def get_file_extensions(self):
|
||||
return '.mp3', '.ogg'
|
||||
|
||||
def decode(self, file, filename, streaming=True):
|
||||
def decode(self, filename, file, streaming=True):
|
||||
if streaming:
|
||||
return FFmpegSource(filename, file)
|
||||
else:
|
||||
|
@ -38,3 +38,5 @@ from .libavutil import *
|
||||
from .libavformat import *
|
||||
from .libswresample import *
|
||||
from .libswscale import *
|
||||
from .compat import *
|
||||
apply_version_changes()
|
||||
|
106
libs/pyglet/media/codecs/ffmpeg_lib/compat.py
Normal file
106
libs/pyglet/media/codecs/ffmpeg_lib/compat.py
Normal file
@ -0,0 +1,106 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
# pyglet
|
||||
# Copyright (c) 2006-2008 Alex Holkner
|
||||
# Copyright (c) 2008-2021 pyglet contributors
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of pyglet nor the names of its
|
||||
# contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
from collections import namedtuple
|
||||
from pyglet.util import debug_print
|
||||
|
||||
_debug = debug_print('debug_media')
|
||||
|
||||
CustomField = namedtuple("CustomField", "fields removals")
|
||||
|
||||
# Versions of the loaded libraries
|
||||
versions = {
|
||||
'avcodec': 0,
|
||||
'avformat': 0,
|
||||
'avutil': 0,
|
||||
'swresample': 0,
|
||||
'swscale': 0,
|
||||
}
|
||||
|
||||
# Group codecs by version they are usually packaged with.
|
||||
release_versions = [
|
||||
{'avcodec': 58, 'avformat': 58, 'avutil': 56, 'swresample': 3, 'swscale': 5},
|
||||
{'libavcodec': 59, 'avformat': 59, 'avutil': 57, 'swresample': 4, 'swscale': 6}
|
||||
]
|
||||
|
||||
# Removals done per library and version.
|
||||
_version_changes = {
|
||||
'avcodec': {},
|
||||
'avformat': {},
|
||||
'avutil': {},
|
||||
'swresample':{},
|
||||
'swscale': {}
|
||||
}
|
||||
|
||||
|
||||
def set_version(library, version):
|
||||
versions[library] = version
|
||||
|
||||
|
||||
def add_version_changes(library, version, structure, fields, removals):
|
||||
if version not in _version_changes[library]:
|
||||
_version_changes[library][version] = {}
|
||||
|
||||
if structure in _version_changes[library][version]:
|
||||
raise Exception("Structure: {} from: {} has already been added for version {}.".format(structure,
|
||||
library,
|
||||
version)
|
||||
)
|
||||
|
||||
_version_changes[library][version][structure] = CustomField(fields, removals)
|
||||
|
||||
|
||||
def apply_version_changes():
|
||||
"""Apply version changes to Structures in FFmpeg libraries.
|
||||
Field data can vary from version to version, however assigning _fields_ automatically assigns memory.
|
||||
_fields_ can also not be re-assigned. Use a temporary list that can be manipulated before setting the
|
||||
_fields_ of the Structure."""
|
||||
|
||||
if _debug:
|
||||
print("FFmpeg Loaded Versions:", versions)
|
||||
|
||||
for library, data in _version_changes.items():
|
||||
for version in data:
|
||||
for structure, cf_data in _version_changes[library][version].items():
|
||||
if versions[library] == version:
|
||||
if cf_data.removals:
|
||||
for remove_field in cf_data.removals:
|
||||
for field in list(cf_data.fields):
|
||||
if field[0] == remove_field:
|
||||
cf_data.fields.remove(field)
|
||||
|
||||
structure._fields_ = cf_data.fields
|
||||
|
||||
|
@ -36,20 +36,36 @@
|
||||
"""Wrapper for include/libavcodec/avcodec.h
|
||||
"""
|
||||
|
||||
from ctypes import c_int, c_uint16, c_int32, c_int64, c_uint32, c_uint64
|
||||
from ctypes import c_uint8, c_uint, c_double, c_float, c_ubyte, c_size_t, c_char, c_char_p
|
||||
from ctypes import c_void_p, addressof, byref, cast, POINTER, CFUNCTYPE, Structure, Union
|
||||
from ctypes import create_string_buffer, memmove
|
||||
from ctypes import c_int, c_uint16, c_int64, c_uint32, c_uint64
|
||||
from ctypes import c_uint8, c_uint, c_float, c_char_p
|
||||
from ctypes import c_void_p, POINTER, CFUNCTYPE, Structure
|
||||
|
||||
import pyglet
|
||||
import pyglet.lib
|
||||
from pyglet.util import debug_print
|
||||
from . import compat
|
||||
from . import libavutil
|
||||
|
||||
avcodec = pyglet.lib.load_library(
|
||||
'avcodec',
|
||||
win32='avcodec-58',
|
||||
darwin='avcodec.58'
|
||||
)
|
||||
_debug = debug_print('debug_media')
|
||||
|
||||
try:
|
||||
avcodec = pyglet.lib.load_library(
|
||||
'avcodec',
|
||||
win32='avcodec-59',
|
||||
darwin='avcodec.59'
|
||||
)
|
||||
version = 59
|
||||
except ImportError:
|
||||
if _debug:
|
||||
print("Failed to load: avcodec-59. Trying older version.")
|
||||
|
||||
avcodec = pyglet.lib.load_library(
|
||||
'avcodec',
|
||||
win32='avcodec-58',
|
||||
darwin='avcodec.58'
|
||||
)
|
||||
version = 58
|
||||
|
||||
compat.set_version('avcodec', version)
|
||||
|
||||
FF_INPUT_BUFFER_PADDING_SIZE = 32
|
||||
|
||||
@ -64,9 +80,13 @@ class AVPacketSideData(Structure):
|
||||
|
||||
AVBufferRef = libavutil.AVBufferRef
|
||||
|
||||
AVRational = libavutil.AVRational
|
||||
|
||||
|
||||
class AVPacket(Structure):
|
||||
_fields_ = [
|
||||
pass
|
||||
|
||||
AVPacket_Fields = [
|
||||
('buf', POINTER(AVBufferRef)),
|
||||
('pts', c_int64),
|
||||
('dts', c_int64),
|
||||
@ -78,17 +98,24 @@ class AVPacket(Structure):
|
||||
('side_data_elems', c_int),
|
||||
('duration', c_int64),
|
||||
('pos', c_int64),
|
||||
('convergence_duration', c_int64) # Deprecated
|
||||
('opaque', c_void_p), # 5.x only
|
||||
('opaque_ref', c_void_p), # 5.x only
|
||||
('time_base', AVRational), # 5.x only
|
||||
('convergence_duration', c_int64) # 4.x only
|
||||
]
|
||||
|
||||
|
||||
compat.add_version_changes('avcodec', 58, AVPacket, AVPacket_Fields,
|
||||
removals=('opaque', 'opaque_ref', 'time_base'))
|
||||
|
||||
compat.add_version_changes('avcodec', 59, AVPacket, AVPacket_Fields,
|
||||
removals=('convergence_duration',))
|
||||
|
||||
|
||||
class AVCodecParserContext(Structure):
|
||||
pass
|
||||
|
||||
|
||||
AVRational = libavutil.AVRational
|
||||
|
||||
|
||||
class AVCodecParameters(Structure):
|
||||
_fields_ = [
|
||||
('codec_type', c_int),
|
||||
@ -112,14 +139,14 @@ class AVCodecParameters(Structure):
|
||||
('color_space', c_int),
|
||||
('chroma_location', c_int),
|
||||
('video_delay', c_int),
|
||||
('channel_layout', c_uint64),
|
||||
('channels', c_int),
|
||||
('channel_layout', c_uint64), # deprecated as of 59
|
||||
('channels', c_int), # deprecated as of 59
|
||||
('sample_rate', c_int),
|
||||
('block_align', c_int),
|
||||
('frame_size', c_int),
|
||||
('initial_padding', c_int),
|
||||
('trailing_padding', c_int),
|
||||
('seek_preroll', c_int),
|
||||
('seek_preroll', c_int)
|
||||
]
|
||||
|
||||
|
||||
@ -178,7 +205,8 @@ class AVHWAccel(Structure):
|
||||
AVClass = libavutil.AVClass
|
||||
AVFrame = libavutil.AVFrame
|
||||
AV_NUM_DATA_POINTERS = libavutil.AV_NUM_DATA_POINTERS
|
||||
AVCodecContext._fields_ = [
|
||||
|
||||
AVCodecContext_Fields = [
|
||||
('av_class', POINTER(AVClass)),
|
||||
('log_level_offset', c_int),
|
||||
('codec_type', c_int),
|
||||
@ -211,10 +239,10 @@ AVCodecContext._fields_ = [
|
||||
('get_format', CFUNCTYPE(c_int, POINTER(AVCodecContext), POINTER(c_int))),
|
||||
('max_b_frames', c_int),
|
||||
('b_quant_factor', c_float),
|
||||
('b_frame_strategy', c_int), # Deprecated
|
||||
('b_frame_strategy', c_int), # Deprecated. Removed in 59.
|
||||
('b_quant_offset', c_float),
|
||||
('has_b_frames', c_int),
|
||||
('mpeg_quant', c_int), # Deprecated
|
||||
('mpeg_quant', c_int), # Deprecated. Removed in 59.
|
||||
('i_quant_factor', c_float),
|
||||
('i_quant_offset', c_float),
|
||||
('lumi_masking', c_float),
|
||||
@ -223,7 +251,7 @@ AVCodecContext._fields_ = [
|
||||
('p_masking', c_float),
|
||||
('dark_masking', c_float),
|
||||
('slice_count', c_int),
|
||||
('prediction_method', c_int), # Deprecated
|
||||
('prediction_method', c_int), # Deprecated. Removed in 59.
|
||||
('slice_offset', POINTER(c_int)),
|
||||
('sample_aspect_ratio', AVRational),
|
||||
('me_cmp', c_int),
|
||||
@ -232,7 +260,7 @@ AVCodecContext._fields_ = [
|
||||
('ildct_cmp', c_int),
|
||||
('dia_size', c_int),
|
||||
('last_predictor_count', c_int),
|
||||
('pre_me', c_int), # Deprecated
|
||||
('pre_me', c_int), # Deprecated. Removed in 59.
|
||||
('me_pre_cmp', c_int),
|
||||
('pre_dia_size', c_int),
|
||||
('me_subpel_quality', c_int),
|
||||
@ -241,21 +269,21 @@ AVCodecContext._fields_ = [
|
||||
('mb_decision', c_int),
|
||||
('intra_matrix', POINTER(c_uint16)),
|
||||
('inter_matrix', POINTER(c_uint16)),
|
||||
('scenechange_threshold', c_int), # Deprecated
|
||||
('noise_reduction', c_int), # Deprecated
|
||||
('scenechange_threshold', c_int), # Deprecated. Removed in 59.
|
||||
('noise_reduction', c_int), # Deprecated. Removed in 59.
|
||||
('intra_dc_precision', c_int),
|
||||
('skip_top', c_int),
|
||||
('skip_bottom', c_int),
|
||||
('mb_lmin', c_int),
|
||||
('mb_lmax', c_int),
|
||||
('me_penalty_compensation', c_int), # Deprecated
|
||||
('me_penalty_compensation', c_int), # Deprecated. Removed in 59.
|
||||
('bidir_refine', c_int),
|
||||
('brd_scale', c_int), # Deprecated
|
||||
('brd_scale', c_int), # Deprecated. Removed in 59.
|
||||
('keyint_min', c_int),
|
||||
('refs', c_int),
|
||||
('chromaoffset', c_int), # Deprecated
|
||||
('chromaoffset', c_int), # Deprecated. Removed in 59.
|
||||
('mv0_threshold', c_int),
|
||||
('b_sensitivity', c_int), # Deprecated
|
||||
('b_sensitivity', c_int), # Deprecated. Removed in 59.
|
||||
('color_primaries', c_int),
|
||||
('color_trc', c_int),
|
||||
('colorspace', c_int),
|
||||
@ -275,7 +303,7 @@ AVCodecContext._fields_ = [
|
||||
('audio_service_type', c_int),
|
||||
('request_sample_fmt', c_int),
|
||||
('get_buffer2', CFUNCTYPE(c_int, POINTER(AVCodecContext), POINTER(AVFrame), c_int)),
|
||||
('refcounted_frames', c_int), # Deprecated
|
||||
('refcounted_frames', c_int), # Deprecated. Removed in 59.
|
||||
('qcompress', c_float),
|
||||
('qblur', c_float),
|
||||
('qmin', c_int),
|
||||
@ -289,28 +317,28 @@ AVCodecContext._fields_ = [
|
||||
('rc_max_available_vbv_use', c_float),
|
||||
('rc_min_vbv_overflow_use', c_float),
|
||||
('rc_initial_buffer_occupancy', c_int),
|
||||
('coder_type', c_int), # Deprecated
|
||||
('context_model', c_int), # Deprecated
|
||||
('frame_skip_threshold', c_int), # Deprecated
|
||||
('frame_skip_factor', c_int), # Deprecated
|
||||
('frame_skip_exp', c_int), # Deprecated
|
||||
('frame_skip_cmp', c_int), # Deprecated
|
||||
('coder_type', c_int), # Deprecated. Removed in 59.
|
||||
('context_model', c_int), # Deprecated. Removed in 59.
|
||||
('frame_skip_threshold', c_int), # Deprecated. Removed in 59.
|
||||
('frame_skip_factor', c_int), # Deprecated. Removed in 59.
|
||||
('frame_skip_exp', c_int), # Deprecated. Removed in 59.
|
||||
('frame_skip_cmp', c_int), # Deprecated. Removed in 59.
|
||||
('trellis', c_int),
|
||||
('min_prediction_order', c_int), # Deprecated
|
||||
('max_prediction_order', c_int), # Deprecated
|
||||
('timecode_frame_start', c_int64), # Deprecated
|
||||
('rtp_callback', CFUNCTYPE(None, # Deprecated
|
||||
POINTER(AVCodecContext), c_void_p, c_int, c_int)),
|
||||
('rtp_payload_size', c_int), # Deprecated
|
||||
('mv_bits', c_int), # Deprecated
|
||||
('header_bits', c_int), # Deprecated
|
||||
('i_tex_bits', c_int), # Deprecated
|
||||
('p_tex_bits', c_int), # Deprecated
|
||||
('i_count', c_int), # Deprecated
|
||||
('p_count', c_int), # Deprecated
|
||||
('skip_count', c_int), # Deprecated
|
||||
('misc_bits', c_int), # Deprecated
|
||||
('frame_bits', c_int), # Deprecated
|
||||
('min_prediction_order', c_int), # Deprecated. Removed in 59.
|
||||
('max_prediction_order', c_int), # Deprecated. Removed in 59.
|
||||
('timecode_frame_start', c_int64), # Deprecated. Removed in 59.
|
||||
('rtp_callback', CFUNCTYPE(None, # Deprecated. Removed in 59.
|
||||
POINTER(AVCodecContext), c_void_p, c_int, c_int)),
|
||||
('rtp_payload_size', c_int), # Deprecated. Removed in 59.
|
||||
('mv_bits', c_int), # Deprecated. Removed in 59.
|
||||
('header_bits', c_int), # Deprecated. Removed in 59.
|
||||
('i_tex_bits', c_int), # Deprecated. Removed in 59.
|
||||
('p_tex_bits', c_int), # Deprecated. Removed in 59.
|
||||
('i_count', c_int), # Deprecated. Removed in 59.
|
||||
('p_count', c_int), # Deprecated. Removed in 59.
|
||||
('skip_count', c_int), # Deprecated. Removed in 59.
|
||||
('misc_bits', c_int), # Deprecated. Removed in 59.
|
||||
('frame_bits', c_int), # Deprecated. Removed in 59.
|
||||
('stats_out', c_char_p),
|
||||
('stats_in', c_char_p),
|
||||
('workaround_bugs', c_int),
|
||||
@ -327,7 +355,7 @@ AVCodecContext._fields_ = [
|
||||
('bits_per_coded_sample', c_int),
|
||||
('bits_per_raw_sample', c_int),
|
||||
('lowres', c_int),
|
||||
('coded_frame', POINTER(AVFrame)), # Deprecated
|
||||
('coded_frame', POINTER(AVFrame)), # Deprecated. Removed in 59.
|
||||
('thread_count', c_int),
|
||||
('thread_type', c_int),
|
||||
('active_thread_type', c_int),
|
||||
@ -348,8 +376,8 @@ AVCodecContext._fields_ = [
|
||||
('skip_frame', c_int),
|
||||
('subtitle_header', POINTER(c_uint8)),
|
||||
('subtitle_header_size', c_int),
|
||||
('vbv_delay', c_uint64), # Deprecated
|
||||
('side_data_only_packets', c_int), # Deprecated
|
||||
('vbv_delay', c_uint64), # Deprecated. Removed in 59.
|
||||
('side_data_only_packets', c_int), # Deprecated. Removed in 59.
|
||||
('initial_padding', c_int),
|
||||
('framerate', AVRational),
|
||||
# !
|
||||
@ -379,9 +407,20 @@ AVCodecContext._fields_ = [
|
||||
('hwaccel_flags', c_int),
|
||||
('apply_cropping', c_int),
|
||||
('extra_hw_frames', c_int)
|
||||
|
||||
]
|
||||
|
||||
compat.add_version_changes('avcodec', 58, AVCodecContext, AVCodecContext_Fields, removals=None)
|
||||
|
||||
compat.add_version_changes('avcodec', 59, AVCodecContext, AVCodecContext_Fields,
|
||||
removals=('b_frame_strategy', 'mpeg_quant', 'prediction_method', 'pre_me', 'scenechange_threshold',
|
||||
'noise_reduction', 'me_penalty_compensation', 'brd_scale', 'chromaoffset', 'b_sensitivity',
|
||||
'refcounted_frames', 'coder_type', 'context_model', 'coder_type', 'context_model',
|
||||
'frame_skip_threshold', 'frame_skip_factor', 'frame_skip_exp', 'frame_skip_cmp',
|
||||
'min_prediction_order', 'max_prediction_order', 'timecode_frame_start', 'rtp_callback',
|
||||
'rtp_payload_size', 'mv_bits', 'header_bits', 'i_tex_bits', 'p_tex_bits', 'i_count', 'p_count',
|
||||
'skip_count', 'misc_bits', 'frames_bits', 'coded_frame', 'vbv_delay', 'side_data_only_packets')
|
||||
)
|
||||
|
||||
AV_CODEC_ID_VP8 = 139
|
||||
AV_CODEC_ID_VP9 = 167
|
||||
|
||||
@ -400,14 +439,13 @@ avcodec.avcodec_open2.argtypes = [POINTER(AVCodecContext),
|
||||
avcodec.avcodec_free_context.argtypes = [POINTER(POINTER(AVCodecContext))]
|
||||
avcodec.av_packet_alloc.restype = POINTER(AVPacket)
|
||||
avcodec.av_init_packet.argtypes = [POINTER(AVPacket)]
|
||||
avcodec.avcodec_decode_audio4.restype = c_int
|
||||
avcodec.avcodec_decode_audio4.argtypes = [POINTER(AVCodecContext),
|
||||
POINTER(AVFrame), POINTER(c_int),
|
||||
POINTER(AVPacket)]
|
||||
avcodec.avcodec_decode_video2.restype = c_int
|
||||
avcodec.avcodec_decode_video2.argtypes = [POINTER(AVCodecContext),
|
||||
POINTER(AVFrame), POINTER(c_int),
|
||||
POINTER(AVPacket)]
|
||||
|
||||
avcodec.avcodec_receive_frame.restype = c_int
|
||||
avcodec.avcodec_receive_frame.argtypes = [POINTER(AVCodecContext), POINTER(AVFrame)]
|
||||
|
||||
avcodec.avcodec_send_packet.restype = c_int
|
||||
avcodec.avcodec_send_packet.argtypes = [POINTER(AVCodecContext), POINTER(AVPacket)]
|
||||
|
||||
avcodec.avcodec_flush_buffers.argtypes = [POINTER(AVCodecContext)]
|
||||
avcodec.avcodec_alloc_context3.restype = POINTER(AVCodecContext)
|
||||
avcodec.avcodec_alloc_context3.argtypes = [POINTER(AVCodec)]
|
||||
|
@ -34,31 +34,50 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
"""Wrapper for include/libavformat/avformat.h
|
||||
"""
|
||||
from ctypes import c_int, c_uint16, c_int32, c_int64, c_uint32, c_uint64
|
||||
from ctypes import c_uint8, c_uint, c_double, c_float, c_ubyte, c_size_t, c_char, c_char_p
|
||||
from ctypes import c_void_p, addressof, byref, cast, POINTER, CFUNCTYPE, Structure, Union
|
||||
from ctypes import create_string_buffer, memmove
|
||||
from ctypes import c_int, c_int64
|
||||
from ctypes import c_uint8, c_uint, c_double, c_ubyte, c_size_t, c_char, c_char_p
|
||||
from ctypes import c_void_p, POINTER, CFUNCTYPE, Structure, sizeof
|
||||
|
||||
import pyglet
|
||||
import pyglet.lib
|
||||
from pyglet.util import debug_print
|
||||
from . import compat
|
||||
from . import libavcodec
|
||||
from . import libavutil
|
||||
|
||||
avformat = pyglet.lib.load_library(
|
||||
'avformat',
|
||||
win32='avformat-58',
|
||||
darwin='avformat.58'
|
||||
)
|
||||
_debug = debug_print('debug_media')
|
||||
|
||||
try:
|
||||
avformat = pyglet.lib.load_library(
|
||||
'avformat',
|
||||
win32='avformat-59',
|
||||
darwin='avformat.59'
|
||||
)
|
||||
version = 59
|
||||
except ImportError:
|
||||
if _debug:
|
||||
print("Failed to load: avformat-59. Trying older version.")
|
||||
|
||||
avformat = pyglet.lib.load_library(
|
||||
'avformat',
|
||||
win32='avformat-58',
|
||||
darwin='avformat.58'
|
||||
)
|
||||
version = 58
|
||||
|
||||
compat.set_version('avformat', version)
|
||||
|
||||
AVSEEK_FLAG_BACKWARD = 1 # ///< seek backward
|
||||
AVSEEK_FLAG_BYTE = 2 # ///< seeking based on position in bytes
|
||||
AVSEEK_FLAG_ANY = 4 # ///< seek to any frame, even non-keyframes
|
||||
AVSEEK_FLAG_FRAME = 8 # ///< seeking based on frame number
|
||||
AVSEEK_SIZE = 0x10000
|
||||
AVFMT_FLAG_CUSTOM_IO = 0x0080
|
||||
|
||||
MAX_REORDER_DELAY = 16
|
||||
|
||||
|
||||
class AVPacketList(Structure): pass
|
||||
class AVPacketList(Structure):
|
||||
pass
|
||||
|
||||
|
||||
class AVInputFormat(Structure):
|
||||
@ -131,13 +150,18 @@ AVCodecParameters = libavcodec.AVCodecParameters
|
||||
AVRational = libavutil.AVRational
|
||||
AVDictionary = libavutil.AVDictionary
|
||||
AVFrame = libavutil.AVFrame
|
||||
AVClass = libavutil.AVClass
|
||||
AVCodec = libavcodec.AVCodec
|
||||
|
||||
|
||||
|
||||
class AVStream(Structure):
|
||||
_fields_ = [
|
||||
pass
|
||||
|
||||
AVStream_Fields = [
|
||||
('index', c_int),
|
||||
('id', c_int),
|
||||
('codec', POINTER(AVCodecContext)),
|
||||
('codec', POINTER(AVCodecContext)), # Deprecated. Removed in 59.
|
||||
('priv_data', c_void_p),
|
||||
('time_base', AVRational),
|
||||
('start_time', c_int64),
|
||||
@ -153,48 +177,17 @@ class AVStream(Structure):
|
||||
('nb_side_data', c_int),
|
||||
('event_flags', c_int),
|
||||
('r_frame_rate', AVRational),
|
||||
('recommended_encoder_configuration', c_char_p),
|
||||
('recommended_encoder_configuration', c_char_p), # Deprecated. Removed in 59.
|
||||
('codecpar', POINTER(AVCodecParameters)),
|
||||
('info', POINTER(AVStreamInfo)),
|
||||
('info', POINTER(AVStreamInfo)), # Deprecated. Removed in 59.
|
||||
('pts_wrap_bits', c_int),
|
||||
('first_dts', c_int64),
|
||||
('cur_dts', c_int64),
|
||||
('last_IP_pts', c_int64),
|
||||
('last_IP_duration', c_int),
|
||||
('probe_packets', c_int),
|
||||
('codec_info_nb_frames', c_int),
|
||||
('need_parsing', c_int),
|
||||
('parser', POINTER(AVCodecParserContext)),
|
||||
('last_in_packet_buffer', POINTER(AVPacketList)),
|
||||
('probe_data', AVProbeData),
|
||||
('pts_buffer', c_int64 * (MAX_REORDER_DELAY + 1)),
|
||||
('index_entries', POINTER(AVIndexEntry)),
|
||||
('nb_index_entries', c_int),
|
||||
('index_entries_allocated_size', c_uint),
|
||||
('stream_identifier', c_int),
|
||||
('interleaver_chunk_size', c_int64),
|
||||
('interleaver_chunk_duration', c_int64),
|
||||
('request_probe', c_int),
|
||||
('skip_to_keyframe', c_int),
|
||||
('skip_samples', c_int),
|
||||
('start_skip_samples', c_int64),
|
||||
('first_discard_sample', c_int64),
|
||||
('last_discard_sample', c_int64),
|
||||
('nb_decoded_frames', c_int),
|
||||
('mux_ts_offset', c_int64),
|
||||
('pts_wrap_reference', c_int64),
|
||||
('pts_wrap_behavior', c_int),
|
||||
('update_initial_durations_done', c_int),
|
||||
('pts_reorder_error', c_int64 * (MAX_REORDER_DELAY + 1)),
|
||||
('pts_reorder_error_count', c_uint8 * (MAX_REORDER_DELAY + 1)),
|
||||
('last_dts_for_order_check', c_int64),
|
||||
('dts_ordered', c_uint8),
|
||||
('dts_misordered', c_uint8),
|
||||
('inject_global_side_data', c_int),
|
||||
('display_aspect_ratio', AVRational),
|
||||
('internal', POINTER(AVStreamInternal))
|
||||
]
|
||||
|
||||
compat.add_version_changes('avformat', 58, AVStream, AVStream_Fields, removals=None)
|
||||
|
||||
compat.add_version_changes('avformat', 59, AVStream, AVStream_Fields,
|
||||
removals=('codec', 'recommended_encoder_configuration', 'info'))
|
||||
|
||||
|
||||
class AVProgram(Structure):
|
||||
pass
|
||||
@ -215,15 +208,11 @@ class AVIOInterruptCB(Structure):
|
||||
]
|
||||
|
||||
|
||||
AVClass = libavutil.AVClass
|
||||
AVCodec = libavcodec.AVCodec
|
||||
|
||||
|
||||
class AVFormatContext(Structure):
|
||||
pass
|
||||
|
||||
|
||||
AVFormatContext._fields_ = [
|
||||
AVFormatContext_Fields = [
|
||||
('av_class', POINTER(AVClass)),
|
||||
('iformat', POINTER(AVInputFormat)),
|
||||
('oformat', POINTER(AVOutputFormat)),
|
||||
@ -232,7 +221,7 @@ AVFormatContext._fields_ = [
|
||||
('ctx_flags', c_int),
|
||||
('nb_streams', c_uint),
|
||||
('streams', POINTER(POINTER(AVStream))),
|
||||
('filename', c_char * 1024), # Deprecated
|
||||
('filename', c_char * 1024), # Deprecated. Removed in 59
|
||||
('url', c_char_p),
|
||||
('start_time', c_int64),
|
||||
('duration', c_int64),
|
||||
@ -279,7 +268,7 @@ AVFormatContext._fields_ = [
|
||||
('format_probesize', c_int),
|
||||
('codec_whitelist', c_char_p),
|
||||
('format_whitelist', c_char_p),
|
||||
('internal', POINTER(AVFormatInternal)),
|
||||
('internal', POINTER(AVFormatInternal)), # Deprecated. Removed in 59
|
||||
('io_repositioned', c_int),
|
||||
('video_codec', POINTER(AVCodec)),
|
||||
('audio_codec', POINTER(AVCodec)),
|
||||
@ -293,7 +282,6 @@ AVFormatContext._fields_ = [
|
||||
('output_ts_offset', c_int64),
|
||||
('dump_separator', POINTER(c_uint8)),
|
||||
('data_codec_id', c_int),
|
||||
# ! one more in here?
|
||||
('protocol_whitelist', c_char_p),
|
||||
('io_open', CFUNCTYPE(c_int,
|
||||
POINTER(AVFormatContext),
|
||||
@ -303,10 +291,19 @@ AVFormatContext._fields_ = [
|
||||
('io_close', CFUNCTYPE(None,
|
||||
POINTER(AVFormatContext), POINTER(AVIOContext))),
|
||||
('protocol_blacklist', c_char_p),
|
||||
('max_streams', c_int)
|
||||
('max_streams', c_int),
|
||||
('skip_estimate_duration_from_pts', c_int), # Added in 59.
|
||||
('max_probe_packets', c_int), # Added in 59.
|
||||
('io_close2', CFUNCTYPE(c_int, POINTER(AVFormatContext), POINTER(AVIOContext))) # Added in 59.
|
||||
]
|
||||
|
||||
avformat.av_register_all.restype = None
|
||||
compat.add_version_changes('avformat', 58, AVFormatContext, AVFormatContext_Fields,
|
||||
removals=('skip_estimate_duration_from_pts', 'max_probe_packets', 'io_close2'))
|
||||
|
||||
compat.add_version_changes('avformat', 59, AVFormatContext, AVFormatContext_Fields,
|
||||
removals=('filename', 'internal'))
|
||||
|
||||
|
||||
avformat.av_find_input_format.restype = c_int
|
||||
avformat.av_find_input_format.argtypes = [c_int]
|
||||
avformat.avformat_open_input.restype = c_int
|
||||
@ -335,6 +332,19 @@ avformat.av_guess_frame_rate.restype = AVRational
|
||||
avformat.av_guess_frame_rate.argtypes = [POINTER(AVFormatContext),
|
||||
POINTER(AVStream), POINTER(AVFrame)]
|
||||
|
||||
ffmpeg_read_func = CFUNCTYPE(c_int, c_void_p, POINTER(c_char), c_int)
|
||||
ffmpeg_write_func = CFUNCTYPE(c_int, c_void_p, POINTER(c_char), c_int)
|
||||
ffmpeg_seek_func = CFUNCTYPE(c_int64, c_void_p, c_int64, c_int)
|
||||
|
||||
avformat.avio_alloc_context.restype = POINTER(AVIOContext)
|
||||
avformat.avio_alloc_context.argtypes = [c_char_p, c_int, c_int, c_void_p, ffmpeg_read_func, c_void_p, ffmpeg_seek_func]
|
||||
|
||||
avformat.avformat_alloc_context.restype = POINTER(AVFormatContext)
|
||||
avformat.avformat_alloc_context.argtypes = []
|
||||
|
||||
avformat.avformat_free_context.restype = c_void_p
|
||||
avformat.avformat_free_context.argtypes = [POINTER(AVFormatContext)]
|
||||
|
||||
__all__ = [
|
||||
'avformat',
|
||||
'AVSEEK_FLAG_BACKWARD',
|
||||
|
@ -34,19 +34,35 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
"""Wrapper for include/libavutil/avutil.h
|
||||
"""
|
||||
from ctypes import c_int, c_uint16, c_int32, c_int64, c_uint32, c_uint64
|
||||
from ctypes import c_uint8, c_int8, c_uint, c_double, c_float, c_ubyte, c_size_t, c_char
|
||||
from ctypes import c_char_p, c_void_p, addressof, byref, cast, POINTER, CFUNCTYPE, Structure
|
||||
from ctypes import Union, create_string_buffer, memmove
|
||||
from ctypes import c_char_p, c_void_p, POINTER, Structure
|
||||
from ctypes import c_int, c_int64, c_uint64
|
||||
from ctypes import c_uint8, c_int8, c_uint, c_size_t
|
||||
|
||||
import pyglet
|
||||
import pyglet.lib
|
||||
from pyglet.util import debug_print
|
||||
from . import compat
|
||||
|
||||
avutil = pyglet.lib.load_library(
|
||||
'avutil',
|
||||
win32='avutil-56',
|
||||
darwin='avutil.56'
|
||||
)
|
||||
_debug = debug_print('debug_media')
|
||||
|
||||
try:
|
||||
avutil = pyglet.lib.load_library(
|
||||
'avutil',
|
||||
win32='avutil-57',
|
||||
darwin='avutil.57'
|
||||
)
|
||||
version = 57
|
||||
except ImportError:
|
||||
if _debug:
|
||||
print("Failed to load: avutil-57. Trying older version.")
|
||||
|
||||
avutil = pyglet.lib.load_library(
|
||||
'avutil',
|
||||
win32='avutil-56',
|
||||
darwin='avutil.56'
|
||||
)
|
||||
version = 56
|
||||
|
||||
compat.set_version('avutil', version)
|
||||
|
||||
AVMEDIA_TYPE_UNKNOWN = -1
|
||||
AVMEDIA_TYPE_VIDEO = 0
|
||||
@ -75,7 +91,13 @@ AV_PIX_FMT_RGB24 = 2
|
||||
AV_PIX_FMT_ARGB = 25
|
||||
AV_PIX_FMT_RGBA = 26
|
||||
|
||||
|
||||
AVChannelOrder = c_int
|
||||
class AVChannelLayout(Structure):
|
||||
_fields_ = [
|
||||
('order', c_int),
|
||||
('nb_channels', c_int),
|
||||
# .. more
|
||||
]
|
||||
class AVBuffer(Structure):
|
||||
_fields_ = [
|
||||
('data', POINTER(c_uint8)),
|
||||
@ -122,64 +144,72 @@ class AVFrameSideData(Structure):
|
||||
|
||||
|
||||
class AVFrame(Structure):
|
||||
_fields_ = [
|
||||
('data', POINTER(c_uint8) * AV_NUM_DATA_POINTERS),
|
||||
('linesize', c_int * AV_NUM_DATA_POINTERS),
|
||||
('extended_data', POINTER(POINTER(c_uint8))),
|
||||
('width', c_int),
|
||||
('height', c_int),
|
||||
('nb_samples', c_int),
|
||||
('format', c_int),
|
||||
('key_frame', c_int),
|
||||
('pict_type', c_int),
|
||||
('sample_aspect_ratio', AVRational),
|
||||
('pts', c_int64),
|
||||
('pkt_pts', c_int64), # Deprecated
|
||||
('pkt_dts', c_int64),
|
||||
('coded_picture_number', c_int),
|
||||
('display_picture_number', c_int),
|
||||
('quality', c_int),
|
||||
('opaque', c_void_p),
|
||||
('error', c_uint64 * AV_NUM_DATA_POINTERS), # Deprecated
|
||||
('repeat_pict', c_int),
|
||||
('interlaced_frame', c_int),
|
||||
('top_field_first', c_int),
|
||||
('palette_has_changed', c_int),
|
||||
('reordered_opaque', c_int64),
|
||||
('sample_rate', c_int),
|
||||
('channel_layout', c_uint64),
|
||||
('buf', POINTER(AVBufferRef) * AV_NUM_DATA_POINTERS),
|
||||
('extended_buf', POINTER(POINTER(AVBufferRef))),
|
||||
('nb_extended_buf', c_int),
|
||||
('side_data', POINTER(POINTER(AVFrameSideData))),
|
||||
('nb_side_data', c_int),
|
||||
('flags', c_int),
|
||||
('color_range', c_int),
|
||||
('color_primaries', c_int),
|
||||
('color_trc', c_int),
|
||||
('colorspace', c_int),
|
||||
('chroma_location', c_int),
|
||||
('best_effort_timestamp', c_int64),
|
||||
('pkt_pos', c_int64),
|
||||
('pkt_duration', c_int64),
|
||||
# !
|
||||
('metadata', POINTER(AVDictionary)),
|
||||
('decode_error_flags', c_int),
|
||||
('channels', c_int),
|
||||
('pkt_size', c_int),
|
||||
('qscale_table', POINTER(c_int8)), # Deprecated
|
||||
('qstride', c_int), # Deprecated
|
||||
('qscale_type', c_int), # Deprecated
|
||||
('qp_table_buf', POINTER(AVBufferRef)), # Deprecated
|
||||
('hw_frames_ctx', POINTER(AVBufferRef)),
|
||||
('opaque_ref', POINTER(AVBufferRef)),
|
||||
('crop_top', c_size_t), # video frames only
|
||||
('crop_bottom', c_size_t), # video frames only
|
||||
('crop_left', c_size_t), # video frames only
|
||||
('crop_right', c_size_t), # video frames only
|
||||
('private_ref', POINTER(AVBufferRef)),
|
||||
]
|
||||
pass
|
||||
|
||||
AVFrame_Fields = [
|
||||
('data', POINTER(c_uint8) * AV_NUM_DATA_POINTERS),
|
||||
('linesize', c_int * AV_NUM_DATA_POINTERS),
|
||||
('extended_data', POINTER(POINTER(c_uint8))),
|
||||
('width', c_int),
|
||||
('height', c_int),
|
||||
('nb_samples', c_int),
|
||||
('format', c_int),
|
||||
('key_frame', c_int),
|
||||
('pict_type', c_int),
|
||||
('sample_aspect_ratio', AVRational),
|
||||
('pts', c_int64),
|
||||
('pkt_pts', c_int64), # Deprecated. Removed in 57.
|
||||
('pkt_dts', c_int64),
|
||||
('time_base', AVRational), # (5.x)
|
||||
('coded_picture_number', c_int),
|
||||
('display_picture_number', c_int),
|
||||
('quality', c_int),
|
||||
('opaque', c_void_p),
|
||||
('error', c_uint64 * AV_NUM_DATA_POINTERS), # Deprecated. Removed in 57.
|
||||
('repeat_pict', c_int),
|
||||
('interlaced_frame', c_int),
|
||||
('top_field_first', c_int),
|
||||
('palette_has_changed', c_int),
|
||||
('reordered_opaque', c_int64),
|
||||
('sample_rate', c_int),
|
||||
('channel_layout', c_uint64),
|
||||
('buf', POINTER(AVBufferRef) * AV_NUM_DATA_POINTERS),
|
||||
('extended_buf', POINTER(POINTER(AVBufferRef))),
|
||||
('nb_extended_buf', c_int),
|
||||
('side_data', POINTER(POINTER(AVFrameSideData))),
|
||||
('nb_side_data', c_int),
|
||||
('flags', c_int),
|
||||
('color_range', c_int),
|
||||
('color_primaries', c_int),
|
||||
('color_trc', c_int),
|
||||
('colorspace', c_int),
|
||||
('chroma_location', c_int),
|
||||
('best_effort_timestamp', c_int64),
|
||||
('pkt_pos', c_int64),
|
||||
('pkt_duration', c_int64),
|
||||
# !
|
||||
('metadata', POINTER(AVDictionary)),
|
||||
('decode_error_flags', c_int),
|
||||
('channels', c_int),
|
||||
('pkt_size', c_int),
|
||||
('qscale_table', POINTER(c_int8)), # Deprecated. Removed in 57.
|
||||
('qstride', c_int), # Deprecated. Removed in 57.
|
||||
('qscale_type', c_int), # Deprecated. Removed in 57.
|
||||
('qp_table_buf', POINTER(AVBufferRef)), # Deprecated. Removed in 57.
|
||||
('hw_frames_ctx', POINTER(AVBufferRef)),
|
||||
('opaque_ref', POINTER(AVBufferRef)),
|
||||
('crop_top', c_size_t), # video frames only
|
||||
('crop_bottom', c_size_t), # video frames only
|
||||
('crop_left', c_size_t), # video frames only
|
||||
('crop_right', c_size_t), # video frames only
|
||||
('private_ref', POINTER(AVBufferRef)),
|
||||
]
|
||||
|
||||
compat.add_version_changes('avutil', 56, AVFrame, AVFrame_Fields,
|
||||
removals=('time_base',))
|
||||
|
||||
compat.add_version_changes('avutil', 57, AVFrame, AVFrame_Fields,
|
||||
removals=('pkt_pts', 'error', 'qscale_table', 'qstride', 'qscale_type', 'qp_table_buf'))
|
||||
|
||||
AV_NOPTS_VALUE = -0x8000000000000000
|
||||
AV_TIME_BASE = 1000000
|
||||
@ -203,8 +233,7 @@ avutil.av_get_bytes_per_sample.restype = c_int
|
||||
avutil.av_get_bytes_per_sample.argtypes = [c_int]
|
||||
avutil.av_strerror.restype = c_int
|
||||
avutil.av_strerror.argtypes = [c_int, c_char_p, c_size_t]
|
||||
avutil.av_frame_get_best_effort_timestamp.restype = c_int64
|
||||
avutil.av_frame_get_best_effort_timestamp.argtypes = [POINTER(AVFrame)]
|
||||
|
||||
avutil.av_image_fill_arrays.restype = c_int
|
||||
avutil.av_image_fill_arrays.argtypes = [POINTER(c_uint8) * 4, c_int * 4,
|
||||
POINTER(c_uint8), c_int, c_int, c_int, c_int]
|
||||
@ -214,6 +243,10 @@ avutil.av_dict_set.argtypes = [POINTER(POINTER(AVDictionary)),
|
||||
avutil.av_dict_free.argtypes = [POINTER(POINTER(AVDictionary))]
|
||||
avutil.av_log_set_level.restype = c_int
|
||||
avutil.av_log_set_level.argtypes = [c_uint]
|
||||
avutil.av_malloc.restype = c_void_p
|
||||
avutil.av_malloc.argtypes = [c_int]
|
||||
avutil.av_freep.restype = c_void_p
|
||||
avutil.av_freep.argtypes = [c_void_p]
|
||||
|
||||
__all__ = [
|
||||
'avutil',
|
||||
|
@ -34,19 +34,37 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
"""Wrapper for include/libswresample/swresample.h
|
||||
"""
|
||||
from ctypes import c_int, c_uint16, c_int32, c_int64, c_uint32, c_uint64
|
||||
from ctypes import c_uint8, c_uint, c_double, c_float, c_ubyte, c_size_t, c_char, c_char_p
|
||||
from ctypes import c_void_p, addressof, byref, cast, POINTER, CFUNCTYPE, Structure, Union
|
||||
from ctypes import create_string_buffer, memmove
|
||||
from ctypes import c_int, c_int64
|
||||
from ctypes import c_uint8
|
||||
from ctypes import c_void_p, POINTER, Structure
|
||||
|
||||
import pyglet
|
||||
import pyglet.lib
|
||||
from pyglet.util import debug_print
|
||||
from . import compat
|
||||
|
||||
swresample = pyglet.lib.load_library(
|
||||
'swresample',
|
||||
win32='swresample-3',
|
||||
darwin='swresample.3'
|
||||
)
|
||||
_debug = debug_print('debug_media')
|
||||
|
||||
|
||||
try:
|
||||
swresample = pyglet.lib.load_library(
|
||||
'swresample',
|
||||
win32='swresample-4',
|
||||
darwin='swresample.4'
|
||||
)
|
||||
version = 4
|
||||
|
||||
except ImportError:
|
||||
if _debug:
|
||||
print("Failed to load: swresample-4. Trying older version.")
|
||||
|
||||
swresample = pyglet.lib.load_library(
|
||||
'swresample',
|
||||
win32='swresample-3',
|
||||
darwin='swresample.3'
|
||||
)
|
||||
version = 3
|
||||
|
||||
compat.set_version('swresample', version)
|
||||
|
||||
SWR_CH_MAX = 32
|
||||
|
||||
|
@ -34,19 +34,35 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
"""Wrapper for include/libswscale/swscale.h
|
||||
"""
|
||||
from ctypes import c_int, c_uint16, c_int32, c_int64, c_uint32, c_uint64
|
||||
from ctypes import c_uint8, c_uint, c_double, c_float, c_ubyte, c_size_t, c_char, c_char_p
|
||||
from ctypes import c_void_p, addressof, byref, cast, POINTER, CFUNCTYPE, Structure, Union
|
||||
from ctypes import create_string_buffer, memmove
|
||||
from ctypes import POINTER, Structure
|
||||
from ctypes import c_int
|
||||
from ctypes import c_uint8, c_double
|
||||
|
||||
import pyglet
|
||||
import pyglet.lib
|
||||
from pyglet.util import debug_print
|
||||
from . import compat
|
||||
|
||||
swscale = pyglet.lib.load_library(
|
||||
'swscale',
|
||||
win32='swscale-5',
|
||||
darwin='swscale.5'
|
||||
)
|
||||
_debug = debug_print('debug_media')
|
||||
|
||||
try:
|
||||
swscale = pyglet.lib.load_library(
|
||||
'swscale',
|
||||
win32='swscale-6',
|
||||
darwin='swscale.6'
|
||||
)
|
||||
version = 6
|
||||
except ImportError:
|
||||
if _debug:
|
||||
print("Failed to load: swscale-6. Trying older version.")
|
||||
|
||||
swscale = pyglet.lib.load_library(
|
||||
'swscale',
|
||||
win32='swscale-5',
|
||||
darwin='swscale.5'
|
||||
)
|
||||
version = 5
|
||||
|
||||
compat.set_version('swscale', version)
|
||||
|
||||
SWS_FAST_BILINEAR = 1
|
||||
|
||||
|
@ -42,16 +42,19 @@ import tempfile
|
||||
|
||||
from threading import Event, Thread
|
||||
|
||||
from ..exceptions import MediaDecodeException
|
||||
from pyglet.util import DecodeException
|
||||
from .base import StreamingSource, AudioData, AudioFormat, StaticSource
|
||||
from . import MediaEncoder, MediaDecoder
|
||||
|
||||
import gi
|
||||
gi.require_version('Gst', '1.0')
|
||||
from gi.repository import Gst, GLib
|
||||
try:
|
||||
import gi
|
||||
gi.require_version('Gst', '1.0')
|
||||
from gi.repository import Gst, GLib
|
||||
except (ValueError, ImportError) as e:
|
||||
raise ImportError(e)
|
||||
|
||||
|
||||
class GStreamerDecodeException(MediaDecodeException):
|
||||
class GStreamerDecodeException(DecodeException):
|
||||
pass
|
||||
|
||||
|
||||
@ -278,7 +281,7 @@ class GStreamerDecoder(MediaDecoder):
|
||||
def get_file_extensions(self):
|
||||
return '.mp3', '.flac', '.ogg', '.m4a'
|
||||
|
||||
def decode(self, file, filename, streaming=True):
|
||||
def decode(self, filename, file, streaming=True):
|
||||
|
||||
if not any(filename.endswith(ext) for ext in self.get_file_extensions()):
|
||||
# Refuse to decode anything not specifically listed in the supported
|
||||
|
@ -9,7 +9,7 @@ from ctypes import memmove, create_string_buffer, byref
|
||||
|
||||
from pyglet.media import StreamingSource
|
||||
from pyglet.media.codecs import AudioFormat, AudioData, MediaDecoder, StaticSource
|
||||
from pyglet.util import debug_print
|
||||
from pyglet.util import debug_print, DecodeException
|
||||
|
||||
|
||||
_debug = debug_print('Debug PyOgg codec')
|
||||
@ -168,7 +168,7 @@ class MemoryOpusFileStream(UnclosedOpusFileStream):
|
||||
)
|
||||
|
||||
if error.value != 0:
|
||||
raise pyogg.PyOggError(
|
||||
raise DecodeException(
|
||||
"file-like object: {} couldn't be processed. Error code : {}".format(filename, error.value))
|
||||
|
||||
self.channels = pyogg.opus.op_channel_count(self.of, -1)
|
||||
@ -195,7 +195,7 @@ class MemoryVorbisFileStream(UnclosedVorbisFileStream):
|
||||
|
||||
error = pyogg.vorbis.libvorbisfile.ov_open_callbacks(buff, self.vf, None, 0, self.memory_object.callbacks)
|
||||
if error != 0:
|
||||
raise pyogg.PyOggError("file couldn't be opened or doesn't exist. Error code : {}".format(error))
|
||||
raise DecodeException("file couldn't be opened or doesn't exist. Error code : {}".format(error))
|
||||
|
||||
info = pyogg.vorbis.ov_info(byref(self.vf), -1)
|
||||
|
||||
@ -282,12 +282,12 @@ class MemoryFLACFileStream(UnclosedFLACFileStream):
|
||||
)
|
||||
|
||||
if init_status: # error
|
||||
raise pyogg.PyOggError("An error occurred when trying to open '{}': {}".format(
|
||||
raise DecodeException("An error occurred when trying to open '{}': {}".format(
|
||||
path, pyogg.flac.FLAC__StreamDecoderInitStatusEnum[init_status]))
|
||||
|
||||
metadata_status = pyogg.flac.FLAC__stream_decoder_process_until_end_of_metadata(self.decoder)
|
||||
if not metadata_status: # error
|
||||
raise pyogg.PyOggError("An error occured when trying to decode the metadata of {}".format(path))
|
||||
raise DecodeException("An error occured when trying to decode the metadata of {}".format(path))
|
||||
|
||||
def read_callback(self, decoder, buffer, size, data):
|
||||
chunk = size.contents.value
|
||||
@ -449,7 +449,7 @@ class PyOggDecoder(MediaDecoder):
|
||||
def get_file_extensions(self):
|
||||
return PyOggDecoder.exts
|
||||
|
||||
def decode(self, file, filename, streaming=True):
|
||||
def decode(self, filename, file, streaming=True):
|
||||
name, ext = os.path.splitext(filename)
|
||||
if ext in PyOggDecoder.vorbis_exts:
|
||||
source = PyOggVorbisSource
|
||||
@ -458,7 +458,7 @@ class PyOggDecoder(MediaDecoder):
|
||||
elif ext in PyOggDecoder.opus_exts:
|
||||
source = PyOggOpusSource
|
||||
else:
|
||||
raise Exception("Decoder could not find a suitable source to use with this filetype.")
|
||||
raise DecodeException("Decoder could not find a suitable source to use with this filetype.")
|
||||
|
||||
if streaming:
|
||||
return source(filename, file)
|
||||
|
@ -38,12 +38,12 @@
|
||||
|
||||
import wave
|
||||
|
||||
from ..exceptions import MediaDecodeException
|
||||
from pyglet.util import DecodeException
|
||||
from .base import StreamingSource, AudioData, AudioFormat, StaticSource
|
||||
from . import MediaEncoder, MediaDecoder
|
||||
|
||||
|
||||
class WAVEDecodeException(MediaDecodeException):
|
||||
class WAVEDecodeException(DecodeException):
|
||||
pass
|
||||
|
||||
|
||||
@ -51,8 +51,7 @@ class WaveSource(StreamingSource):
|
||||
def __init__(self, filename, file=None):
|
||||
if file is None:
|
||||
file = open(filename, 'rb')
|
||||
|
||||
self._file = file
|
||||
self._file = file
|
||||
|
||||
try:
|
||||
self._wave = wave.open(file)
|
||||
@ -100,7 +99,7 @@ class WaveDecoder(MediaDecoder):
|
||||
def get_file_extensions(self):
|
||||
return '.wav', '.wave', '.riff'
|
||||
|
||||
def decode(self, file, filename, streaming=True):
|
||||
def decode(self, filename, file, streaming=True):
|
||||
if streaming:
|
||||
return WaveSource(filename, file)
|
||||
else:
|
||||
@ -112,7 +111,7 @@ class WaveEncoder(MediaEncoder):
|
||||
def get_file_extensions(self):
|
||||
return '.wav', '.wave', '.riff'
|
||||
|
||||
def encode(self, source, file, filename):
|
||||
def encode(self, source, filename, file):
|
||||
"""Save the Source to disk as a standard RIFF Wave.
|
||||
|
||||
A standard RIFF wave header will be added to the raw PCM
|
||||
@ -123,6 +122,11 @@ class WaveEncoder(MediaEncoder):
|
||||
The file name to save as.
|
||||
|
||||
"""
|
||||
opened_file = None
|
||||
if file is None:
|
||||
file = open(filename, 'wb')
|
||||
opened_file = True
|
||||
|
||||
source.seek(0)
|
||||
wave_writer = wave.open(file, mode='wb')
|
||||
wave_writer.setnchannels(source.audio_format.channels)
|
||||
@ -134,6 +138,9 @@ class WaveEncoder(MediaEncoder):
|
||||
while audiodata:
|
||||
wave_writer.writeframes(audiodata.data)
|
||||
audiodata = source.get_audio_data(chunksize)
|
||||
else:
|
||||
if opened_file:
|
||||
file.close()
|
||||
|
||||
|
||||
def get_decoders():
|
||||
|
@ -37,12 +37,12 @@ import platform
|
||||
import warnings
|
||||
|
||||
from pyglet import com, image
|
||||
from pyglet.util import debug_print
|
||||
from pyglet.util import debug_print, DecodeException
|
||||
from pyglet.libs.win32 import _kernel32 as kernel32
|
||||
from pyglet.libs.win32 import _ole32 as ole32
|
||||
from pyglet.libs.win32.constants import *
|
||||
from pyglet.libs.win32.types import *
|
||||
from pyglet.media import Source, MediaDecodeException
|
||||
from pyglet.media import Source
|
||||
from pyglet.media.codecs import AudioFormat, AudioData, VideoFormat, MediaDecoder, StaticSource
|
||||
|
||||
_debug = debug_print('debug_media')
|
||||
@ -484,18 +484,18 @@ class WMFSource(Source):
|
||||
self._imf_bytestream.SetCurrentPosition(0)
|
||||
|
||||
if wrote_length.value != data_len:
|
||||
raise MediaDecodeException("Could not write all of the data to the bytestream file.")
|
||||
raise DecodeException("Could not write all of the data to the bytestream file.")
|
||||
|
||||
try:
|
||||
MFCreateSourceReaderFromByteStream(self._imf_bytestream, self._attributes, ctypes.byref(self._source_reader))
|
||||
except OSError as err:
|
||||
raise MediaDecodeException(err) from None
|
||||
raise DecodeException(err) from None
|
||||
else:
|
||||
# We can just load from filename if no file object specified..
|
||||
try:
|
||||
MFCreateSourceReaderFromURL(filename, self._attributes, ctypes.byref(self._source_reader))
|
||||
except OSError as err:
|
||||
raise MediaDecodeException(err) from None
|
||||
raise DecodeException(err) from None
|
||||
|
||||
if self.decode_audio:
|
||||
self._load_audio()
|
||||
@ -568,7 +568,7 @@ class WMFSource(Source):
|
||||
try:
|
||||
self._source_reader.SetCurrentMediaType(self._audio_stream_index, None, mf_mediatype)
|
||||
except OSError as err: # Can't decode codec.
|
||||
raise MediaDecodeException(err) from None
|
||||
raise DecodeException(err) from None
|
||||
|
||||
# Current media type should now be properly decoded at this point.
|
||||
decoded_media_type = IMFMediaType() # Maybe reusing older IMFMediaType will work?
|
||||
@ -623,7 +623,7 @@ class WMFSource(Source):
|
||||
try:
|
||||
self._source_reader.SetCurrentMediaType(self._video_stream_index, None, uncompressed_mt)
|
||||
except OSError as err: # Can't decode codec.
|
||||
raise MediaDecodeException(err) from None
|
||||
raise DecodeException(err) from None
|
||||
|
||||
height, width = self._get_attribute_size(uncompressed_mt, MF_MT_FRAME_SIZE)
|
||||
|
||||
@ -875,7 +875,7 @@ class WMFDecoder(MediaDecoder):
|
||||
def get_file_extensions(self):
|
||||
return self.extensions
|
||||
|
||||
def decode(self, file, filename, streaming=True):
|
||||
def decode(self, filename, file, streaming=True):
|
||||
if streaming:
|
||||
return WMFSource(filename, file)
|
||||
else:
|
||||
|
@ -44,11 +44,3 @@ class MediaFormatException(MediaException):
|
||||
|
||||
class CannotSeekException(MediaException):
|
||||
pass
|
||||
|
||||
|
||||
class MediaDecodeException(MediaException):
|
||||
exception_priority = 10
|
||||
|
||||
|
||||
class MediaEncodeException(MediaException):
|
||||
pass
|
||||
|
@ -82,8 +82,6 @@ instance when loading the Model::
|
||||
.. versionadded:: 1.4
|
||||
"""
|
||||
|
||||
from io import BytesIO
|
||||
|
||||
import pyglet
|
||||
|
||||
from pyglet import gl
|
||||
@ -92,12 +90,11 @@ from pyglet.gl import current_context
|
||||
from pyglet.math import Mat4, Vec3
|
||||
from pyglet.graphics import shader
|
||||
|
||||
from .codecs import ModelDecodeException
|
||||
from .codecs import add_encoders, add_decoders, add_default_model_codecs
|
||||
from .codecs import get_encoders, get_decoders
|
||||
from .codecs import registry as _codec_registry
|
||||
from .codecs import add_default_codecs as _add_default_codecs
|
||||
|
||||
|
||||
def load(filename, file=None, decoder=None, batch=None):
|
||||
def load(filename, file=None, decoder=None, batch=None, group=None):
|
||||
"""Load a 3D model from a file.
|
||||
|
||||
:Parameters:
|
||||
@ -112,36 +109,15 @@ def load(filename, file=None, decoder=None, batch=None):
|
||||
registered for the file extension, or if decoding fails.
|
||||
`batch` : Batch or None
|
||||
An optional Batch instance to add this model to.
|
||||
`group` : Group or None
|
||||
An optional top level Group.
|
||||
|
||||
:rtype: :py:mod:`~pyglet.model.Model`
|
||||
"""
|
||||
|
||||
if not file:
|
||||
file = open(filename, 'rb')
|
||||
|
||||
if not hasattr(file, 'seek'):
|
||||
file = BytesIO(file.read())
|
||||
|
||||
try:
|
||||
if decoder:
|
||||
return decoder.decode(file, filename, batch)
|
||||
else:
|
||||
first_exception = None
|
||||
for decoder in get_decoders(filename):
|
||||
try:
|
||||
model = decoder.decode(file, filename, batch)
|
||||
return model
|
||||
except ModelDecodeException as e:
|
||||
if (not first_exception or
|
||||
first_exception.exception_priority < e.exception_priority):
|
||||
first_exception = e
|
||||
file.seek(0)
|
||||
|
||||
if not first_exception:
|
||||
raise ModelDecodeException('No decoders are available for this model format.')
|
||||
raise first_exception
|
||||
finally:
|
||||
file.close()
|
||||
if decoder:
|
||||
return decoder.decode(filename, file, batch=batch, group=group)
|
||||
else:
|
||||
return _codec_registry.decode(filename, file, batch=batch, group=group)
|
||||
|
||||
|
||||
def get_default_shader():
|
||||
@ -260,14 +236,15 @@ class Material:
|
||||
self.texture_name == other.texture_name)
|
||||
|
||||
|
||||
class BaseMaterialGroup(graphics.ShaderGroup):
|
||||
class BaseMaterialGroup(graphics.Group):
|
||||
default_vert_src = None
|
||||
default_frag_src = None
|
||||
matrix = Mat4()
|
||||
|
||||
def __init__(self, material, program, order=0, parent=None):
|
||||
super().__init__(program, order, parent)
|
||||
super().__init__(order, parent)
|
||||
self.material = material
|
||||
self.program = program
|
||||
|
||||
|
||||
class TexturedMaterialGroup(BaseMaterialGroup):
|
||||
@ -391,4 +368,4 @@ class MaterialGroup(BaseMaterialGroup):
|
||||
self.program['model'] = self.matrix
|
||||
|
||||
|
||||
add_default_model_codecs()
|
||||
_add_default_codecs()
|
||||
|
@ -33,15 +33,14 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
from pyglet.util import Codecs, Decoder, Encoder, DecodeException, EncodeException
|
||||
from pyglet.util import CodecRegistry, Decoder, Encoder, DecodeException, EncodeException
|
||||
|
||||
|
||||
_codecs = Codecs()
|
||||
|
||||
add_decoders = _codecs.add_decoders
|
||||
get_decoders = _codecs.get_decoders
|
||||
add_encoders = _codecs.add_encoders
|
||||
get_encoders = _codecs.get_encoders
|
||||
registry = CodecRegistry()
|
||||
add_decoders = registry.add_decoders
|
||||
add_encoders = registry.add_encoders
|
||||
get_decoders = registry.get_decoders
|
||||
get_encoders = registry.get_encoders
|
||||
|
||||
|
||||
class ModelDecodeException(DecodeException):
|
||||
@ -53,7 +52,7 @@ class ModelEncodeException(EncodeException):
|
||||
|
||||
|
||||
class ModelDecoder(Decoder):
|
||||
def decode(self, file, filename, batch):
|
||||
def decode(self, filename, file, batch, group):
|
||||
"""Decode the given file object and return an instance of `Model`.
|
||||
Throws ModelDecodeException if there is an error. filename
|
||||
can be a file type hint.
|
||||
@ -63,7 +62,7 @@ class ModelDecoder(Decoder):
|
||||
|
||||
class ModelEncoder(Encoder):
|
||||
|
||||
def encode(self, model, file, filename):
|
||||
def encode(self, model, filename, file):
|
||||
"""Encode the given model to the given file. filename
|
||||
provides a hint to the file format desired. options are
|
||||
encoder-specific, and unknown options should be ignored or
|
||||
@ -72,13 +71,13 @@ class ModelEncoder(Encoder):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def add_default_model_codecs():
|
||||
def add_default_codecs():
|
||||
# Add all bundled codecs. These should be listed in order of
|
||||
# preference. This is called automatically by pyglet.model.
|
||||
|
||||
try:
|
||||
from pyglet.model.codecs import obj
|
||||
add_decoders(obj)
|
||||
registry.add_decoders(obj)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
@ -231,7 +231,7 @@ class OBJModelDecoder(ModelDecoder):
|
||||
def get_file_extensions(self):
|
||||
return ['.obj']
|
||||
|
||||
def decode(self, file, filename, batch):
|
||||
def decode(self, filename, file, batch, group=None):
|
||||
|
||||
if not batch:
|
||||
batch = pyglet.graphics.Batch()
|
||||
@ -247,20 +247,20 @@ class OBJModelDecoder(ModelDecoder):
|
||||
if material.texture_name:
|
||||
program = pyglet.model.get_default_textured_shader()
|
||||
texture = pyglet.resource.texture(material.texture_name)
|
||||
group = TexturedMaterialGroup(material, program, texture)
|
||||
vertex_lists.append(program.vertex_list(count, GL_TRIANGLES, batch, group,
|
||||
matgroup = TexturedMaterialGroup(material, program, texture, parent=group)
|
||||
vertex_lists.append(program.vertex_list(count, GL_TRIANGLES, batch, matgroup,
|
||||
vertices=('f', mesh.vertices),
|
||||
normals=('f', mesh.normals),
|
||||
tex_coords=('f', mesh.tex_coords),
|
||||
colors=('f', material.diffuse * count)))
|
||||
else:
|
||||
program = pyglet.model.get_default_shader()
|
||||
group = MaterialGroup(material, program)
|
||||
vertex_lists.append(program.vertex_list(count, GL_TRIANGLES, batch, group,
|
||||
matgroup = MaterialGroup(material, program, parent=group)
|
||||
vertex_lists.append(program.vertex_list(count, GL_TRIANGLES, batch, matgroup,
|
||||
vertices=('f', mesh.vertices),
|
||||
normals=('f', mesh.normals),
|
||||
colors=('f', material.diffuse * count)))
|
||||
groups.append(group)
|
||||
groups.append(matgroup)
|
||||
|
||||
return Model(vertex_lists=vertex_lists, groups=groups, batch=batch)
|
||||
|
||||
|
@ -81,7 +81,7 @@ import pyglet
|
||||
from pyglet.gl import GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
|
||||
from pyglet.gl import GL_TRIANGLES, GL_LINES, GL_BLEND
|
||||
from pyglet.gl import glBlendFunc, glEnable, glDisable
|
||||
from pyglet.graphics import shader, Batch, ShaderGroup
|
||||
from pyglet.graphics import shader, Batch, Group
|
||||
|
||||
|
||||
vertex_source = """#version 150 core
|
||||
@ -151,7 +151,7 @@ def _rotate(vertices, angle, x, y):
|
||||
return rotated_vertices
|
||||
|
||||
|
||||
class _ShapeGroup(ShaderGroup):
|
||||
class _ShapeGroup(Group):
|
||||
"""Shared Shape rendering Group.
|
||||
|
||||
The group is automatically coalesced with other shape groups
|
||||
@ -171,10 +171,13 @@ class _ShapeGroup(ShaderGroup):
|
||||
`blend_dest` : int
|
||||
OpenGL blend destination mode; for example,
|
||||
``GL_ONE_MINUS_SRC_ALPHA``.
|
||||
`program` : `~pyglet.graphics.shader.ShaderProgram`
|
||||
The ShaderProgram to use.
|
||||
`parent` : `~pyglet.graphics.Group`
|
||||
Optional parent group.
|
||||
"""
|
||||
super().__init__(program, parent=parent)
|
||||
super().__init__(parent=parent)
|
||||
self.program = program
|
||||
self.blend_src = blend_src
|
||||
self.blend_dest = blend_dest
|
||||
|
||||
|
@ -357,12 +357,14 @@ class _GlyphBox(_AbstractBox):
|
||||
for start, end, color in context.colors_iter.ranges(i, i + n_glyphs):
|
||||
if color is None:
|
||||
color = (0, 0, 0, 255)
|
||||
if len(color) != 4:
|
||||
raise ValueError("Color requires 4 values (R, G, B, A). Value received: {}".format(color))
|
||||
colors.extend(color * ((end - start) * 4))
|
||||
|
||||
indices = []
|
||||
# Create indices for each glyph quad:
|
||||
for i in range(n_glyphs):
|
||||
indices.extend([element + (i * 4) for element in [0, 1, 2, 0, 2, 3]])
|
||||
for glyph_idx in range(n_glyphs):
|
||||
indices.extend([element + (glyph_idx * 4) for element in [0, 1, 2, 0, 2, 3]])
|
||||
|
||||
vertex_list = program.vertex_list_indexed(n_glyphs * 4, GL_TRIANGLES, indices, layout.batch, group,
|
||||
position=('f', vertices),
|
||||
@ -384,6 +386,7 @@ class _GlyphBox(_AbstractBox):
|
||||
y1 = y + self.descent + baseline
|
||||
y2 = y + self.ascent + baseline
|
||||
x1 = x
|
||||
|
||||
for start, end, decoration in context.decoration_iter.ranges(i, i + n_glyphs):
|
||||
bg, underline = decoration
|
||||
x2 = x1
|
||||
@ -391,18 +394,28 @@ class _GlyphBox(_AbstractBox):
|
||||
x2 += glyph.advance + kern
|
||||
|
||||
if bg is not None:
|
||||
if len(bg) != 4:
|
||||
raise ValueError("Background color requires 4 values (R, G, B, A). Value received: {}".format(bg))
|
||||
|
||||
background_vertices.extend([x1, y1, x2, y1, x2, y2, x1, y2])
|
||||
background_colors.extend(bg * 4)
|
||||
|
||||
if underline is not None:
|
||||
if len(underline) != 4:
|
||||
raise ValueError("Underline color requires 4 values (R, G, B, A). Value received: {}".format(underline))
|
||||
|
||||
underline_vertices.extend([x1, y + baseline - 2, x2, y + baseline - 2])
|
||||
underline_colors.extend(underline * 2)
|
||||
|
||||
x1 = x2
|
||||
|
||||
if background_vertices:
|
||||
background_list = program.vertex_list_indexed(len(background_vertices) // 2,
|
||||
GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
||||
background_indices = []
|
||||
bg_count = len(background_vertices) // 2
|
||||
for glyph_idx in range(bg_count):
|
||||
background_indices.extend([element + (glyph_idx * 4) for element in [0, 1, 2, 0, 2, 3]])
|
||||
|
||||
background_list = program.vertex_list_indexed(bg_count, GL_TRIANGLES, background_indices,
|
||||
layout.batch, layout.background_decoration_group,
|
||||
position=('f', background_vertices),
|
||||
colors=('Bn', background_colors))
|
||||
|
@ -36,6 +36,7 @@
|
||||
"""Various utility functions used internally by pyglet
|
||||
"""
|
||||
|
||||
import io
|
||||
import os
|
||||
import sys
|
||||
|
||||
@ -134,7 +135,7 @@ def debug_print(enabled_or_option='debug'):
|
||||
return _debug_print
|
||||
|
||||
|
||||
class Codecs:
|
||||
class CodecRegistry:
|
||||
"""Utility class for handling adding and querying of codecs."""
|
||||
|
||||
def __init__(self):
|
||||
@ -154,20 +155,19 @@ class Codecs:
|
||||
return self._encoders
|
||||
|
||||
def get_decoders(self, filename=None):
|
||||
"""Get an ordered list of all decoders. If a `filename` is provided,
|
||||
decoders supporting that extension will be ordered first in the list.
|
||||
"""Get a list of all decoders. If a `filename` is provided, only
|
||||
decoders supporting that extension will be returned. An empty list
|
||||
will be return if no encoders for that extension are available.
|
||||
"""
|
||||
decoders = []
|
||||
if filename:
|
||||
extension = os.path.splitext(filename)[1].lower()
|
||||
decoders += self._decoder_extensions.get(extension, [])
|
||||
decoders += [e for e in self._decoders if e not in decoders]
|
||||
return decoders
|
||||
return self._decoder_extensions.get(extension, [])
|
||||
return self._decoders
|
||||
|
||||
def add_decoders(self, module):
|
||||
"""Add a decoder module. The module must define `get_decoders`. Once
|
||||
added, the appropriate decoders defined in the codec will be returned by
|
||||
Codecs.get_decoders.
|
||||
CodecRegistry.get_decoders.
|
||||
"""
|
||||
for decoder in module.get_decoders():
|
||||
self._decoders.append(decoder)
|
||||
@ -179,7 +179,7 @@ class Codecs:
|
||||
def add_encoders(self, module):
|
||||
"""Add an encoder module. The module must define `get_encoders`. Once
|
||||
added, the appropriate encoders defined in the codec will be returned by
|
||||
Codecs.get_encoders.
|
||||
CodecRegistry.get_encoders.
|
||||
"""
|
||||
for encoder in module.get_encoders():
|
||||
self._encoders.append(encoder)
|
||||
@ -188,6 +188,51 @@ class Codecs:
|
||||
self._encoder_extensions[extension] = []
|
||||
self._encoder_extensions[extension].append(encoder)
|
||||
|
||||
def decode(self, filename, file, **kwargs):
|
||||
"""Attempt to decode a file, using the available registered decoders.
|
||||
Any decoders that match the file extension will be tried first. If no
|
||||
decoders match the extension, all decoders will then be tried in order.
|
||||
"""
|
||||
first_exception = None
|
||||
|
||||
for decoder in self.get_decoders(filename):
|
||||
try:
|
||||
return decoder.decode(filename, file, **kwargs)
|
||||
except DecodeException as e:
|
||||
if not first_exception:
|
||||
first_exception = e
|
||||
if file:
|
||||
file.seek(0)
|
||||
|
||||
for decoder in self.get_decoders():
|
||||
try:
|
||||
return decoder.decode(filename, file, **kwargs)
|
||||
except DecodeException:
|
||||
if file:
|
||||
file.seek(0)
|
||||
|
||||
if not first_exception:
|
||||
raise DecodeException(f"No decoders available for this file type: {filename}")
|
||||
raise first_exception
|
||||
|
||||
def encode(self, media, filename, file=None, **kwargs):
|
||||
"""Attempt to encode a pyglet object to a specified format. All registered
|
||||
encoders that advertise support for the specific file extension will be tried.
|
||||
If no encoders are available, an EncodeException will be raised.
|
||||
"""
|
||||
|
||||
first_exception = None
|
||||
for encoder in self.get_encoders(filename):
|
||||
|
||||
try:
|
||||
return encoder.encode(media, filename, file, **kwargs)
|
||||
except EncodeException as e:
|
||||
first_exception = first_exception or e
|
||||
|
||||
if not first_exception:
|
||||
raise EncodeException(f"No Encoders are available for this extension: '{filename}'")
|
||||
raise first_exception
|
||||
|
||||
|
||||
class Decoder:
|
||||
def get_file_extensions(self):
|
||||
@ -220,7 +265,7 @@ class Encoder:
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def encode(self, media, file, filename):
|
||||
def encode(self, media, filename, file):
|
||||
"""Encode the given media type to the given file. `filename`
|
||||
provides a hint to the file format desired. options are
|
||||
encoder-specific, and unknown options should be ignored or
|
||||
@ -239,8 +284,8 @@ class Encoder:
|
||||
|
||||
|
||||
class DecodeException(Exception):
|
||||
exception_priority = 10
|
||||
__module__ = "CodecRegistry"
|
||||
|
||||
|
||||
class EncodeException(Exception):
|
||||
pass
|
||||
__module__ = "CodecRegistry"
|
||||
|
Loading…
Reference in New Issue
Block a user