Раньше вы могли открывать /dev/dsp
для чтения и записи, теперь с PulseAudio это больше не работает.
Я думал, что вы можете сделать это с padsp
, но этот код не запускается:
import ossaudiodev
f = ossaudiodev.open("w")
fmt, channels, rate = dsp.setparameters(fmt, channels, rate)
(запуск через padsp python script.py
)
Я получаю ошибку No such file or directory: '/dev/dsp'
.
Чего мне не хватает? Как читать и записывать необработанные байты со звукового устройства и на него и как выбрать, какой из них я хочу использовать?
Этот скрипт представляет собой тонкую оболочку вокруг простого API PulseAudio. Он позволяет записывать сэмплы на выход по умолчанию:
#!/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)
Скорость (44100) определяет количество сэмплов в секунду реального времени. Он ожидает байты в диапазоне 0-255 включительно, что определяется PA_SAMPLE_U8 (эквивалентно «8-разрядному без знака», как показано, например, в Audacity). Если у вас более одного канала, он ожидает чередующиеся выборки для каждого из них. Таким образом, одна секунда шума имеет 44100 выборок на канал = 88200 выборок, где (по модулю 2 = 0) для левого канала.
Обратите внимание, что этот скрипт работает только на Python 3