Можно ли остановить функцию stream.write до полного использования буфера? Когда я пытаюсь это сделать, звук останавливается, но функция stream.write никогда не возвращается.
Это рабочий пример того, как я хочу использовать небольшой класс для воспроизведения звуков чистых тонов без блокировки основногоthread.
import time
import sounddevice as sd
import numpy as np
from threading import Thread
toneduration = 10
samplerate = 44100
frequency = 440
amplitude = 0.5
sd.default.device = 1
sd.default.samplerate = samplerate
sd.default.channels = 2
class Sound(Thread):
def __init__(self):
Thread.__init__(self)
self.stream = sd.OutputStream()
self.stream.start()
vector1 = np.linspace(0, toneduration, toneduration * samplerate)
vector2 = amplitude * np.sin(2 * np.pi * frequency * vector1)
vector3 = np.array([vector2, vector2])
self.soundVector = np.ascontiguousarray(vector3.T, dtype=np.float32)
def run(self):
self.stream.write(self.soundVector)
print('end')
sound = Sound()
sound.start()
time.sleep(3)
sound.stream.close()
Я могу воспроизводить звуки заданной длительности, но если я остановлю поток вручную, используя stream.close()
, функция не вернется (сообщение print('end')
никогда не отображается, а поток нене закончено)
Должен ли я использовать обратный вызов вместо этого? В таком случае, как я должен заполнить буфер массивом numpy? Я прочитал примеры кода в документации, но не мог понять, как это сделать.