From 5cac29362eb238311f279a016ec2a77221d26022 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Sat, 28 Mar 2009 21:45:36 +0000 Subject: Merge branch 'gstreamer' --- diff --git a/NEWS b/NEWS index e2d6a52..2288bec 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,11 @@ +30 + +* Make activity screen resolution independent +* OLPC#6618 Update-pair-button's sensitivity reflects to selected pair +* OLPC#5242 Suppress wrong positions in players list + +29 + 28 27 diff --git a/activity.py b/activity.py index 3b1d816..aba9d9b 100644 --- a/activity.py +++ b/activity.py @@ -188,9 +188,9 @@ class MemorizeActivity(Activity): if self.play_mode == False: self.hbox.remove(self.createcardpanel) self.hbox.remove(self.cardlist) - - self.hbox.pack_start(self.scoreboard) - self.hbox.pack_start(self.table, False) + if self.play_mode in (False, None): + self.hbox.pack_start(self.scoreboard) + self.hbox.pack_start(self.table, False) self.play_mode = True def restart(self, widget): @@ -299,17 +299,11 @@ class MemorizeActivity(Activity): self.game.rem_buddy(buddy) 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/activity/activity.info b/activity/activity.info index 556cb85..be80e65 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,9 +1,9 @@ [Activity] name = Memorize -service_name = org.laptop.Memorize +bundle_id = org.laptop.Memorize exec = sugar-activity activity.MemorizeActivity icon = activity-memorize -activity_version = 29 +activity_version = 30 show_launcher = yes mime_types = application/x-memorize-project; license = GPLv2+ 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 @@ - - --+rtaudio=alsa -odac -m0 -d -b2048 -B4096 - - -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..on - instance control channel (1:on 0: off) - sfplay..gain - soundfile play gain (0-1) - sfplay..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..on - instance control channel (1:on 0: off) - sfplay..gain - soundfile play gain (0-1) - sfplay..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 - - - - -f0 600000 - - - diff --git a/game.py b/game.py index 4626a32..fb86c10 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') @@ -74,22 +75,7 @@ class MemorizeGame(GObject): self.flip_block = False self._flop_cards = None - # create csound instance to play sound files - self.sound = 0 - try: - import csnd - del csnd - self.sound = 1 - _logger.error(' [Check for module csnd] found.') - except: - _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 +162,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) @@ -211,12 +190,10 @@ class MemorizeGame(GObject): self.model.data['running'] = 'True' - # play sound in case if available - if self.sound == 1: - 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) + snd = self.model.grid[id].get('snd', None) + if snd != None: + sound_file = join(self.model.data.get('pathsnd'), snd) + self.audio.play(sound_file) self.emit('flip-card', id) if not signal: diff --git a/playerscoreboard.py b/playerscoreboard.py index 9668dfa..af0ef0b 100644 --- a/playerscoreboard.py +++ b/playerscoreboard.py @@ -83,9 +83,9 @@ class PlayerScoreboard(gtk.EventBox): self.msg.set_alignment(0, 0.5) self.add(self.table) - self.table.attach(self.icon, 0, 1, 0, 3) - self.table.attach(self.nick, 1, 2, 0, 1, yoptions=gtk.SHRINK) - self.table.attach(self.score_table, 1, 2, 1, 2, gtk.SHRINK, gtk.SHRINK) + self.table.attach(self.icon, 0, 1, 0, 3, gtk.SHRINK, gtk.SHRINK) + self.table.attach(self.nick, 1, 2, 0, 1) + self.table.attach(self.score_table, 1, 2, 1, 2) if score <> 0: for i in range(score): @@ -102,7 +102,7 @@ class PlayerScoreboard(gtk.EventBox): rows = int(math.ceil(float(size/2) / self._score_cols)) self.score_table.resize(rows, self._score_cols) - self.score_table.set_size_request(self._score_width, + self.score_table.set_size_request(-1, (theme.SCORE_SIZE+theme.PAD/2) * (rows) - theme.PAD/2) def increase_score(self): -- cgit v0.9.1