Current Path: > > opt > alt > > python313 > lib64 > python3.13 > >
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 | - | - | |
_pyrepl | Directory | - | - | |
asyncio | Directory | - | - | |
collections | Directory | - | - | |
concurrent | Directory | - | - | |
config-3.13-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 | - | - | |
logging | Directory | - | - | |
multiprocessing | Directory | - | - | |
pathlib | Directory | - | - | |
pydoc_data | Directory | - | - | |
re | Directory | - | - | |
site-packages | Directory | - | - | |
sqlite3 | Directory | - | - | |
sysconfig | Directory | - | - | |
tomllib | Directory | - | - | |
unittest | Directory | - | - | |
urllib | Directory | - | - | |
venv | Directory | - | - | |
wsgiref | Directory | - | - | |
xml | Directory | - | - | |
xmlrpc | Directory | - | - | |
zipfile | Directory | - | - | |
zoneinfo | Directory | - | - | |
LICENSE.txt | File | 13809 bytes | June 11 2025 15:36:57. | |
__future__.py | File | 5218 bytes | June 23 2025 14:28:17. | |
__hello__.py | File | 227 bytes | June 23 2025 14:28:17. | |
_aix_support.py | File | 4021 bytes | June 23 2025 14:28:16. | |
_android_support.py | File | 6895 bytes | June 23 2025 14:28:03. | |
_apple_support.py | File | 2256 bytes | June 23 2025 14:28:16. | |
_collections_abc.py | File | 32264 bytes | June 23 2025 14:28:03. | |
_colorize.py | File | 2848 bytes | June 23 2025 14:28:03. | |
_compat_pickle.py | File | 8735 bytes | June 23 2025 14:28:15. | |
_compression.py | File | 5681 bytes | June 23 2025 14:28:03. | |
_ios_support.py | File | 2672 bytes | June 23 2025 14:28:16. | |
_markupbase.py | File | 14653 bytes | June 23 2025 14:28:03. | |
_opcode_metadata.py | File | 9265 bytes | June 23 2025 14:28:16. | |
_osx_support.py | File | 22023 bytes | June 23 2025 14:28:16. | |
_py_abc.py | File | 6189 bytes | June 23 2025 14:28:16. | |
_pydatetime.py | File | 91990 bytes | June 23 2025 14:28:17. | |
_pydecimal.py | File | 227283 bytes | June 23 2025 14:28:02. | |
_pyio.py | File | 93693 bytes | June 23 2025 14:28:04. | |
_pylong.py | File | 11830 bytes | June 23 2025 14:28:03. | |
_sitebuiltins.py | File | 3128 bytes | June 23 2025 14:28:03. | |
_strptime.py | File | 29383 bytes | June 23 2025 14:28:16. | |
_sysconfigdata__linux_x86_64-linux-gnu.py | File | 67303 bytes | June 23 2025 14:37:34. | |
_sysconfigdata_d_linux_x86_64-linux-gnu.py | File | 67285 bytes | June 23 2025 14:31:05. | |
_threading_local.py | File | 4363 bytes | June 23 2025 14:28:03. | |
_weakrefset.py | File | 5893 bytes | June 23 2025 14:28:03. | |
abc.py | File | 6538 bytes | June 23 2025 14:28:03. | |
antigravity.py | File | 500 bytes | June 23 2025 14:28:03. | |
argparse.py | File | 101661 bytes | June 23 2025 14:28:16. | |
ast.py | File | 65339 bytes | June 23 2025 14:28:16. | |
base64.py | File | 21643 bytes | June 23 2025 14:28:03. | |
bdb.py | File | 35343 bytes | June 23 2025 14:28:15. | |
bisect.py | File | 3423 bytes | June 23 2025 14:28:02. | |
bz2.py | File | 11969 bytes | June 23 2025 14:28:16. | |
cProfile.py | File | 6637 bytes | June 23 2025 14:28:02. | |
calendar.py | File | 26077 bytes | June 23 2025 14:28:16. | |
cmd.py | File | 15316 bytes | June 23 2025 14:28:02. | |
code.py | File | 13170 bytes | June 23 2025 14:28:03. | |
codecs.py | File | 36928 bytes | June 23 2025 14:28:03. | |
codeop.py | File | 5828 bytes | June 23 2025 14:28:03. | |
colorsys.py | File | 4062 bytes | June 23 2025 14:28:03. | |
compileall.py | File | 20665 bytes | June 23 2025 14:28:03. | |
configparser.py | File | 53831 bytes | June 23 2025 14:28:03. | |
contextlib.py | File | 27801 bytes | June 23 2025 14:28:03. | |
contextvars.py | File | 129 bytes | June 23 2025 14:28:15. | |
copy.py | File | 8975 bytes | June 23 2025 14:28:03. | |
copyreg.py | File | 7614 bytes | June 23 2025 14:28:16. | |
csv.py | File | 19178 bytes | June 23 2025 14:28:03. | |
dataclasses.py | File | 64545 bytes | June 23 2025 14:28:16. | |
datetime.py | File | 268 bytes | June 23 2025 14:28:17. | |
decimal.py | File | 2798 bytes | June 23 2025 14:28:16. | |
difflib.py | File | 83368 bytes | June 23 2025 14:28:03. | |
dis.py | File | 40962 bytes | June 23 2025 14:28:03. | |
doctest.py | File | 109333 bytes | June 23 2025 14:28:03. | |
enum.py | File | 85578 bytes | June 23 2025 14:28:03. | |
filecmp.py | File | 10652 bytes | June 23 2025 14:28:03. | |
fileinput.py | File | 15717 bytes | June 23 2025 14:28:03. | |
fnmatch.py | File | 6180 bytes | June 23 2025 14:28:03. | |
fractions.py | File | 40021 bytes | June 23 2025 14:28:02. | |
ftplib.py | File | 34735 bytes | June 23 2025 14:28:03. | |
functools.py | File | 39123 bytes | June 23 2025 14:28:17. | |
genericpath.py | File | 6247 bytes | June 23 2025 14:28:17. | |
getopt.py | File | 7488 bytes | June 23 2025 14:28:16. | |
getpass.py | File | 6233 bytes | June 23 2025 14:28:02. | |
gettext.py | File | 21534 bytes | June 23 2025 14:28:16. | |
glob.py | File | 19720 bytes | June 23 2025 14:28:03. | |
graphlib.py | File | 9648 bytes | June 23 2025 14:28:02. | |
gzip.py | File | 24633 bytes | June 23 2025 14:28:16. | |
hashlib.py | File | 9446 bytes | June 23 2025 14:28:17. | |
heapq.py | File | 23024 bytes | June 23 2025 14:28:02. | |
hmac.py | File | 7716 bytes | June 23 2025 14:28:04. | |
imaplib.py | File | 54040 bytes | June 23 2025 14:28:16. | |
inspect.py | File | 128276 bytes | June 23 2025 14:28:15. | |
io.py | File | 3582 bytes | June 23 2025 14:28:03. | |
ipaddress.py | File | 81635 bytes | June 23 2025 14:28:16. | |
keyword.py | File | 1073 bytes | June 23 2025 14:28:16. | |
linecache.py | File | 7284 bytes | June 23 2025 14:28:03. | |
locale.py | File | 79033 bytes | June 23 2025 14:28:15. | |
lzma.py | File | 13399 bytes | June 23 2025 14:28:16. | |
mailbox.py | File | 81644 bytes | June 23 2025 14:28:15. | |
mimetypes.py | File | 23851 bytes | June 23 2025 14:28:15. | |
modulefinder.py | File | 23792 bytes | June 23 2025 14:28:03. | |
netrc.py | File | 6922 bytes | June 23 2025 14:28:04. | |
ntpath.py | File | 32806 bytes | June 23 2025 14:28:03. | |
nturl2path.py | File | 2374 bytes | June 23 2025 14:28:16. | |
numbers.py | File | 11467 bytes | June 23 2025 14:28:17. | |
opcode.py | File | 2825 bytes | June 23 2025 14:28:17. | |
operator.py | File | 10980 bytes | June 23 2025 14:28:15. | |
optparse.py | File | 60369 bytes | June 23 2025 14:28:16. | |
os.py | File | 41635 bytes | June 23 2025 14:28:03. | |
pdb.py | File | 90938 bytes | June 23 2025 14:28:03. | |
pickle.py | File | 66957 bytes | June 23 2025 14:28:03. | |
pickletools.py | File | 94052 bytes | June 23 2025 14:28:03. | |
pkgutil.py | File | 18281 bytes | June 23 2025 14:28:03. | |
platform.py | File | 47359 bytes | June 23 2025 14:28:03. | |
plistlib.py | File | 29794 bytes | June 23 2025 14:28:02. | |
poplib.py | File | 14604 bytes | June 23 2025 14:28:02. | |
posixpath.py | File | 18360 bytes | June 23 2025 14:28:03. | |
pprint.py | File | 24158 bytes | June 23 2025 14:28:03. | |
profile.py | File | 23153 bytes | June 23 2025 14:28:03. | |
pstats.py | File | 29296 bytes | June 23 2025 14:28:03. | |
pty.py | File | 6137 bytes | June 23 2025 14:28:02. | |
py_compile.py | File | 7837 bytes | June 23 2025 14:28:16. | |
pyclbr.py | File | 11396 bytes | June 23 2025 14:28:02. | |
pydoc.py | File | 110078 bytes | June 23 2025 14:28:03. | |
queue.py | File | 13481 bytes | June 23 2025 14:28:16. | |
quopri.py | File | 7197 bytes | June 23 2025 14:28:16. | |
random.py | File | 37006 bytes | June 23 2025 14:28:02. | |
reprlib.py | File | 7192 bytes | June 23 2025 14:28:03. | |
rlcompleter.py | File | 7918 bytes | June 23 2025 14:28:17. | |
runpy.py | File | 12885 bytes | June 23 2025 14:28:02. | |
sched.py | File | 6351 bytes | June 23 2025 14:28:16. | |
secrets.py | File | 1984 bytes | June 23 2025 14:28:04. | |
selectors.py | File | 19457 bytes | June 23 2025 14:28:03. | |
shelve.py | File | 8810 bytes | June 23 2025 14:28:16. | |
shlex.py | File | 13353 bytes | June 23 2025 14:28:17. | |
shutil.py | File | 57463 bytes | June 23 2025 14:28:16. | |
signal.py | File | 2495 bytes | June 23 2025 14:28:15. | |
site.py | File | 25568 bytes | June 23 2025 14:28:15. | |
smtplib.py | File | 43545 bytes | June 23 2025 14:28:03. | |
socket.py | File | 37759 bytes | June 23 2025 14:28:17. | |
socketserver.py | File | 28065 bytes | June 23 2025 14:28:17. | |
sre_compile.py | File | 231 bytes | June 23 2025 14:28:03. | |
sre_constants.py | File | 232 bytes | June 23 2025 14:28:03. | |
sre_parse.py | File | 229 bytes | June 23 2025 14:28:03. | |
ssl.py | File | 52706 bytes | June 23 2025 14:28:15. | |
stat.py | File | 6147 bytes | June 23 2025 14:28:16. | |
statistics.py | File | 61831 bytes | June 23 2025 14:28:03. | |
string.py | File | 11786 bytes | June 23 2025 14:28:16. | |
stringprep.py | File | 12917 bytes | June 23 2025 14:28:03. | |
struct.py | File | 257 bytes | June 23 2025 14:28:03. | |
subprocess.py | File | 89486 bytes | June 23 2025 14:28:02. | |
symtable.py | File | 14207 bytes | June 23 2025 14:28:16. | |
tabnanny.py | File | 11545 bytes | June 23 2025 14:28:16. | |
tarfile.py | File | 114095 bytes | June 23 2025 14:28:03. | |
tempfile.py | File | 32366 bytes | June 23 2025 14:28:02. | |
textwrap.py | File | 19939 bytes | June 23 2025 14:28:03. | |
this.py | File | 1003 bytes | June 23 2025 14:28:03. | |
threading.py | File | 55244 bytes | June 23 2025 14:28:15. | |
timeit.py | File | 13477 bytes | June 23 2025 14:28:03. | |
token.py | File | 2489 bytes | June 23 2025 14:28:03. | |
tokenize.py | File | 21568 bytes | June 23 2025 14:28:16. | |
trace.py | File | 29728 bytes | June 23 2025 14:28:02. | |
traceback.py | File | 66524 bytes | June 23 2025 14:28:16. | |
tracemalloc.py | File | 18047 bytes | June 23 2025 14:28:16. | |
tty.py | File | 2035 bytes | June 23 2025 14:28:02. | |
types.py | File | 11207 bytes | June 23 2025 14:28:02. | |
typing.py | File | 132718 bytes | June 23 2025 14:28:16. | |
uuid.py | File | 29141 bytes | June 23 2025 14:28:03. | |
warnings.py | File | 26948 bytes | June 23 2025 14:28:03. | |
wave.py | File | 23236 bytes | June 23 2025 14:28:03. | |
weakref.py | File | 21513 bytes | June 23 2025 14:28:16. | |
webbrowser.py | File | 24298 bytes | June 23 2025 14:28:16. | |
zipapp.py | File | 8618 bytes | June 23 2025 14:28:03. | |
zipimport.py | File | 32890 bytes | June 23 2025 14:28:16. |
"""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 old aifc module) getmark(id) -- raises an error since the mark does not exist (for compatibility with the old 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): import warnings warnings._deprecated("Wave_read.getmarkers", remove=(3, 15)) return None def getmark(self, id): import warnings warnings._deprecated("Wave_read.getmark", remove=(3, 15)) 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): import warnings warnings._deprecated("Wave_write.setmark", remove=(3, 15)) raise Error('setmark() not supported') def getmark(self, id): import warnings warnings._deprecated("Wave_write.getmark", remove=(3, 15)) raise Error('no marks') def getmarkers(self): import warnings warnings._deprecated("Wave_write.getmarkers", remove=(3, 15)) 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