from __future__ import print_function import threading 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 range(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': 0, 'nChannels': 1, 'firstChannel': 0} iParams = {'deviceId': 0, '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()