Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2017 11:02:23

mamol27
Зарегистрирован: 2017-08-14
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание объектов скрипта

Есть задача запускать музыку на разных устройствах одновременно на raspberry pi. Так как единственная библиотека, подходящая по большему числу критериев - python-sounddevice, выбрал ее.
Но столкнулся с проблемой она написана не классом. Собственно написал отдельный скрипт запуска и обработки музыки, и запускаю этот скрипт с основной программы. Но тут возникла еще одна проблема - время загрузки разных треков разное и время на запуск скрипта не постоянно.
Можно ли каким-нибудь образом более точно и стабильно управлять этими процессами. (например загрузить все треки в память и давать указатели, неявное управление этими процессами)
Буду благодарен за пинок в нужную сторону.

Скрипт воспроизведения и записи треков:

 import argparse
import os
import sys
import sounddevice as sd
import soundfile as sf
class Music:
    __record_flag = False
    __playing_flag = False
    __current_time = 0
    __fs = 48000
    __duration = 5  # seconds
    sd.default.samplerate = __fs
    def __init__(self):
        self.parser = self.create_parser()
        self.myrecording = None
        self.file_name = self.parser.file
        sd.default.channels = tuple(map(int, self.parser.channels))
        sd.default.device = tuple(map(int, self.parser.device))
        self.mode = self.parser.mode
        self.__duration = int(self.parser.time)
        self.__loop = self.parser.loop.__contains__("True")
    @staticmethod
    def create_parser():
        parser = argparse.ArgumentParser()
        parser.add_argument('-c', '--channels', nargs='+')
        parser.add_argument('-d', '--device', nargs='+')
        parser.add_argument('-m', '--mode', default="play")
        parser.add_argument('-f', '--file', default="./resources/sounds/game.wav")
        parser.add_argument('-t', '--time', default="20")
        parser.add_argument('-p', '--pid', default="pid.txt")
        parser.add_argument('-l', '--loop', default="False")
        # print(parser.parse_args(sys.argv[1:]))
        return parser.parse_args(sys.argv[1:])
    def record(self):
        print("Start recording")
        myrecording = sd.rec(self.__duration * self.__fs)
        sd.wait()
        print("Recorded successful")
        # self.sd.play(myrecording)
        # self.sd.wait()
        sf.write(self.file_name, myrecording, self.__fs)
    def play_audio(self, arr):
        # print(self.__playing_flag)
        sd.play(arr, loop=self.__loop)
        sd.wait()
    def play_rec(self, arr):
        sd.playrec(arr)
        sd.wait()
    def stop_playing(self):
        # self.sd.play("./res/non.wav")
        sd.stop()
    def play_file(self):
        print("playing track")
        data, fs = sf.read(self.file_name)
        self.play_audio(data)
    def do_reverse(self):
        data, fs = sf.read(self.file_name)
        sf.write(self.file_name, data[::-1], fs)
    def show(self):
        print(sd.query_devices())
music = Music()
# music.show()
if music.mode == 'play':
    music.f = open(music.parser.pid, 'w')
    music.pid = str(os.getpid())
    # print(music.pid)
    music.f.write(music.pid)
    music.f.close()
    music.play_file()
elif music.mode == 'record':
    music.record()
elif music.mode == "reverse":
    music.do_reverse()
elif music.mode == "stop":
    music.stop_playing()
elif music.mode == 'play_rec':
    music.f = open(music.parser.pid, 'w')
    music.pid = str(os.getpid())
    # print(music.pid)
    music.f.write(music.pid)
    music.f.close()
    music.play_file()
# print("thats all")

Отредактировано mamol27 (Авг. 23, 2017 11:51:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version