GithubHelp home page GithubHelp logo

missionpinball / mpf-mc Goto Github PK

View Code? Open in Web Editor NEW
21.0 9.0 42.0 65.58 MB

The Mission Pinball Framework Media Controller. Controls graphics, sounds, DMDs, and LCD displays in MPF.

Home Page: http://missionpinball.org

License: MIT License

Python 95.92% Shell 0.10% Makefile 0.02% C 0.27% Dockerfile 0.11% Cython 3.57%
mpf mission-pinball-framework pinball

mpf-mc's Introduction

Mission Pinball Framework - Media Controller (mpf-mc)

This package is for the "Media Controller" for the Mission Pinball Framework (MPF).

The architecture of MPF breaks the pinball software into two pieces. The core engine which controls the pinball machine and runs the game logic is in the MPF package. Separate from that is the Media Controller which controls the display and sound, including the DMD, Color DMD, RGB LED DMD, and/or onscreen or LCD display. (Note that you need a media controller to drive a DMD and sound even if you don't have an on-screen LCD window. Don't worry--you can run this headless and/or in a console-only environment for those cases.)

This package (mpf-mc) is MPF's "in box" media controller which is based on Kivy and Python. It leverages OpenGL and the GPU of the computer it's running on. There are other media controller projects (at various levels of completeness) you can use with MPF built on Unity, Godot, Rust, and others.

MPF-MC runs on Windows, Mac, Linux, and Raspberry Pi. It can run on the same machine as the core MPF engine, or it can be a separate machine. It runs as a separate process from MPF, so it works well on a multi-core computer.

The MPF project homepage is here : https://missionpinball.org

Coverage Status Test & Build Status

Documentation

https://missionpinball.org

Support

MPF is open source and has no official support. Some MPF users follow the MPF-users Google group: https://groups.google.com/forum/#!forum/mpf-users. Individual hardware providers may provide additional support for users of their hardware.

Contributing

MPF is a passion project created and maintained by volunteers. If you're a Python coder, documentation writer, or pinball maker, feel free to make a change and submit a pull request. For more information about contributing see the Contributing Code and Contributing Documentation pages.

License

MPF and related projects are released under the MIT License. Refer to the LICENSE file for details. Docs are released under Creative Commons CC BY 4.0.

mpf-mc's People

Contributors

avanwinkle avatar borgdog avatar enteryourinitials avatar ericselkpc avatar jabdoa2 avatar jan-kantert avatar jankantert avatar jherrm avatar markinc666 avatar mfulleratlassian avatar nullbuilds avatar qcapen avatar scottacus64 avatar seanirby avatar toomanybrians avatar unrared avatar wolfmarsh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mpf-mc's Issues

Add audio track control to sound_player (stop, start, pause, resume)

Currently all play/stop control is on an individual sound basis. It will be important to be able to pause and resume all currently playing sounds on a track. For example, when playing a video with embedded audio you may want to pause the music track and don't care what specific sound is playing.

Since the sound_player is based on controlling sound assets, I'm not sure how to add track events (I'd rather not add a track_player). Some additional thought will need to be given to how to expose this functionality in the config files.

Audio locks up after repeated calls to play sfx

Sound player events result in this:
WARNING : kivy : Track: All internal audio events are currently in use, could not play sound sling_bounce

  • after triggering the slings multiple times (I assume more than 8 times within the length of the sample)

Config:
sound_system:
buffer: 4096
frequency: 44100
channels: 2
master_volume: 0.9
tracks:
voice:
volume: 0.6
simultaneous_sounds: 1
preload: yes
sfx:
volume: 0.4
simultaneous_sounds: 8
preload: yes
music:
volume: 0.5
simultaneous_sounds: 1

assets:
sounds:
default:
load: preload
voice:
load: preload
track: voice
sfx:
load: preload
track: sfx
music:
load: on_demand
track: music

sounds:
sling_bounce:
track: sfx

sound_player:
sw_sling: sling_bounce

Update travis build script to pull mpf from github, not PyPI

Currently the build script for OS X on travis installs MPF via pip from PyPI, but that's a problem if we update mpf and mpf-mc at the same time since it takes 10-15min for mpf to build and be propagated to PyPI (causing mpf-mc installation to fail).

So we should probably update the script so it just grabs the latest mpf from github instead of installing it from PyPI.

slide set to expire, never does when interrupted

3 slides with a mode.
show Slide A (expire: 5s)
at 3s, show Slide B (countdown slide ~ 8 seconds)
show remove Slide B & Slide C (expire: 5s)
5s, Slide A appears, never expires

# config_version=4
# n2

#Mystery

mode:
  start_events: player_turn_start
  stop_events: game_ending
  code: Mystery.Mystery
  priority: 1800


slide_player:
  mystery_award_ready: slide_74
  mystery_award_selected_1: 
    slide_75:
      action: play
    slide_76:
      action: remove
  mystery_award_selection_countdown: slide_76


sound_player:
  mystery_sfx: cat_squeeze

slides:
  slide_74:
    widgets:    
      - type: video
        video: paperweb
      - type: image
        image: mask2
      - type: text
        style: tall_title
        font_size: 108
        text: YOUR AWARD IS READY
        anchor_y: top
        y: top
    expire: 5s    

  slide_75:
    widgets:  
      - type: video
        video: extraballmovie
      - type: image
        image: mask2
      - type: text
        style: tall_title
        font_size: 108
        text: (value)
        anchor_y: bottom
        y: bottom
      - type: text
        style: tall_title
        font_size: 108
        text: YOUR AWARD
        anchor_y: top
        y: top
    expire: 5s    

  slide_76:
    widgets:    
      - type: text
        style: tall_title
        font_size: 108
        text: CHOOSE YOUR AWARD
        anchor_y: top
        y: top
      - type: text
        style: tall_title
        font_size: 108
        text: (v1) (v2) (v3) (v4)
      - type: text
        style: tall_title
        font_size: 108
        anchor_y: bottom
        text: (value)
        y: bottom

"Screen space" shows for lights & LEDs

Add feature to allow a virtual "display" that maps to x/y coordinates of lights or LEDs which can then "play" slides on lights & LEDs using MPF's external show function

Do we need widget merge_settings?

Why not just use the list of keys in the widget's config before we validate?
If we can do this, that will remove a bunch of lines of code.
If we figure that we do need them, incorporate them into the MPF-side processing of plugin player validation

Better slide_player validation

Show a nicer error:

 File "mpf/mpf/core/config_player.py", line 131, in process_mode_config
   config = self.validate_config(config)
 File "mpf-mc/mpfmc/config_players/slide_player.py", line 238, in validate_config
   for key in slide_settings.keys():
AttributeError: 'int' object has no attribute 'keys'

Config:

slide_player:
 scene_pick_XXX_up_item_collected:
   show: slide_item_collected
   expire: 2

image displayed incorrectly

title.png is garbled when displayed in a attract show
title

in attract_dmd_loop.yaml

slides:
attract_dmd_loop_slide_6:
widgets:
- type: image
image: title

garbled_image

no video playback on Windows 10 or Windows 7

Python3.4 installed.
Latest version of pip, etc.

Current dev build - using pip install mpf-mc --upgrade
Looks like no codecs installed for video.

No video displayed during run.

C:\mpf\NBX>mpf mc
INFO : kivy : Factory: 179 symbols loaded
INFO : kivy : Image: Providers: img_tex, img_dds, img_gif, img_sdl2 (img_pil, img_ffpyplayer ignored)
INFO : kivy : Video: Provider: null(['video_ffmpeg', 'video_ffpyplayer', 'video_pyglet'] ignored)
Loading MPF-MC controller
INFO : kivy : Mission Pinball Framework Media Controller v0.30.0.dev374
INFO : kivy : Machine path: C:\mpf\NBX
INFO : kivy : Starting clock at 30.0Hz
INFO : kivy : Text: Provider: sdl2
INFO : kivy : OSC: using for socket
INFO : kivy : Window: Provider: sdl2
INFO : kivy : GL: GLEW initialization succeeded
INFO : kivy : GL: OpenGL version <b'4.4.0 NVIDIA 344.60'>
INFO : kivy : GL: OpenGL vendor <b'NVIDIA Corporation'>
INFO : kivy : GL: OpenGL renderer <b'GeForce GT 610/PCIe/SSE2'>
INFO : kivy : GL: OpenGL parsed version: 4, 4
INFO : kivy : GL: Shading version <b'4.40 NVIDIA via Cg compiler'>
INFO : kivy : GL: Texture max size <16384>
INFO : kivy : GL: Texture max units <32>
INFO : kivy : Window: auto add sdl2 input provider
INFO : kivy : Window: virtual keyboard not allowed, single mode, not docked
INFO : kivy : Base: Start application main loop
INFO : kivy : GL: NPOT texture support is available
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile

slide_player crash

INFO : kivy : AudioInterface: Enabling audio playback
INFO : kivy : Base: Start application main loop
INFO : kivy : Base: Leaving application in progress...
Traceback (most recent call last):
  File "c:\python34\lib\runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\python34\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python34\Scripts\mpf.exe\__main__.py", line 9, in <module>
  File "c:\python34\lib\site-packages\mpf\commands\__init__.py", line 121, in run_from_command_line
    CommandLineUtility(path).execute()
  File "c:\python34\lib\site-packages\mpf\commands\__init__.py", line 54, in execute
    *self.parse_args())
  File "c:\python34\lib\site-packages\mpfmc\commands\mc.py", line 141, in __init__
    machine_path=machine_path).run()
  File "c:\python34\lib\site-packages\kivy\app.py", line 828, in run
    runTouchApp()
  File "c:\python34\lib\site-packages\kivy\base.py", line 487, in runTouchApp
    EventLoop.window.mainloop()
  File "c:\python34\lib\site-packages\kivy\core\window\window_sdl2.py", line 619, in mainloop
    self._mainloop()
  File "c:\python34\lib\site-packages\kivy\core\window\window_sdl2.py", line 362, in _mainloop
    EventLoop.idle()
  File "c:\python34\lib\site-packages\kivy\base.py", line 327, in idle
    Clock.tick()
  File "c:\python34\lib\site-packages\kivy\clock.py", line 515, in tick
    self._process_events()
  File "c:\python34\lib\site-packages\kivy\clock.py", line 647, in _process_events
    event.tick(self._last_tick, remove)
  File "c:\python34\lib\site-packages\kivy\clock.py", line 406, in tick
    ret = callback(self._dt)
  File "c:\python34\lib\site-packages\mpfmc\uix\display.py", line 110, in _displays_initialized
    self.mc.displays_initialized()
  File "c:\python34\lib\site-packages\mpfmc\core\mc.py", line 195, in displays_initialized
    self._init()
  File "c:\python34\lib\site-packages\mpfmc\core\mc.py", line 234, in _init
    self.events.process_event_queue()
  File "c:\python34\lib\site-packages\mpf\core\events.py", line 477, in process_event_queue
    **event[3])
  File "c:\python34\lib\site-packages\mpf\core\events.py", line 412, in _process_event
    result = handler[0](**merged_kwargs)
  File "c:\python34\lib\site-packages\mpfmc\core\mode_controller.py", line 54, in _load_modes
    self.mc.modes[mode] = self._load_mode(mode)
  File "c:\python34\lib\site-packages\mpfmc\core\mode_controller.py", line 131, in _load_mode
    return Mode(self.mc, config, mode_string, mode_path)
  File "c:\python34\lib\site-packages\mpfmc\core\mode.py", line 47, in __init__
    **item.kwargs)
  File "c:\python34\lib\site-packages\mpf\core\config_player.py", line 132, in process_mode_config
    config = self.validate_config(config)
  File "c:\python34\lib\site-packages\mpfmc\config_players\slide_player.py", line 238, in validate_config
    for key in slide_settings.keys():
AttributeError: 'int' object has no attribute 'keys'

Sound ducking release not smooth

The release portion of the sound ducking envelope does not transition smoothly back to full volume over the specified duration. Instead the release begins smoothly and then suddenly jumps back to full volume.

Update tests to work with non writable permissions

Tests on Ubuntu 14.04 are failing with permissions errors on mpfcache and high_scores.yaml because it can't write to files/folders in /usr/local/lib...

MPF Unit Tests:
PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/mpf/tests/machine_files/null/mpfcache'
PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/mpf/tests/machine_files/high_score/data/high_scores.yaml

From MC Tests:
PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/mpfmc/tests/machine_files/mpf_plugin_config_player_validation/mpfcache'

This should be fixed for .30 because we tell people to run the unittests to see if their install works.

When the machine tilts we get warnings in mc

WARNING : kivy : Received invalid BCP command: tilt
WARNING : kivy : Received invalid BCP command: tilt
WARNING : kivy : Received invalid BCP command: tilt
WARNING : kivy : Received invalid BCP command: tilt
WARNING : kivy : Received invalid BCP command: tilt

Add start and stop event notifications for sounds

Add events that are emitted whenever sounds are played/started and stopped, including when a sound finishes playing. The particular events can be specified at the sound asset level or in the sound_player parameters. Could also consider adding automatically generated events such as sound_XXXXX_started and sound_XXXXX_finished, although these should be able to be configured (enabled/disabled on a global and perhaps track level) so we don't flood the event loop and bcp traffic by default.

Windowless mode / offscreen frame buffer / no GUI

Need to make it so mpf-mc can run without a GUI, with an off screen frame buffer. This will be useful for DMD and RGB DMD games.

This has been prototyped and works. Just need to get it into the MPF-MC code. Can probably wait until 0.31 since I don't think anyone is using this yet.

KeyError 'action' - in attract mode show

Trying to run attract show, get the following crash for each slide in the show:

" File "c:\python34\lib\site-packages\mpfmc\config_players\slide_player.py", line 163, in play
if s['action'] == 'play':
KeyError: 'action'"

attract.yaml:

#config_version=4
mode:
  priority: 10000

show_player:
  mode_attract_started:
    attract_dmd_loop:
      action: play
      loops: -1
      speed: 1
    lsb_sweep:
      loops: -1
      speed: 6         

  mode_attract_stopped:
    attract_dmd_loop:
      action: stop
    lsb_sweep:
      action: stop

show file -
attract_dmd_loop.yaml

# show_version=4
- time: 0
  slides:
    attract_dmd_loop_slide_1:
    - type: text
      text: (machine|score1_label)
      style: tall_title
      font_size: 48
      anchor_y: top
      y: top
    - type: text
      text: (machine|score1_name) (machine|score1_value)
      style: tall_title
      font_size: 48
      number_grouping: true

- time: '+3'
  slides:
    attract_dmd_loop_slide_2:
    - type: text
      text: (machine|player1_score)
      color: yellow
      style: tall_title
      font_size: 48
      number_grouping: true
      min_digits: 2
      anchor_y: top
      anchor_x: left
      x: left+20
      y: top+0
    - type: text
      text: (machine|player2_score)
      color: yellow
      style: tall_title
      font_size: 48
      anchor_y: top
      anchor_x: right
      number_grouping: true
      min_digits: 2
      x: right-20
      y: top+0
    - type: text
      text: (machine|player3_score)
      color: yellow
      style: tall_title
      font_size: 48
      anchor_y: bottom
      anchor_x: left
      x: left+20
      y: bottom+5
      number_grouping: true
      min_digits: 2
    - type: text
      text: (machine|player4_score)
      color: yellow
      style: tall_title
      font_size: 48
      anchor_y: bottom
      anchor_x: right
      x: right-20
      y: bottom+5
      number_grouping: true
      min_digits: 2
    - type: text
      style: tall_title
      font_size: 36
      text: (machine|credits_string)
      color: magenta
      anchor_y: bottom
      y: bottom
- time: '+3'
  slides:
    attract_dmd_loop_slide_3:
      widgets:
      - type: image
        image: fast_pinball_logo_black_960
      transition:
        type: move_out
        duration: 1s
        direction: right

- time: '+3'
  slides:
    attract_dmd_loop_slide_4:
      widgets:
      - type: image
        image: Mission-Pinball-Logo-with-Script-200
      transition:
        type: move_out
        duration: 1s
        direction: left

- time: '+4'
  slides:
    attract_dmd_loop_slide_5:
      widgets:    
        - type: image
          image: fast_pinball_logo_black_960
          z: 25
 #       - type: video
 #         video: welcome
 #         z: 10
 #       - type: image
 #         image: mask2
 #         z: 20  


- time: '+8'
  slides:
    attract_dmd_loop_slide_6:
      widgets:
      - type: image
        image: title

- time: '+4'
  slides:
    attract_dmd_loop_slide_7:
    - type: text
      style: nightmare_l
      text: PRESS START
      color: lime
      animations:
        entrance:
        - property: opacity
          value: 1
          duration: 0.5s
        - property: opacity
          value: 0
          duration: 0.5s
          repeat: true
    - type: text
      style: tall_title
      font_size: 36
      text: (machine|credits_string)
      anchor_y: bottom


      y: bottom
- time: '+4'

Allow plugin players to validate show sections

Currently plugin players can't preprocess player sections from shows, since they run on the mc side but shows run on mpf.

Solution is to extend the functionality of the plugin player config validation so it can validate and update shows too. Will require a slight refactor of the ConfigCollection class so it can be accessed by the part of the plugin player running on mpf

Sounds in playback queue are not removed when stopped

Only sounds that are actively playing are stopped when the sound.stop method is called. Sounds that have been requested for playback, but are queued because the track is busy do not get removed when the sound.stop method is executed. A stop request should also remove a pending sound from the queue.

Sound markers and related events

Add the ability to specify markers in sound assets that trigger events when they are reached during playback. This would be particularly useful to restart a song at a particular point on the next ball after a ball drains. Markers should be specified at the sound asset level at a particular number of samples or time. Optionally, one or more events to be emitted should be listed under each marker.

Markers should also be able to be used as start points in a sound (optionally provide a marker in the play method).

Add loop until event looping option for sounds

Sounds may be configured to loop indefinitely or a specified number of times (or not at all). There is definitely a need to loop until an event is received (ex: loop a portion of music until the ball is plunged).

Implementation question: when do we start listening for the specified event? Probably as soon as the sound begins playback makes the most sense for now, especially since the entire sound will be looped. If we add more granular loop controls (setup loops within a sound), then the listener will be activated when the loop start point is reached.

python.exe hangs on exit

I don't know if this problem is Windows-only or general, but with mpf-mc, when I hit 'Esc' to close the window, python.exe stays running and I don't get a command prompt. I have to kill python.exe via Task Manager.

I spent about 4 hours troubleshooting and couldn't figure it out. More details here:
http://stackoverflow.com/questions/36563278/sys-exit-not-working-no-other-threads-and-no-try-blocks-capturing-systemexit

It seems to be related to the AssetLoader thread. If I comment that out, everything works fine.

At this point I'm out of ideas, so if anyone else can help, that'd be great. I can post more details if anyone needs them, but I think everything is in the StackOverflow post (which is unanswered at this point).

Allow multiple ducking target tracks for sounds

Currently the ducking target parameter for sounds only supports a single value. I'm sure it will be requested to be able to control multiple tracks with a ducking envelope (example: quiet both music and sfx tracks when a voice callout is playing). I don't think it is necessary to have separate envelope settings for each target track so simply making target a list of tracks I believe will be sufficient.

Needs to figure out asset defaults for videos

Currently there's no asset defaults section because we can't read the size of videos, so when videos are found in the videos folder without corresponding video entry, it will crash since there are no defaults.

Worst case have to fix the crash. Ideally we'd figure out some way to pre-set asset defaults, but this might be something that the game developer needs to do.

INFO : kivy : Base: Leaving application in progress...
Traceback (most recent call last):
  File "c:\python34\lib\runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\python34\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python34\Scripts\mpf.exe\__main__.py", line 9, in <module>
  File "c:\python34\lib\site-packages\mpf\commands\__init__.py", line 121, in run_from_command_line
    CommandLineUtility(path).execute()
  File "c:\python34\lib\site-packages\mpf\commands\__init__.py", line 54, in execute
    *self.parse_args())
  File "c:\python34\lib\site-packages\mpfmc\commands\mc.py", line 141, in __init__
    machine_path=machine_path).run()
  File "c:\python34\lib\site-packages\kivy\app.py", line 828, in run
    runTouchApp()
  File "c:\python34\lib\site-packages\kivy\base.py", line 487, in runTouchApp
    EventLoop.window.mainloop()
  File "c:\python34\lib\site-packages\kivy\core\window\window_sdl2.py", line 619, in mainloop
    self._mainloop()
  File "c:\python34\lib\site-packages\kivy\core\window\window_sdl2.py", line 362, in _mainloop
    EventLoop.idle()
  File "c:\python34\lib\site-packages\kivy\base.py", line 327, in idle
    Clock.tick()
  File "c:\python34\lib\site-packages\kivy\clock.py", line 515, in tick
    self._process_events()
  File "c:\python34\lib\site-packages\kivy\clock.py", line 647, in _process_events
    event.tick(self._last_tick, remove)
  File "c:\python34\lib\site-packages\kivy\clock.py", line 406, in tick
    ret = callback(self._dt)
  File "c:\python34\lib\site-packages\mpfmc\uix\display.py", line 119, in _displays_initialized
    self.mc.displays_initialized()
  File "c:\python34\lib\site-packages\mpfmc\core\mc.py", line 192, in displays_initialized
    self._init()
  File "c:\python34\lib\site-packages\mpfmc\core\mc.py", line 221, in _init
    self.events.process_event_queue()
  File "c:\python34\lib\site-packages\mpf\core\events.py", line 477, in process_event_queue
    **event[3])
  File "c:\python34\lib\site-packages\mpf\core\events.py", line 412, in _process_event
    result = handler[0](**merged_kwargs)
  File "c:\python34\lib\site-packages\mpf\core\assets.py", line 195, in _create_assets
    self._create_assets_from_disk(config=self.machine.machine_config)
  File "c:\python34\lib\site-packages\mpf\core\assets.py", line 301, in _create_assets_from_disk
    path=path)
  File "c:\python34\lib\site-packages\mpf\core\assets.py", line 393, in _create_asset_config_entries
    asset_class['defaults'][default_string])
KeyError: 'default'

fix failing text input test

FAIL: test_text_input (test_TextInput.TestText)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/travis/build/missionpinball/mpf-mc/mpfmc/tests/test_TextInput.py", line 27, in test_text_input
    self.assertEqual(text_input_widget.text, 'D')
AssertionError: 'C' != 'D'
- C
+ D```

Slide Player crashes in mc

Mode does not have any slides.

Traceback (most recent call last):
  File "/usr/local/bin/mpf", line 9, in <module>
    load_entry_point('mpf==0.30.0.dev1223', 'console_scripts', 'mpf')()
  File "/mpf/commands/__init__.py", line 121, in run_from_command_line
    CommandLineUtility(path).execute()
  File "/mpf/commands/__init__.py", line 54, in execute
    *self.parse_args())
  File "/mpfmc/commands/mc.py", line 141, in __init__
    machine_path=machine_path).run()
  File "/usr/local/lib/python3.4/dist-packages/kivy/app.py", line 828, in run
    runTouchApp()
  File "/usr/local/lib/python3.4/dist-packages/kivy/base.py", line 487, in runTouchApp
    EventLoop.window.mainloop()
  File "/usr/local/lib/python3.4/dist-packages/kivy/core/window/window_sdl2.py", line 619, in mainloop
    self._mainloop()
  File "/usr/local/lib/python3.4/dist-packages/kivy/core/window/window_sdl2.py", line 362, in _mainloop
    EventLoop.idle()
  File "/usr/local/lib/python3.4/dist-packages/kivy/base.py", line 327, in idle
    Clock.tick()
  File "/usr/local/lib/python3.4/dist-packages/kivy/clock.py", line 515, in tick
    self._process_events()
  File "/usr/local/lib/python3.4/dist-packages/kivy/clock.py", line 647, in _process_events
    event.tick(self._last_tick, remove)
  File "/usr/local/lib/python3.4/dist-packages/kivy/clock.py", line 406, in tick
    ret = callback(self._dt)
  File "/mpfmc/uix/display.py", line 114, in _displays_initialized
    self.mc.displays_initialized()
  File "/mpfmc/core/mc.py", line 197, in displays_initialized
    self._init()
  File "/mpfmc/core/mc.py", line 236, in _init
    self.events.process_event_queue()
  File "/mpf/core/events.py", line 482, in process_event_queue
    **event[3])
  File "/mpf/core/events.py", line 417, in _process_event
    result = handler[0](**merged_kwargs)
  File "/mpfmc/core/mode_controller.py", line 54, in _load_modes
    self.mc.modes[mode] = self._load_mode(mode)
  File "/mpfmc/core/mode_controller.py", line 133, in _load_mode
    return Mode(self.mc, config, mode_string, mode_path)
  File "/mpfmc/core/mode.py", line 47, in __init__
    **item.kwargs)
  File "/mpf/core/config_player.py", line 131, in process_mode_config
    config = self.validate_config(config)
  File "/mpfmc/config_players/slide_player.py", line 213, in validate_config
    settings = {settings: dict()}
TypeError: unhashable type: 'list' 

Crash on bad sound ducking settings

The audio interface can crash if bad ducking settings are used. If a release_point setting uses a time that is longer than the sound, a negative start sample position results and causes a crash. Need to add intelligent ducking parameter validation that uses the length of the sound when validating.

Add ability to stop individual instances of sounds

Currently, sounds are stopped by name which means if there are multiple instances of the same sound playing simultaneously they will all be stopped. That may not always be desired. It might be nice to be able to stop individual instances (perhaps by key?).

Exception when running the audio tests

Exception ignored in: 'Pinball.mpf_mc.mpfmc.core.audio.audio_interface.Track._play_sound_on_sound_player'
OverflowError: value too large to convert to int
Exception ignored in: 'Pinball.mpf_mc.mpfmc.core.audio.audio_interface.Track._play_sound_on_sound_player'
OverflowError: value too large to convert to int 

On one of my Lubuntu 14.04 machines. Sound does not play. Works on my other Lubuntu 14.04 machine.

Add docstrings for all event posts

Now that mpf-docs creates its events reference from docstrings in the code, go through all the code and make sure that every event post has a docstring.

Add Physical DMD and RGB DMD

DMD and RGB DMDs need to stream their content to MPF via BCP so they can be displayed on physical DMD devices

font cropping

need to add settings to trim the tops and bottoms of fonts so they can be aligned properly

Missing Tests

I'll just keep this initial comment up to date with the tests that are needed:

  • sound_player " #159
  • physical_dmd #160
  • physical_rgb_dmd #160

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.