|  | 
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()
 |