Current Path: > > opt > alt > python312 > lib64 > > python3.12 >
Operation : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 Software : Apache Server IP : 162.0.232.56 | Your IP: 216.73.216.111 Domains : 1034 Domain(s) Permission : [ 0755 ]
Name | Type | Size | Last Modified | Actions |
---|---|---|---|---|
__pycache__ | Directory | - | - | |
asyncio | Directory | - | - | |
collections | Directory | - | - | |
concurrent | Directory | - | - | |
config-3.12-x86_64-linux-gnu | Directory | - | - | |
ctypes | Directory | - | - | |
curses | Directory | - | - | |
dbm | Directory | - | - | |
Directory | - | - | ||
encodings | Directory | - | - | |
ensurepip | Directory | - | - | |
html | Directory | - | - | |
http | Directory | - | - | |
importlib | Directory | - | - | |
json | Directory | - | - | |
lib-dynload | Directory | - | - | |
lib2to3 | Directory | - | - | |
logging | Directory | - | - | |
multiprocessing | Directory | - | - | |
pydoc_data | Directory | - | - | |
re | Directory | - | - | |
site-packages | Directory | - | - | |
sqlite3 | Directory | - | - | |
tomllib | Directory | - | - | |
unittest | Directory | - | - | |
urllib | Directory | - | - | |
venv | Directory | - | - | |
wsgiref | Directory | - | - | |
xml | Directory | - | - | |
xmlrpc | Directory | - | - | |
zipfile | Directory | - | - | |
zoneinfo | Directory | - | - | |
LICENSE.txt | File | 13936 bytes | June 03 2025 15:41:47. | |
__future__.py | File | 5218 bytes | June 23 2025 13:48:52. | |
__hello__.py | File | 227 bytes | June 23 2025 13:48:52. | |
_aix_support.py | File | 4021 bytes | June 23 2025 13:48:49. | |
_collections_abc.py | File | 32089 bytes | June 23 2025 13:48:37. | |
_compat_pickle.py | File | 8761 bytes | June 23 2025 13:48:48. | |
_compression.py | File | 5681 bytes | June 23 2025 13:48:37. | |
_markupbase.py | File | 14653 bytes | June 23 2025 13:48:37. | |
_osx_support.py | File | 22023 bytes | June 23 2025 13:48:50. | |
_py_abc.py | File | 6189 bytes | June 23 2025 13:48:51. | |
_pydatetime.py | File | 92087 bytes | June 23 2025 13:48:51. | |
_pydecimal.py | File | 227283 bytes | June 23 2025 13:48:36. | |
_pyio.py | File | 93593 bytes | June 23 2025 13:48:37. | |
_pylong.py | File | 10790 bytes | June 23 2025 13:48:37. | |
_sitebuiltins.py | File | 3128 bytes | June 23 2025 13:48:37. | |
_strptime.py | File | 28393 bytes | June 23 2025 13:48:51. | |
_sysconfigdata__linux_x86_64-linux-gnu.py | File | 76553 bytes | June 23 2025 13:58:24. | |
_sysconfigdata_d_linux_x86_64-linux-gnu.py | File | 76549 bytes | June 23 2025 13:51:17. | |
_threading_local.py | File | 7220 bytes | June 23 2025 13:48:37. | |
_weakrefset.py | File | 5893 bytes | June 23 2025 13:48:36. | |
abc.py | File | 6538 bytes | June 23 2025 13:48:37. | |
aifc.py | File | 34211 bytes | June 23 2025 13:48:51. | |
antigravity.py | File | 500 bytes | June 23 2025 13:48:37. | |
argparse.py | File | 101155 bytes | June 23 2025 13:48:49. | |
ast.py | File | 64452 bytes | June 23 2025 13:48:50. | |
base64.py | File | 20648 bytes | June 23 2025 13:48:37. | |
bdb.py | File | 33573 bytes | June 23 2025 13:48:48. | |
bisect.py | File | 3423 bytes | June 23 2025 13:48:36. | |
bz2.py | File | 11847 bytes | June 23 2025 13:48:50. | |
cProfile.py | File | 6569 bytes | June 23 2025 13:48:36. | |
calendar.py | File | 25864 bytes | June 23 2025 13:48:49. | |
cgi.py | File | 34432 bytes | June 23 2025 13:48:50. | |
cgitb.py | File | 12421 bytes | June 23 2025 13:48:52. | |
chunk.py | File | 5500 bytes | June 23 2025 13:48:37. | |
cmd.py | File | 14873 bytes | June 23 2025 13:48:36. | |
code.py | File | 10962 bytes | June 23 2025 13:48:37. | |
codecs.py | File | 36870 bytes | June 23 2025 13:48:37. | |
codeop.py | File | 5908 bytes | June 23 2025 13:48:36. | |
colorsys.py | File | 4062 bytes | June 23 2025 13:48:37. | |
compileall.py | File | 20507 bytes | June 23 2025 13:48:36. | |
configparser.py | File | 53789 bytes | June 23 2025 13:48:37. | |
contextlib.py | File | 27637 bytes | June 23 2025 13:48:36. | |
contextvars.py | File | 129 bytes | June 23 2025 13:48:48. | |
copy.py | File | 8412 bytes | June 23 2025 13:48:37. | |
copyreg.py | File | 7614 bytes | June 23 2025 13:48:50. | |
crypt.py | File | 3913 bytes | June 23 2025 13:48:37. | |
csv.py | File | 16386 bytes | June 23 2025 13:48:37. | |
dataclasses.py | File | 62085 bytes | June 23 2025 13:48:50. | |
datetime.py | File | 268 bytes | June 23 2025 13:48:52. | |
decimal.py | File | 2805 bytes | June 23 2025 13:48:49. | |
difflib.py | File | 83368 bytes | June 23 2025 13:48:37. | |
dis.py | File | 30227 bytes | June 23 2025 13:48:37. | |
doctest.py | File | 106749 bytes | June 23 2025 13:48:37. | |
enum.py | File | 81540 bytes | June 23 2025 13:48:37. | |
filecmp.py | File | 10381 bytes | June 23 2025 13:48:37. | |
fileinput.py | File | 15714 bytes | June 23 2025 13:48:37. | |
fnmatch.py | File | 5999 bytes | June 23 2025 13:48:37. | |
fractions.py | File | 38147 bytes | June 23 2025 13:48:36. | |
ftplib.py | File | 34735 bytes | June 23 2025 13:48:37. | |
functools.py | File | 37940 bytes | June 23 2025 13:48:52. | |
genericpath.py | File | 5572 bytes | June 23 2025 13:48:52. | |
getopt.py | File | 7488 bytes | June 23 2025 13:48:50. | |
getpass.py | File | 5990 bytes | June 23 2025 13:48:36. | |
gettext.py | File | 21320 bytes | June 23 2025 13:48:50. | |
glob.py | File | 8732 bytes | June 23 2025 13:48:36. | |
graphlib.py | File | 9648 bytes | June 23 2025 13:48:36. | |
gzip.py | File | 25402 bytes | June 23 2025 13:48:50. | |
hashlib.py | File | 9349 bytes | June 23 2025 13:48:51. | |
heapq.py | File | 23024 bytes | June 23 2025 13:48:36. | |
hmac.py | File | 7716 bytes | June 23 2025 13:48:37. | |
imaplib.py | File | 54040 bytes | June 23 2025 13:48:49. | |
imghdr.py | File | 4398 bytes | June 23 2025 13:48:50. | |
inspect.py | File | 127125 bytes | June 23 2025 13:48:48. | |
io.py | File | 3582 bytes | June 23 2025 13:48:37. | |
ipaddress.py | File | 81414 bytes | June 23 2025 13:48:49. | |
keyword.py | File | 1073 bytes | June 23 2025 13:48:50. | |
linecache.py | File | 5800 bytes | June 23 2025 13:48:37. | |
locale.py | File | 78599 bytes | June 23 2025 13:48:48. | |
lzma.py | File | 13277 bytes | June 23 2025 13:48:51. | |
mailbox.py | File | 78911 bytes | June 23 2025 13:48:48. | |
mailcap.py | File | 9333 bytes | June 23 2025 13:48:36. | |
mimetypes.py | File | 23037 bytes | June 23 2025 13:48:48. | |
modulefinder.py | File | 23699 bytes | June 23 2025 13:48:37. | |
netrc.py | File | 6922 bytes | June 23 2025 13:48:37. | |
nntplib.py | File | 41087 bytes | June 23 2025 13:48:36. | |
ntpath.py | File | 32324 bytes | June 23 2025 13:48:36. | |
nturl2path.py | File | 2374 bytes | June 23 2025 13:48:50. | |
numbers.py | File | 11467 bytes | June 23 2025 13:48:51. | |
opcode.py | File | 13174 bytes | June 23 2025 13:48:52. | |
operator.py | File | 10965 bytes | June 23 2025 13:48:48. | |
optparse.py | File | 60369 bytes | June 23 2025 13:48:50. | |
os.py | File | 40821 bytes | June 23 2025 13:48:36. | |
pathlib.py | File | 51052 bytes | June 23 2025 13:48:49. | |
pdb.py | File | 70311 bytes | June 23 2025 13:48:37. | |
pickle.py | File | 66911 bytes | June 23 2025 13:48:37. | |
pickletools.py | File | 94052 bytes | June 23 2025 13:48:37. | |
pipes.py | File | 8978 bytes | June 23 2025 13:48:50. | |
pkgutil.py | File | 18281 bytes | June 23 2025 13:48:37. | |
platform.py | File | 43402 bytes | June 23 2025 13:48:37. | |
plistlib.py | File | 28342 bytes | June 23 2025 13:48:36. | |
poplib.py | File | 14619 bytes | June 23 2025 13:48:36. | |
posixpath.py | File | 17483 bytes | June 23 2025 13:48:37. | |
pprint.py | File | 24158 bytes | June 23 2025 13:48:37. | |
profile.py | File | 23106 bytes | June 23 2025 13:48:37. | |
pstats.py | File | 29289 bytes | June 23 2025 13:48:37. | |
pty.py | File | 6137 bytes | June 23 2025 13:48:36. | |
py_compile.py | File | 7837 bytes | June 23 2025 13:48:49. | |
pyclbr.py | File | 11396 bytes | June 23 2025 13:48:36. | |
pydoc.py | File | 113522 bytes | June 23 2025 13:48:37. | |
queue.py | File | 11496 bytes | June 23 2025 13:48:50. | |
quopri.py | File | 7197 bytes | June 23 2025 13:48:50. | |
random.py | File | 34689 bytes | June 23 2025 13:48:36. | |
reprlib.py | File | 7148 bytes | June 23 2025 13:48:37. | |
rlcompleter.py | File | 7827 bytes | June 23 2025 13:48:52. | |
runpy.py | File | 12885 bytes | June 23 2025 13:48:36. | |
sched.py | File | 6351 bytes | June 23 2025 13:48:49. | |
secrets.py | File | 1984 bytes | June 23 2025 13:48:37. | |
selectors.py | File | 19671 bytes | June 23 2025 13:48:37. | |
shelve.py | File | 8560 bytes | June 23 2025 13:48:49. | |
shlex.py | File | 13353 bytes | June 23 2025 13:48:51. | |
shutil.py | File | 56762 bytes | June 23 2025 13:48:49. | |
signal.py | File | 2495 bytes | June 23 2025 13:48:49. | |
site.py | File | 23198 bytes | June 23 2025 13:48:48. | |
smtplib.py | File | 43545 bytes | June 23 2025 13:48:37. | |
sndhdr.py | File | 7448 bytes | June 23 2025 13:48:50. | |
socket.py | File | 37815 bytes | June 23 2025 13:48:51. | |
socketserver.py | File | 28065 bytes | June 23 2025 13:48:52. | |
sre_compile.py | File | 231 bytes | June 23 2025 13:48:37. | |
sre_constants.py | File | 232 bytes | June 23 2025 13:48:36. | |
sre_parse.py | File | 229 bytes | June 23 2025 13:48:37. | |
ssl.py | File | 50904 bytes | June 23 2025 13:48:48. | |
stat.py | File | 5485 bytes | June 23 2025 13:48:49. | |
statistics.py | File | 50227 bytes | June 23 2025 13:48:37. | |
string.py | File | 11786 bytes | June 23 2025 13:48:50. | |
stringprep.py | File | 12917 bytes | June 23 2025 13:48:37. | |
struct.py | File | 257 bytes | June 23 2025 13:48:37. | |
subprocess.py | File | 88747 bytes | June 23 2025 13:48:36. | |
sunau.py | File | 18478 bytes | June 23 2025 13:48:37. | |
symtable.py | File | 12477 bytes | June 23 2025 13:48:50. | |
sysconfig.py | File | 31850 bytes | June 23 2025 13:48:49. | |
tabnanny.py | File | 11545 bytes | June 23 2025 13:48:50. | |
tarfile.py | File | 112458 bytes | June 23 2025 13:48:37. | |
telnetlib.py | File | 23334 bytes | June 23 2025 13:48:37. | |
tempfile.py | File | 32386 bytes | June 23 2025 13:48:36. | |
textwrap.py | File | 19718 bytes | June 23 2025 13:48:36. | |
this.py | File | 1003 bytes | June 23 2025 13:48:37. | |
threading.py | File | 60200 bytes | June 23 2025 13:48:49. | |
timeit.py | File | 13477 bytes | June 23 2025 13:48:37. | |
token.py | File | 2511 bytes | June 23 2025 13:48:36. | |
tokenize.py | File | 21570 bytes | June 23 2025 13:48:49. | |
trace.py | File | 29366 bytes | June 23 2025 13:48:36. | |
traceback.py | File | 46393 bytes | June 23 2025 13:48:49. | |
tracemalloc.py | File | 18047 bytes | June 23 2025 13:48:50. | |
tty.py | File | 2035 bytes | June 23 2025 13:48:36. | |
types.py | File | 10993 bytes | June 23 2025 13:48:36. | |
typing.py | File | 118836 bytes | June 23 2025 13:48:50. | |
uu.py | File | 7341 bytes | June 23 2025 13:59:33. | |
uuid.py | File | 29656 bytes | June 23 2025 13:48:37. | |
warnings.py | File | 21909 bytes | June 23 2025 13:48:37. | |
wave.py | File | 22769 bytes | June 23 2025 13:48:37. | |
weakref.py | File | 21513 bytes | June 23 2025 13:48:49. | |
webbrowser.py | File | 23746 bytes | June 23 2025 13:48:50. | |
xdrlib.py | File | 5942 bytes | June 23 2025 13:48:52. | |
zipapp.py | File | 7543 bytes | June 23 2025 13:48:37. | |
zipimport.py | File | 27840 bytes | June 23 2025 13:48:49. |
"""Stuff to parse WAVE files. Usage. Reading WAVE files: f = wave.open(file, 'r') where file is either the name of a file or an open file pointer. The open file pointer must have methods read(), seek(), and close(). When the setpos() and rewind() methods are not used, the seek() method is not necessary. This returns an instance of a class with the following public methods: getnchannels() -- returns number of audio channels (1 for mono, 2 for stereo) getsampwidth() -- returns sample width in bytes getframerate() -- returns sampling frequency getnframes() -- returns number of audio frames getcomptype() -- returns compression type ('NONE' for linear samples) getcompname() -- returns human-readable version of compression type ('not compressed' linear samples) getparams() -- returns a namedtuple consisting of all of the above in the above order getmarkers() -- returns None (for compatibility with the aifc module) getmark(id) -- raises an error since the mark does not exist (for compatibility with the aifc module) readframes(n) -- returns at most n frames of audio rewind() -- rewind to the beginning of the audio stream setpos(pos) -- seek to the specified position tell() -- return the current position close() -- close the instance (make it unusable) The position returned by tell() and the position given to setpos() are compatible and have nothing to do with the actual position in the file. The close() method is called automatically when the class instance is destroyed. Writing WAVE files: f = wave.open(file, 'w') where file is either the name of a file or an open file pointer. The open file pointer must have methods write(), tell(), seek(), and close(). This returns an instance of a class with the following public methods: setnchannels(n) -- set the number of channels setsampwidth(n) -- set the sample width setframerate(n) -- set the frame rate setnframes(n) -- set the number of frames setcomptype(type, name) -- set the compression type and the human-readable compression type setparams(tuple) -- set all parameters at once tell() -- return current position in output file writeframesraw(data) -- write audio frames without patching up the file header writeframes(data) -- write audio frames and patch up the file header close() -- patch up the file header and close the output file You should set the parameters before the first writeframesraw or writeframes. The total number of frames does not need to be set, but when it is set to the correct value, the header does not have to be patched up. It is best to first set all parameters, perhaps possibly the compression type, and then write audio frames using writeframesraw. When all frames have been written, either call writeframes(b'') or close() to patch up the sizes in the header. The close() method is called automatically when the class instance is destroyed. """ from collections import namedtuple import builtins import struct import sys __all__ = ["open", "Error", "Wave_read", "Wave_write"] class Error(Exception): pass WAVE_FORMAT_PCM = 0x0001 WAVE_FORMAT_EXTENSIBLE = 0xFFFE # Derived from uuid.UUID("00000001-0000-0010-8000-00aa00389b71").bytes_le KSDATAFORMAT_SUBTYPE_PCM = b'\x01\x00\x00\x00\x00\x00\x10\x00\x80\x00\x00\xaa\x008\x9bq' _array_fmts = None, 'b', 'h', None, 'i' _wave_params = namedtuple('_wave_params', 'nchannels sampwidth framerate nframes comptype compname') def _byteswap(data, width): swapped_data = bytearray(len(data)) for i in range(0, len(data), width): for j in range(width): swapped_data[i + width - 1 - j] = data[i + j] return bytes(swapped_data) class _Chunk: def __init__(self, file, align=True, bigendian=True, inclheader=False): self.closed = False self.align = align # whether to align to word (2-byte) boundaries if bigendian: strflag = '>' else: strflag = '<' self.file = file self.chunkname = file.read(4) if len(self.chunkname) < 4: raise EOFError try: self.chunksize = struct.unpack_from(strflag+'L', file.read(4))[0] except struct.error: raise EOFError from None if inclheader: self.chunksize = self.chunksize - 8 # subtract header self.size_read = 0 try: self.offset = self.file.tell() except (AttributeError, OSError): self.seekable = False else: self.seekable = True def getname(self): """Return the name (ID) of the current chunk.""" return self.chunkname def close(self): if not self.closed: try: self.skip() finally: self.closed = True def seek(self, pos, whence=0): """Seek to specified position into the chunk. Default position is 0 (start of chunk). If the file is not seekable, this will result in an error. """ if self.closed: raise ValueError("I/O operation on closed file") if not self.seekable: raise OSError("cannot seek") if whence == 1: pos = pos + self.size_read elif whence == 2: pos = pos + self.chunksize if pos < 0 or pos > self.chunksize: raise RuntimeError self.file.seek(self.offset + pos, 0) self.size_read = pos def tell(self): if self.closed: raise ValueError("I/O operation on closed file") return self.size_read def read(self, size=-1): """Read at most size bytes from the chunk. If size is omitted or negative, read until the end of the chunk. """ if self.closed: raise ValueError("I/O operation on closed file") if self.size_read >= self.chunksize: return b'' if size < 0: size = self.chunksize - self.size_read if size > self.chunksize - self.size_read: size = self.chunksize - self.size_read data = self.file.read(size) self.size_read = self.size_read + len(data) if self.size_read == self.chunksize and \ self.align and \ (self.chunksize & 1): dummy = self.file.read(1) self.size_read = self.size_read + len(dummy) return data def skip(self): """Skip the rest of the chunk. 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. """ if self.closed: raise ValueError("I/O operation on closed file") if self.seekable: try: n = self.chunksize - self.size_read # maybe fix alignment if self.align and (self.chunksize & 1): n = n + 1 self.file.seek(n, 1) self.size_read = self.size_read + n return except OSError: pass while self.size_read < self.chunksize: n = min(8192, self.chunksize - self.size_read) dummy = self.read(n) if not dummy: raise EOFError class Wave_read: """Variables used in this class: These variables are available to the user though appropriate methods of this class: _file -- the open file with methods read(), close(), and seek() set through the __init__() method _nchannels -- the number of audio channels available through the getnchannels() method _nframes -- the number of audio frames available through the getnframes() method _sampwidth -- the number of bytes per audio sample available through the getsampwidth() method _framerate -- the sampling frequency available through the getframerate() method _comptype -- the AIFF-C compression type ('NONE' if AIFF) available through the getcomptype() method _compname -- the human-readable AIFF-C compression type available through the getcomptype() method _soundpos -- the position in the audio stream available through the tell() method, set through the setpos() method These variables are used internally only: _fmt_chunk_read -- 1 iff the FMT chunk has been read _data_seek_needed -- 1 iff positioned correctly in audio file for readframes() _data_chunk -- instantiation of a chunk class for the DATA chunk _framesize -- size of one frame in the file """ def initfp(self, file): self._convert = None self._soundpos = 0 self._file = _Chunk(file, bigendian = 0) if self._file.getname() != b'RIFF': raise Error('file does not start with RIFF id') if self._file.read(4) != b'WAVE': raise Error('not a WAVE file') self._fmt_chunk_read = 0 self._data_chunk = None while 1: self._data_seek_needed = 1 try: chunk = _Chunk(self._file, bigendian = 0) except EOFError: break chunkname = chunk.getname() if chunkname == b'fmt ': self._read_fmt_chunk(chunk) self._fmt_chunk_read = 1 elif chunkname == b'data': if not self._fmt_chunk_read: raise Error('data chunk before fmt chunk') self._data_chunk = chunk self._nframes = chunk.chunksize // self._framesize self._data_seek_needed = 0 break chunk.skip() if not self._fmt_chunk_read or not self._data_chunk: raise Error('fmt chunk and/or data chunk missing') def __init__(self, f): self._i_opened_the_file = None if isinstance(f, str): f = builtins.open(f, 'rb') self._i_opened_the_file = f # else, assume it is an open file object already try: self.initfp(f) except: if self._i_opened_the_file: f.close() raise def __del__(self): self.close() def __enter__(self): return self def __exit__(self, *args): self.close() # # User visible methods. # def getfp(self): return self._file def rewind(self): self._data_seek_needed = 1 self._soundpos = 0 def close(self): self._file = None file = self._i_opened_the_file if file: self._i_opened_the_file = None file.close() def tell(self): return self._soundpos def getnchannels(self): return self._nchannels def getnframes(self): return self._nframes def getsampwidth(self): return self._sampwidth def getframerate(self): return self._framerate def getcomptype(self): return self._comptype def getcompname(self): return self._compname def getparams(self): return _wave_params(self.getnchannels(), self.getsampwidth(), self.getframerate(), self.getnframes(), self.getcomptype(), self.getcompname()) def getmarkers(self): return None def getmark(self, id): raise Error('no marks') def setpos(self, pos): if pos < 0 or pos > self._nframes: raise Error('position not in range') self._soundpos = pos self._data_seek_needed = 1 def readframes(self, nframes): if self._data_seek_needed: self._data_chunk.seek(0, 0) pos = self._soundpos * self._framesize if pos: self._data_chunk.seek(pos, 0) self._data_seek_needed = 0 if nframes == 0: return b'' data = self._data_chunk.read(nframes * self._framesize) if self._sampwidth != 1 and sys.byteorder == 'big': data = _byteswap(data, self._sampwidth) if self._convert and data: data = self._convert(data) self._soundpos = self._soundpos + len(data) // (self._nchannels * self._sampwidth) return data # # Internal methods. # def _read_fmt_chunk(self, chunk): try: wFormatTag, self._nchannels, self._framerate, dwAvgBytesPerSec, wBlockAlign = struct.unpack_from('<HHLLH', chunk.read(14)) except struct.error: raise EOFError from None if wFormatTag != WAVE_FORMAT_PCM and wFormatTag != WAVE_FORMAT_EXTENSIBLE: raise Error('unknown format: %r' % (wFormatTag,)) try: sampwidth = struct.unpack_from('<H', chunk.read(2))[0] except struct.error: raise EOFError from None if wFormatTag == WAVE_FORMAT_EXTENSIBLE: try: cbSize, wValidBitsPerSample, dwChannelMask = struct.unpack_from('<HHL', chunk.read(8)) # Read the entire UUID from the chunk SubFormat = chunk.read(16) if len(SubFormat) < 16: raise EOFError except struct.error: raise EOFError from None if SubFormat != KSDATAFORMAT_SUBTYPE_PCM: try: import uuid subformat_msg = f'unknown extended format: {uuid.UUID(bytes_le=SubFormat)}' except Exception: subformat_msg = 'unknown extended format' raise Error(subformat_msg) self._sampwidth = (sampwidth + 7) // 8 if not self._sampwidth: raise Error('bad sample width') if not self._nchannels: raise Error('bad # of channels') self._framesize = self._nchannels * self._sampwidth self._comptype = 'NONE' self._compname = 'not compressed' class Wave_write: """Variables used in this class: These variables are user settable through appropriate methods of this class: _file -- the open file with methods write(), close(), tell(), seek() set through the __init__() method _comptype -- the AIFF-C compression type ('NONE' in AIFF) set through the setcomptype() or setparams() method _compname -- the human-readable AIFF-C compression type set through the setcomptype() or setparams() method _nchannels -- the number of audio channels set through the setnchannels() or setparams() method _sampwidth -- the number of bytes per audio sample set through the setsampwidth() or setparams() method _framerate -- the sampling frequency set through the setframerate() or setparams() method _nframes -- the number of audio frames written to the header set through the setnframes() or setparams() method These variables are used internally only: _datalength -- the size of the audio samples written to the header _nframeswritten -- the number of frames actually written _datawritten -- the size of the audio samples actually written """ def __init__(self, f): self._i_opened_the_file = None if isinstance(f, str): f = builtins.open(f, 'wb') self._i_opened_the_file = f try: self.initfp(f) except: if self._i_opened_the_file: f.close() raise def initfp(self, file): self._file = file self._convert = None self._nchannels = 0 self._sampwidth = 0 self._framerate = 0 self._nframes = 0 self._nframeswritten = 0 self._datawritten = 0 self._datalength = 0 self._headerwritten = False def __del__(self): self.close() def __enter__(self): return self def __exit__(self, *args): self.close() # # User visible methods. # def setnchannels(self, nchannels): if self._datawritten: raise Error('cannot change parameters after starting to write') if nchannels < 1: raise Error('bad # of channels') self._nchannels = nchannels def getnchannels(self): if not self._nchannels: raise Error('number of channels not set') return self._nchannels def setsampwidth(self, sampwidth): if self._datawritten: raise Error('cannot change parameters after starting to write') if sampwidth < 1 or sampwidth > 4: raise Error('bad sample width') self._sampwidth = sampwidth def getsampwidth(self): if not self._sampwidth: raise Error('sample width not set') return self._sampwidth def setframerate(self, framerate): if self._datawritten: raise Error('cannot change parameters after starting to write') if framerate <= 0: raise Error('bad frame rate') self._framerate = int(round(framerate)) def getframerate(self): if not self._framerate: raise Error('frame rate not set') return self._framerate def setnframes(self, nframes): if self._datawritten: raise Error('cannot change parameters after starting to write') self._nframes = nframes def getnframes(self): return self._nframeswritten def setcomptype(self, comptype, compname): if self._datawritten: raise Error('cannot change parameters after starting to write') if comptype not in ('NONE',): raise Error('unsupported compression type') self._comptype = comptype self._compname = compname def getcomptype(self): return self._comptype def getcompname(self): return self._compname def setparams(self, params): nchannels, sampwidth, framerate, nframes, comptype, compname = params if self._datawritten: raise Error('cannot change parameters after starting to write') self.setnchannels(nchannels) self.setsampwidth(sampwidth) self.setframerate(framerate) self.setnframes(nframes) self.setcomptype(comptype, compname) def getparams(self): if not self._nchannels or not self._sampwidth or not self._framerate: raise Error('not all parameters set') return _wave_params(self._nchannels, self._sampwidth, self._framerate, self._nframes, self._comptype, self._compname) def setmark(self, id, pos, name): raise Error('setmark() not supported') def getmark(self, id): raise Error('no marks') def getmarkers(self): return None def tell(self): return self._nframeswritten def writeframesraw(self, data): if not isinstance(data, (bytes, bytearray)): data = memoryview(data).cast('B') self._ensure_header_written(len(data)) nframes = len(data) // (self._sampwidth * self._nchannels) if self._convert: data = self._convert(data) if self._sampwidth != 1 and sys.byteorder == 'big': data = _byteswap(data, self._sampwidth) self._file.write(data) self._datawritten += len(data) self._nframeswritten = self._nframeswritten + nframes def writeframes(self, data): self.writeframesraw(data) if self._datalength != self._datawritten: self._patchheader() def close(self): try: if self._file: self._ensure_header_written(0) if self._datalength != self._datawritten: self._patchheader() self._file.flush() finally: self._file = None file = self._i_opened_the_file if file: self._i_opened_the_file = None file.close() # # Internal methods. # def _ensure_header_written(self, datasize): if not self._headerwritten: if not self._nchannels: raise Error('# channels not specified') if not self._sampwidth: raise Error('sample width not specified') if not self._framerate: raise Error('sampling rate not specified') self._write_header(datasize) def _write_header(self, initlength): assert not self._headerwritten self._file.write(b'RIFF') if not self._nframes: self._nframes = initlength // (self._nchannels * self._sampwidth) self._datalength = self._nframes * self._nchannels * self._sampwidth try: self._form_length_pos = self._file.tell() except (AttributeError, OSError): self._form_length_pos = None self._file.write(struct.pack('<L4s4sLHHLLHH4s', 36 + self._datalength, b'WAVE', b'fmt ', 16, WAVE_FORMAT_PCM, self._nchannels, self._framerate, self._nchannels * self._framerate * self._sampwidth, self._nchannels * self._sampwidth, self._sampwidth * 8, b'data')) if self._form_length_pos is not None: self._data_length_pos = self._file.tell() self._file.write(struct.pack('<L', self._datalength)) self._headerwritten = True def _patchheader(self): assert self._headerwritten if self._datawritten == self._datalength: return curpos = self._file.tell() self._file.seek(self._form_length_pos, 0) self._file.write(struct.pack('<L', 36 + self._datawritten)) self._file.seek(self._data_length_pos, 0) self._file.write(struct.pack('<L', self._datawritten)) self._file.seek(curpos, 0) self._datalength = self._datawritten def open(f, mode=None): if mode is None: if hasattr(f, 'mode'): mode = f.mode else: mode = 'rb' if mode in ('r', 'rb'): return Wave_read(f) elif mode in ('w', 'wb'): return Wave_write(f) else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'")
SILENT KILLER Tool