Este script é um wrapper fino da API simples do PulseAudio. Ele permite que você grave amostras na saída padrão:
#!/usr/bin/env python3
import random
import ctypes
import struct
class NoiseMaker (object):
PA_SAMPLE_U8 = 0
PA_STREAM_PLAYBACK = 1
def __init__(self, rate, channels):
pat_sample_spec = ctypes.c_buffer(struct.pack("LLB",
self.PA_SAMPLE_U8, rate, channels))
self.pa = ctypes.cdll.LoadLibrary("libpulse-simple.so.0")
self.s = self.pa.pa_simple_new(0, "App", self.PA_STREAM_PLAYBACK,
0, "App Noise", ctypes.byref(pat_sample_spec), 0, 0,0)
def write(self, data):
self.pa.pa_simple_write(self.s, data, len(data), 0)
def __del__(self):
self.pa.pa_simple_free(self.s)
one_second_noise = bytes(random.randint(0, 255) for i in range(44100*2))
NoiseMaker(44100, 2).write(one_second_noise)
A taxa (44100) define quantas amostras há em um segundo em tempo real. Ele espera bytes no intervalo de 0 a 255 inclusive, o que é definido por PA_SAMPLE_U8 (equivalente a 'Unsigned 8-Bit' como mostrado pelo Audacity, por exemplo). Se você tiver mais de um canal, ele espera amostras alternadas para cada um deles. Então, um segundo de ruído tem 44100 amostras por canal = 88200 amostras, onde as (módulo 2 = 0) são para o canal esquerdo.
Por favor, note que este script é executado apenas no Python 3