diff --git a/examples/pyaudio-sstv.py b/examples/pyaudio-sstv.py new file mode 100644 index 0000000..8a7caa3 --- /dev/null +++ b/examples/pyaudio-sstv.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +""" +Demonstrates playing the generated samples directly using PyAudio +Tested on PyAudio 0.2.7 http://people.csail.mit.edu/hubert/pyaudio/ +""" + +from __future__ import division +from sstv import SSTV +from time import sleep +from itertools import islice +import struct, pyaudio + +class PyAudioSSTV(object): + def __init__(self, sstv): + self.pa = pyaudio.PyAudio() + self.sstv = sstv + self.fmt = '<' + SSTV.BITS_TO_STRUCT[sstv.bits] + + def __del__(self): + self.pa.terminate() + + def execute(self): + self.sampler = self.sstv.gen_samples() + stream = self.pa.open( + format=self.pa.get_format_from_width(self.sstv.bits // 8), + channels=1, rate=self.sstv.samples_per_sec, output=True, + stream_callback=self.callback) + stream.start_stream() + while stream.is_active(): + sleep(0.5) + stream.stop_stream() + stream.close() + + def callback(self, in_data, frame_count, time_info, status): + frames = ''.join(struct.pack(self.fmt, b) + for b in islice(self.sampler, frame_count)) + return frames, pyaudio.paContinue + + +def main(): + from PIL import Image + from grayscale import Robot8BW + + img = Image.open("160x120bw.png") + sstv = Robot8BW(img, 44100, 16) + sstv.vox_enabled = True + PyAudioSSTV(sstv).execute() + +if __name__ == '__main__': + main()