Skip to content

Commit

Permalink
Merge pull request #40 from maniek2332/ft/audio
Browse files Browse the repository at this point in the history
Audio - exposed music playback control and master volume control
  • Loading branch information
maniek2332 committed Dec 8, 2019
2 parents bee2414 + 918d300 commit a2c567a
Show file tree
Hide file tree
Showing 8 changed files with 218 additions and 8 deletions.
41 changes: 40 additions & 1 deletion demos/basic/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ def __init__(self, sound_path, music_path):

if music_path:
self.music = Music(music_path)
self.music.play()
else:
self.music = None

Expand All @@ -65,6 +64,8 @@ def update(self, dt):
self.engine.quit()

keyboard = event.keyboard
audio = event.audio

if keyboard:
if keyboard.is_pressing(Keycode.q):
self.engine.quit()
Expand All @@ -87,6 +88,44 @@ def update(self, dt):
self.engine.virtual_resolution_mode))
elif keyboard.is_pressing(Keycode.p):
print("Mouse position: {}".format(self.input.mouse.get_position()))
elif keyboard.is_pressing(Keycode.num_9):
print("Decreasing master volume")
self.engine.audio.master_volume -= 0.1
print("Master volume: {}".format(self.engine.audio.master_volume))
elif keyboard.is_pressing(Keycode.num_0):
print("Increasing master volume")
self.engine.audio.master_volume += 0.1
print("Master volume: {}".format(self.engine.audio.master_volume))
elif keyboard.is_pressing(Keycode.num_7):
print("Decreasing master music volume")
self.engine.audio.master_music_volume -= 0.1
print("Master music volume: {}".format(self.engine.audio.master_music_volume))
elif keyboard.is_pressing(Keycode.num_8):
print("Increasing master music volume")
self.engine.audio.master_music_volume += 0.1
print("Master music volume: {}".format(self.engine.audio.master_music_volume))
elif keyboard.is_pressing(Keycode.num_5):
print("Decreasing master sound volume")
self.engine.audio.master_sound_volume -= 0.1
print("Master sound volume: {}".format(self.engine.audio.master_sound_volume))
elif keyboard.is_pressing(Keycode.num_6):
print("Increasing master sound volume")
self.engine.audio.master_sound_volume += 0.1
print("Master sound volume: {}".format(self.engine.audio.master_sound_volume))
elif keyboard.is_pressing(Keycode.x):
self.music.play()
print("Playing music")
elif keyboard.is_pressing(Keycode.c):
ret = self.music.pause()
print("Pausing music, success: {}".format(ret))
elif keyboard.is_pressing(Keycode.v):
ret = self.music.resume()
print("Resuming music, success: {}".format(ret))
elif keyboard.is_pressing(Keycode.b):
ret = self.music.stop()
print("Stopping music, success: {}".format(ret))
elif audio and audio.music_finished:
print("Music finished!")


if __name__ == '__main__':
Expand Down
105 changes: 102 additions & 3 deletions kaa/audio.pxi
Original file line number Diff line number Diff line change
@@ -1,6 +1,21 @@
from .kaacore.audio cimport CSound, CMusic
from enum import IntEnum

cimport cython

from .kaacore.engine cimport get_c_engine
from .kaacore.audio cimport CAudioManager, CSound, CMusic, CMusicState

DEF SOUND_FREELIST_SIZE = 30
DEF MUSIC_FREELIST_SIZE = 10


class MusicState(IntEnum):
playing = <uint8_t>CMusicState.playing
paused = <uint8_t>CMusicState.paused
stopped = <uint8_t>CMusicState.stopped


@cython.freelist(SOUND_FREELIST_SIZE)
cdef class Sound:
cdef CSound c_sound

Expand All @@ -10,6 +25,14 @@ cdef class Sound:
def __init__(self, str sound_filepath, double volume=1.):
self._attach_c_sound(CSound.load(sound_filepath.encode(), volume))

@property
def volume(self):
return self.c_sound.volume()

@volume.setter
def volume(self, double vol):
self.c_sound.volume(vol)

def play(self, double volume=1.):
self.c_sound.play(volume)

Expand All @@ -20,6 +43,7 @@ cdef Sound get_sound_wrapper(const CSound& c_sound):
return sound


@cython.freelist(MUSIC_FREELIST_SIZE)
cdef class Music:
cdef CMusic c_music

Expand All @@ -29,11 +53,86 @@ cdef class Music:
def __init__(self, str music_filepath, double volume=1.):
self._attach_c_music(CMusic.load(music_filepath.encode(), volume))

def play(self):
self.c_music.play()
@staticmethod
def get_current():
return get_music_wrapper(CMusic.get_current())

@staticmethod
def get_state():
return MusicState(<uint8_t>CMusic.get_state())

@property
def volume(self):
return self.c_music.volume()

@volume.setter
def volume(self, double vol):
self.c_music.volume(vol)

@property
def is_playing(self):
return self.c_music.is_playing()

def play(self, double volume=1.):
self.c_music.play(volume)

@property
def is_paused(self):
return self.c_music.is_paused()

def pause(self):
return self.c_music.pause()

def resume(self):
return self.c_music.resume()

def stop(self):
return self.c_music.stop()


cdef Music get_music_wrapper(const CMusic& c_music):
cdef Music music = Music.__new__(Music)
music._attach_c_music(c_music)
return music


@cython.final
cdef class _AudioManager:
cdef CAudioManager* _get_c_audio_manager(self):
cdef CEngine* c_engine = get_c_engine()
assert c_engine != NULL
cdef CAudioManager* c_audio_manager = c_engine.audio_manager.get()
assert c_audio_manager != NULL
return c_audio_manager

@property
def master_volume(self):
return self._get_c_audio_manager().master_volume()

@master_volume.setter
def master_volume(self, double vol):
self._get_c_audio_manager().master_volume(vol)

@property
def master_sound_volume(self):
return self._get_c_audio_manager().master_sound_volume()

@master_sound_volume.setter
def master_sound_volume(self, double vol):
self._get_c_audio_manager().master_sound_volume(vol)

@property
def master_music_volume(self):
return self._get_c_audio_manager().master_music_volume()

@master_music_volume.setter
def master_music_volume(self, double vol):
self._get_c_audio_manager().master_music_volume(vol)

@property
def mixing_channels(self):
return self._get_c_audio_manager().mixing_channels()

@mixing_channels.setter
def mixing_channels(self, int ch):
self._get_c_audio_manager().mixing_channels(ch)
6 changes: 6 additions & 0 deletions kaa/engine.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ class VirtualResolutionMode(IntEnum):
cdef class _Engine:
cdef _Window _window
cdef _Renderer _renderer
cdef _AudioManager _audio_manager

def __init__(self):
self._window = _Window()
self._renderer = _Renderer()
self._audio_manager = _AudioManager()

cdef inline CEngine* _get_c_engine(self):
cdef CEngine* c_engine = get_c_engine()
Expand Down Expand Up @@ -98,6 +100,10 @@ cdef class _Engine:
def renderer(self):
return self._renderer

@property
def audio(self):
return self._audio_manager

def stop(self):
if get_c_engine() == NULL:
raise ValueError("Engine is stopped")
Expand Down
23 changes: 22 additions & 1 deletion kaa/input.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ from .kaacore.input cimport (
CKeycode, CMouseButton, CControllerButton, CControllerAxis,
CCompoundControllerAxis, CCompoundEventType, CEventType, CWindowEventType,
CSystemEvent, CWindowEvent, CKeyboardEvent, CMouseEvent,
CControllerEvent, CEvent, CInputManager, CSystemManager,
CControllerEvent, CAudioEvent, CEvent, CInputManager, CSystemManager,
CKeyboardManager, CMouseManager, CControllerManager, CControllerID
)

Expand Down Expand Up @@ -336,6 +336,9 @@ class EventType(IntEnum):
controller_removed = <uint32_t>CEventType.controller_removed
controller_remapped = <uint32_t>CEventType.controller_remapped

music_finished = <uint32_t>CEventType.music_finished
channel_finished = <uint32_t>CEventType.channel_finished


class WindowEventType(IntEnum):
shown = <uint32_t>CWindowEventType.shown,
Expand Down Expand Up @@ -580,6 +583,19 @@ cdef class ControllerEvent(_BaseEvent):
return self.c_event.controller().removed()


@cython.final
cdef class AudioEvent(_BaseEvent):
@staticmethod
cdef AudioEvent create(CEvent c_event):
cdef AudioEvent instance = AudioEvent.__new__(AudioEvent)
instance.c_event = c_event
return instance

@typed_property(EventType.music_finished)
def music_finished(self):
return self.c_event.audio().music_finished()


@cython.final
cdef class Event(_BaseEvent):
def __repr__(self):
Expand Down Expand Up @@ -616,6 +632,11 @@ cdef class Event(_BaseEvent):
if self.c_event.controller():
return ControllerEvent.create(self.c_event)

@property
def audio(self):
if self.c_event.audio():
return AudioEvent.create(self.c_event)


cdef class _BaseInputManager:
cdef CInputManager* c_input_manager
Expand Down
37 changes: 36 additions & 1 deletion kaa/kaacore/audio.pxd
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from libcpp cimport bool
from libc.stdint cimport uint16_t

from .exceptions cimport raise_py_error

Expand All @@ -14,6 +15,15 @@ cdef extern from "kaacore/audio.h" nogil:
void play(double volume) \
except +raise_py_error

double volume() except +raise_py_error
void volume(const double) except +raise_py_error


cdef enum CMusicState "kaacore::MusicState":
playing "kaacore::MusicState::playing",
paused "kaacore::MusicState::paused",
stopped "kaacore::MusicState::stopped",


cdef cppclass CMusic "kaacore::Music":
CMusic()
Expand All @@ -26,7 +36,32 @@ cdef extern from "kaacore/audio.h" nogil:
CMusic get_current() \
except +raise_py_error

@staticmethod
CMusicState get_state() \
except +raise_py_error

double volume() except +raise_py_error
void volume(const double) except +raise_py_error

bool is_playing() \
except +raise_py_error
void play() \
void play(double volume) \
except +raise_py_error

bool is_paused() except +raise_py_error
bool pause() except +raise_py_error
bool resume() except +raise_py_error
bool stop() except +raise_py_error

cdef cppclass CAudioManager "kaacore::AudioManager":
double master_volume() except +raise_py_error
void master_volume(const double vol) except +raise_py_error

double master_sound_volume() except +raise_py_error
void master_sound_volume(const double vol) except +raise_py_error

double master_music_volume() except +raise_py_error
void master_music_volume(const double vol) except +raise_py_error

uint16_t mixing_channels() except +raise_py_error
void mixing_channels(const uint16_t channels) except +raise_py_error
2 changes: 2 additions & 0 deletions kaa/kaacore/engine.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ from libc.stdint cimport int32_t, uint64_t
from .display cimport CDisplay
from .scenes cimport CScene
from .window cimport CWindow
from .audio cimport CAudioManager
from .renderer cimport CRenderer
from .input cimport CInputManager
from .exceptions cimport raise_py_error
Expand All @@ -22,6 +23,7 @@ cdef extern from "kaacore/engine.h" nogil:
unique_ptr[CWindow] window
unique_ptr[CRenderer] renderer
unique_ptr[CInputManager] input_manager
unique_ptr[CAudioManager] audio_manager
CScene* scene
uint64_t time

Expand Down
10 changes: 9 additions & 1 deletion kaa/kaacore/input.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,9 @@ cdef extern from "kaacore/input.h" nogil:
controller_button_up "kaacore::EventType::controller_button_up",
controller_added "kaacore::EventType::controller_added",
controller_removed "kaacore::EventType::controller_removed",
controller_remapped "kaacore::EventType::controller_remapped"
controller_remapped "kaacore::EventType::controller_remapped",
music_finished "kaacore::EventType::music_finished",
channel_finished "kaacore::EventType::channel_finished",

cdef enum CWindowEventType "kaacore::WindowEventType":
shown "kaacore::WindowEventType::shown",
Expand Down Expand Up @@ -425,6 +427,10 @@ cdef extern from "kaacore/input.h" nogil:
bint axis_motion(CControllerAxis ca) \
except +raise_py_error

cdef cppclass CAudioEvent "kaacore::AudioEvent":
bint music_finished() \
except +raise_py_error

cdef cppclass CEvent "kaacore::Event":
uint32_t type() \
except +raise_py_error
Expand All @@ -440,6 +446,8 @@ cdef extern from "kaacore/input.h" nogil:
except +raise_py_error
const CControllerEvent* const controller() \
except +raise_py_error
const CAudioEvent* const audio() \
except +raise_py_error

cdef cppclass CSystemManager "kaacore::InputManager::SystemManager":
string get_clipboard_text() \
Expand Down

0 comments on commit a2c567a

Please sign in to comment.