Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS8
-rw-r--r--activity.py18
-rw-r--r--activity/activity.info4
-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.py35
-rw-r--r--playerscoreboard.py8
9 files changed, 88 insertions, 257 deletions
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 @@
-<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..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):