# -*- coding: utf-8 -*- ############################################################ # Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo # # 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, see . # ############################################################ import wx import output import tempfile import sound import os import config from mysc.thread_utils import call_threaded import sound_lib class audioDialog(wx.Dialog): def __init__(self, parent): self.parent = parent wx.Dialog.__init__(self, None, -1, _(u"Attach audio")) self.file = None self.recorded = False self.recording = None self.playing = None panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) self.play = wx.Button(panel, -1, _(u"Play")) self.play.Bind(wx.EVT_BUTTON, self.onPlay) self.play.Disable() self.pause = wx.Button(panel, -1, _(u"Pause")) self.pause.Bind(wx.EVT_BUTTON, self.onPause) self.pause.Disable() self.record = wx.Button(panel, -1, _(u"Record")) self.record.Bind(wx.EVT_BUTTON, self.onRecord) self.record.SetFocus() self.attach_exists = wx.Button(panel, -1, _(u"Add an existing file")) self.attach_exists.Bind(wx.EVT_BUTTON, self.onAttach) self.discard = wx.Button(panel, -1, _(u"Discard")) self.discard.Bind(wx.EVT_BUTTON, self.onDiscard) self.discard.Disable() label = wx.StaticText(panel, -1, _(u"Upload to")) self.services = wx.ComboBox(panel, -1, choices=self.get_available_services(), value=self.get_available_services()[0], style=wx.CB_READONLY) servicesBox = wx.BoxSizer(wx.HORIZONTAL) servicesBox.Add(label) servicesBox.Add(self.services) self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach")) self.attach.Disable() cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) sizer.Add(self.play) sizer.Add(self.pause) sizer.Add(self.record) sizer.Add(self.attach_exists) sizer.Add(self.discard) sizer.Add(self.attach) def get_available_services(self): services = [] if config.main["services"]["dropbox_token"] != "": services.append("Dropbox") services.append("SNDUp") return services def onPause(self, ev): if self.pause.GetLabel() == _(u"Pause"): self.recording.pause() self.pause.SetLabel(_(u"Resume")) elif self.pause.GetLabel() == _(u"Resume"): self.recording.play() self.pause.SetLabel(_(U"Pause")) def onRecord(self, ev): if self.recording != None: self.stop_recording() self.pause.Disable() else: self.start_recording() self.pause.Enable() def start_recording(self): self.attach_exists.Disable() self.file = tempfile.mktemp(suffix='.wav') self.recording = sound.recording(self.file) self.recording.play() self.record.SetLabel(_(u"Stop recording")) output.speak(_(u"Recording")) def stop_recording(self): self.recording.stop() self.recording.free() output.speak(_(u"Stopped")) self.recorded = True self.record.SetLabel(_(u"Record")) self.file_attached() def file_attached(self): self.pause.SetLabel(_(u"Pause")) self.record.Disable() self.play.Enable() self.discard.Enable() self.attach_exists.Disable() self.attach.Enable() self.play.SetFocus() def onDiscard(self, evt): evt.Skip() if self.playing: self._stop() if self.recording != None: self.attach.Disable() self.play.Disable() self.file = None self.record.Enable() self.attach_exists.Enable() self.record.SetFocus() self.discard.Disable() self.recording = None output.speak(_(u"Discarded")) def onPlay(self, evt): evt.Skip() if not self.playing: call_threaded(self._play) else: self._stop() def _play(self): output.speak(_(u"Playing...")) # try: self.playing = sound_lib.stream.FileStream(file=unicode(self.file), flags=sound_lib.stream.BASS_UNICODE) self.playing.play() self.play.SetLabel(_(u"Stop")) try: while self.playing.is_playing: pass self.play.SetLabel(_(u"Play")) self.playing.free() self.playing = None except: pass def _stop(self): output.speak(_(u"Stopped")) self.playing.stop() self.playing.free() self.play.SetLabel(_(u"Play")) self.playing = None def postprocess(self): if self.file.lower().endswith('.wav'): output.speak(_(u"Recoding audio...")) sound.recode_audio(self.file) self.wav_file = self.file self.file = '%s.ogg' % self.file[:-4] def cleanup(self): if self.playing and self.playing.is_playing: self.playing.stop() if self.recording != None: if self.recording.is_playing: self.recording.stop() try: self.recording.free() except: pass os.remove(self.file) if hasattr(self, 'wav_file'): os.remove(self.wav_file) del(self.wav_file) if hasattr(self, 'wav_file') and os.path.exists(self.file): os.remove(self.file) def onAttach(self, ev): openFileDialog = wx.FileDialog(self, _(u"Select the audio file to be uploaded"), "", "", _("Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) if openFileDialog.ShowModal() == wx.ID_CANCEL: return self.file = openFileDialog.GetPath() self.file_attached() ev.Skip()