2n2u

Untitled

Nov 1st, 2015
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.66 KB | None | 0 0
  1. # kivy imports
  2. from kivy.app import App
  3. from kivy.uix.boxlayout import BoxLayout
  4. from kivy.uix.anchorlayout import AnchorLayout
  5. from kivy.properties import ObjectProperty
  6. from kivy.clock import Clock
  7. from kivy.uix.screenmanager import ScreenManager, Screen
  8. from kivy.garden.graph import Graph, MeshLinePlot, SmoothLinePlot, LinePlot
  9. from kivy.core.window import Window
  10. from kivy.uix.widget import Widget
  11. # Import custom fonts
  12. from kivy.core.text import LabelBase
  13. from functools import partial
  14. KIVY_FONTS = [
  15.     {
  16.         "name": "RobotoCondensed",
  17.         "fn_regular": "data/fonts/RobotoCondensed-Light.ttf",
  18.         "fn_bold": "data/fonts/RobotoCondensed-Regular.ttf",
  19.         "fn_italic": "data/fonts/RobotoCondensed-LightItalic.ttf",
  20.         "fn_bolditalic": "data/fonts/RobotoCondensed-Italic.ttf"
  21.     }
  22. ]
  23.  
  24. # other imports
  25. from jnius import autoclass
  26. from audiostream import get_input
  27. import math
  28. import numpy as np
  29. import os
  30. import wave
  31.  
  32. __author__ = 'Andre'
  33.  
  34.  
  35. if not os.path.isdir("/sdcard/kivyrecords/"):
  36.     os.mkdir("/sdcard/kivyrecords/")
  37.  
  38. PATH = "/sdcard/kivyrecords/rec_test.wav"
  39.  
  40. recordtime = 5
  41. samples_per_second = 10
  42.  
  43. screens = []
  44.  
  45. # Load custom fonts
  46. for font in KIVY_FONTS:
  47.     LabelBase.register(**font)
  48.  
  49. # Screen that contains the Record Form Widget
  50. class RootScreen(BoxLayout):  #
  51.     user_profile = ObjectProperty()
  52.     g_evaluation = ObjectProperty()
  53.     show_results = ObjectProperty()
  54.     go_settings = ObjectProperty()
  55.     screen_manager = ObjectProperty(None)
  56.  
  57.     def __init__(self, **kwargs):
  58.         super(RootScreen, self).__init__(**kwargs)
  59.         self.tmp = ''
  60.         # Initializing the button background normal images
  61.         self.images = ['data/images/User.png', 'data/images/Microphone.png',
  62.                         'data/images/AudioWave.png', 'data/images/Settings.png']
  63.         self.buttons_array = [self.user_profile, self.g_evaluation, self.show_results, self.go_settings]
  64.  
  65.         for i in range(0, len(self.images)):
  66.  
  67.             self.buttons_array[i].background_normal = self.images[i]
  68.             self.tmp = self.images[i]
  69.             self.tmp = self.tmp.replace(".png", "d.png")
  70.             self.buttons_array[i].background_down = self.tmp
  71.  
  72.     def select_screen(self):
  73.         print("teste")
  74.         print(self.ids)
  75.         #sm.switch_to(screens[1])
  76.  
  77.  
  78. class RecordForm(BoxLayout):  #
  79.     # binding of record button on .kv
  80.     b_record = ObjectProperty()
  81.     # binding of the progressbar on .kv
  82.     p_bar = ObjectProperty()
  83.     # Instatiate the rform to pass later (Record Widget 'Layout')
  84.     rform = ObjectProperty()
  85.     # binding to the graph layout on .kv
  86.     g_layout = ObjectProperty()
  87.  
  88.  
  89.     def __init__(self, **kwargs):
  90.         super(RecordForm, self).__init__(**kwargs)
  91.         Clock.schedule_once(self.my_init)
  92.  
  93.     def my_init(self,dt):
  94.         self.REC = Recorder(self.g_layout)
  95.  
  96.     def start_record(self):
  97.         self.b_record.disabled = True
  98.         self.p_bar.max = recordtime
  99.         #print(self.ids)
  100.         self.REC.start()
  101.         Clock.schedule_once(self.stop_record, recordtime)
  102.         Clock.schedule_interval(self.update_display, 1/samples_per_second)
  103.  
  104.     def stop_record(self, dt):
  105.         Clock.unschedule(self.update_display)
  106.         self.p_bar.value = 0
  107.         self.REC.stop()
  108.         self.b_record.disabled = False
  109.  
  110.     def update_display(self,dt):
  111.         self.p_bar.value = self.p_bar.value + dt
  112.  
  113. class GraphForm(AnchorLayout):
  114.     def __init__(self, **kwargs):
  115.         super(GraphForm, self).__init__(**kwargs)
  116.             # Initializing the graph instance
  117.         self.graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5, x_ticks_major=10, y_ticks_major=20,
  118.         y_grid_label=True, x_grid_label=True, padding=5, x_grid=True, y_grid=True, xmin=-0, xmax=120, ymin=-0, ymax=100)
  119.         self.plot = SmoothLinePlot(color=[1, 0, 0, 1])
  120.         self.graph.add_plot(self.plot)
  121.         self.add_widget(self.graph)
  122.  
  123.  
  124.  
  125. class Recorder(object):
  126.  
  127.     def __init__(self, g_layout):
  128.         # get the needed Java classes
  129.         Clock.schedule_once(partial(self.my_init, g_layout))
  130.  
  131.     def my_init(self, dt, g_layout):
  132.         self.buffer_size = 4096
  133.         self.MediaRecorder = autoclass('android.media.MediaRecorder')
  134.         self.AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
  135.         self.AudioFormat = autoclass('android.media.AudioFormat')
  136.         self.AudioRecord = autoclass('android.media.AudioRecord')
  137.         # set the system config
  138.         self.SampleRate = 44100
  139.         self.ChannelConfig = self.AudioFormat.CHANNEL_IN_MONO
  140.         self.AudioEncoding = self.AudioFormat.ENCODING_PCM_16BIT
  141.         self.minBufferSize = self.AudioRecord.getMinBufferSize(self.SampleRate, self.ChannelConfig, self.AudioEncoding)
  142.         self.sData = []
  143.         self.mic = get_input(callback=self.mic_callback, source='mic', buffersize=self.minBufferSize)
  144.         self.rform = self.g_layout
  145.         self.converted_buf = []
  146.         self.xmax = 0
  147.         self.ymax = 0
  148.  
  149.     def mic_callback(self, buf):
  150.         self.sData.append(str(buf))
  151.         self.converted_buf = np.frombuffer(buf, dtype=np.int16)
  152.         if np.amax(self.converted_buf) > self.ymax:
  153.             self.ymax = np.amax(self.converted_buf)
  154.         self.rform.plot.points.append((self.xmax, np.amax(self.converted_buf)))
  155.  
  156.         # Auto-Scale Y-Axis
  157.         self.rform.graph.ymax = int(self.ymax)
  158.         # Scale Y Ticks
  159.         self.rform.graph.y_ticks_major = int(int(self.ymax)/5.)
  160.         self.rform.graph.y_ticks_minor = int(self.rform.graph.y_ticks_major/5.)
  161.  
  162.         # New sample
  163.         self.xmax += 1
  164.  
  165.     def start(self):
  166.         self.mic.start()
  167.         self.rform.plot.points = []
  168.         Clock.schedule_interval(self.readbuffer, 1/60.)
  169.  
  170.     def readbuffer(self, dt):
  171.         self.mic.poll()
  172.  
  173.     def stop(self):
  174.         Clock.unschedule(self.readbuffer)
  175.         self.mic.stop()
  176.         wf = wave.open(PATH, 'w')
  177.         wf.setnchannels(self.mic.channels)
  178.         wf.setsampwidth(2)
  179.         wf.setframerate(self.mic.rate)
  180.         wf.writeframes(b''.join(self.sData))
  181.         wf.close()
  182.         #np.savetxt("/sdcard/kivyrecords/" + "test.txt", self.newpoints, fmt='%2.2i')
  183.         self.sData = []
  184.         self.xmax = 0
  185.         self.ymax = 0
  186.         self.converted_buf = []
  187.  
  188. # screens.extend([RootScreen(name='Home'), RecordForm(name='RecordForm')])
  189. # for i in range(0,len(screens)-1):
  190. #     sm.add_widget(screens[i])
  191. #     print i
  192.  
  193. class AirflowApp(App):
  194.  
  195.     def build(self):
  196.         self.title = 'AirFlow Application'
  197.         #Window.clearcolor = (1, 1, 1, 1)
  198.         return RecordForm()#RootScreen()
  199.  
  200. if __name__ == '__main__':
  201.     AirflowApp().run()
Advertisement
Add Comment
Please, Sign In to add comment