Как заставить медиа-очередь Pyglet продолжать играть? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть несколько песен, загружаемых и помещенных в очередь в моем проигрывателе, однако проигрыватель останавливается после первой песни, и мне приходится вручную принудительно запускать следующую песню, используя next_source (), хотя из документации я считаю, что она должна быть автоматической.

Я использую Python 3.7.1 и Pyglet 1.3.2, я изучил документацию и попробовал различные методы постановки данных в очередь.Я пытался убедиться, что файл воспроизводится полностью, хотя я не уверен, что воспроизведение первой песни когда-либо заканчивается.

chosenDirectory = ""
cSong = ""
cSongIndex = 0
player = pyglet.media.Player()
songList = []


def chooseDirectory():
    global chosenDirectory
    chosenDirectory = tk.filedialog.askdirectory(initialdir="/")
    lbl.configure(text=chosenDirectory)
    listBox.delete("0", "end")

    def listFiles(dir):
        global songList
        songList = []
        files = os.listdir(dir)
        for x, file in enumerate(files):
            filePath = chosenDirectory + "/" + file
            if not os.path.isdir(filePath):
                fileExt = file.split(".")[1]
                if fileExt == "mp3" or fileExt == "wav":
                    listBox.insert(x, file)
                    songList.append(filePath)

    listFiles(chosenDirectory)


class mediaControls:
    def curSelect(self, info):
        global cSong
        if listBox.curselection() != ():
            selected = listBox.get(listBox.curselection())
            if selected != cSong:
                cSong = selected
                cSongIndex = listBox.curselection()[0]
        self.playList()

    def playSong(self):
        if not player.playing:
            player.play()
        elif player.playing:
            player.pause()

    def playList(self):
        for song in songList:
            music = pyglet.media.load(song)
            print(music.duration)
            player.queue(music)
        self.playSong()

    def playNextSong(self):
        player.next_source()

    def playNewSong(self):
        global cSong
        global cSongIndex
        cSongIndex = cSongIndex + 1
        cSong = listBox.get(cSongIndex)
        self.playSong()

Мой ожидаемый результат от этого - циклическое повторение всех песен.отказавшись от них перед переходом к следующему, и не требуя вмешательства с моей стороны.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Я хотел бы отметить использование global, так как вы, похоже, имели дело с тем, что он не продолжает играть.Все виды использования global можно исключить, сделав состояние частью класса.Как и при запуске приложения, он создает экземпляр этого класса, который живет в течение всего времени выполнения программы.Учтите следующее.

Это не работает, так как вы не включили весь скрипт.listBox, кажется, отсутствует и также должен быть членом экземпляра.

class mediaControls:
    def __init__(self):
        self.chosenDirectory = ""
        self.cSong = ""
        self.cSongIndex = 0
        self.player = pyglet.media.Player()
        self.songList = []

    def chooseDirectory(self):
        self.chosenDirectory = chosenDirectory = tk.filedialog.askdirectory(initialdir="/")
        lbl.configure(text=chosenDirectory)
        listBox.delete("0", "end")

        songList = []
        files = os.listdir(chosenDirectory)
        for x, file in enumerate(files):
            filePath = os.path.join(chosenDirectory, file)
            if not os.path.isdir(filePath):
                fileExt = file.split(".")[1]
                if fileExt == "mp3" or fileExt == "wav":
                    listBox.insert(x, file)
                    songList.append(filePath)
        self.songList = songList

    def curSelect(self, info):
        if listBox.curselection() != ():
            selected = listBox.get(listBox.curselection())
            if selected != self.cSong:
                self.cSong = selected
                self.cSongIndex = listBox.curselection()[0]
        self.playList()

    def playSong(self):
        if not self.player.playing:
            self.player.play()
        elif self.player.playing:
            self.player.pause()

    def playList(self):
        for song in self.songList:
            music = pyglet.media.load(song)
            print(music.duration)
            self.player.queue(music)
        self.playSong()

    def playNextSong(self):
        self.player.next_source()

    def playNewSong(self):
        self.cSongIndex = self.cSongIndex + 1
        self.cSong = listBox.get(self.cSongIndex)
        self.playSong()
0 голосов
/ 28 июня 2019

Получается, что я ожидал, что очередь будет обрабатывать все, не осознавая, что команда pyglet.app.run () фактически запускает все события.Без использования этого (с момента его блокировки) я могу просто включить on_eos (), вызвать функцию next_source () и получить тот же результат.

...