Como eu escrevo bytes brutos em um dispositivo de som?

5

Antigamente, você costumava abrir /dev/dsp para ler e escrever, agora, com o PulseAudio, isso não funciona mais.

Eu pensei que você poderia fazer isso com padsp , mas esse código não funciona:

import ossaudiodev

f = ossaudiodev.open("w")
fmt, channels, rate = dsp.setparameters(fmt, channels, rate)

(rodando via padsp python script.py )

O erro que recebo é No such file or directory: '/dev/dsp' .

O que estou perdendo? Como leio e escrevo bytes brutos de e para um dispositivo de som e como seleciono qual deles eu quero usar?

    
por Stefano Palazzo 04.04.2011 / 23:11

1 resposta

5

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

    
por Stefano Palazzo 05.04.2011 / 11:08