def __init__(self):
     self.playlist=MrcPlayList()
     self.playing=False
     self.pausing=False
     self.wokenUp=False
     self.eventDequeuerThread=MrcPlayerEventDequeuer()
     self.lock=threading.RLock()
class MrcPlayer:

    def __init__(self):
        self.playlist=MrcPlayList()
        self.playing=False
        self.pausing=False
        self.wokenUp=False
        self.eventDequeuerThread=MrcPlayerEventDequeuer()
        self.lock=threading.RLock()

    def wakeUp(self):
        try:
            with self.lock:
                print ' ... MrcPlayerInstance waking up ...'
                MrcLogger.info(' ... MrcPlayerInstance waking up ...')
                pygame.init()
                pygame.mixer.init()
                self.eventDequeuerThread.start()
                pygame.mixer.music.set_endevent(pygame.USEREVENT)
                self.wokenUp=True
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.wakeUp: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.wakeUp: '+e.__str__())

    def goToSleep(self):
        try:
            with self.lock:
                print ' ... MrcPlayerInstance going to sleep ...'
                MrcLogger.info(' ... MrcPlayerInstance going to sleep ...')
                self.eventDequeuerThread.goToSleep()
                self.eventDequeuerThread.join()
                self.playlist.clean()
                pygame.mixer.quit()
                self.wokenUp=False
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.goToSleep: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.goToSleep: '+e.__str__())

    def playFile(self, mrcfile):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.playFile called while wokenUp is False! Not playing...')
                    return
                self.playlist.clean()
                self.playlist.addFile(mrcfile)
                self.playCurrent()
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.playFile('+filepath+'): '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.playFile('+filepath+'): '+e.__str__())

    def playFiles(self, mrcfiles):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.playFiles called while wokenUp is False! Not playing...')
                    return
                self.playlist.clean()
                self.playlist.addFileList(mrcfiles)
                self.playCurrent()
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.playFiles: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.playFiles: '+e.__str__())


    def stop(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.stop called while wokenUp is False! Not stopping...')
                    return
                if not ( self.playing or self.pausing ):
                    return
                pygame.mixer.music.stop()
                self.playing=False
                self.pausing=False
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.stop: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.stop: '+e.__str__())

    def playCurrent(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.playCurrent called while wokenUp is False! Not playing...')
                    return
                self.stop()
                curr=self.playlist.getCurrentFileName()
                if curr==None:
                    return
                pygame.mixer.music.load(curr)
                pygame.mixer.music.play() 
                self.playing=True
                self.pausing=False
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.playCurrent: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.playCurrent: '+e.__str__())

    def prev(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.prev called while wokenUp is False! Not going prev...')
                    return
                if not self.playlist.prev():
                    return
                self.playCurrent()
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.prev: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.prev: '+e.__str__())

    def next(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.next called while wokenUp is False! Not going next...')
                    return
                if not self.playlist.next():
                    return
                self.playCurrent()
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.next: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.next: '+e.__str__())

    def pause(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.pause called while wokenUp is False! Not pausing...')
                    return
                if self.playing and not self.pausing:
                    pygame.mixer.music.pause()
                    self.playing=False
                    self.pausing=True
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.pause: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.pause: '+e.__str__())

    def unpause(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.unpause called while wokenUp is False! Not unpausing...')
                    return
                if self.pausing and not self.playing:
                    pygame.mixer.music.unpause()
                    self.playing=True
                    self.pausing=False
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.unpause: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.unpause: '+e.__str__())

    def getPlayList(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.getPlayList called while wokenUp is False! Not getting playlist...')
                    return None, -1, False, 'Player not woken up, please try again later'
                files = []
                for f in self.playlist.files:
                    files.append(f)
                    if files[len(files)-1].path.startswith(MrcSettings.BASE_MUSIC_PATH):
                          files[len(files)-1].path=files[len(files)-1].path[len(MrcSettings.BASE_MUSIC_PATH):]
                return files, self.playlist.current, self.pausing, ''
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.getPlayList: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.getPlayList: '+e.__str__())

    def setVolumeUp(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.setVolumeUp called while wokenUp is False! Not setting volume up...')
                    return
                currentVolume = pygame.mixer.music.get_volume()
                if currentVolume < 0.95:
                    pygame.mixer.music.set_volume(currentVolume+0.05)
                elif currentVolume != 1.0:
                    pygame.mixer.music.set_volume(1.0)
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.setVolumeUp: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.setVolumeUp: '+e.__str__())

    def setVolumeDown(self):
        try:
            with self.lock:
                if not self.wokenUp:
                    MrcLogger.error('MrcPlayer.setVolumeDown called while wokenUp is False! Not setting volume down...')
                    return
                currentVolume = pygame.mixer.music.get_volume()
                if currentVolume > 0.05:
                    pygame.mixer.music.set_volume(currentVolume-0.05)
                elif currentVolume != 0.0:
                    pygame.mixer.music.set_volume(0.0)
        except pygame.error as e:
            MrcLogger.error('pygame.error caught in MrcPlayer.setVolumeDown: '+e.__str__())
        except Exception as e:
            MrcLogger.error('Exception caught in MrcPlayer.setVolumeDown: '+e.__str__())
 

    # TEST METHOD #
    def testStuff():
        try:
            file = 'C:\\partage\\mp3\\raph\\Muse\\Black Holes And Revelations\\Muse - 01 - Take A Bow.ogg'

            print str(datetime.datetime.now()) + ' ' + 'file: ' + file
            pygame.init()
            print str(datetime.datetime.now()) + ' ' + 'inited'
            pygame.mixer.init()
            print str(datetime.datetime.now()) + ' ' + 'mixer inited : ' + str(pygame.mixer.get_init())
            pygame.mixer.music.load(file)
            print str(datetime.datetime.now()) + ' ' + 'loaded'
            pygame.mixer.music.play()
            print str(datetime.datetime.now()) + ' ' + 'volume : ' + str(pygame.mixer.music.get_volume())
            print str(datetime.datetime.now()) + ' ' + 'playing'
            while pygame.mixer.music.get_busy(): 
                pygame.time.Clock().tick(10)
            print str(datetime.datetime.now()) + ' ' + 'finished'
            pygame.mixer.quit()
            print str(datetime.datetime.now()) + ' ' + 'quitted'

        except pygame.error as e:
            print 'pygame.error caught: '+e.__str__()
        except Exception as e:
            print 'Exception caught: '+e.__str__()