多个 Phonon audioOutput 实例在 Linux 上无法正常工作?
Posted
技术标签:
【中文标题】多个 Phonon audioOutput 实例在 Linux 上无法正常工作?【英文标题】:Multiple Phonon audioOutput instances don't work properly on linux? 【发布时间】:2012-07-04 21:11:52 【问题描述】:我正在开发一个音板程序。该窗口填充了以下 SoundPlayer 类的多个实例。运行我的程序时,音量滑块不会影响他们自己的播放器。最后启动的播放器的音量滑块控制整个节目的音量。我已经打印出了所有的 audioObjects、volumeSliders 等实例,并且没有一个在播放器之间共享。我让每个播放器打印出它的音量,使用正确的音量滑块确实会改变音量(audioOutput.volume()),但没有声音效果。使用最后启动的音量滑块,其他播放器的音频输出音量不会改变音量值,但会产生声音效果。我很茫然,因为这在多台 Windows 机器上运行良好,但在 ubuntu 12.04 上却不行。在其他地方寻求帮助并在多台机器上运行它之后,我开始认为这是 Linux 的 PySide/Phonon 问题?
编辑:似乎问题更多在于音频输出。我将一些按钮连接到 .setVolume() 并手动调节音量,它的窃听器和以前一样。只有最后启动的播放器的音量才会真正影响可听声音,并且对每个播放器都如此。
SoundPlayer 类:(为简洁起见,修剪了一些 ui 设置。关键部分包括创建 audioOutputs 和 MediaObjects 的 createAttr()/loadAttr() 以及创建音量滑块的 setupUi()。)
class SoundPlayer():
def __init__(self, MainWindow, position, instance, attributes):
self.instance = instance
self.mainWindow = MainWindow
self.pos = position
self.setupUi(self.pos)
if attributes == '':
self.createAttr()
self.attributes = [self.name, self.filename]
else:
self.attributes = attributes
self.loadAttr()
self.buttons()
self.directory = QDesktopServices.storageLocation(QDesktopServices.MusicLocation)
def updateDevice(self, device):
self.audio.setOutputDevice(device)
Phonon.createPath(self.media, self.audio)
def loadAttr(self):
self.name = self.attributes[0]
self.filename = self.attributes[1]
self.media = Phonon.MediaObject(self.instance)
self.audio = Phonon.AudioOutput(Phonon.MusicCategory, self.instance)
self.source = Phonon.MediaSource(self.filename)
Phonon.createPath(self.media, self.audio)
self.label.setText(self.name)
self.updateUi()
def createAttr(self):
self.filename = ''
self.name = 'None'
self.media = Phonon.MediaObject(self.instance)
self.audio = Phonon.AudioOutput(Phonon.MusicCategory, self.instance)
self.source = Phonon.MediaSource(self.filename)
Phonon.createPath(self.media, self.audio)
self.media.stateChanged.connect(lambda x,y: self.changed(x,y))
self.label.setText(self.name)
self.updateUi()
def saveAttr(self):
self.attributes = [self.name, self.filename]
def buttons(self):
self.playButton.clicked.connect(self.onplaybutton())
self.resetButton.clicked.connect(self.onresetbutton())
self.stopButton.clicked.connect(self.onstopbutton())
self.optionButton.clicked.connect(self.optionDialog())
def onplaybutton(self):
state = self.media.state()
if state != Phonon.State.PausedState and state != Phonon.State.PlayingState:
self.playButton.setIcon(QtGui.QIcon(":pause.png"))
self.media.setCurrentSource(self.source)
self.media.play()
elif state == Phonon.State.PlayingState:
self.playButton.setIcon(QtGui.QIcon(":play.png"))
self.media.pause()
elif state == Phonon.State.PausedState:
self.playButton.setIcon(QtGui.QIcon(":pause.png"))
time = self.media.currentTime()
self.media.play()
self.media.seek(time)
def onresetbutton(self):
self.media.setCurrentSource(self.source)
self.media.play()
self.playButton.setIcon(QtGui.QIcon(":pause.png"))
def onstopbutton(self):
self.media.stop()
self.playButton.setIcon(QtGui.QIcon(":play.png"))
def updateUi(self):
self.seek = Phonon.SeekSlider(self.media, self.widget)
self.seek.resize(111, 21)
self.seek.show()
self.volume = Phonon.VolumeSlider(self.audio, self.volumeWidget)
self.volume.resize(111, 21)
self.volume.show()
self.playButton.setIcon(QtGui.QIcon(":play.png"))
self.media.stateChanged.connect(lambda x,y: self.changed(x,y))
【问题讨论】:
【参考方案1】:很可能不是你的错: https://bugs.kde.org/show_bug.cgi?id=321288
【讨论】:
请注意,此处不鼓励仅链接答案。请考虑editing your answer 并在此处添加概要。以上是关于多个 Phonon audioOutput 实例在 Linux 上无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章