| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \section{\module{chunk} --- | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | 	 Read IFF chunked data} | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \declaremodule{standard}{chunk} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | \modulesynopsis{Module to read IFF chunks.} | 
					
						
							|  |  |  | \moduleauthor{Sjoerd Mullender}{sjoerd@acm.org} | 
					
						
							|  |  |  | \sectionauthor{Sjoerd Mullender}{sjoerd@acm.org} | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | This module provides an interface for reading files that use EA IFF 85 | 
					
						
							|  |  |  | chunks.\footnote{``EA IFF 85'' Standard for Interchange Format Files, | 
					
						
							|  |  |  | Jerry Morrison, Electronic Arts, January 1985.}  This format is used | 
					
						
							|  |  |  | in at least the Audio\index{Audio Interchange File | 
					
						
							|  |  |  | Format}\index{AIFF}\index{AIFF-C} Interchange File Format | 
					
						
							| 
									
										
										
										
											1999-08-26 15:57:44 +00:00
										 |  |  | (AIFF/AIFF-C) and the Real\index{Real Media File Format} Media File | 
					
						
							|  |  |  | Format\index{RMFF} (RMFF).  The WAVE audio file format is closely | 
					
						
							|  |  |  | related and can also be read using this module. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | A chunk has the following structure: | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{tableiii}{c|c|l}{textrm}{Offset}{Length}{Contents} | 
					
						
							|  |  |  |   \lineiii{0}{4}{Chunk ID} | 
					
						
							| 
									
										
										
										
											1999-08-26 15:57:44 +00:00
										 |  |  |   \lineiii{4}{4}{Size of chunk in big-endian byte order, not including the  | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  |                  header} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  |   \lineiii{8}{\var{n}}{Data bytes, where \var{n} is the size given in | 
					
						
							| 
									
										
										
										
											2000-07-16 19:01:10 +00:00
										 |  |  |                        the preceding field} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  |   \lineiii{8 + \var{n}}{0 or 1}{Pad byte needed if \var{n} is odd and | 
					
						
							|  |  |  |                                 chunk alignment is used} | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{tableiii} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | The ID is a 4-byte string which identifies the type of chunk. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The size field (a 32-bit value, encoded using big-endian byte order) | 
					
						
							| 
									
										
										
										
											1999-08-26 15:57:44 +00:00
										 |  |  | gives the size of the chunk data, not including the 8-byte header. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | Usually an IFF-type file consists of one or more chunks.  The proposed | 
					
						
							|  |  |  | usage of the \class{Chunk} class defined here is to instantiate an | 
					
						
							|  |  |  | instance at the start of each chunk and read from the instance until | 
					
						
							|  |  |  | it reaches the end, after which a new instance can be instantiated. | 
					
						
							|  |  |  | At the end of the file, creating a new instance will fail with a | 
					
						
							|  |  |  | \exception{EOFError} exception. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-08-26 15:57:44 +00:00
										 |  |  | \begin{classdesc}{Chunk}{file\optional{, align, bigendian, inclheader}} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | Class which represents a chunk.  The \var{file} argument is expected | 
					
						
							|  |  |  | to be a file-like object.  An instance of this class is specifically | 
					
						
							|  |  |  | allowed.  The only method that is needed is \method{read()}.  If the | 
					
						
							|  |  |  | methods \method{seek()} and \method{tell()} are present and don't | 
					
						
							|  |  |  | raise an exception, they are also used.  If these methods are present | 
					
						
							|  |  |  | and raise an exception, they are expected to not have altered the | 
					
						
							|  |  |  | object.  If the optional argument \var{align} is true, chunks are | 
					
						
							|  |  |  | assumed to be aligned on 2-byte boundaries.  If \var{align} is | 
					
						
							| 
									
										
										
										
											1999-08-26 15:57:44 +00:00
										 |  |  | false, no alignment is assumed.  The default value is true.  If the | 
					
						
							|  |  |  | optional argument \var{bigendian} is false, the chunk size is assumed | 
					
						
							|  |  |  | to be in little-endian order.  This is needed for WAVE audio files. | 
					
						
							|  |  |  | The default value is true.  If the optional argument \var{inclheader} | 
					
						
							|  |  |  | is true, the size given in the chunk header includes the size of the | 
					
						
							|  |  |  | header.  The default value is false. | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | \end{classdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A \class{Chunk} object supports the following methods: | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}{getname}{} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | Returns the name (ID) of the chunk.  This is the first 4 bytes of the | 
					
						
							|  |  |  | chunk. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-08-26 15:57:44 +00:00
										 |  |  | \begin{methoddesc}{getsize}{} | 
					
						
							|  |  |  | Returns the size of the chunk. | 
					
						
							|  |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \begin{methoddesc}{close}{} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | Close and skip to the end of the chunk.  This does not close the | 
					
						
							|  |  |  | underlying file. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | The remaining methods will raise \exception{IOError} if called after | 
					
						
							|  |  |  | the \method{close()} method has been called. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \begin{methoddesc}{isatty}{} | 
					
						
							| 
									
										
										
										
											2002-04-09 18:15:00 +00:00
										 |  |  | Returns \code{False}. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | \begin{methoddesc}{seek}{pos\optional{, whence}} | 
					
						
							|  |  |  | Set the chunk's current position.  The \var{whence} argument is | 
					
						
							|  |  |  | optional and defaults to \code{0} (absolute file positioning); other | 
					
						
							|  |  |  | values are \code{1} (seek relative to the current position) and | 
					
						
							|  |  |  | \code{2} (seek relative to the file's end).  There is no return value. | 
					
						
							|  |  |  | If the underlying file does not allow seek, only forward seeks are | 
					
						
							|  |  |  | allowed. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}{tell}{} | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | Return the current position into the chunk. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-25 17:52:17 +00:00
										 |  |  | \begin{methoddesc}{read}{\optional{size}} | 
					
						
							|  |  |  | Read at most \var{size} bytes from the chunk (less if the read hits | 
					
						
							|  |  |  | the end of the chunk before obtaining \var{size} bytes).  If the | 
					
						
							|  |  |  | \var{size} argument is negative or omitted, read all data until the | 
					
						
							|  |  |  | end of the chunk.  The bytes are returned as a string object.  An | 
					
						
							|  |  |  | empty string is returned when the end of the chunk is encountered | 
					
						
							|  |  |  | immediately. | 
					
						
							| 
									
										
										
										
											1999-06-22 18:49:20 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}{skip}{} | 
					
						
							|  |  |  | Skip to the end of the chunk.  All further calls to \method{read()} | 
					
						
							|  |  |  | for the chunk will return \code{''}.  If you are not interested in the | 
					
						
							|  |  |  | contents of the chunk, this method should be called so that the file | 
					
						
							|  |  |  | points to the start of the next chunk. | 
					
						
							|  |  |  | \end{methoddesc} |