2012-07-04 36 views
1

我正在製作一個音板程序。該窗口由以下SoundPlayer類的多個實例組成。運行我的程序時,音量滑塊不會影響他們自己的播放器。最後啓動的播放器的音量滑塊控制整個節目的音量。我已經打印出了audioObjects,volumeSliders等的所有實例,並且它們之間沒有任何玩家共享。我讓每個播放器打印出音量,使用正確的音量滑塊確實會改變音量(audioOutput.volume()),但沒有聽覺效果。使用上次啓動的音量滑塊時,其他播放器的audioOutput音量不會更改音量值,但仍有聲音效果。我感到茫然,因爲這在多臺Windows機器上工作得很好,但在Ubuntu 12.04上沒有問題。在其他地方尋求幫助並在多臺機器上運行後,我開始認爲這是一個PySide/Phonon與Linux的問題?多聲子audioOutput實例在Linux上無法正常工作?

編輯:似乎問題更多地與audioOutput。我將一些按鈕連接到了.setVolume()並手動調整了音量,並且像以前一樣調出了相同的音量。只有最後啓動的播放器的音量實際上會影響可聽聲音,並且爲每個播放器都這樣做。關鍵部分包括創建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)) 

回答