web-dev-qa-db-ja.com

生のバイトをサウンドデバイスに書き込むにはどうすればよいですか?

昔は、/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'です。

私は何が欠けていますか?サウンドデバイスとの間で生のバイトを読み書きするにはどうすればよいですか。また、使用するバイトを選択するにはどうすればよいですか。

5
Stefano Palazzo

このスクリプトは、PulseAudioのSimple APIの薄いラッパーです。サンプルをデフォルトの出力に書き込むことができます:

#!/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)は、リアルタイムの1秒に存在するサンプルの数を定義します。 PA_SAMPLE_U8で定義されている0〜255の範囲のバイト(Audacityで示されている「符号なし8ビット」と同等)が必要です。複数のチャネルがある場合は、それぞれのチャネルでサンプルが交互になることが予想されます。したがって、1秒間のノイズには、チャネルあたり44100サンプル= 88200サンプルがあり、(モジュロ2 = 0)のサンプルは左チャネル用です。

このスクリプトはPython 3でのみ実行されることに注意してください

5
Stefano Palazzo