Totem は
gst_stream_volume_set_volume
でボリューム調節を行っているということだけ理解した。
その関数ってもしかして playbin の volume Property とリンクしているんじゃないの?
米国の Google でコードを探し試しまくったけどさっぱり解らない…
3. Pipeline
自前でパイプラインを構築するか、しかし情報少なすぎ!
いや、そういえば playbin は古いので新しい PulseAudio に対応しているはずがない。
だから playbin2 に移行しろということなのか…
Y901x の GstPipeline を playbin2 に書き換えて試す。
self.player = gst.element_factory_make("playbin2", "player")
エラーが出る場所をとにかくコメントアウトしてボリュームを試す。
あーあ、マジでそんだけだった、しかも mute Property にて簡単にミュート。
しかし DirectShow 同様に非線形カーブなので GtkHScale 値をそのまま使えないみたい。
ミュートも「サウンドの設定」の「アプリケーション」タブと見事連動。
これではもう playbin2 に移行するしか選択肢が無いようだ。
# Get GstStreamInfo List info_arr = self.player.get_property("stream-info-value-array")
の所で例外になる、そりゃ playbin2 にそんなプロパティは無い。
本当はもの凄い遠回りをしたけど一応こう書き換えたら上手く動いた。
def gst_on_message(self, bus, message): t = message.type if t == gst.MESSAGE_EOS: self.clear() # Repeat if self.settingwin["repeat"] > 1: self.on_next(self) elif self.settingwin["repeat"] == 1: self.set_play_position(0) self.player.set_state(gst.STATE_PLAYING) elif t == gst.MESSAGE_ERROR: self.clear() err, debug = message.parse_error() self.messagebox(str(err) + "\n" + str(debug)) self.toolbox.change_img(0) elif t == gst.MESSAGE_STATE_CHANGED: if gst.STATE_PLAYING == message.parse_state_changed()[1]: self.toolbox.change_img(0) # This is First Play if not self.is_playing: try: self.p_duration = self.player.query_duration(gst.FORMAT_TIME)[0] except: self.p_duration = gst.CLOCK_TIME_NONE if self.p_duration != gst.CLOCK_TIME_NONE: self.toolbox.seekadj.upper = self.p_duration self.is_playing = True # toolbox Buttons Enabled self.toolbox.set_enable_ctrl(True) # Timer on self.timer_id = gobject.timeout_add(200, self.on_timer) # File Names Listup self.listup_change() # # playbin2 # vsink = self.player.get_property("video-sink") # vsink == None @ Music File if vsink: for pad in vsink.pads(): # print pad.get_caps()[0].get_name() # is Check # W Buffer Off self.video_window.unset_flags(gtk.DOUBLE_BUFFERED) # caps[0] @ GstStructure caps = pad.get_negotiated_caps() self.video["width"] = caps[0]["width"] self.video["height"] = caps[0]["height"] # flt = float(self.video["width"]) / float(self.video["height"]) self.aframe.set(xalign=0.5, yalign=0.5, ratio=flt, obey_child=False) self.change_video_size() """ under Old PlayBin src # Get GstStreamInfo List info_arr = self.player.get_property("stream-info-value-array") if len(info_arr) == 1: # Music pass else: # W Buffer Off self.video_window.unset_flags(gtk.DOUBLE_BUFFERED) for info in info_arr: # Get Video Size pad = info.get_property("object") #print pad caps = pad.get_negotiated_caps() if caps != None and "video" in caps.to_string(): # caps[0] @ GstStructure self.video["width"] = caps[0]["width"] self.video["height"] = caps[0]["height"] # flt = float(self.video["width"]) / float(self.video["height"]) self.aframe.set(xalign=0.5, yalign=0.5, ratio=flt, obey_child=False) self.change_video_size()""" else: self.toolbox.change_img(1)
GstStreamInfo のリストからの情報で設定するより短くなってもーたw
video-sink なんてテキトーだったのにビンゴだったのは自分で驚いたマジで。
これで playbin2 化はなんとかなりそうだ、後はボリューム値の線形化だ。
って以前のように動かせるだけで見た目は何も進化していないのが少し悲しい…