Author: ArcRiley
Date: 2007-07-07 01:17:33 -0400 (Sat, 07 Jul 2007)
New Revision: 395

Modified:
   trunk/pysoy/src/transports/Transport.pxi
   trunk/pysoy/src/transports/soy.transports.pxd
   trunk/pysoy/tests/vid_canvas.py
Log:
Ticket #263 - we seem to be demuxing Ogg now


Modified: trunk/pysoy/src/transports/Transport.pxi
===================================================================
--- trunk/pysoy/src/transports/Transport.pxi    2007-07-07 03:07:00 UTC (rev 
394)
+++ trunk/pysoy/src/transports/Transport.pxi    2007-07-07 05:17:33 UTC (rev 
395)
@@ -27,8 +27,9 @@
   def __init__(self, path, *args, **keywords) :
     cdef char _magic[4]
     cdef soy._internals.Children _transports
-    self._objs = {}
-    self._snos = {}
+    self._objs = <Stored *> py.PyMem_Malloc(sizeof(Stored) * 4)
+    self._mobj = 4
+    self._dict = {}
     if self._open(path) : 
       if self._read(_magic,4) == 0 :
         self._vers = -1
@@ -37,6 +38,7 @@
           self._headOgg()
         #elif _magic == 'Soy0' :
         else :
+          self._vers = -10
           raise TypeError('unsupported file type')
     
     # Yes, this is a level 5 sin.
@@ -48,13 +50,57 @@
     _transports.unlock()
 
 
+  def __dealloc__(self) :
+    cdef soy._internals.Children _transports
+    if self._vers > -10 :
+      _transports = <soy._internals.Children> \
+                    py.PyCObject_AsVoidPtr(__import__('soy._core', [], [], 
+                               ['_Transports']).__dict__['_Transports']())
+      _transports.lock()
+      _transports.remove(<void *> self)
+      _transports.unlock()
+    py.PyMem_Free(self._objs)
+
+
   # This is called by _coreLoop()
   cdef void _process(self) :
     if self._mode == 1 :
       if self._vers == 0 :
-        self._loadOgg()     
+        self._loadOgg()
 
 
+  cdef int _initObjt(self, int _serialno, object _name, object _object) :
+    cdef int i
+    if self._mobj <= self._nobj :
+      self._mobj = self._mobj + 4
+      self._objs = <Stored *> py.PyMem_Realloc(self._objs, 
+                                               sizeof(Stored) * self._mobj)
+    self._objs[self._nobj].serialno = _serialno
+    for i from 0 <= i < len(_name) :
+      self._objs[self._nobj].name[i] = ord(_name[i])
+    self._objs[self._nobj].namelen = len(_name)
+    self._objs[self._nobj].object  = <void *> _object
+    self._dict[_name] = _object        
+    self._nobj = self._nobj + 1
+    return self._nobj-1
+
+  cdef int _findName(self, char *_name, unsigned char _namelen) :
+    cdef int i
+    for i from 0 <= i < self._nobj :
+      if _namelen == self._objs[i].namelen and \
+         _name[:_namelen] == self._objs[i].name[:_namelen] :
+        return i
+    return -1
+
+
+  cdef int _findSrno(self, int _serialno) :
+    cdef int i
+    for i from 0 <= i < self._nobj :
+      if _serialno == self._objs[i].serialno :
+        return i
+    return -1
+
+
   ############################################################################
   # Transport-specific functions
   #
@@ -94,7 +140,7 @@
   # Ogg functions
   #
   cdef void _headOgg(self) :
-    cdef int _sn
+    cdef int i, _sn
     cdef unsigned int m
     cdef char *_magic
     cdef ogg.ogg_page         _page
@@ -110,7 +156,9 @@
     ogg.ogg_sync_wrote(&self._sync, 4)
     while self._readOggPage(&_page) :
       if not ogg.ogg_page_bos(&_page) :
-        (<soy._internals.Loadable> self._objs['video'])._load(&_page)
+        i = self._findSrno(ogg.ogg_page_serialno(&_page))
+        if i >= 0 :
+          (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
         break
       _sn = ogg.ogg_page_serialno(&_page)
       ogg.ogg_stream_init(&_testStream, _sn)
@@ -118,10 +166,9 @@
       ogg.ogg_stream_packetout(&_testStream, &_packet)
       ogg.oggpackB_readinit(&_buffer, _packet.packet, _packet.bytes)
       m = ogg.oggpackB_read(&_buffer, 32)
-      if m == 2155112549L and not self._objs.has_key('video') :
-        self._objs['video'] = soy.textures.Video()
-        self._snos[_sn] = 'video'
-        (<soy._internals.Loadable> self._objs['video'])._load(&_page)
+      if m == 2155112549L :
+        i = self._initObjt(_sn, 'video', soy.textures.Video())
+        (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
       # 24538994 = vorbis
       # 7828073 = writ
       # 1399874917L = speex
@@ -132,22 +179,23 @@
       if not self._readOggPage(&_page) :
         break
       _sn = ogg.ogg_page_serialno(&_page)
-      if self._snos.has_key(_sn) :
-        (<soy._internals.Loadable> self._objs[self._snos[_sn]])._load(&_page)
+      i = self._findSrno(_sn)
+      if i >= 0 :
+        (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
     self._vers = 0 # Ogg
     self._mode = 1 # Loading
 
 
   cdef void _loadOgg(self) :
-    cdef int _sn
-    cdef ogg.ogg_page         _page
+    cdef int i, _sn
+    cdef ogg.ogg_page _page
     if self._readOggPage(&_page) :
       _sn = ogg.ogg_page_serialno(&_page)
-      stdio.printf('processed %d:%d\n', _sn, ogg.ogg_page_pageno(&_page))
-      if self._snos.has_key(_sn) :
-        (<soy._internals.Loadable> self._objs[self._snos[_sn]])._load(&_page)
+      i = self._findSrno(_sn)
+      if i >= 0 :
+        (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
+        
 
-
   cdef int _readOggPage(self, ogg.ogg_page *_oggPage) :
     cdef char *_buffer
     cdef int   _bytes
@@ -180,16 +228,16 @@
   # Python methods
   #
   def __getitem__(self, key) :
-    return self._objs[key]
+    return self._dict[key]
 
 
   def __repr__(self) :
-    return self._objs.__repr__()
+    return self._dict.__repr__()
 
 
   def __str__(self) :
-    return self._objs.__str__()
+    return self._dict.__str__()
 
 
   def __len__(self) :
-    return self._objs.__len__()
+    return self._dict.__len__()

Modified: trunk/pysoy/src/transports/soy.transports.pxd
===================================================================
--- trunk/pysoy/src/transports/soy.transports.pxd       2007-07-07 03:07:00 UTC 
(rev 394)
+++ trunk/pysoy/src/transports/soy.transports.pxd       2007-07-07 05:17:33 UTC 
(rev 395)
@@ -22,15 +22,28 @@
 cimport stdio
 cimport soy._internals
 
+
+cdef struct Stored :
+  int            serialno
+  char           name[256]
+  unsigned char  namelen
+  void          *object
+
+
 cdef class Transport :
-  cdef object                  _objs      # OBJectS
-  cdef object                  _snos
-  cdef int                     _vers      # -1 = empty, 0 = ogg, 1 = soy
+  cdef Stored                 *_objs
+  cdef object                  _dict
+  cdef int                     _mobj
+  cdef int                     _nobj
+  cdef int                     _vers      # <-9=error, -1=empty, 0=ogg, >0=soy
   cdef int                     _mode      # 0 = idle, 1 = load, 2 = save
   cdef ogg.ogg_sync_state      _sync
   #
   # General Functions
   cdef void  _process(self)
+  cdef int   _initObjt(self, int, object, object)
+  cdef int   _findName(self, char*, unsigned char)
+  cdef int   _findSrno(self, int)
   #
   # Transport-specific functions
   cdef int   _open  (self, path)

Modified: trunk/pysoy/tests/vid_canvas.py
===================================================================
--- trunk/pysoy/tests/vid_canvas.py     2007-07-07 03:07:00 UTC (rev 394)
+++ trunk/pysoy/tests/vid_canvas.py     2007-07-07 05:17:33 UTC (rev 395)
@@ -3,7 +3,8 @@
 import soy
 from time import sleep
 
-vid = soy.transports.File('changeworld.ogg')['video']
+ogg = soy.transports.File('changeworld.ogg')
+vid = ogg['video']
 
 scr = soy.Screen()
 win = soy.Window(scr, 'Video Canvas')

_______________________________________________
PySoy-SVN mailing list
[email protected]
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to