Advertisement
2n2u

RecordApp with Kivy

Oct 25th, 2015
2,326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.76 KB | None | 0 0
  1. __author__ = 'Andre'
  2. from kivy.app import App
  3. from kivy.uix.boxlayout import BoxLayout
  4. from kivy.properties import NumericProperty, ObjectProperty
  5. from kivy.clock import Clock
  6. from jnius import autoclass
  7. from audiostream import get_input
  8. import wave
  9. #
  10. import os
  11.  
  12.  
  13.  
  14. if not os.path.isdir("/sdcard/kivyrecords/"):
  15.     os.mkdir("/sdcard/kivyrecords/")
  16.  
  17. PATH = "/sdcard/kivyrecords/rec_test.wav"
  18.  
  19. recordtime = 5
  20. samples_per_second = 60
  21.  
  22.  
  23. class RootScreen(BoxLayout): #
  24.     pass
  25.  
  26.  
  27. class RecordForm(BoxLayout): #
  28.     b_record = ObjectProperty()
  29.     p_bar = ObjectProperty()
  30.  
  31.     def start_record(self):
  32.         self.b_record.disabled = True
  33.         self.p_bar.max = recordtime
  34.         REC.start()
  35.         Clock.schedule_once(self.stop_record, recordtime)
  36.         Clock.schedule_interval(self.update_display, 1/30.)
  37.  
  38.     def stop_record(self, dt):
  39.         Clock.unschedule(self.update_display)
  40.         self.p_bar.value = 0
  41.         REC.stop()
  42.         self.b_record.disabled = False
  43.  
  44.     def update_display(self,dt):
  45.         self.p_bar.value = self.p_bar.value + dt
  46.  
  47.  
  48. class Recorder(object):
  49.     def __init__(self):
  50.         # get the needed Java classes
  51.         self.MediaRecorder = autoclass('android.media.MediaRecorder')
  52.         self.AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
  53.         self.AudioFormat = autoclass('android.media.AudioFormat')
  54.         self.AudioRecord = autoclass('android.media.AudioRecord')
  55.     # define our system
  56.         self.SampleRate = 44100
  57.         self.ChannelConfig = self.AudioFormat.CHANNEL_IN_MONO
  58.         self.AudioEncoding = self.AudioFormat.ENCODING_PCM_16BIT
  59.         self.BufferSize = self.AudioRecord.getMinBufferSize(self.SampleRate, self.ChannelConfig, self.AudioEncoding)
  60.         self.outstream = self.FileOutputStream(PATH)
  61.         self.sData = []
  62.         self.mic = get_input(callback=self.mic_callback, source='mic', buffersize=self.BufferSize)
  63.  
  64.     def mic_callback(self, buf):
  65.         self.sData.append(buf)
  66.         print ('got : ' + str(len(buf)))
  67.  
  68.  
  69.     def start(self):
  70.         self.mic.start()
  71.         Clock.schedule_interval(self.readbuffer, 1/samples_per_second)
  72.  
  73.     def readbuffer(self, dt):
  74.         self.mic.poll()
  75.  
  76.     def dummy(self, dt):
  77.         print ("dummy")
  78.  
  79.     def stop(self):
  80.         Clock.schedule_once(self.dummy, 0.5)
  81.         Clock.unschedule(self.readbuffer)
  82.         self.mic.stop()
  83.         wf = wave.open(PATH, 'wb')
  84.         wf.setnchannels(self.mic.channels)
  85.         wf.setsampwidth(2)
  86.         wf.setframerate(self.mic.rate)
  87.         wf.writeframes(b''.join(self.sData))
  88.         wf.close()
  89.  
  90. REC = Recorder()
  91.  
  92. class RecordApp(App):
  93.  
  94.     def build(self):
  95.         self.title = 'Recording Application'
  96.  
  97. if __name__ == '__main__':
  98.     RecordApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement