self.fd=open(filename, 'w')
self.insert_code('header.py')
- self.generate_enums(self.parser.enums)
wrapped_methods=self.generate_wrappers(self.parser.methods)
for l in self.parser.methods:
self.output_ctypes(*l)
"""
f=open(filename, 'r')
for l in f:
- if 'build_date' in l:
+ if l.startswith('build_date'):
self.output('build_date="%s"' % time.ctime())
+ elif l.startswith('# GENERATED_ENUMS'):
+ self.generate_enums(self.parser.enums)
else:
self.output(l.rstrip())
+
f.close()
def convert_enum_names(self, enums):
raise Exception('This method only handles enums')
pyname=self.type2class[name]
- self.output("class %s(ctypes.c_uint):" % pyname)
+ self.output("class %s(ctypes.c_ulong):" % pyname)
self.output(' """%s\n """' % comment)
conv={}
n='_'+n
conv[k]=n
- for k, v in values:
- self.output(" %s=ctypes.c_uint(%s)" % (conv[k], v))
-
self.output(" _names={")
for k, v in values:
self.output(" %s: '%s'," % (v, conv[k]))
return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
def __eq__(self, other):
- return (isinstance(other, ctypes.c_uint) and self.value == other.value)
+ return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
+ or (isinstance(other, (int, long)) and self.value == other ) )
def __ne__(self, other):
return not self.__eq__(other)
-
""")
+ for k, v in values:
+ self.output("%(class)s.%(attribute)s=%(class)s(%(value)s)" % {
+ 'class': pyname,
+ 'attribute': conv[k],
+ 'value': v
+ })
+ self.output("")
def output_ctypes(self, rtype, method, params, comment):
"""Output ctypes decorator for the given method.
# FIXME: should find a means to configure path
dll=ctypes.CDLL('/Applications/VLC.app/Contents/MacOS/lib/libvlc.2.dylib')
+#
+# Generated enum types.
+#
+
+# GENERATED_ENUMS
+
+#
+# End of generated enum types.
+#
+
class ListPOINTER(object):
'''Just like a POINTER but accept a list of ctype as an argument.
'''
class MediaControlPosition(ctypes.Structure):
_fields_= [
- ('origin', ctypes.c_int),
- ('key', ctypes.c_int),
+ ('origin', PositionOrigin),
+ ('key', PositionKey),
('value', ctypes.c_longlong),
]
+ def __init__(self, value=0, origin=None, key=None):
+ # We override the __init__ method so that instanciating the
+ # class with an int as parameter will create the appropriate
+ # default position (absolute position, media time, with the
+ # int as value).
+ self.value=value
+ if origin is None:
+ origin=PositionOrigin.AbsolutePosition
+ if key is None:
+ key=PositionKey.MediaTime
+ self.origin=origin
+ self.key=key
+
def __str__(self):
return "MediaControlPosition %ld (%s, %s)" % (
self.value,
- str(PositionOrigin(self.origin)),
- str(PositionKey(self.key))
+ str(self.origin),
+ str(self.key)
)
@staticmethod
def from_param(arg):
if isinstance(arg, (int, long)):
- p=MediaControlPosition()
- p.value=arg
- p.key=2
+ p=MediaControlPosition(arg)
return p
else:
return arg
class MediaControlStreamInformation(ctypes.Structure):
_fields_= [
- ('status', ctypes.c_int),
+ ('status', PlayerStatus),
('url', ctypes.c_char_p),
('position', ctypes.c_longlong),
('length', ctypes.c_longlong),
]
def __str__(self):
- return "%s (%s) : %ld / %ld" % (self.url,
- str(PlayerStatus(self.status)),
+ return "%s (%s) : %ld / %ld" % (self.url or "<No defined URL>",
+ str(self.status),
self.position,
self.length)
@param pos: a MediaControlPosition or an integer (in ms)
"""
if not isinstance(pos, MediaControlPosition):
- pos=MediaControlPosition(origin=PositionOrigin.AbsolutePosition, key=PositionKey.MediaTime, value=long(pos))
+ pos=MediaControlPosition(long(pos))
e=MediaControlException()
mediacontrol_set_media_position(self, pos, e)
@param pos: a MediaControlPosition or an integer (in ms)
"""
if not isinstance(pos, MediaControlPosition):
- pos=MediaControlPosition(origin=PositionOrigin.AbsolutePosition, key=PositionKey.MediaTime, value=long(pos))
+ pos=MediaControlPosition(long(pos))
e=MediaControlException()
mediacontrol_start(self, pos, e)
@param pos: a MediaControlPosition or an integer (in ms)
"""
if not isinstance(pos, MediaControlPosition):
- pos=MediaControlPosition(origin=PositionOrigin.AbsolutePosition, key=PositionKey.MediaTime, value=long(pos))
+ pos=MediaControlPosition(long(pos))
e=MediaControlException()
p=mediacontrol_snapshot(self, pos, e)
if p:
- return p.contents
+ snap=p.contents
+ # FIXME: there is a bug in the current mediacontrol_snapshot
+ # implementation, which sets an incorrect date.
+ # Workaround here:
+ snap.date=self.get_media_position().value
+ return snap
else:
return None
@param end: the end position
"""
if not isinstance(begin, MediaControlPosition):
- begin=MediaControlPosition(origin=PositionOrigin.AbsolutePosition, key=PositionKey.MediaTime, value=long(begin))
+ begin=self.value2position(pos)
if not isinstance(end, MediaControlPosition):
- begin=MediaControlPosition(origin=PositionOrigin.AbsolutePosition, key=PositionKey.MediaTime, value=long(end))
+ end=self.value2position(end)
e=MediaControlException()
mediacontrol_display_text(self, message, begin, end, e)
mc.set_mrl(mrl)
self.assertEqual(mc.get_mrl(), mrl)
+ def test_mediacontrol_position(self):
+ p=vlc.MediaControlPosition(value=2,
+ origin=vlc.PositionOrigin.RelativePosition,
+ key=vlc.PositionKey.MediaTime)
+ self.assertEqual(p.value, 2)
+
+ def test_mediacontrol_position_shortcut(self):
+ p=vlc.MediaControlPosition(2)
+ self.assertEqual(p.value, 2)
+ self.assertEqual(p.key, vlc.PositionKey.MediaTime)
+ self.assertEqual(p.origin, vlc.PositionOrigin.AbsolutePosition)
+
+ def test_mediacontrol_get_media_position(self):
+ mc=vlc.MediaControl()
+ p=mc.get_media_position()
+ self.assertEqual(p.value, -1)
+
+ def test_mediacontrol_get_stream_information(self):
+ mc=vlc.MediaControl()
+ s=mc.get_stream_information()
+ self.assertEqual(s.position, 0)
+ self.assertEqual(s.length, 0)
+
# Basic libvlc tests
def test_instance_creation(self):
i=vlc.Instance()