diff options
author | Aleksey Lim <alsroot@member.fsf.org> | 2009-02-01 20:32:06 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@member.fsf.org> | 2009-02-01 20:32:06 (GMT) |
commit | 54307b100fe9ce4f313f7cac7e1ad4298ba9e41b (patch) | |
tree | 31d20a484be072ab8d4b9823bc56727d4771b521 | |
parent | 48a3c653d91aad048f7b0ba34ec5767d9ae35e1d (diff) |
Use gstreamer instead of csound to play sound cards
-rw-r--r-- | activity.py | 9 | ||||
-rw-r--r-- | audio.py | 62 | ||||
-rw-r--r-- | csound/__init__.py | 0 | ||||
-rw-r--r-- | csound/csoundserver.py | 60 | ||||
-rw-r--r-- | csound/univorc.csd | 150 | ||||
-rw-r--r-- | game.py | 16 |
6 files changed, 68 insertions, 229 deletions
diff --git a/activity.py b/activity.py index 3b1d816..407e6c4 100644 --- a/activity.py +++ b/activity.py @@ -300,16 +300,13 @@ class MemorizeActivity(Activity): def _focus_in(self, event, data=None): if self.game.sound == 1: - self.game.cs.start() - _logger.debug(" Memorize is visible: start csound server. ") + self.game.audio.play() def _focus_out(self, event, data=None): if self.game.sound == 1: - self.game.cs.pause() - _logger.debug(" Memorize is invisible: pause csound server. ") + self.game.audio.pause() def _cleanup_cb(self, data=None): if self.game.sound == 1: - self.game.cs.quit() - _logger.debug(" Memorize closes: close csound server. ") + self.game.audio.stop() diff --git a/audio.py b/audio.py new file mode 100644 index 0000000..d9b69c7 --- /dev/null +++ b/audio.py @@ -0,0 +1,62 @@ +# Copyright (C) 2006, 2007, 2008 One Laptop Per Child +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +import gst +import logging + +_logger = logging.getLogger('memorize-activity') + +class Audio: + def __init__(self): + self._player = gst.element_factory_make('playbin', 'player') + fakesink = gst.element_factory_make('fakesink', 'my-fakesink') + self._player.set_property('video-sink', fakesink) + self._playing = None + + bus = self._player.get_bus() + bus.add_signal_watch() + bus.connect('message', self._gstmessage_cb) + + def play(self, filename=None): + if filename: + _logger.debug('play audio %s' % filename) + self._player.set_property('uri', 'file://' + filename) + self._player.set_state(gst.STATE_NULL) + elif self._playing == None: + return + else: + _logger.debug('continue audio') + + self._player.set_state(gst.STATE_PLAYING) + self._playing = True + + def pause(self): + if self._playing != None: + _logger.debug('pause audio') + self._player.set_state(gst.STATE_PAUSED) + self._playing = False + + def stop(self): + self._player.set_state(gst.STATE_NULL) + + def _gstmessage_cb(self, bus, message): + type = message.type + + if type in (gst.MESSAGE_EOS, gst.MESSAGE_ERROR): + self._player.set_state(gst.STATE_NULL) + self._playing = None + _logger.debug('audio stoped with type %d' % type) diff --git a/csound/__init__.py b/csound/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/csound/__init__.py +++ /dev/null diff --git a/csound/csoundserver.py b/csound/csoundserver.py deleted file mode 100644 index 953b74b..0000000 --- a/csound/csoundserver.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) 2006, 2007, 2008 One Laptop Per Child -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# - -import os -import logging -from threading import Thread - -import csnd - -_logger = logging.getLogger('csound') - -class CsoundServer(Thread): - def __init__(self): - Thread.__init__(self) - self.csound = csnd.Csound() - - def start(self): - self.perf = csnd.CsoundPerformanceThread(self.csound) - uniorcpath = os.path.join( os.path.dirname(__file__), 'univorc.csd') - if not os.path.exists(uniorcpath): - _logger.error('univorc not found %s'%uniorcpath) - else: - if self.csound.Compile(uniorcpath) == -1: - _logger.debug('error compiling csound orchestra %s'%uniorcpath) - return 1 - self.perf.Play() - return 0 - - def pause(self): - self.perf.Stop() - self.perf.Join() - self.csound.Reset() - _logger.debug('stop performance') - - def perform(self, msg): - _logger.debug(' [perform_cb] %s'%str(msg)) - self.perf.InputMessage(str(msg)) - - def quit(self): - _logger.info('quit') - self.perf.Stop() - self.perf.Join() - self.csound.Reset() - self.csound = None - - diff --git a/csound/univorc.csd b/csound/univorc.csd deleted file mode 100644 index 5e3232c..0000000 --- a/csound/univorc.csd +++ /dev/null @@ -1,150 +0,0 @@ -<CsoundSynthesizer> -<CsOptions> --+rtaudio=alsa -odac -m0 -d -b2048 -B4096 -</CsOptions> -<CsInstruments> -sr=16000 -ksmps=100 -nchnls=2 - -/************************************************************************** - General ogg-vorbis Soundfile Player -**************************************************************************/ - -instr 100 -/* soundfile play control - p4 : filename - p5 : unique instance ID - p6 : output gain (0-1) - p7 : offset in seconds - - channels: - sfplay.<ID>.on - instance control channel (1:on 0: off) - sfplay.<ID>.gain - soundfile play gain (0-1) - sfplay.<ID>.flen - holds the channel length -*/ -S1 strget p4 -inst = p5 -ich = 1 -iln = 10 -ioffset = p7 - -Slen sprintf "sfplay.%d.flen", p5 ; file length channel -chnset iln, Slen - -Splay sprintf "sfplay.%d.on", inst ; instance control channel -Sname sprintf "sfplay.%d.fname", inst ; filename channel -Sgain sprintf "sfplay.%d.gain", inst ; gain channel -chnset S1, Sname -chnset 1, Splay -chnset p6, Sgain -event_i "i",101,0,iln,inst,ich,ioffset -turnoff -endin - - -instr 101 -/* soundfile player - This is the actual soundfile player. - It never gets called directly -*/ -ich = p5 -inst= p4 -ioffset = p6 -Splay sprintf "sfplay.%d.on", inst ; instance control channel -Sname sprintf "sfplay.%d.fname", inst ; filename channel -Sgain sprintf "sfplay.%d.gain", inst ; gain channel -kon chnget Splay -kg1 chnget Sgain -S1 chnget Sname -if kon == 0 then -printf "sfplay:%d OFF\n", 1, inst -turnoff -endif -if ich = 1 then -a1 oggplay S1, ioffset -a2 = a1 -else -a1,a2 oggplay S1, ioffset -endif - outs a1*kg1, a2*kg1 -printf_i "sfplay:%d\n", 1, inst -endin - - -/************************************************************************** - General wav, aiff Soundfile Player -**************************************************************************/ - -instr 102 -/* soundfile play control - p4 : filename - p5 : unique instance ID - p6 : output gain (0-1) - p7 : offset in seconds - - channels: - sfplay.<ID>.on - instance control channel (1:on 0: off) - sfplay.<ID>.gain - soundfile play gain (0-1) - sfplay.<ID>.flen - holds the channel length -*/ -S1 strget p4 -inst = p5 -ich filenchnls S1 -iln filelen S1 -ioffset = p7 - -Slen sprintf "sfplay.%d.flen", p5 ; file length channel -chnset iln, Slen - -if ioffset >= iln then -turnoff -else -iln = iln - ioffset -endif - -Splay sprintf "sfplay.%d.on", inst ; instance control channel -Sname sprintf "sfplay.%d.fname", inst ; filename channel -Sgain sprintf "sfplay.%d.gain", inst ; gain channel -chnset S1, Sname -chnset 1, Splay -chnset p6, Sgain -event_i "i",103,0,iln,inst,ich,ioffset -turnoff -endin - - -instr 103 -/* soundfile player - This is the actual soundfile player. - It never gets called directly -*/ -ich = p5 -inst= p4 -ioffset = p6 -Splay sprintf "sfplay.%d.on", inst ; instance control channel -Sname sprintf "sfplay.%d.fname", inst ; filename channel -Sgain sprintf "sfplay.%d.gain", inst ; gain channel -kon chnget Splay -kg1 chnget Sgain -S1 chnget Sname -if kon == 0 then -printf "sfplay:%d OFF\n", 1, inst -turnoff -endif -if ich = 1 then -a1 diskin2 S1,1,ioffset,1 -a2 = a1 -else -a1,a2 diskin2 S1,1,ioffset,1 -endif - outs a1*kg1, a2*kg1 -endin - - -</CsInstruments> -<CsScore> -f0 600000 - -</CsScore> -</CsoundSynthesizer> @@ -27,6 +27,7 @@ from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT, GObject, timeout_add from gobject import source_remove from model import Model +from audio import Audio import theme _logger = logging.getLogger('memorize-activity') @@ -85,11 +86,7 @@ class MemorizeGame(GObject): _logger.error(' [Check for module csnd] not found. There will be no sound.') if self.sound == 1: - from csound.csoundserver import CsoundServer - self.cs = CsoundServer() - if self.cs.start() != 0: - _logger.error(' Error starting csound performance.') - self.sound = 0 + self.audio = Audio() def load_game(self, game_name, size, mode): self.set_load_mode('Loading game') @@ -176,13 +173,6 @@ class MemorizeGame(GObject): self.current_player = next self.update_turn() - def play_sound(self, snd, sound_file): - if len(snd.split('.')) > 1: - if snd.split('.')[1] in ['wav', 'aif', 'aiff']: - self.cs.perform('i 102 0.0 3.0 "%s" 1 0.9 0'%(sound_file)) - else: - self.cs.perform('i 100 0.0 3.0 "%s" 1 0.9 0'%(sound_file)) - def card_overflipped(self, widget, id): if self._flop_cards and id in self._flop_cards: self.card_flipped(widget, id) @@ -216,7 +206,7 @@ class MemorizeGame(GObject): snd = self.model.grid[id].get('snd', None) if snd != None: sound_file = join(self.model.data.get('pathsnd'), snd) - self.play_sound(snd, sound_file) + self.audio.play(sound_file) self.emit('flip-card', id) if not signal: |