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 化はなんとかなりそうだ、後はボリューム値の線形化だ。
って以前のように動かせるだけで見た目は何も進化していないのが少し悲しい…