Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey 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)
commit54307b100fe9ce4f313f7cac7e1ad4298ba9e41b (patch)
tree31d20a484be072ab8d4b9823bc56727d4771b521
parent48a3c653d91aad048f7b0ba34ec5767d9ae35e1d (diff)
Use gstreamer instead of csound to play sound cards
-rw-r--r--activity.py9
-rw-r--r--audio.py62
-rw-r--r--csound/__init__.py0
-rw-r--r--csound/csoundserver.py60
-rw-r--r--csound/univorc.csd150
-rw-r--r--game.py16
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>
diff --git a/game.py b/game.py
index 4626a32..b92e895 100644
--- a/game.py
+++ b/game.py
@@ -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: