Index: trunk/src/services/players/internal.py
===================================================================
--- trunk/src/services/players/internal.py	(revision 28)
+++ trunk/src/services/players/internal.py	(working copy)
@@ -355,7 +355,16 @@
         song = self.songs[0]
         song.seekrelative(seconds)
         self.audiodev.flush()
+        
+    def _playerplayfaster(self):
+        self.songs[0].playfaster()
+        
+    def _playerplayslower(self):
+        self.songs[0].playslower()
 
+    def _playerspeedreset(self):
+        self.songs[0].resetplayspeed()
+        
     def _playerreleasedevice(self):
         self.audiodev.closedevice()
 
Index: trunk/src/services/player.py
===================================================================
--- trunk/src/services/player.py	(revision 28)
+++ trunk/src/services/player.py	(working copy)
@@ -226,6 +226,10 @@
         self.channel.subscribe(events.playerseekrelative, self.playerseekrelative)
         self.channel.subscribe(events.playerplaysong, self.playerplaysong)
         self.channel.subscribe(events.playerratecurrentsong, self.playerratecurrentsong)
+        self.channel.subscribe(events.playerplayfaster, self.playerplayfaster)
+        self.channel.subscribe(events.playerplayslower, self.playerplayslower)
+        self.channel.subscribe(events.playerspeedreset, self.playerspeedreset)
+
         self.channel.supply(requests.getplaybackinfo, self.getplaybackinfo)
 
     def work(self):
@@ -333,6 +337,21 @@
         this method has to be implemented by specialized classes"""
         pass
 
+    def _playerplayfaster(self):
+        """Speed up the play rate of the current song
+        this method has to be implemented by specialized classes"""
+        pass
+
+    def _playerplayslower(self):
+        """Slow down the play rate of the current song
+        this method has to be implemented by specialized classes"""
+        pass
+
+    def _playerspeedreset(self):
+        """Reset the play rate of the current song back to normal
+        this method has to be implemented by specialized classes"""
+        pass
+
     def _playerreleasedevice(self):
         """temporarily release audio device 
 
@@ -397,6 +416,18 @@
         if event.playerid == self.id:
             self._playerseekrelative(event.seconds)
 
+    def playerplayfaster(self, event):
+        if event.playerid == self.id:
+            self._playerplayfaster()
+
+    def playerplayslower(self, event):
+        if event.playerid == self.id:
+            self._playerplayslower()
+
+    def playerspeedreset(self, event):
+        if event.playerid == self.id:
+            self._playerspeedreset()
+            
     def playerplaysong(self, event):
         """play event.song next"""
         if event.playerid == self.id:
Index: trunk/src/events.py
===================================================================
--- trunk/src/events.py	(revision 28)
+++ trunk/src/events.py	(working copy)
@@ -319,6 +319,26 @@
         return "%s(%f->%s)" % (self.__class__.__name__, self.seconds, self.playerid)
 
 
+class playerplayfaster(playerevent):
+    """ increase play speed of song on player"""
+    
+    def __init__(self,playerid):
+        self.playerid = playerid
+        self.speed_adj = 441
+
+class playerplayslower(playerevent):
+    """ decrease play speed of song on player"""
+    
+    def __init__(self,playerid):
+        self.playerid = playerid
+        self.speed_adj = 441
+
+class playerspeedreset(playerevent):
+    """ Reset play speed of song on player back to its original rate"""
+    
+    def __init__(self,playerid):
+        self.playerid = playerid
+        
 class playerstop(playerevent):
     """ stop player """
     pass
Index: trunk/src/config.py
===================================================================
--- trunk/src/config.py	(revision 28)
+++ trunk/src/config.py	(working copy)
@@ -637,6 +637,9 @@
         toggleiteminfowindow = configkeys("ctrl-v")
         volumeup = configkeys(")")
         volumedown = configkeys("(")
+        playerplayfaster = configkeys("f")
+        playerplayslower = configkeys("s")
+        playerspeedreset = configkeys("d")
 
     class filelistwindow(configsection):
         selectnext = configkeys("KEY_DOWN j")
Index: trunk/src/decoder.py
===================================================================
--- trunk/src/decoder.py	(revision 28)
+++ trunk/src/decoder.py	(working copy)
@@ -216,7 +216,8 @@
     def __init__(self, song, outrate):
         self.song = song
         self.outrate = outrate
-
+        self.default_rate = outrate
+        
         try:
             decoder = getdecoder(self.song.type)
         except:
@@ -274,3 +275,17 @@
         self.buff = self.last_l = self.last_r = None
         self.buffpos = 0
         self.ptime = self.decodedfile.ptime()
+
+    def playslower(self, speed_adj = 441):
+        self.outrate += speed_adj
+        
+    def playfaster(self, speed_adj = 441):
+        # Its absurd that someone would try this
+        # but we better check for it.
+        if (self.outrate - speed_adj) < 1:
+            self.outrate = 1
+        else:
+            self.outrate -= speed_adj
+
+    def resetplayspeed(self):
+        self.outrate = self.default_rate
Index: trunk/src/playerwin.py
===================================================================
--- trunk/src/playerwin.py	(revision 28)
+++ trunk/src/playerwin.py	(working copy)
@@ -138,6 +138,12 @@
             hub.notify(events.playerseekrelative(self.playerid, 2))
         elif key in self.keybindings["playerstop"]:
             hub.notify(events.playerstop(self.playerid))
+        elif key in self.keybindings["playerplayfaster"]:
+            hub.notify(events.playerplayfaster(self.playerid))
+        elif key in self.keybindings["playerplayslower"]:
+            hub.notify(events.playerplayslower(self.playerid))
+        elif key in self.keybindings["playerspeedreset"]:
+            hub.notify(events.playerspeedreset(self.playerid))
         elif ord("1") <= key-1024 <= ord("5") and self.song:
             self.song.rate(key-1024-ord("1")+1)
         else:
