import rtaudio as rt from math import cos import struct class audio_generator: def __init__(self): self.idx = -1 self.freq = 440. def __call__(self): self.idx += 1 if self.idx%48000 == 0: self.freq *= 2**(1/12.) return 0.5*cos(2.*3.1416*self.freq*self.idx/48000.) class callback: def __init__(self, gen): self.gen = gen self.i = 0 def __call__(self,playback, capture): [struct.pack_into("f", playback, 4*o, self.gen()) for o in xrange(256)] self.i = self.i + 256 if self.i > 48000*10: print '.' return 1 dac = rt.RtAudio() n = dac.getDeviceCount() print 'Number of devices available: ', n for i in range(n): try: print dac.getDeviceInfo(i) except rt.RtError as e: print e print 'Default output device: ', dac.getDefaultOutputDevice() print 'Default input device: ', dac.getDefaultInputDevice() print 'is stream open: ', dac.isStreamOpen() print 'is stream running: ', dac.isStreamRunning() oParams = {'deviceId': 1, 'nChannels': 1, 'firstChannel': 0} iParams = {'deviceId': 1, 'nChannels': 1, 'firstChannel': 0} try: dac.openStream(oParams,oParams,48000,256,callback(audio_generator()) ) except rt.RtError as e: print e else: dac.startStream() import time print 'latency: ', dac.getStreamLatency() while (dac.isStreamRunning()): time.sleep(0.1) print dac.getStreamTime() dac.stopStream() dac.abortStream() dac.closeStream()