1 /*****************************************************************************
2 * vlc_position.c: vlc.Position binding
3 *****************************************************************************
4 * Copyright (C) 2006,2007,2008,2009 the VideoLAN team
7 * Authors: Olivier Aubert <olivier.aubert at liris.cnrs.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 /***********************************************************************
27 ***********************************************************************/
30 PyPosition_new( PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
33 static char *kwlist
[] = { "value", "origin", "key", NULL
};
35 self
= PyObject_New( PyPosition
, &PyPosition_Type
);
38 self
->origin
=mediacontrol_AbsolutePosition
;
39 self
->key
=mediacontrol_MediaTime
;
41 if(! PyArg_ParseTupleAndKeywords( args
, kwds
, "|lii", kwlist
,
49 if( self
->key
!= mediacontrol_MediaTime
50 && self
->key
!= mediacontrol_ByteCount
51 && self
->key
!= mediacontrol_SampleCount
)
53 PyErr_SetString ( MediaControl_InternalException
, "Invalid key value" );
57 if( self
->origin
!= mediacontrol_AbsolutePosition
58 && self
->origin
!= mediacontrol_RelativePosition
59 && self
->origin
!= mediacontrol_ModuloPosition
)
61 PyErr_SetString ( MediaControl_InternalException
, "Invalid origin value" );
66 return ( PyObject
* )self
;
69 mediacontrol_PositionKey
70 positionKey_py_to_c( PyObject
* py_key
)
72 mediacontrol_PositionKey key_position
= mediacontrol_MediaTime
;
75 if( !PyArg_Parse( py_key
, "i", &key
) )
77 PyErr_SetString ( MediaControl_InternalException
, "Invalid key value" );
83 case 0: key
= mediacontrol_ByteCount
; break;
84 case 1: key
= mediacontrol_SampleCount
; break;
85 case 2: key
= mediacontrol_MediaTime
; break;
90 mediacontrol_PositionOrigin
91 positionOrigin_py_to_c( PyObject
* py_origin
)
93 mediacontrol_PositionOrigin origin_position
= mediacontrol_AbsolutePosition
;
96 if( !PyArg_Parse( py_origin
,"i", &origin
) )
98 PyErr_SetString( MediaControl_InternalException
,
99 "Invalid origin value" );
100 return origin_position
;
105 case 0: origin_position
= mediacontrol_AbsolutePosition
; break;
106 case 1: origin_position
= mediacontrol_RelativePosition
; break;
107 case 2: origin_position
= mediacontrol_ModuloPosition
; break;
110 return origin_position
;
113 /* Methods for transforming the Position Python object to Position structure*/
114 mediacontrol_Position
*
115 position_py_to_c( PyObject
* py_position
)
117 mediacontrol_Position
* a_position
= NULL
;
118 PyPosition
*pos
= ( PyPosition
* )py_position
;
120 a_position
= ( mediacontrol_Position
* )malloc( sizeof( mediacontrol_Position
) );
123 PyErr_SetString( PyExc_MemoryError
, "Out of memory" );
129 /* If we give a NULL value, it will be considered as
130 a 0 relative position in mediatime */
131 a_position
->origin
= mediacontrol_RelativePosition
;
132 a_position
->key
= mediacontrol_MediaTime
;
133 a_position
->value
= 0;
135 else if( PyObject_IsInstance( py_position
, ( PyObject
* )&PyPosition_Type
) )
137 a_position
->origin
= pos
->origin
;
138 a_position
->key
= pos
->key
;
139 a_position
->value
= ntohll(pos
->value
);
143 /* Feature: if we give an integer, it will be considered as
144 a relative position in mediatime */
145 a_position
->origin
= mediacontrol_RelativePosition
;
146 a_position
->key
= mediacontrol_MediaTime
;
147 a_position
->value
= PyLong_AsLongLong( py_position
);
153 position_c_to_py( mediacontrol_Position
*position
)
155 PyPosition
* py_retval
;
157 py_retval
= PyObject_New( PyPosition
, &PyPosition_Type
);
158 py_retval
->origin
= position
->origin
;
159 py_retval
->key
= position
->key
;
160 py_retval
->value
= position
->value
;
165 static PyMethodDef PyPosition_methods
[] =
167 { NULL
} /* Sentinel */
170 static PyMemberDef PyPosition_members
[] =
172 { "origin", T_INT
, offsetof( PyPosition
, origin
), 0, "Position origin" },
173 { "key", T_INT
, offsetof( PyPosition
, key
), 0, "Position key" },
174 { "value", T_ULONG
, offsetof( PyPosition
, value
), 0, "Position value" },
175 { NULL
} /* Sentinel */
178 static PyTypeObject PyPosition_Type
=
180 PyObject_HEAD_INIT( NULL
)
182 "vlc.Position", /*tp_name*/
183 sizeof( PyPosition_Type
), /*tp_basicsize*/
192 0, /*tp_as_sequence*/
200 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /*tp_flags*/
201 "Represent a Position with value, origin and key", /* tp_doc */
204 0, /* tp_richcompare */
205 0, /* tp_weaklistoffset */
208 PyPosition_methods
, /* tp_methods */
209 PyPosition_members
, /* tp_members */
213 0, /* tp_descr_get */
214 0, /* tp_descr_set */
215 0, /* tp_dictoffset */
218 PyPosition_new
, /* tp_new */