Full Code of tuffy/python-audio-tools for AI

master de55488dc982 cached
339 files
15.4 MB
4.1M tokens
5779 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,206K chars total). Download the full file to get everything.
Repository: tuffy/python-audio-tools
Branch: master
Commit: de55488dc982
Files: 339
Total size: 15.4 MB

Directory structure:
gitextract_4hj81sl5/

├── COPYING
├── INSTALL
├── MANIFEST.in
├── Makefile
├── TODO
├── audiotools/
│   ├── __init__.py
│   ├── accuraterip.py
│   ├── aiff.py
│   ├── ape.py
│   ├── au.py
│   ├── cdtoc.py
│   ├── coverartarchive.py
│   ├── cue/
│   │   ├── __init__.py
│   │   ├── tokrules.py
│   │   └── yaccrules.py
│   ├── flac.py
│   ├── freedb.py
│   ├── id3.py
│   ├── id3v1.py
│   ├── image.py
│   ├── m4a.py
│   ├── m4a_atoms.py
│   ├── mp3.py
│   ├── mpc.py
│   ├── musicbrainz.py
│   ├── ogg.py
│   ├── opus.py
│   ├── player.py
│   ├── ply/
│   │   ├── README
│   │   ├── __init__.py
│   │   ├── lex.py
│   │   └── yacc.py
│   ├── speex.py
│   ├── text.py
│   ├── toc/
│   │   ├── __init__.py
│   │   ├── tokrules.py
│   │   └── yaccrules.py
│   ├── tta.py
│   ├── ui.py
│   ├── vorbis.py
│   ├── vorbiscomment.py
│   ├── wav.py
│   └── wavpack.py
├── audiotools-config
├── cdda2track
├── cddainfo
├── cddaplay
├── coverbrowse
├── coverdump
├── covertag
├── docs/
│   ├── COPYING
│   ├── Makefile
│   ├── audiotools-config.xml
│   ├── audiotools.cfg.xml
│   ├── cdda2track.xml
│   ├── cddainfo.xml
│   ├── cddaplay.xml
│   ├── coverbrowse.xml
│   ├── coverdump.xml
│   ├── covertag.xml
│   ├── dvda2track.xml
│   ├── dvdainfo.xml
│   ├── manpagexml.py
│   ├── programming/
│   │   ├── Makefile
│   │   └── source/
│   │       ├── audiotools.rst
│   │       ├── audiotools_accuraterip.rst
│   │       ├── audiotools_bitstream.rst
│   │       ├── audiotools_cdio.rst
│   │       ├── audiotools_cue.rst
│   │       ├── audiotools_dvda.rst
│   │       ├── audiotools_freedb.rst
│   │       ├── audiotools_musicbrainz.rst
│   │       ├── audiotools_pcm.rst
│   │       ├── audiotools_pcmconverter.rst
│   │       ├── audiotools_player.rst
│   │       ├── audiotools_replaygain.rst
│   │       ├── audiotools_toc.rst
│   │       ├── audiotools_ui.rst
│   │       ├── conf.py
│   │       ├── huffman.dot
│   │       ├── index.rst
│   │       └── metadata.rst
│   ├── track2cdda.xml
│   ├── track2track.xml
│   ├── trackcat.xml
│   ├── trackcmp.xml
│   ├── trackinfo.xml
│   ├── tracklength.xml
│   ├── tracklint.xml
│   ├── trackplay.xml
│   ├── trackrename.xml
│   ├── tracksplit.xml
│   ├── tracktag.xml
│   └── trackverify.xml
├── dvda2track
├── dvdainfo
├── setup.cfg
├── setup.py
├── src/
│   ├── COPYING.LESSERv3
│   ├── Makefile
│   ├── accuraterip.c
│   ├── accuraterip.h
│   ├── bitstream-table.c
│   ├── bitstream.c
│   ├── bitstream.h
│   ├── buffer.c
│   ├── buffer.h
│   ├── cdiomodule.c
│   ├── cdiomodule.h
│   ├── common/
│   │   ├── flac_crc.c
│   │   ├── flac_crc.h
│   │   ├── m4a_atoms.c
│   │   ├── m4a_atoms.h
│   │   ├── md5.c
│   │   ├── md5.h
│   │   ├── tta_crc.c
│   │   └── tta_crc.h
│   ├── decoders/
│   │   ├── NOTES.rst
│   │   ├── alac.c
│   │   ├── alac.h
│   │   ├── alac_residual.h
│   │   ├── alac_residual.json
│   │   ├── flac.c
│   │   ├── flac.h
│   │   ├── mp3.c
│   │   ├── mp3.h
│   │   ├── mpc.c
│   │   ├── mpc.h
│   │   ├── oggflac.c
│   │   ├── oggflac.h
│   │   ├── opus.c
│   │   ├── opus.h
│   │   ├── sine.c
│   │   ├── sine.h
│   │   ├── tta.c
│   │   ├── tta.h
│   │   ├── vorbis.c
│   │   ├── vorbis.h
│   │   ├── wavpack.c
│   │   └── wavpack.h
│   ├── decoders.c
│   ├── decoders.h
│   ├── dither.c
│   ├── dvdamodule.c
│   ├── dvdamodule.h
│   ├── encoders/
│   │   ├── NOTES.rst
│   │   ├── alac.c
│   │   ├── alac.h
│   │   ├── flac.c
│   │   ├── flac.h
│   │   ├── mp2.c
│   │   ├── mp3.c
│   │   ├── mpc.c
│   │   ├── opus.c
│   │   ├── tta.c
│   │   ├── tta.h
│   │   ├── vorbis.c
│   │   ├── wavpack.c
│   │   └── wavpack.h
│   ├── encoders.c
│   ├── encoders.h
│   ├── framelist.c
│   ├── framelist.h
│   ├── func_io.c
│   ├── func_io.h
│   ├── huffman.c
│   ├── huffman.h
│   ├── libmpcdec/
│   │   ├── AUTHORS
│   │   ├── COPYING
│   │   ├── ChangeLog
│   │   ├── README
│   │   ├── decoder.h
│   │   ├── huffman.c
│   │   ├── huffman.h
│   │   ├── internal.h
│   │   ├── mpc_bits_reader.c
│   │   ├── mpc_bits_reader.h
│   │   ├── mpc_decoder.c
│   │   ├── mpc_demux.c
│   │   ├── mpc_reader.c
│   │   ├── mpcdec_math.h
│   │   ├── requant.c
│   │   ├── requant.h
│   │   ├── streaminfo.c
│   │   └── synth_filter.c
│   ├── libmpcenc/
│   │   ├── analy_filter.c
│   │   ├── bitstream.c
│   │   ├── encode_sv7.c
│   │   ├── huffsv7.c
│   │   ├── libmpcenc.h
│   │   └── quant.c
│   ├── libmpcpsy/
│   │   ├── ans.c
│   │   ├── cvd.c
│   │   ├── fft4g.c
│   │   ├── fft_routines.c
│   │   ├── libmpcpsy.h
│   │   ├── profile.c
│   │   ├── psy.c
│   │   └── psy_tab.c
│   ├── mini-gmp.c
│   ├── mini-gmp.h
│   ├── mod_bitstream.c
│   ├── mod_bitstream.h
│   ├── mod_defs.h
│   ├── mod_ogg.c
│   ├── mod_ogg.h
│   ├── mpc/
│   │   ├── datatypes.h
│   │   ├── minimax.h
│   │   ├── mpc_crc32.c
│   │   ├── mpc_types.h
│   │   ├── mpcdec.h
│   │   ├── mpcmath.h
│   │   ├── reader.h
│   │   └── streaminfo.h
│   ├── ogg.c
│   ├── ogg.h
│   ├── ogg_crc.c
│   ├── ogg_crc.h
│   ├── output/
│   │   ├── alsa.c
│   │   ├── alsa.h
│   │   ├── core_audio.c
│   │   ├── core_audio.h
│   │   ├── pulseaudio.c
│   │   ├── pulseaudio.h
│   │   ├── sfifo.c
│   │   └── sfifo.h
│   ├── output.c
│   ├── parson.c
│   ├── parson.h
│   ├── pcm.c
│   ├── pcm.h
│   ├── pcm_conv.c
│   ├── pcm_conv.h
│   ├── pcmconverter.c
│   ├── pcmconverter.h
│   ├── pcmreader.c
│   ├── pcmreader.h
│   ├── read_bits_table_be.h
│   ├── read_bits_table_le.h
│   ├── read_unary_table_be.h
│   ├── read_unary_table_le.h
│   ├── replaygain.c
│   ├── replaygain.h
│   ├── samplerate/
│   │   ├── common.h
│   │   ├── fastest_coeffs.h
│   │   ├── float_cast.h
│   │   ├── high_qual_coeffs.h
│   │   ├── mid_qual_coeffs.h
│   │   ├── samplerate.c
│   │   ├── samplerate.h
│   │   ├── src_linear.c
│   │   ├── src_sinc.c
│   │   └── src_zoh.c
│   ├── unread_bit_table_be.h
│   └── unread_bit_table_le.h
├── test/
│   ├── 1h.flac
│   ├── 1m.flac
│   ├── 1s.flac
│   ├── aiff-1ch.aiff
│   ├── aiff-2ch.aiff
│   ├── aiff-6ch.aiff
│   ├── aiff-8bit.aiff
│   ├── aiff-metadata.aiff
│   ├── aiff-misordered.aiff
│   ├── aiff-nossnd.aiff
│   ├── alac-allframes.m4a
│   ├── apptest.sh
│   ├── autotag.sh
│   ├── cdda_test.cue
│   ├── cdtoc1.flac
│   ├── cdtoc2.flac
│   ├── error.py
│   ├── flac-allframes.flac
│   ├── flac-disordered.flac
│   ├── flac-id3-2.flac
│   ├── flac-id3.flac
│   ├── flac-nomask1.flac
│   ├── flac-nomask2.flac
│   ├── flac-nomask3.flac
│   ├── flac-nomask4.flac
│   ├── flac-nonmd5.flac
│   ├── flac-noseektable.flac
│   ├── flac-seektable.flac
│   ├── freedb_test_discid-1.cue
│   ├── freedb_test_discid-2.cue
│   ├── freedb_test_discid-3.cue
│   ├── freedb_test_discid-4.cue
│   ├── freedb_test_discid-5.cue
│   ├── huge.bmp.bz2
│   ├── image_test_metrics-6.tiff
│   ├── imagetiff_setup.tiff
│   ├── m4a-faac.m4a
│   ├── m4a-faac2.m4a
│   ├── m4a-faac3.m4a
│   ├── m4a-itunes.m4a
│   ├── m4a-nero.m4a
│   ├── m4a-nero2.m4a
│   ├── m4a-nero3.m4a
│   ├── metadata_flac_cuesheet-1.cue
│   ├── metadata_flac_cuesheet-2.cue
│   ├── metadata_flac_cuesheet-3.cue
│   ├── shorten-frames.shn
│   ├── shorten-lpc.shn
│   ├── silence.wv
│   ├── sine.mp2
│   ├── test.cfg
│   ├── test.py
│   ├── test_cdrdao.py
│   ├── test_cdrecord.py
│   ├── test_core.py
│   ├── test_formats.py
│   ├── test_metadata.py
│   ├── test_streams.py
│   ├── test_utils.py
│   ├── tone.flac
│   ├── tone1.flac
│   ├── tone2.flac
│   ├── tone3.flac
│   ├── tone4.flac
│   ├── tone5.flac
│   ├── tone6.flac
│   ├── tone7.flac
│   ├── tone8.flac
│   ├── trackcat_pre_gap.cue
│   ├── trackcat_pre_gap2.cue
│   ├── trueaudio.tta
│   └── wavpack-combo.wv
├── track2cdda
├── track2track
├── trackcat
├── trackcmp
├── trackinfo
├── tracklength
├── tracklint
├── trackplay
├── trackrename
├── tracksplit
├── tracktag
└── trackverify

================================================
FILE CONTENTS
================================================

================================================
FILE: COPYING
================================================
		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year  name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.


================================================
FILE: INSTALL
================================================
			Installation Procedure

To install Python Audio Tools, you simply need to run:

make install

as root from this source directory. This will use the Python interpreter
to install the audiotools Python module and the executable scripts.
It will then install the man pages from the doc/ subdirectory.

To verify your Python Audio Tools installation, run:

audiotools-config

as a normal user. This will load the audiotools Python module,
if possible, and deliver a listing of available audio formats and
current system settings.


		     Fixing Installation Problems

* The audiotools.cdio module doesn't build correctly

  Check that you have the CDIO library installed, commonly known as libcdio
  If libcdio is installed the module still doesn't build, ensure that
  you've also installed any accompanying libcdio-devel package.


* audiotools-config lists formats as unavailable

  Certain audio formats require external programs. For instance,
  to use FLAC files, Python Audio Tools requires the flac and metaflac
  programs. If these cannot be found in the regular executable search path
  or from the config file, you will not be able to use that format.
  Check your system's package manager for programs which may be available
  but not yet installed.


* My Python interpreter isn't found, or I wish to use a different one

  The first line of Makefile is which Python interpreter is being used for
  installation of both the Python Audio Tools and Construct module.
  For instance, to use a Python interpreter located at
  /opt/python/bin/python, you should change that line to read:

  export PYTHON = /opt/python/bin/python

  Running make will then invoke the new interpreter for installation of
  the audiotools module and scripts.



For additional information, please see the complete manual in the "docs"
subdirectory named "audiotools_letter.pdf" and "audiotools_a4.pdf".



================================================
FILE: MANIFEST.in
================================================
recursive-include audiotools *
recursive-include docs *
recursive-include src *
recursive-include test *
include audiotools-config
include cdda2track
include cddainfo
include cddaplay
include COPYING
include coverbrowse
include coverdump
include dvda2track
include dvdainfo
include INSTALL
include Makefile
include setup.py
include TODO
include track2cdda
include track2track
include trackcat
include trackcmp
include trackinfo
include tracklength
include tracklint
include trackplay
include trackrename
include tracksplit
include tracktag
include trackverify


================================================
FILE: Makefile
================================================
# which Python interpreter to use
PYTHON = python

# which Python test coverage utility to use
COVERAGE = coverage

all: .FORCE
	$(PYTHON) setup.py build

install: .FORCE
	$(PYTHON) setup.py install
	cd docs && $(MAKE) install

probe: .FORCE
	$(PYTHON) setup.py build_ext --dry-run

check: .FORCE
	cd test && $(PYTHON) test.py

check_coverage: .FORCE
	cd test && $(COVERAGE) run test.py

coverage_report: .FORCE
	cd test && $(COVERAGE) report -m

clean: .FORCE
	rm -rfv build
	rm -fv audiotools/*.pyc

distclean: clean
	cd docs && $(MAKE) clean

.FORCE:



================================================
FILE: TODO
================================================
# -*- Mode: Org -*-
* Previous Issues
** DONE Fix WAVE/MP3 formats to support MP3 audio in a WAVE container
   Instead of WaveAudio generating a nasty "compression not supported" error,
   its is_type() classmethod should return False.
   And, MP3Audio's is_type() classmethod should check for MP3 compressed
   RIFF WAVE containers.
   This isn't likely to mess up decoding, but may confuse ID3 tagging.
** DONE Allow file template to be specified on the command line
   When making new files with track2track, cd2track, etc.
** DONE Update the website with the latest documentation
** DONE Allow a unified %(album_track_number)s file template field
   If there's no album number, it's simply 2 digits of track number.
   Otherwise, it's a combination of the two fields.
   For example, album_number = 2 and track_number = 13 results in
   "213" for a value.
** DONE Update trackcat to take a cuesheet argument when outputting FLACs
   Thus, one can perform:
   trackcat --cuesheet=file.cue file1.wav file2.wav file3.wav -t flac -o cd.flac
   which will embed "file.cue" into "cd.flac" using metaflac.
   Though no other format I'm aware of supports this kind of cuesheet handling,
   being able to easily build solid disc images of a single FLAC file
   is much of the reason for trackcat/tracksplit.
** DONE Don't remove undone tracklint entries from its undo DB
   Since its checksum will change anyway and no longer match,
   explicitly removing the entry is no longer necessary
** DONE Support FLAC padding
   If changes to FLAC metadata are small enough, write over the
   padding (if present) rather than rewrite the whole file - like metaflac.
   This approach should speed up tagging considerably.
** DONE Fix image support in ID3v2
   Very large images can take a very long time to load.
** DONE Fix programs to key on album number and track number
   Certain programs, such as trackcmp, work on tracks across two directories
   and key on track number to determine which to compare to which.
   These need to be updated to use both track number and album number.
** DONE Adjust wave conversions to use album number, if present
   For example, converting track_number 15 and album_number 2 to WAVE
   should make a file "track215.cdda.wav" which then properly converts
   back to track_number 15 and album_number 2 if read.
** DONE Improve XMCD handling
   Support for XMCD files often breaks down if one or more tracks
   are missing.
   In some cases, there's no fix to be had (track2xmcd)
   but in most instances it should be made to work correctly.
** DONE Perform type inference wherever possible
   Anything with a single output file (trackcat and record2track)
   should be able to infer its output type from the track suffix, if possible.
** DONE Add "comment" field support to all metadata types
   Don't forget to add unit tests for comment field.
*** TODO Sort "comment" fields correctly across all metadata types
*** TODO Add --comment support to tracktag
** DONE Fix ID3v2 image support to handle Unicode descriptions
   The current implementation falls down on UTF-16 input,
   but I should have a solution from the COMM frame handler.
** DONE Limit ID3v2.2/2.3 to UCS-2 encoding
   The current implementation treats UCS-2 the same as UTF-16.
   This needs to be fixed so that really high unicode characters
   (above U+FFFF) are replaced with something within spec.
** DONE Unify ID3v2 frame handling
   In the beginning, there were text frames and Everything Else.
   Text frames were unicode strings,
   and Everything Else was a binary string of whatever.
   Now that ID3 is cluttered with APIC frames and COMM frames that need
   special treatment, ID3v2 needs an overhaul to more resemble FlacMetaData.
*** DONE Ensure unknown frames are displayed correctly
    Anything that's not text, images or comments should get some sort
    of proper display instead of a Python object string.
** DONE Add app testing to the unit test suite
   Though not everything is unit-testable
   (such as the CD handling programs or anything X11)
   a lot of the batch programs are to some degree:
- [X] coverdump
- [X] track2track
- [X] trackcat
- [X] trackcmp
- [X] tracklength
- [X] tracklint
- [X] trackrename
- [X] tracksplit
- [X] tracktag
** DONE Add verbosity levels to programs
   Every batch program should support a -V --verbose flag
   with options for "silence","normal" (the default) and "debug".
   Silence shuts off everything but error messages.
   Normal is standard output behavior.
   Debug for additional debugging output.
- [X] cd2track
- [X] cd2xmcd
- [X] coverdump
- [X] record2track
- [X] track2cd (this will need to forward verbosity to cdrecord)
- [X] track2track
- [X] track2xmcd
- [X] trackcmp
- [X] trackrename
- [X] tracksplit
- [X] tracktag
- [X] tracklint
** DONE Add compression percentage display to trackinfo
   Though not massively useful, it'd be neat to see just how
   compressed audio tracks are, as a percentage of their original size.
** DONE Add support for W??? frames to ID3v2
   The various W??? frames are really just URLs and don't need to
   be displayed as hex-encoded blobs.
** DONE Add CUE/TOC support to track2cd
   It should be possible to burn a selection of tracks, or a disc image,
   from a cuesheet with all its indexes/ISRC/catalog data intact
   by passing --cue to track2cd.
** DONE Unify CUE/TOC support
   Cuesheets and cdrdao TOC files are largely interchangeable.
   They both feature a listing of track offsets and, optionally,
   CD-TEXT data, ISRCs and so on.
   These formats should be unified such that any program will
   handle them both automatically.
- [X] tracksplit
- [X] trackcat
- [X] tracktag
*** DONE Update docs to mention CUE/TOC interchangeability
- [X] tracksplit
- [X] trackcat
- [X] tracktag
*** DONE Support cuesheet from FlacMetaData directly
    Since we're parsing CUE/TOC files anyway, this data can be used
    to build FLAC CUESHEET blocks directly instead of punting
    this task to metaflac.
*** DONE Add unit tests for TOC/CUE files, as well as embedded FLAC cuesheets
** DONE Update copyright text for 2009
** DONE Preserve metadata when using trackcat
   Any fields shared by all tracks should be merged into metadata
   for the newly combined track.
** DONE Don't route data though WAVE files unless necessary
   Currently, track2track routes through WAVE if both ends happen to
   support foreign RIFF chunks, whether the files have such chunks or not.
   This behavior needs to be modified such that only source files
   which actually have foreign chunks, and a target format that supports them,
   results in a pass through RIFF WAVE.
** DONE Convert editxmcd to PyGTK
   Although the dialog(1)-based version works in terminals and is curses-based,
   it's extremely hokey, error-prone and doesn't support any cut & paste.
   This needs to be reimplemented in PyGTK (since coverview already uses it)
   and made into a stable app someone would want to use.
*** DONE Update XMCD support
    The current handling of XMCD files treats them only as very primative
    AlbumMetaData implementations.  This must be updated into something
    round-trippable if editxmcd is to be modernized.
**** DONE Add XMCD unit tests
**** DONE Update XMCD API documentation
** DONE Require Python 2.5
   Since Python 2.4 is in bugfix-only mode and barely supported,
   it's best to move the minimum version to Python 2.5 or better
   (which has already been superceded by Python 2.6).
   This reduces the amount of Python versions to test on
   and allows the use of more modern Python features which
   makes the code less clunky.
*** TODO Update documentation to mention Python 2.5 requirement.
** DONE Expand WavPack's APEv2 tag coverage
   WavPack's official specification defines APEv2 tags such as
   "Cuesheet" and "Cover Art" which the APEv2 standard does not.
   It would be helpful to make WavPack's APEv2 tags a superset of regular APEv2.
*** DONE Add image support to WavePackAPEv2
*** DONE Add cuesheet support to WavePackAPEv2
** DONE Build unified cuesheet interface
   Once both FLAC and WavPack support embedded cuesheets,
   there will need to be a unified interface to support them.
   I expect this will be a simple pair of get_cuesheet/set_cuesheet
   methods, probably attached to the AudioFiles themselves
   rather than to MetaData objects.
*** DONE Alter FLAC-specific cuesheet documentation to be more general
*** DONE Ensure cuesheets are transferred properly when transcoding
*** DONE Update trackcat to use the interface
*** DONE Update tracksplit to use the interface
*** DONE Update track2cd to use the interface
*** DONE Document cuesheet interface
*** DONE Add unit tests for embedded cuesheets across all formats
*** DONE Add cuesheet import option to tracktag
    This can also use the --cue flag,
    for consistency with other image-handling programs like tracksplit.
    If given with a single, album-length track, --cue will import a cuesheet.
    If given with multiple tracks or a single track that's too short,
    --cue will function like --xmcd and act as a metadata source.
*** DONE Update track2xmcd to support getting an XMCD file from CD image
** DONE Convert to Muspack SV8
   Now that Musepack SV8 is finalized, it should be the new default.
   The old SV7 command-line tools aren't well supported and don't
   seem to work outside of x86 platforms.
   SV7 streams are, in theory, backwards compatible so switching
   shouldn't be a problem.
** DONE Update coverview to look more standard
   It's currently a haphazard assortment of widgets
   rather than anything like a proper GTK app.
   It should be tweaked to look better.
** DONE Improve transcoding robustness
   Just about all of the to_pcm() and from_pcm() methods expect
   that their subprocess calls will work as expected.
   Though rare in practice, these need to be checked in case
   the child processes fail for any reason.
*** DONE Check for invalid input/output files/permissions errors
    If an output file can't be read/written to for some reason
    (invalid permissions, etc.) generate a proper error message
    instead of throwing ugly IOExceptions or confusing errors.
- [X] cd2track
- [X] cd2xmcd
- [X] coverdump
- [X] editxmcd
- [X] record2track
- [X] track2cd
- [X] track2track
- [X] track2xmcd
- [X] trackcat
- [X] trackcmp
- [X] trackinfo
- [X] tracklength
- [X] tracklint
- [X] trackplay
- [X] trackrename
- [X] tracksplit
- [X] tracktag
** DONE Make text output consistent
   Currently, command-line programs generate output using a
   selection of scattered print statements - often accompanied by
   if blocks when verbosity is indicated - and haphazardly
   filtered through unicode.
   This should be replaced by a unified message system similar
   to Python's built-in logging module which can abstract away
   these difficulties.
*** DONE Convert tty output to gettext-based strings
    This will not only make output messages more consistent across the tools,
    but will also allow for foreign language translations in the future.
- [X] cd2track
- [X] cd2xmcd
- [X] coverdump
- [X] record2track
- [X] track2cd
- [X] track2track
- [X] track2xmcd
- [X] trackcat
- [X] trackcmp
- [X] trackinfo
- [X] tracklength
- [X] tracklint
- [X] trackplay
- [X] trackrename
- [X] tracksplit
- [X] tracktag
**** DONE Convert output from audiotools module to gettext-based strings
- [X] __aiff__.py
- [X] __ape__.py
- [X] __au__.py
- [X] cue.py
- [X] __flac__.py
- [X] __freedb__.py
- [X] __id3__.py
- [X] __id3v1__.py
- [X] __image__.py
- [X] __init__.py
- [X] __m4a__.py
- [X] __mp3__.py
- [X] __musepack__.py
- [X] __speex__.py
- [X] toc.py
- [X] __vorbiscomment__.py
- [X] __vorbis__.py
- [X] __wavpack__.py
- [X] __wav__.py
*** DONE Add unit tests for tty output
    All programs which generate output should be unit tested
    so that all code paths are assured of printing the messages they're
    supposed to print, at the streams they're supposed to print on,
    and in the proper encoding settings.
- [X] coverdump
- [X] track2track
- [X] track2xmcd
- [X] trackcat
- [X] trackcmp
- [X] trackinfo
- [X] tracklength
- [X] tracklint
- [X] trackrename
- [X] tracksplit
- [X] tracktag
*** DONE Convert --help output to gettext-based strings
*** DONE Convert GUI programs to gettext-based strings
- [X] coverview
- [X] editxmcd
*** DONE Convert "Usage" output to gettext-based strings
** DONE Update tracksplit's man page
   It now supports more of track2track's options
** DONE Support total tracks/total albums metadata fields
*** DONE Add support for fields in the metadata tags
- [X] Add support in Vorbis Comments
- [X] Add support in ID3v2
- [X] Add support in M4A
- [X] Add support in APEv2
*** DONE Add support in utilities
- [X] Add support in tracktag
- [X] Add support in cd2track
- [X] Add support in tracksplit
- [X] Add support in trackcat
*** DONE Add unit tests
*** DONE Add fields to --format output
*** DONE Update man pages with fields information
** DONE Integrate better MetaData merging
   There's a few areas in which MetaData from multiple sources must
   be merged in an intelligent manner,
   such as where tracksplit takes a source track an XMCD file.
   Now that a preliminary MetaData.merge() classmethod is in place,
   this process must be integrated consistently.
- [X] track2track
- [X] trackrename
- [X] tracksplit
- [X] tracktag
*** DONE Add unit tests for MetaData merging process
- [X] track2track
- [X] trackrename
- [X] tracksplit
- [X] tracktag
** DONE Improve M4A metadata handling
*** DONE Make M4A metadata updating less destructive
   Like FLAC, not all fields need to be wiped out when overwriting
   old metadata with new.
*** DONE Add more M4A-specific unit tests
** DONE Add more system information to audiotools-config
   All BIN-referenced binaries should be accounted for.
   Thumbnailing status and requirements should be shown.
** DONE Add cdinfo utility
   Analagous to trackinfo, but for an inserted CD.
   This would be a better location for cd2xmcd's "-i" option.
*** DONE Add cdinfo man page
*** DONE Link cdinfo man page to other utility man pages
** DONE Add manual page for audiotools.cfg
   It'll be easier to check what the options are from a man page
   rather than having to check the website or PDF doc.
** DONE Convert vorbiscomment dependency to Python
   This would remove the last app-based MetaData-setting utility
   and may pave the way for adding cover art to Ogg Vorbis
   (assuming I can find the standard for a secondary stream of image data)
** DONE Add metadata deletion capability
   It would be helpful to have the low-level capability of deleting
   either part of a MetaData tag or the entire tag altogether.
   For example, deleting the "track_name" field would delete
   a Vorbis comment's "TITLE" field.
   Or, deleting the MetaData from MP3 would remove all the ID3v2/ID3v1 tags.
*** DONE Add delattr to ID3v1
** DONE Integrate pyconstruct as a submodule
** DONE Add undo capability to editxmcd
** DONE Add --cue option to track2xmcd
   One should be able to pull metadata from CD images
   without having to embed the cuesheet.
*** DONE Add unit tests for track2xmcd's --cue option
*** DONE Update man page
** DONE Group --help output more intelligently
   For tools with a large number of options (such as track2track or tracktag)
   the --help output is particularly jumbled.
   Use more of optparse's features to make this output clearer.
- [X] cd2track
- [X] cd2xmcd
- [X] track2track
- [X] track2xmcd
- [X] tracksplit
- [X] tracktag
** DONE Check for FLAC metadata chunk overflow
   Although APEv2 and ID3 tags support very large objects (hundreds of MB),
   FLAC metadata chunks have a maxmimum of about 16MB per chunk,
   which may be hit accidentally.
** DONE Fix or replace Python's built-in aifc module
   The current implementation suffers from bugs.
*** DONE Document AIFF better
** DONE Add MusicBrainz support
   It would be helpful to have external metadata support beyond FreeDB,
   since FreeDB is very primitive.
*** DONE Ensure that MusicBrainz is interchangeable with FreeDB/XMCD
**** DONE Unify track2xmcd/track2mb, cd2xmcd/cd2mb
     Based on preliminary testing, MusicBrainz's output is better than FreeDB's
     but its album coverage is not as broad.
     In addition, nobody wants to run their albums through two separate tools
     in order to extract metadata for tagging.  The best solution is
     for tools to try both and output the one that's most complete.
**** DONE Extend editxmcd to MusicBrainz XML
     Although editxmcd was originally designed specifically for XMCD files
     and MusicBrainz's XML format differs radically, no one should have to
     know whether an album metadata file is one or the other.
     Therefore, editxmcd should be extended with additional fields
     to handle XML backend data if necessary.
**** DONE Handle multiple Release entries with single Disc ID
**** DONE Allow MusicBrainz XML output for new editxmcd files
     FreeDB output should also be an option, however.
*** DONE Add MusicBrainz protocol/format documentation
*** DONE Add MusicBrainz-specific unit tests
- [X] track2track
- [X] track2xmcd
- [X] trackrename
- [X] tracksplit
- [X] tracktag
*** DONE Update --help text to indicate MusicBrainz compatibility
- [X] cd2xmcd
- [X] editxmcd
- [X] track2track
- [X] track2xmcd
- [X] trackrename
- [X] tracksplit
- [X] tracktag
*** DONE Update man pages to indiciate MusicBrainz compatibility
- [X] cd2xmcd
- [X] editxmcd
- [X] track2track
- [X] track2xmcd
- [X] trackrename
- [X] tracksplit
- [X] tracktag
*** DONE Update documentation with MusicBrainz config file fields
*** DONE Ensure missing XML fields are handled correctly
    The MusicBrainz XML spec allows most fields to be missing altogether
    (such as <title>).  editxmcd should add these fields in the proper place
    if necessary.
**** DONE Add unit tests for improperly reordered XML fields
** DONE Ensure .glade files are found
   Not all systems place Python data files in the same locations.
** DONE Convert to_pcm()/from_pcm() to FrameList-based I/O
   Passing specifically-sized blobs of binary data between conversion
   routines worked well when those routines are little more than
   subprocess black-boxes.  However, this approach works less well
   whenever actual sample values are required, or when processing is needed.
   In those cases, going from integers to strings, converting the strings
   back to integers for processing, then bouncing them into strings once
   again becomes needless work.
   A more sensible approach is to keep all data as FrameList-compatible
   objects (stored as C-based lists of int32s behind-the-scenes)
   and convert that data to/from strings only at the beginning and end
   of processing.
*** DONE Build C-based audiotools.pcm.FrameList object
    This needs to closely match audiotools.FrameList's functionality
    and combine all the PCM conversion features from audiotools.pcmreader
**** DONE Integrate audiotools.pcm.FrameList with i_array structures
**** DONE Make audiotools.pcm.FrameList into a standalone object
     So standalone test codecs can use them, such as "flacenc"
**** DONE Unit test audiotools.pcm.FrameList
*** DONE Convert FLAC encoder/decoder to use FrameList objects
    - [X] flacenc
    - [X] audiotools.decoders.FlacDecoder
    - [X] audiotools.encoders.encode_flac
*** DONE Convert to_pcm()/from_pcm() routines to use FrameList objects
    - [X] AAC
    - [X] AIFF
    - [X] Sun AU
    - [X] FLAC
    - [X] M4A
    - [X] MP2
    - [X] MP3
    - [X] Ogg FLAC
    - [X] Ogg Speex
    - [X] WAVE
    - [X] WavPack
*** DONE Convert CDTrackReader/OffsetCDTrackReader to use FrameList objects
*** DONE Convert PCMConverter to use FrameList objects
*** DONE Convert ReplayGainReader to use FrameList objects
*** DONE Ensure integrated FrameList passes all unit tests
*** DONE Remove deprecated audiotools.FrameList object
*** DONE Remove deprecated pcmstream.PCMStreamReader object
*** DONE Convert pcmstream module to resample module
*** DONE Avoid importing audiotools.pcm so often
    Other C libraries often import audiotools.pcm via Python callbacks
    This library importing should be cached when possible.
    - [X] cdiomodule
    - [X] pcmreader
    - [X] replaygain
    - [X] resample
*** DONE Check for memory leaks
*** DONE Add FrameList and FloatFrameList programming documentation
*** DONE Remove .copy() method
    Since FrameLists are now immutable, there's no need for it
*** DONE Make pcm objects self-documenting
    For example, their methods and functions should give useful info
    when checked with "help()"
** DONE Add native ReplayGain handling routines
*** DONE Add native ReplayGain handling to FlacAudio/OggFlacAudio
*** DONE Ensure add_replay_gain()'s exceptions are caught
    Errors during calculation may raise ValueError,
    which must be caught anywhere the function is called
*** DONE Add ReplayGain unit tests
*** DONE Ensure ReplayGain works properly on 8bps and 24bps output
*** DONE Ensure ReplayGain is applied consistently
    Although cd2track and tracksplit are guaranteed
    to generate only one album at a time, track2track and tracktag are not.
    If multiple albums are applied gain at once,
    add_replay_gain must be called on an album-by-album basis
    rather than on the entire set.
*** DONE Double-check ReplayGainReader
    Ensure its output is consistent with other implementations.
** DONE Fix multi-channel audio handling
   It's important that channel mapping information be preserved
   when transcoding between sources with 3+ channels.
   This likely means another flag for PCMReader so that
   from_pcm() can build a file with the proper channel mask set.
   However, it may also be necessary to build some sort of
   channel reordering mechanism in the event that formats differ
   on how channels are to be ordered in the file.
*** Channel Counts and Ordering
| Format     | Maximum Channels | Ordering               |
|------------+------------------+------------------------|
| AAC        |               48 | stereo-only (via faac) |
| AIFF       |             2^16 | predefined             |
| Sun AU     |             2^32 | mostly undefined       |
| FLAC       |                8 | as WAVE                |
| M4A        |               48 | as WAVE?               |
| MP2        |                2 | stereo-only            |
| MP3        |                2 | stereo-only            |
| Musepack   |                2 | stereo-only            |
| Ogg FLAC   |                8 | as WAVE                |
| Ogg Vorbis |              255 | predefined             |
| Ogg Speex  |             2^32 | stereo-only            |
| RIFF WAVE  |             2^16 | predefined             |
| WavPack    |               16 | as WAVE                |
|------------+------------------+------------------------|
*** DONE Fix AudioFile definitions to support channel_mask()
    - [X] AACAudio
    - [X] AiffAudio
    - [X] AuAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] SpeexAudio
    - [X] WaveAudio
    - [X] WavPackAudio
*** DONE Fix to_pcm() methods to support channel_mask
    - [X] AACAudio
    - [X] AiffAudio
    - [X] AuAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] SpeexAudio
    - [X] WaveAudio
    - [X] WavPackAudio
*** DONE Fix from_pcm() classmethods to support channel_mask
    - [X] AACAudio
    - [X] AiffAudio
    - [X] AuAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] SpeexAudio
    - [X] WaveAudio
    - [X] WavPackAudio
*** DONE Fix alternate PCMReaders to support channel_mask
    - [X] BufferedPCMReader
    - [X] PCMConverter
    - [X] ReplayGainReader
    - [X] CDTrackReader
    - [X] OffsetCDTrackReader
    - [X] PCMCat
*** DONE Handle undefined channel masks in a sane way
**** DONE Fix to_pcm() methods to output undefined ChannelMasks
     If a format has not defined channel assignments for a given
     channel count, its to_pcm() method should return undefined ChannelMasks.
     - [X] AACAudio
     - [X] AiffAudio
     - [X] AuAudio
     - [X] FlacAudio
     - [X] M4AAudio
     - [X] MP2Audio
     - [X] MP3Audio
     - [X] OggFlacAudio
     - [X] VorbisAudio
     - [X] SpeexAudio
     - [X] WaveAudio
     - [X] WavPackAudio
**** DONE Fix from_pcm() classmethods to accept undefined ChannelMasks
     So long as the number of channels is acceptable,
     audio formats are free to place undefined ChannelMasks
     in whatever arrangement they'd like.
     - [X] AACAudio
     - [X] AiffAudio
     - [X] AuAudio
     - [X] FlacAudio
     - [X] M4AAudio
     - [X] MP2Audio
     - [X] MP3Audio
     - [X] OggFlacAudio
     - [X] VorbisAudio
     - [X] SpeexAudio
     - [X] WaveAudio
     - [X] WavPackAudio
*** DONE Unit test multichannel encoding and channel_mask handling
**** DONE Ensure all AudioFile types have a working channel_mask() method
     Even 2 channel audio should yield something valid.
**** DONE Ensure all to_pcm() methods yield a matching channel_mask attribute
**** DONE Ensure channel_mask is preserved between from_pcm(to_pcm()) calls
**** DONE Ensure channel_mask is preserved between to_wave()/from_wave() calls
**** DONE Ensure channels are actually stored in the proper order
     This is less of an issue for .wav, .flac, .oga or .wv
     which already store channels in RIFF WAVE order
     and more of an issue for Ogg Vorbis and other formats that do not.
**** DONE Ensure UnsupportedChannelMask is raised when necessary
     This includes calls to from_pcm() and from_wave()
*** DONE Ensure PCMReader.channel_mask is always an integer
** DONE Fix the unit test error messages
** DONE Make the programming documentation web-capable
    It should render consistently with the regular Python reference docs
    and be placed both in the source tree and on the website
    for better accessability.
*** DONE Document audiotools
     - [X] AudioFile
     - [X] BufferedPCMReader
     - [X] ChannelMask
     - [X] ExecQueue
     - [X] Image
     - [X] MetaData
     - [X] PCMConverter
     - [X] PCMReader
     - [X] PCMCat
     - [X] ReorderedPCMReader
     - [X] ReplayGain
     - [X] ReplayGainReader
     - [X] Messenger
     - [X] AlbumMetaData
     - [X] CDTrackLog
     - [X] CDDA
     - [X] CDTrackReader
     - [X] calculate_replay_gain
     - [X] filename_to_type
     - [X] find_glade_file
     - [X] group_tracks
     - [X] open
     - [X] open_directory
     - [X] open_files
     - [X] pcm_cmp
     - [X] pcm_split
     - [X] read_metadata_file
     - [X] read_sheet
     - [X] stripped_pcm_cmp
     - [X] transfer_data
     - [X] transfer_framelist_data
     - [X] BIN
     - [X] TYPE_MAP
     - [X] VERSION
     - [X] AVAILABLE_TYPES
*** DONE Document audiotools.pcm
     - [X] FloatFrameList
     - [X] FrameList
     - [X] from_channels
     - [X] from_float_channels
     - [X] from_float_frames
     - [X] from_frames
     - [X] from_list
*** DONE Document audiotools.resample
     - [X] Resampler
*** DONE Document audiotools.replaygain
     - [X] ReplayGain
*** DONE Document audiotools.cdio
     - [X] CDDA
     - [X] set_read_callback
*** DONE Document audiotools.cue
     - [X] Cuesheet
     - [X] read_cuesheet
     - [X] CueException
*** DONE Document audiotools.toc
     - [X] TOCFile
     - [X] read_tocfile
     - [X] TOCException
** DONE Make reference documentation render consistently
*** DONE Ensure documents render in letter and A4 size
*** DONE Add Creative Commons licensing to source code and doc itself
*** DONE Add internal PDF linkage
    The file should have working bookmarks
    and internal links so one can click directly to a chapter
*** DONE Add new introduction
*** DONE Basics
**** DONE Hexadecimal
**** DONE Endianness
**** DONE Signed values
     How to decode/encode signed integers should be properly explained
**** DONE Character Encodings
**** DONE PCM
*** DONE .wav
**** DONE the RIFF WAVE stream
**** DONE the fmt chunk
**** DONE the WAVEFORMATEXTENSIBLE fmt chunk
**** DONE the data chunk
**** DONE channel mapping
*** DONE .aiff
**** DONE the AIFF stream
**** DONE the COMM chunk
***** TODO 80 bit IEEE standard 754 floating point
**** DONE the SSND chunk
*** DONE .au
**** DONE the AU stream
**** DONE the AU header
*** DONE .flac
**** DONE the FLAC file stream
**** DONE FLAC metadata
***** DONE the PADDING metadata block
***** DONE the APPLICATION metadata block
***** DONE the SEEKTABLE metadata block
***** DONE the VORBIS_COMMENT metadata block
***** DONE the PICTURE metadata block
***** DONE the CUESHEET metadata block
**** DONE FLAC decoding
***** DONE the CONSTANT subframe
***** DONE the VERBATIM subframe
***** DONE the FIXED subframe
***** DONE the LPC subframe
***** DONE the Residual
****** DONE Rice Encoding
***** DONE Channels
***** DONE Wasted bits per sample
**** DONE FLAC encoding
***** DONE Metadata header
***** DONE the STREAMINFO metadata block
***** DONE Frame header
***** DONE Channel assignment
***** DONE Subframe header
***** DONE the CONSTANT subframe
***** DONE the VERBATIM subframe
***** DONE the FIXED subframe
***** DONE the LPC subframe
****** DONE Windowing
****** DONE Computing autocorrelation
****** DONE LP coefficient calculation
****** DONE Best order estimation
****** DONE Best order exhaustive search
****** DONE Quantizing coefficients
****** DONE Calculation Residual
***** DONE the Residual
****** DONE Residual Values
**** DONE the Checksums
***** TODO CRC-8
***** TODO CRC-16
*** DONE .ape
**** DONE the Monkey's Audio stream
**** DONE the APE Descriptor
**** DONE the APE Header
**** DONE the APEv2 tag
**** DONE the APEv2 tag header/footer
**** DONE the APEv2 flags
*** DONE .wv
**** DONE the WavPack file stream
**** DONE a WavPack block header
**** DONE a WavPack sub-block header
*** DONE .mp3
**** DONE the MP3 file stream
**** DONE an MPEG frame header
***** DONE the Xing header
**** DONE the ID3v1 tag
***** DONE ID3v1
***** DONE ID3v1.1
**** DONE the ID3v2 tag
***** DONE the ID3v2 stream
***** DONE ID3v2.2
****** DONE the ID3v2.2 Header
****** DONE an ID3v2.2 Frame
****** DONE ID3v2.2 Frame IDs
****** DONE the PIC Frame
***** DONE ID3v2.3
****** DONE the ID3v2.3 Header
****** DONE an ID3v2.3 Frame
****** DONE ID3v2.3 Frame IDs
****** DONE the APIC Frame
***** DONE ID3v2.4
****** DONE the ID3v2.4 Header
****** DONE an ID3v2.4 Frame
****** DONE ID3v2.4 Frame IDs
****** DONE the APIC Frame
*** DONE .ogg
**** DONE the Ogg file stream
**** DONE an Ogg Page
**** DONE Ogg packets
**** DONE the Identification packet
**** DONE the Comment packet
**** DONE Channel assignment
*** DONE .spx
**** DONE the Header packet
**** DONE the Comment packet
*** DONE .oga
**** DONE the Ogg FLAC file stream
**** DONE the STREAMINFO metadata packet
**** DONE the Metadata packets
*** DONE .m4a
**** DONE the QuickTime file stream
**** DONE a QuickTime atom
**** DONE Container atoms
**** DONE M4A atoms
***** DONE the ftyp atom
***** DONE the mvhd atom
***** DONE the tkhd atom
***** DONE the mdhd atom
***** DONE the hdlr atom
***** DONE the smhd atom
***** DONE the dref atom
***** DONE the stsd atom
***** DONE the mp4a atom
***** DONE the stts atom
***** DONE the stsc atom
***** DONE the stsz atom
***** DONE the stco atom
***** DONE the meta atom
****** DONE the trkn sub-atom
****** DONE the disk sub-atom
*** DONE .mpc
**** DONE Musepack SV7
***** DONE the Musepack SV7 file stream
***** DONE the Musepack SV7 header
**** DONE Musepack SV8
***** DONE the Musepack SV8 file stream
***** DONE Nut-encoded values
***** DONE the SH packet
***** DONE the SE packet
***** DONE the RG packet
***** DONE the EI packet
*** DONE FreeDB
**** DONE Native Protocol
***** DONE the Disc ID
***** DONE Initial Greeting
***** DONE Client-Server Handshake
***** DONE Set Protocol Level
***** DONE Query Database
***** DONE Read XMCD Data
***** DONE Close Connection
**** DONE Web Protocol
**** DONE XMCD
*** DONE MusicBrainz
**** DONE Searching Releases
***** DONE The Disc ID
***** DONE Server Query
***** DONE Release XML
**** DONE MusieBrainz XML
*** DONE ReplayGain
**** DONE Applying ReplayGain
**** DONE Calculating ReplayGain
***** DONE the Equal Loudness Filter
      This should be re-documented to be closer to the actual implementation
****** TODO the Yule Filter
****** TODO the Buffer Filter
****** TODO a Filtering Example
***** DONE RMS Energy Blocks
***** DONE Statistical Processing and Calibration
*** DONE References
*** DONE Remove old troff reference documentation
*** DONE Add title and author to PDF documentation
** DONE Ensure make(1) from doc/ directory builds both doc trees
** DONE Seperate unreadable files from unknown files
   Files we're unable to read should be handled differently
   from files we're unable to understand.
*** DONE Update audiotools.open() to raise IOErrors
*** DONE Update audiotools.open_files() to handle IOErrors
*** DONE Update audiotools.open_directory() to handle IOErrors
*** DONE Update internal calls to open()/open_files() to handle IOErrors
    - [X] __flac__.py
    - [X] __m4a__.py
    - [X] __mp3__.py
    - [X] __vorbis__.py
    - [X] __wavpack__.py
    - [X] __wav__.py
*** DONE Update tools which use open()/open_files() to handle IOErrors
    - [X] coverdump
    - [X] editxmcd
    - [X] track2cd
    - [X] track2track
    - [X] track2xmcd
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
*** DONE Add unit tests to demonstrate new behavior
*** DONE Update programming documentation with new behavior
** DONE Ensure embedded cuesheets aren't clobbered by adding more metadata
** DONE Adjust %(album_track_number)s to accomodate more than 9 albums
   For example, track 2 of 7, album 5 of 11 in format
   "%(album_track_number)s - %(track_name)s.%(suffix)s should be:
   "0502 - name.suffix"
** DONE editxmcd's "New" command should work with embedded cuesheets
   Selecting a single disc image with embedded cuesheets should
   fill in the proper XMCD/MusicBrainz fields
** DONE Ensure add_replay_gain used on hi-def tracks doesn't raise errors
** DONE Add Shorten support
   I don't expect people have a lot of shn files lying around
   and nobody should be using it for new data
   (though I'll add a rudimentary encoder for completeness' sake)
   but it's interesting to document for historical reasons.
*** DONE Build complete decoder
    - [X] DIFF0
    - [X] DIFF1
    - [X] DIFF2
    - [X] DIFF3
    - [X] QUIT
    - [X] BLOCKSIZE
    - [X] BITSHIFT
    - [X] QLPC
    - [X] ZERO
    - [X] VERBATIM
    I'll likely limit support to Shorten version2/3
    since generating older versions will be a challenge
    and this format is obscure enough as it is.
*** DONE Build partial encoder
    - [X] DIFF0
    - [X] DIFF1
    - [X] DIFF2
    - [X] QUIT
    - [X] BLOCKSIZE
    - [X] ZERO
    - [X] VERBATIM
**** DONE Convert partial encoder for standalone use
     To ensure there aren't any memory leaks
*** DONE Add ShortenAudio type to audiotools Python core
*** DONE Add Shorten-specific unit tests
*** DONE Document Shorten
    - [X] Shorten data types
    - [X] the Shorten file stream
    - [X] the decoding process
    - [X] the encoding process
** DONE trackcmp should give exact PCM frame/byte of first mismatch
*** DONE update unit tests to cover new behavior
    - [X] test_trackcmp
    - [X] test_trackcmp1
    - [X] test_trackcmp2
    - [X] test_trackcmp3
    - [X] test_trackcmp4
*** DONE update manual page to cover new behavior
** DONE Add analyzers for built-in decoders
   Analagous to flac(1)'s --analyze option,
   this will be an .analyze_frame() method that returns a Python dict
   of ints/lists/dicts containing frame data on each pass,
   or None at the stream's end.
   This will provide both an easier way to visualize the file's internals,
   and also a debugging aid.
*** DONE FlacDecoder
*** DONE SHNDecoder
*** DONE ALACDecoder
** DONE Add more examples
   A lot of handy new features aren't documented with examples and walkthroughs.
   Examples to add include:
- [X] a full multi-CD example, detailing the use of --album-number
- [X] an image embedding walkthrough
- [X] a CD image creation, splitting, burning example involving TOC/CUE files
- [X] an XMCD walkthrough with fetching, editing and tagging
** DONE Update documentation to cover concrete MetaData classes
   - [X] ApeTag
   - [X] FlacMetaData
   - [X] ID3v1Comment
   - [X] ID3v22Comment
   - [X] ID3v23Comment
   - [X] ID3v24Comment
   - [X] ID3CommentPair
   - [X] M4AMetaData
   - [X] VorbisComment
** DONE Ensure man pages install correctly on Mac OS X
** DONE add a %(basename)s --format attribute
   For example, given the path: "/foo/bar/01 - track name.mp3"
   the %(basename)s attribute would be: "01 - track name"
   allowing one to ignore its internal metadata entirely
   and use original names.
*** DONE Update AudioFile.track_name to support attribute
*** DONE Update tools that call AudioFile.track_name
    - [X] cd2track
    - [X] track2track
    - [X] trackrename
    - [X] tracksplit
*** DONE Update man pages for tools that call AudioFile.track_name
    - [X] track2track.1
    - [X] trackrename.1
    - [X] audiotools.cfg.5
*** DONE Add unit test support for new attribute
*** DONE Add documentation for new field to programming reference
*** DONE Add documentation for format strings to programming reference
** DONE Update AudioFile.track_name classmethod
   the previous behavior was a kludge cobbled together over time
   Its new call method is:  track_name(file_path, metadata, format)
   so that track_number and album_number can be pulled from file_path
   directly instead of passed in from outside.
*** DONE Update tools to support new calling method
    - [X] track2track
    - [X] cd2track
    - [X] trackrename
    - [X] tracksplit
*** DONE Update programming documentation
*** DONE Add unit tests
*** DONE Update old unit tests with new behavior
*** DONE unit test suffix field
** DONE Update Python code to support PEP 8
   Following accepted Python style should make the code more
   accessible and maintainable in the long run.
   It's also a good opportunity to clean up and simplify code
   without changing the actual API interface.
*** DONE Update core modules
**** DONE __aiff__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] IEEE_Extended
      - [X] AiffException
      - [X] AiffAudio
      - [X] AiffAudio.bits_per_sample
      - [X] AiffAudio.channels
      - [X] AiffAudio.channel_mask
      - [X] AiffAudio.lossless
      - [X] AiffAudio.total_frames
      - [X] AiffAudio.sample_rate
      - [X] AiffAudio.is_type
      - [X] AiffAudio.chunks
      - [X] AiffAudio.comm_chunk
      - [X] AiffAudio.chunk_files
      - [X] AiffAudio.get_metadata
      - [X] AiffAudio.set_metadata
      - [X] AiffAudio.delete_metadata
      - [X] AiffAudio.to_pcm
      - [X] AiffAudio.from_pcm
      - [X] AIFFChannelMask
      - [X] AIFFChannelMask.channels
**** DONE __ape__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] ApeTagItem
      - [X] ApeTagItem.build
      - [X] ApeTagItem.binary
      - [X] ApeTagItem.external
      - [X] ApeTagItem.string
      - [X] ApeTag
      - [X] ApeTag.converted
      - [X] ApeTag.merge
      - [X] ApeTag.supports_images
      - [X] ApeTag.add_image
      - [X] ApeTag.delete_image
      - [X] ApeTag.images
      - [X] ApeTag.read
      - [X] ApeTag.build
      - [X] ApeTaggedAudio
      - [X] ApeTaggedAudio.get_metadata
      - [X] ApeTaggedAudio.set_metadata
      - [X] ApeTaggedAudio.delete_metadata
      - [X] ApeAudio
      - [X] ApeAudio.is_type
      - [X] ApeAudio.lossless
      - [X] ApeAudio.supports_foreign_riff_chunks
      - [X] ApeAudio.has_foreign_riff_chunks
      - [X] ApeAudio.bits_per_sample
      - [X] ApeAudio.channels
      - [X] ApeAudio.total_frames
      - [X] ApeAudio.sample_rate
      - [X] ApeAudio.to_wave
      - [X] ApeAudio.from_wave
**** DONE __au__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] AuAudio
      - [X] AuAudio.is_type
      - [X] AuAudio.lossless
      - [X] AuAudio.bits_per_sample
      - [X] AuAudio.channels
      - [X] AuAudio.channel_mask
      - [X] AuAudio.sample_rate
      - [X] AuAudio.total_frames
      - [X] AuAudio.to_pcm
      - [X] AuAudio.from_pcm
      - [X] AuAudio.track_name
**** DONE __flac__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [ ] FlacException
      - [X] FlacMetaDataBlockTooLarge
      - [X] FlacMetaDataBlock
      - [X] FlacMetaDataBlock.build_block
      - [X] FlacMetaData
      - [X] FlacMetaData.converted
      - [X] FlacMetaData.merge
      - [X] FlacMetaData.add_image
      - [X] FlacMetaData.delete_image
      - [X] FlacMetaData.images
      - [X] FlacMetaData.metadata_blocks
      - [X] FlacMetaData.build
      - [X] FlacMetaData.supports_images
      - [X] FlacVorbisComment
      - [X] FlacVorbisComment.build_block
      - [X] FlacVorbisComment.converted
      - [X] FlacPictureComment
      - [X] FlacPictureComment.converted
      - [X] FlacPictureComment.type_string
      - [X] FlacPictureComment.build
      - [X] FlacPictureComment.build_block
      - [X] FlacCueSheet
      - [X] FlacCueSheet.build_block
      - [X] FlacCueSheet.converted
      - [X] FlacCueSheet.catalog
      - [X] FlacCueSheet.ISRCs
      - [X] FlacCueSheet.indexes
      - [X] FlacCueSheet.pcm_lengths
      - [X] FlacAudio
      - [X] FlacAudio.is_type
      - [X] FlacAudio.channel_mask
      - [X] FlacAudio.lossless
      - [X] FlacAudio.supports_foreign_riff_chunks
      - [X] FlacAudio.get_metadata
      - [X] FlacAudio.set_metadata
      - [X] FlacAudio.metadata_length
      - [X] FlacAudio.delete_metadata
      - [X] FlacAudio.set_cuesheet
      - [X] FlacAudio.get_cuesheet
      - [X] FlacAudio.to_pcm
      - [X] FlacAudio.from_pcm
      - [X] FlacAudio.has_foreign_riff_chunks
      - [X] FlacAudio.riff_wave_chunks
      - [X] FlacAudio.to_wave
      - [X] FlacAudio.from_wave
      - [X] FlacAudio.bits_per_sample
      - [X] FlacAudio.channels
      - [X] FlacAudio.total_frames
      - [X] FlacAudio.sample_rate
      - [X] FlacAudio.add_replay_gain
      - [X] FlacAudio.can_add_replay_gain
      - [X] FlacAudio.lossless_replay_gain
      - [X] FlacAudio.replay_gain
      - [X] FlacAudio.sub_pcm_tracks
      - [X] OggFlacAudio
      - [X] OggFlacAudio.is_type
      - [X] OggFlacAudio.get_metadata
      - [X] OggFlacAudio.set_metadata
      - [X] OggFlacAudio.metadata_length
      - [X] OggFlacAudio.to_pcm
      - [X] OggFlacAudio.from_pcm
      - [X] OggFlacAudio.sub_pcm_tracks
      - [X] OggFlacAudio.supports_foreign_riff_chunks
**** DONE __freedb__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] XMCDException
      - [X] XMCD
      - [X] XMCD.key_digits
      - [X] XMCD.build
      - [X] XMCD.read
      - [X] XMCD.read_data
      - [X] XMCD.from_files
      - [X] XMCD.from_cuesheet
      - [X] XMCD.metadata
      - [X] DiscID
      - [X] DiscID.from_cdda
      - [X] DiscID.add
      - [X] DiscID.offsets
      - [X] DiscID.length
      - [X] DiscID.idsuffix
      - [X] DiscID.freedb_id
      - [X] DiscID.toxmcd
      - [X] FreeDBException
      - [X] FreeDB
      - [X] FreeDB.connect
      - [X] FreeDB.close
      - [X] FreeDB.write
      - [X] FreeDB.read
      - [X] FreeDB.query
      - [X] FreeDB.read_data
      - [X] FreeDBWeb
      - [X] FreeDBWeb.connect
      - [X] FreeDBWeb.close
      - [X] FreeDBWeb.write
      - [X] FreeDBWeb.read
      - [X] FreeDBWeb.query
      - [X] FreeDBWeb.read_data
      - [X] get_xmcd
**** DONE __id3__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] UCS2Codec
      - [X] UCS2Codec.fix_char
      - [X] UCS2Codec.encode
      - [X] UCS2Codec.decode
      - [X] UnsupportedID3v2Version
      - [X] Syncsafe32
      - [X] UBInt24
      - [X] WidecharCStringAdapter
      - [X] UCS2CString
      - [X] UTF16CString
      - [X] UTF16BECString
      - [X] ID3v22Frame
      - [X] ID3v22Frame.build
      - [X] ID3v22Frame.parse
      - [X] ID3v22TextFrame
      - [X] ID3v22TextFrame.total
      - [X] ID3v22TextFrame.from_unicode
      - [X] ID3v22TextFrame.build
      - [X] ID3v22ComFrame
      - [X] ID3v22ComFrame.from_unicode
      - [X] ID3v22ComFrame.build
      - [X] ID3v22PicFrame
      - [X] ID3v22PicFrame.type_string
      - [X] ID3v22PicFrame.build
      - [X] ID3v22PicFrame.converted
      - [X] ID3v22Comment
      - [X] ID3v22Comment.add_image
      - [X] ID3v22Comment.delete_image
      - [X] ID3v22Comment.images
      - [X] ID3v22Comment.parse
      - [X] ID3v22Comment.converted
      - [X] ID3v22Comment.merge
      - [X] ID3v22Comment.build
      - [X] ID3v22Comment.skip
      - [X] ID3v22Comment.read_id3v2_comment
      - [X] ID3v23Frame
      - [X] ID3v23Frame.build
      - [X] ID3v23Frame.parse
      - [X] ID3v23TextFrame
      - [X] ID3v23TextFrame.total
      - [X] ID3v23TextFrame.from_unicode
      - [X] ID3v23TextFrame.build
      - [X] ID3v23PicFrame
      - [X] ID3v23PicFrame.build
      - [X] ID3v23PicFrame.converted
      - [X] ID3v23ComFrame
      - [X] ID3v23ComFrame.from_unicode
      - [X] ID3v23ComFrame.build
      - [X] ID3v23Comment
      - [X] ID3v23Comment.add_image
      - [X] ID3v23Comment.delete_image
      - [X] ID3v23Comment.images
      - [X] ID3v23Comment.build
      - [X] ID3v24Frame
      - [X] ID3v24Frame.build
      - [X] ID3v24Frame.parse
      - [X] ID3v24TextFrame
      - [X] ID3v24TextFrame.total
      - [X] ID3v24TextFrame.from_unicode
      - [X] ID3v24TextFrame.build
      - [X] ID3v24PicFrame
      - [X] ID3v24PicFrame.build
      - [X] ID3v24PicFrame.converted
      - [X] ID3v24ComFrame
      - [X] ID3v24ComFrame.from_unicode
      - [X] ID3v24ComFrame.build
      - [X] ID3v24Comment
      - [X] ID3v24Comment.build
      - [X] ID3CommentPair
      - [X] ID3CommentPair.converted
      - [X] ID3CommentPair.merge
      - [X] ID3CommentPair.images
      - [X] ID3CommentPair.add_image
      - [X] ID3CommentPair.delete_image
      - [X] ID3CommentPair.supports_images
**** DONE __id3v1__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] ID3v1Comment
      - [X] ID3v1Comment.read_id3v1_comment
      - [X] ID3v1Comment.build_id3v1
      - [X] ID3v1Comment.supports_images
      - [X] ID3v1Comment.converted
      - [X] ID3v1Comment.build_tag
      - [X] ID3v1Comment.images
**** DONE __image__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] image_metrics
      - [X] ImageMetrics
      - [X] InvalidImage
      - [X] InvalidJPEG
      - [X] InvalidPNG
      - [X] InvalidBMP
      - [X] InvalidGIF
      - [X] InvalidTIFF
      - [X] can_thumbnail
      - [X] thumbnail_formats
      - [X] thumbnail_image
**** DONE __init__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] __init__.py
      - [X] RawConfigParser
      - [X] RawConfigParser.get_default
      - [X] RawConfigParser.getint_default
      - [X] find_glade_file
      - [X] OptionParser
      - [X] Messenger
      - [X] str_width
      - [X] VerboseMessenger
      - [X] VerboseMessenger.output
      - [X] VerboseMessenger.partial_output
      - [X] VerboseMessenger.new_row
      - [X] VerboseMessenger.blank_row
      - [X] VerboseMessenger.divider_row
      - [X] VerboseMessenger.output_column
      - [X] VerboseMessenger.output_rows
      - [X] VerboseMessenger.info
      - [X] VerboseMessenger.partial_info
      - [X] VerboseMessenger.error
      - [X] VerboseMessenger.warning
      - [X] VerboseMessenger.usage
      - [X] VerboseMessenger.filename
      - [X] VerboseMessenger.ansi
      - [X] VerboseMessenger.ansi_err
      - [X] SilentMessenger
      - [X] SilentMessenger.output
      - [X] SilentMessenger.partial_output
      - [X] SilentMessenger.warning
      - [X] SilentMessenger.info
      - [X] SilentMessenger.partial_info
      - [X] UnsupportedFile
      - [X] InvalidFile
      - [X] InvalidFormat
      - [X] EncodingError
      - [X] UnsupportedChannelMask
      - [X] UnsupportedChannelCount
      - [X] DecodingError
      - [X] open
      - [X] open_files
      - [X] open_directory
      - [X] UnknownAudioType
      - [X] AmbiguousAudioType
      - [X] filename_to_type
      - [X] ChannelMask
      - [X] ChannelMask.defined
      - [X] ChannelMask.undefined
      - [X] ChannelMask.channels
      - [X] ChannelMask.index
      - [X] ChannelMask.from_fields
      - [X] ChannelMask.from_channels
      - [X] PCMReader
      - [X] PCMReader.read
      - [X] PCMReader.close
      - [X] PCMReaderError
      - [X] PCMReaderError.read
      - [X] PCMReaderError.close
      - [X] ReorderedPCMReader
      - [X] ReorderedPCMReader.read
      - [X] ReorderedPCMReader.close
      - [X] transfer_data
      - [X] transfer_framelist_data
      - [X] threaded_transfer_framelist_data
      - [X] pcm_cmp
      - [X] stripped_pcm_cmp
      - [X] pcm_frame_cmp
      - [X] PCMCat
      - [X] PCMCat.read
      - [X] PCMCat.close
      - [X] BufferedPCMReader
      - [X] BufferedPCMReader.close
      - [X] BufferedPCMReader.read
      - [X] pcm_split
      - [X] PCMConverter
      - [X] PCMConverter.read
      - [X] PCMConverter.close
      - [X] applicable_replay_gain
      - [X] calculate_replay_gain
      - [X] InterruptableReader
      - [X] InterruptableReader.stop
      - [X] InterruptableReader.send_data
      - [X] InterruptableReader.read
      - [X] ignore_sigint
      - [X] make_dirs
      - [X] MetaData
      - [X] MetaData.converted
      - [X] MetaData.supports_images
      - [X] MetaData.images
      - [X] MetaData.front_covers
      - [X] MetaData.back_covers
      - [X] MetaData.leaflet_pages
      - [X] MetaData.media_images
      - [X] MetaData.other_images
      - [X] MetaData.add_image
      - [X] MetaData.delete_image
      - [X] MetaData.merge
      - [X] AlbumMetaData
      - [X] AlbumMetaData.metadata
      - [X] MetaDataFileException
      - [X] Image
      - [X] Image.suffix
      - [X] Image.type_string
      - [X] Image.new
      - [X] Image.thumbnail
      - [X] ReplayGain
      - [X] UnsupportedTracknameField
      - [X] AudioFile
      - [X] AudioFile.is_type
      - [X] AudioFile.bits_per_sample
      - [X] AudioFile.channels
      - [X] AudioFile.channel_mask
      - [X] AudioFile.lossless
      - [X] AudioFile.set_metadata
      - [X] AudioFile.get_metadata
      - [X] AudioFile.delete_metadata
      - [X] AudioFile.total_frames
      - [X] AudioFile.cd_frames
      - [X] AudioFile.sample_rate
      - [X] AudioFile.to_pcm
      - [X] AudioFile.from_pcm
      - [X] AudioFile.to_wave
      - [X] AudioFile.from_wave
      - [X] AudioFile.supports_foreign_riff_chunks
      - [X] AudioFile.has_foreign_riff_chunks
      - [X] AudioFile.track_number
      - [X] AudioFile.album_number
      - [X] AudioFile.track_name
      - [X] AudioFile.add_replay_gain
      - [X] AudioFile.can_add_replay_gain
      - [X] AudioFile.lossless_replay_gain
      - [X] AudioFile.replay_gain
      - [X] AudioFile.set_cuesheet
      - [X] AudioFile.get_cuesheet
      - [X] AudioFile.has_binaries
      - [X] DummyAudioFile
      - [X] DummyAudioFile.get_metadata
      - [X] DummyAudioFile.cd_frames
      - [X] DummyAudioFile.track_number
      - [X] DummyAudioFile.sample_rate
      - [X] DummyAudioFile.total_frames
      - [X] SheetException
      - [X] read_sheet
      - [X] parse_timestamp
      - [X] build_timestamp
      - [X] sheet_to_unicode
      - [X] at_a_time
      - [X] CDDA
      - [X] RawCDDA
      - [X] RawCDDA.length
      - [X] RawCDDA.close
      - [X] RawCDDA.first_sector
      - [X] RawCDDA.last_sector
      - [X] OffsetCDDA
      - [X] OffsetCDDA.close
      - [X] CDTrackLog
      - [X] CDTrackReader
      - [X] CDTrackReader.offset
      - [X] CDTrackReader.length
      - [X] CDTrackReader.log
      - [X] CDTrackReader.read
      - [X] CDTrackReader.close
      - [X] OffsetCDTrackReader
      - [X] OffsetCDTrackReader.offset
      - [X] OffsetCDTrackReader.length
      - [X] OffsetCDTrackReader.log
      - [X] OffsetCDTrackReader.read
      - [X] OffsetCDTrackReader.close
      - [X] read_metadata_file
      - [X] ExecQueue
      - [X] ExecQueue.execute
      - [X] ExecQueue.run
      - [X] BitstreamReader
      - [X] BitstreamReader.byte_align
      - [X] BitstreamReader.read
      - [X] BitstreamReader.unread
      - [X] BitstreamReader.read_signed
      - [X] BitstreamReader.unary
      - [X] BitstreamReader.tell
      - [X] BitstreamReader.close
      - [X] BitstreamWriter
      - [X] BitstreamWriter.byte_align
      - [X] BitstreamWriter.write
      - [X] BitstreamWriter.write_signed
      - [X] BitstreamWriter.unary
      - [X] BitstreamWriter.tell
      - [X] BitstreamWriter.close
**** DONE __m4a_atoms__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] VersionLength
      - [X] AtomAdapter
      - [X] Atom
      - [X] AtomListAdapter
      - [X] AtomContainer
      - [X] AtomWrapper
**** DONE __m4a__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] M4AAudio_faac
      - [X] M4AAudio_faac.channel_mask
      - [X] M4AAudio_faac.is_type
      - [X] M4AAudio_faac.lossless
      - [X] M4AAudio_faac.channels
      - [X] M4AAudio_faac.bits_per_sample
      - [X] M4AAudio_faac.sample_rate
      - [X] M4AAudio_faac.cd_frames
      - [X] M4AAudio_faac.total_frames
      - [X] M4AAudio_faac.get_metadata
      - [X] M4AAudio_faac.set_metadata
      - [X] M4AAudio_faac.delete_metadata
      - [X] M4AAudio_faac.to_pcm
      - [X] M4AAudio_faac.from_pcm
      - [X] M4AAudio_faac.can_add_replay_gain
      - [X] M4AAudio_faac.lossless_replay_gain
      - [X] M4AAudio_faac.add_replay_gain
      - [X] M4AAudio_nero
      - [X] M4AAudio_nero.to_pcm
      - [X] M4AAudio_nero.from_pcm
      - [X] M4AAudio_nero.to_wave
      - [X] M4AAudio_nero.from_wave
      - [X] ILST_Atom
      - [X] M4AMetaData
      - [X] M4AMetaData.binary_atom
      - [X] M4AMetaData.text_atom
      - [X] M4AMetaData.trkn_atom
      - [X] M4AMetaData.disk_atom
      - [X] M4AMetaData.covr_atom
      - [X] M4AMetaData.images
      - [X] M4AMetaData.add_image
      - [X] M4AMetaData.delete_image
      - [X] M4AMetaData.converted
      - [X] M4AMetaData.merge
      - [X] M4AMetaData.to_atom
      - [X] M4AMetaData.supports_images
      - [X] M4ACovr
      - [X] M4ACovr.converted
      - [X] ALACAudio
      - [X] ALACAudio.is_type
      - [X] ALACAudio.total_frames
      - [X] ALACAudio.channel_mask
      - [X] ALACAudio.cd_frames
      - [X] ALACAudio.lossless
      - [X] ALACAudio.to_pcm
      - [X] ALACAudio.from_pcm
      - [X] ALACAudio.to_wave
      - [X] ALACAudio.from_wave
      - [X] ADTSException
      - [X] AACAudio
      - [X] AACAudio.is_type
      - [X] AACAudio.bits_per_sample
      - [X] AACAudio.channels
      - [X] AACAudio.lossless
      - [X] AACAudio.total_frames
      - [X] AACAudio.sample_rate
      - [X] AACAudio.to_pcm
      - [X] AACAudio.from_pcm
      - [X] AACAudio.aac_frames
      - [X] AACAudio.aac_frame_count
**** DONE __mp3__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] MP3Exception
      - [X] MP3Audio
      - [X] MP3Audio.is_type
      - [X] MP3Audio.lossless
      - [X] MP3Audio.to_pcm
      - [X] MP3Audio.from_pcm
      - [X] MP3Audio.bits_per_sample
      - [X] MP3Audio.channels
      - [X] MP3Audio.sample_rate
      - [X] MP3Audio.get_metadata
      - [X] MP3Audio.set_metadata
      - [X] MP3Audio.delete_metadata
      - [X] MP3Audio.cd_frames
      - [X] MP3Audio.total_frames
      - [X] MP3Audio.can_add_replay_gain
      - [X] MP3Audio.lossless_replay_gain
      - [X] MP3Audio.add_replay_gain
      - [X] MP2Audio
      - [X] MP2Audio.is_type
      - [X] MP2Audio.from_pcm
**** DONE __musepack__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] NutValue
      - [X] Musepack8StreamReader
      - [X] Musepack8StreamReader.packets
      - [X] MusepackAudio
      - [X] MusepackAudio.from_pcm
      - [X] MusepackAudio.is_type
      - [X] MusepackAudio.sample_rate
      - [X] MusepackAudio.total_frames
      - [X] MusepackAudio.channels
      - [X] MusepackAudio.bits_per_sample
      - [X] MusepackAudio.lossless
**** DONE __musicbrainz__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] get_xml_nodes
      - [X] get_xml_text_node
      - [X] reorder_xml_children
      - [X] MBDiscID
      - [X] MBDiscID.from_cdda
      - [X] MBDiscID.offsets
      - [X] MusicBrainz
      - [X] MusicBrainz.connect
      - [X] MusicBrainz.close
      - [X] MusicBrainz.read_data
      - [X] MBXMLException
      - [X] MusicBrainzReleaseXML
      - [X] MusicBrainzReleaseXML.read
      - [X] MusicBrainzReleaseXML.read_data
      - [X] MusicBrainzReleaseXML.metadata
      - [X] MusicBrainzReleaseXML.from_files
      - [X] MusicBrainzReleaseXML.from_cuesheet
      - [X] MusicBrainzReleaseXML.build
      - [X] get_mbxml
**** DONE __shn__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] ShortenAudio
      - [X] ShortenAudio.is_type
      - [X] ShortenAudio.bits_per_sample
      - [X] ShortenAudio.channels
      - [X] ShortenAudio.channel_mask
      - [X] ShortenAudio.lossless
      - [X] ShortenAudio.total_frames
      - [X] ShortenAudio.sample_rate
      - [X] ShortenAudio.to_pcm
      - [X] ShortenAudio.from_pcm
      - [X] ShortenAudio.to_wave
      - [X] ShortenAudio.from_wave
      - [X] ShortenAudio.supports_foreign_riff_chunks
      - [X] ShortenAudio.has_foreign_riff_chunks
**** DONE __speex__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] UnframedVorbisComment
      - [X] SpeexAudio
      - [X] SpeexAudio.is_type
      - [X] SpeexAudio.to_pcm
      - [X] SpeexAudio.from_pcm
      - [X] SpeexAudio.set_metadata
      - [X] SpeexAudio.can_add_replay_gain
**** DONE __vorbiscomment__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] VorbisComment
      - [X] VorbisComment.supports_images
      - [X] VorbisComment.images
      - [X] VorbisComment.converted
      - [X] VorbisComment.merge
      - [X] VorbisComment.build
**** DONE __vorbis__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] OggStreamReader
      - [X] OggStreamReader.close
      - [X] OggStreamReader.packets
      - [X] OggStreamReader.pages
      - [X] OggStreamReader.pages_to_packets
      - [X] OggStreamReader.calculate_ogg_checksum
      - [X] OggStreamWriter
      - [X] OggStreamWriter.close
      - [X] OggStreamWriter.write_page
      - [X] OggStreamWriter.build_pages
      - [X] VorbisAudio
      - [X] VorbisAudio.is_type
      - [X] VorbisAudio.lossless
      - [X] VorbisAudio.bits_per_sample
      - [X] VorbisAudio.channels
      - [X] VorbisAudio.channel_mask
      - [X] VorbisAudio.total_frames
      - [X] VorbisAudio.sample_rate
      - [X] VorbisAudio.to_pcm
      - [X] VorbisAudio.from_pcm
      - [X] VorbisAudio.set_metadata
      - [X] VorbisAudio.get_metadata
      - [X] VorbisAudio.delete_metadata
      - [X] VorbisAudio.add_replay_gain
      - [X] VorbisAudio.can_add_replay_gain
      - [X] VorbisAudio.lossless_replay_gain
      - [X] VorbisAudio.replay_gain
      - [X] VorbisChannelMask
      - [X] VorbisChannelMask.channels
**** DONE __wavpack__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] SymlinkPCMReader
      - [X] SymlinkPCMReader.read
      - [X] SymlinkPCMReader.close
      - [X] SymlinkPCMReader.new
      - [X] WavePackAPEv2
      - [X] WavePackAPEv2.converted
      - [X] WavPackAudio
      - [X] WavPackAudio.is_type
      - [X] WavPackAudio.lossless
      - [X] WavPackAudio.supports_foreign_riff_chunks
      - [X] WavPackAudio.channel_mask
      - [X] WavPackAudio.get_metadata
      - [X] WavPackAudio.has_foreign_riff_chunks
      - [X] WavPackAudio.frames
      - [X] WavPackAudio.sub_frames
      - [X] WavPackAudio.bits_per_sample
      - [X] WavPackAudio.channels
      - [X] WavPackAudio.total_frames
      - [X] WavPackAudio.sample_rate
      - [X] WavPackAudio.from_pcm
      - [X] WavPackAudio.to_wave
      - [X] WavPackAudio.to_pcm
      - [X] WavPackAudio.from_wave
      - [X] WavPackAudio.add_replay_gain
      - [X] WavPackAudio.can_add_replay_gain
      - [X] WavPackAudio.replay_gain
      - [X] WavPackAudio.get_cuesheet
      - [X] WavPackAudio.set_cuesheet
**** DONE __wav__.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] WaveReader
      - [X] WaveReader.read
      - [X] WaveReader.close
      - [X] TempWaveReader
      - [X] TempWaveReader.close
      - [X] WavException
      - [X] WaveAudio
      - [X] WaveAudio.is_type
      - [X] WaveAudio.lossless
      - [X] WaveAudio.supports_foreign_riff_chunks
      - [X] WaveAudio.has_foreign_riff_chunks
      - [X] WaveAudio.channel_mask
      - [X] WaveAudio.to_pcm
      - [X] WaveAudio.from_pcm
      - [X] WaveAudio.to_wave
      - [X] WaveAudio.from_wave
      - [X] WaveAudio.total_frames
      - [X] WaveAudio.sample_rate
      - [X] WaveAudio.channels
      - [X] WaveAudio.bits_per_sample
      - [X] WaveAudio.can_add_replay_gain
      - [X] WaveAudio.lossless_replay_gain
      - [X] WaveAudio.add_replay_gain
      - [X] WaveAudio.track_name
      - [X] WaveAudio.fmt_chunk_to_channel_mask
      - [X] WaveAudio.chunk_ids
      - [X] WaveAudio.chunks
      - [X] WaveAudio.wave_from_chunks
      - [X] WaveAudio.pcm_split
**** DONE cue.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] cue.py
      - [X] CueException
      - [X] tokens
      - [X] get_value
      - [X] parse
      - [X] Cuesheet
      - [X] Cuesheet.catalog
      - [X] Cuesheet.single_file_type
      - [X] Cuesheet.indexes
      - [X] Cuesheet.pcm_lengths
      - [X] Cuesheet.ISRCs
      - [X] Cuesheet.file
      - [X] Track
      - [X] Track.ISRC
      - [X] read_cuesheet
**** DONE toc.py
***** DONE adjust syntax
***** DONE add docstrings
      - [X] toc.py
      - [X] TOCException
      - [X] parse
      - [X] TOCFile
      - [X] TOCFile.catalog
      - [X] TOCFile.indexes
      - [X] TOCFile.pcm_lengths
      - [X] TOCFile.ISRCs
      - [X] TOCFile.file
      - [X] Track
      - [X] Track.ISRC
      - [X] read_tocfile
*** DONE Update utilities
    - [X] audiotools-config
    - [X] cd2track
    - [X] cd2xmcd
    - [X] cdinfo
    - [X] coverdump
    - [X] coverview
    - [X] editxmcd
    - [X] record2track
    - [X] track2cd
    - [X] track2track
    - [X] track2xmcd
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
*** DONE Update tests
    - [X] test.py
    - [X] test_streams.py
** DONE Update C code to support PEP 7
   - [X] array.c
   - [X] array.h
   - [X] bitstream_r.c
   - [X] bitstream_r.h
   - [X] bitstream_w.c
   - [X] bitstream_w.h
   - [X] cdiomodule.c
   - [X] decoders.c
   - [X] decoders.h
   - [X] encoders.c
   - [X] encoders.h
   - [X] md5.c
   - [X] md5.h
   - [X] pcm.c
   - [X] pcm.h
   - [X] pcmreader.c
   - [X] pcmreader.h
   - [X] replaygain.c
   - [X] replaygain.h
   - [X] resample.c
   - [X] resample.h
   - [X] decoders/alaac.c
   - [X] decoders/alac.h
   - [X] decoders/flac.c
   - [X] decoders/flac_crc.c
   - [X] decoders/flac_crc.h
   - [X] decoders/flac.h
   - [X] decoders/shn.c
   - [X] decoders/shn.h
   - [X] encoders/alac.c
   - [X] encoders/alac.h
   - [X] encoders/alac_lpc.c
   - [X] encoders/alac_lpc.h
   - [X] encoders/flac.c
   - [X] encoders/flac.h
   - [X] encoders/flac_lpc.c
   - [X] encoders/flac_lpc.h
   - [X] encoders/shn.c
   - [X] encoders/shn.h
** DONE Add ALAC support
*** DONE Build ALAC decoder
**** DONE Add audiotools.decoders.AlacDecoder object
**** DONE Add frame header parsing
**** DONE Add subframe header parsing
**** DONE Add wasted-bits block parsing
**** DONE Add residual decoding
**** DONE Ensure frame footer is checked
**** DONE Decode subframes
**** DONE Perform channel decorrelation
     - [X] leftweight zero
     - [X] leftweight nonzero
**** DONE Handle wasted-bits samples
**** DONE Return pcm.FrameList objects on calls to read()
**** DONE Ensure PCMReader-compatible fields are present
     - [X] sample_rate
     - [X] channels
     - [X] channel_mask
     - [X] bits_per_sample
**** DONE Ensure 16/24 bps streams work correctly
     - [X] 16bps
     - [X] 24bps
**** DONE Ensure 1/2 channel streams work correctly
     - [X] 1 channel
     - [X] 2 channels
**** DONE Ensure different sample rates work correctly
     - [X] 44100Hz
     - [X] 48000Hz
     - [X] 96000Hz
     - [X] 192000Hz
     (need to figure out what other sample rates ALAC supports)
**** DONE Update source to more closely match documentation
**** DONE Optimize for speed
*** DONE Build ALAC encoder
**** DONE Add audiotools.encoders.encode_alac function
**** DONE Ensure verbatim ALAC file is written correctly
**** DONE Determine ALAC stream tunables
***** wasted bits for 24bps streams
***** interlacing shift
***** interlacing leftweight
***** prediction quantitization
***** coefficients
**** DONE extract wasted bits for 24bps streams
**** DONE correlate stereo samples
**** DONE determine coefficients/quantitization
**** DONE calculate residual values
**** DONE write residuals based on initial history/history multiplier/etc.
**** DONE handle random noise with uncompressed frames
**** DONE handle atypical sample rates properly
**** DONE Update source to more closely match documentation
**** DONE make interlacing shift and interlacing leftweight range options
**** DONE optimize for speed
*** DONE Add ALACAudio type to audiotools Python core
*** DONE Enable TestAlacAudio core tests
*** DONE Add ALAC-specific unit tests
**** DONE test_streams
**** DONE test_small_files
**** DONE test_full_scale_deflection
**** DONE test_sines
     eliminate DeprecationWarning at construct/core.py:541
     which seems to be caused by 96000Hz input
**** DONE test_wasted_bps
**** DONE test_blocksizes
**** DONE test_frame_header_variations
**** DONE test_noise
**** DONE test_fractional
*** DONE Document ALAC
**** DONE the ALAC file stream
**** DONE ALAC decoding
***** DONE Frame header
***** DONE Subframe header
***** DONE Residual decoding
***** DONE Residual decoding example
***** DONE Subframe decoding
      Simplify this to make it easier to understand
***** DONE Subframe decoding example
***** DONE Channel decorrelation
***** DONE Channel decorrelation example
***** DONE Wasted bits
***** DONE Wasted bits example
**** DONE ALAC encoding
***** DONE Figure out compliant atom contents
      - [X] ftyp
      - [X] moov->mvhd
      - [X] moov->trak->tkhd
      - [X] moov->trak->mdia->mdhd
      - [X] moov->trak->mdia->hdlr
      - [X] moov->trak->mdia->minf->smhd
      - [X] moov->trak->mdia->dinf->dref
      - [X] moov->trak->mdia->stbl->stsd->alac
      - [X] moov->trak->mdia->stbl->stts
      - [X] moov->trak->mdia->stbl->stsc
      - [X] moov->trak->mdia->stbl->stsz
      - [X] moov->trak->mdia->stbl->stco
      - [X] moov->udta->meta
      - [X] free
***** DONE Add forward references in "alac" atom description
***** DONE figure out if "meta" has required "----" sub-atoms
***** DONE extracting wasted bits for 24bps streams
***** DONE correlating stereo samples
***** DONE determining coefficients/quantitization
****** DONE Windowing
****** DONE Computing autocorrelation
****** DONE LP coefficient calculation
****** DONE Best order estimation
****** DONE Quantizing coefficients
***** DONE calculating residual values
      Simplify this to make it easier to understand
***** DONE writing residuals based on initial history/history multiplier/etc.
***** DONE Fix bitstream figs to be monospace font for binary digits
**** DONE verify A4 layout is correct
*** DONE Update M4A metadata routines to exploit "free" atoms
    As with FLAC, rewriting the entire file should be avoided
*** DONE Fix InvalidImage exceptions when reading test ALACs
*** DONE Ensure UnsupportedChannels exception is handled by user-level tools
*** DONE Ensure new ALACs work in iTunes
*** DONE Ensure new ALACs work on iPods
*** DONE Have M4A files group properly on iTunes/iPods
** DONE Remove xdelta requirement
   It's doesn't compile well on some platforms and is only used by tracklint
*** DONE Build trivial binary delta routine
    Since most metadata formats make use of padding,
    we can use a simple XOR over their contents to generate
    a bidirectional patch that's optimized for tracklint's behavior.
    Since the bulk of such a patch should be NULLs,
    we can compress it with zlib/bz2 and achieve
    excellent compression.
** DONE Tweak documentation
*** DONE Update indexes to account for warm-up samples
    The i index on the left and right hand sides must match.
    - [X] FLAC FIXED decoding
    - [X] FLAC LPC decoding
    - [X] FLAC FIXED encoding
    - [X] FLAC LPC encoding
*** DONE Rewrite the FLAC channel assignment section
    Reference the side channel extra bit and add examples.
*** DONE Add FLAC channel assignment encoding documentation
    Show its channel calculations and include an example.
** DONE indicate ReplayGain capabilities/binaries
   audiotools-config(1) should show what ReplayGain binaries are present
   and all audio classes that support it
** DONE update trackcmp to share trackverify's output interface
** DONE Add unary jump tables with a max value
   Since both Apple Lossless *and* WavPack have unary reading
   with a maximum upper limit of read bits, it makes sense
   to build a proper jump table for it.
   The size of our state limits the maximum to 8 bits,
   so larger maximums will be supported at a read_limited_unary() level.

   The trouble is, we need to differentiate between normal exits
   (we've hit the stop bit) and exits that hit the maximum value.
   So, the jump table itself must have a different syntax
   (probably an extra bit for "maximum value reached")
   and read_limited_unary() will likely return -1 in that event.
** DONE Add little-endian bitstream readers
*** DONE integrate read functions into Bitstream struct
*** DONE add bitstream.py jump tables for little-endian reading
    - [X] read_bits_table_le.h
    - [X] read_unary_table_le.h
    - [X] read_limited_unary_table_le.h
    - [X] unread_bit_table_le.h
*** DONE add little-endian Bitstream functions
    - [X] bs_read_bits_le
    - [X] bs_read_bits64_le
    - [X] bs_unread_bit_le
    - [X] bs_read_unary_le
    - [X] bs_read_limited_unary_le
*** DONE have bs_open() attach the proper endian functions
*** DONE update Python BitstreamReader for little-endian operation
    This should function similar to the C one,
    with alignment specified at init-time.
    Or, perhaps replace Python reader with C-based one altogether.
*** DONE add some basic Bitstream reader unit testing
*** DONE allow endianness swapping
** DONE Add little-endian bitstream writers
*** DONE add bitstream.py jump tables for little-endian writing
    - [X] write_bits_table_le.h
    - [X] write_unary_table_le.h
*** DONE Add little-endian Bitstream functions
    - [X] write_bits_actual_le
    - [X] write_signed_bits_actual_le
    - [X] write_bits64_actual_le
    - [X] write_unary_actual_le
    - [X] byte_align_w_actual_le
*** DONE have bs_open() attach the proper endian functions
*** DONE update Python BitstreamWriter for little-endian operation
    Convert to a C type, similar to BitstreamReader
*** DONE add some basic Bitstream writer unit testing
*** DONE allow endianness swapping
** DONE integrate new endianness routines into existing routines
*** DONE Convert Ogg verifier to proper little-endian operation
*** DONE Swap endianness for proper FLAC VORBISCOMMENT writing
*** DONE have bs_set_endianness create instruction in recorder-mode
    So that if we're recording an endianness shift,
    it gets set properly when "played back" to an actual writer.
    In fact, it may be a good idea to attach the set_endianness()
    function to the bitstream writer itself.
** DONE Build proper AlbumMetaDataFile class
   This is a superclass of FreeDB's XMCD and MusicBrainz's XML
   which wraps metadata containers into a consistent interface
   for use by editxmcd and command-line utilities.
*** DONE Convert XMCD to AlbumMetaDataFile subclass
*** DONE Add unit tests for XMCD
*** DONE Convert MusicBrainzReleaseXML to AlbumMetaDataFile subclass
*** DONE Add unit tests for MusicBrainzReleaseXML
*** DONE Update utilities to use new interface
    - [X] tracksplit
    - [X] track2track
    - [X] track2xmcd
    - [X] trackrename
    - [X] tracktag
    - [ ] editxmcd
    - [X] cd2track
    - [X] cd2xmcd
*** DONE Update old unit tests to new interface
*** DONE Fix get_track to return blank artist name if not present
    Don't pull from the class artist name;
    have track_metadata() figure that out as appropriate instead.
**** DONE Fix unit tests for proper behavior
*** DONE Document AlbumMetaDataFile
** DONE Update ALAC to handle multichannel audio
   What David Hammerton's reverse-engineered decoder described as
   a 3-bit frame footer isn't; it's actually a "stop" delimiter
   analagous to WavPack's block header stop bit.
   If it's not 0x7, keep reading frames and combine them
   channel-wise into a single multichannel chunk of output.

   iTunes and iPods still won't be able to handle such files,
   but XLD should be able to.
*** DONE Update ALACDecoder's analyze_frame() method for multichannel
*** DONE Update ALACDecoder's read() method for multichannel
*** DONE Update encode_alac function for multichannel
*** DONE Unit test multichannel ALAC encoding and decoding
*** DONE Update decoding documentation describing multichannel handling
*** DONE Update encoding documentation describing multichannel handling
** DONE Add higher sampling rate support to ReplayGain module
   Extract the higher rates from wvgain.c
   - [X] 8000Hz
   - [X] 11025Hz
   - [X] 12000Hz
   - [X] 16000Hz
   - [X] 18900Hz
   - [X] 22050Hz
   - [X] 24000Hz
   - [X] 32000Hz
   - [X] 37800Hz
   - [X] 44100Hz
   - [X] 48000Hz
   - [X] 56000Hz
   - [X] 64000Hz
   - [X] 88200Hz
   - [X] 96000Hz
   - [X] 112000Hz
   - [X] 128000Hz
   - [X] 144000Hz
   - [X] 176400Hz
   - [X] 192000Hz
*** DONE Unit test sample rates
** DONE Allow audio type defaults to be selectable
*** DONE Update tools to pull -t from config file
    - [X] cd2track
    - [X] record2track
    - [X] track2track
    - [X] trackcat
    - [X] tracksplit
*** DONE Update tools to pull -q from config file
    - [X] cd2track
    - [X] record2track
    - [X] track2track
    - [X] trackcat
    - [X] tracksplit
*** DONE Update audio formats to pull default quality from config file (if any)
    for all calls to from_pcm() and from_wave()
    - [X] aac
    - [X] flac
    - [X] m4a (Nero)
    - [X] m4a (faac)
    - [X] mp2
    - [X] mp3
    - [X] oga
    - [X] ogg
    - [X] spx
    - [X] wv
*** DONE Update audiotools-config to display default type
*** DONE Update audiotools-config to display default qualities
*** DONE Update audiotools-config to select default type
*** DONE Update audiotools-config to select default quality for a type
*** DONE Document new configuration options in man pages
    - [X] audiotools-config
    - [X] cd2track
    - [X] record2track
    - [X] track2track
    - [X] trackcat
    - [X] tracksplit
    - [X] audiotools.cfg
** DONE Allow default verbosity to be selectable
*** DONE Update audiotools-config to display default verbosity
*** DONE Update audiotools-config to select default verbosity
*** DONE Update tools to use default verbosity
    - [X] cd2track
    - [X] cd2xmcd
    - [X] coverdump
    - [X] record2track
    - [X] track2cd
    - [X] track2track
    - [X] track2xmcd
    - [X] trackcmp
    - [X] tracklint
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
*** DONE Document new configuration option in man pages
    - [X] audiotools-config
    - [X] audiotools.cfg
** DONE Shift common decoder/encoder routines to a common/ directory
   - [X] flac_crc.h
   - [X] flac_crc.c
   - [X] misc.h
   - [X] misc.c
   - [X] md5.h
   - [X] md5.c
** DONE Get coverview and editxmcd working on Mac OS X
*** DONE editxmcd
**** DONE Update man page
*** DONE Update coverview for dual PyGTK/Tkinter operation
    It's a simple enough app that it should be able to conditionally do both,
    especially since audiotools does most of the heavy lifting.
    This allows it to look like a proper app under X11
    and work at all everywhere else.

    It should look and function approximately the same on both.
**** DONE Remove glade requirement
     I'm sick of glade, and coverview should be small enough
     that it's not a problem to lay it out internally.
**** DONE Update coverview for PyGTK
**** DONE Update coverview for Tkinter
***** DONE Fixup error messages, if possible
**** DONE Add --gtk/--tkinter switches for conditional launch
     For testing purposes
**** DONE Cleanup conditional classes/helper functions
**** DONE Check for init-time errors
     Both in loading audiofiles and in import problems
     such as Mac OS's 32-bit problem
**** DONE Update man page
** DONE More graceful handling of broken files
   A lot of the track handlers assume that once the start of the file is good,
   the rest of it is following the spec.  This is not always the case.
*** DONE All audio formats need to implement the error specification
    This means that:
    classmethod.is_type() must never error
    __init__() must raise InvalidFile if the filename's contents are invalid
    to_pcm() must return PCMReaderError if the decoder can't be built
    classmethod.from_pcm() must raise EncodingError if it can't encode file
    to_wave() must raise EncodingError if a wave can't be written
    classmethod.from_wave() must raise EncodingError if it can't encode file
    a failed to_wave() mustn't leave half-encoded .wav files behind
    a failed from_wave() mustn't leave half-encoded .wav files behind
    a failed from_pcm() mustn't leave a partially encoded file behind
    PCMReaders may raise IOError and ValueError on read()
    PCMReaders may raise DecodingError on close()
**** DONE AACAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE AiffAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE ALACAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE AuAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE FlacAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE M4AAudio_faac
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
**** DONE M4AAudio_nero
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE MP2Audio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE MP3Audio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE OggFlacAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE ShortenAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE SpeexAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
**** DONE VorbisAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE WaveAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
**** DONE WavPackAudio
     - [X] is_type() doesn't error
     - [X] __init__() raises InvalidFile
     - [X] to_pcm() returns PCMReaderError on decoder error
     - [X] from_pcm() raises EncodingError on encoder error
     - [X] to_wave() raises EncodingError on decoder error
     - [X] from_wave() raises EncodingError on encoder error
     - [X] failed to_wave() deletes partial file
     - [X] failed from_wave() deletes partial file
     - [X] failed from_pcm() deletes partial file
     - [X] PCMReader raises IOError/ValueError on read() if necessary
     - [X] PCMReader raises DecodingError on close() if necessary
*** DONE Check for invalid files at the tool level
    If an invalid file is encountered, display a proper
    user-readable error message explaining what's wrong
    with the file.
**** DONE track2cd
**** DONE track2track
**** DONE trackcat
**** DONE trackcmp
**** DONE trackplay
**** DONE tracksplit
*** DONE Document ValueError/IOError behavior
    Both in docstrings and in the rst documentation.
** DONE Add a convert() method to AudioFile subclasses
   Something like:

   audiofile.convert(target_path,
                     target_class,
                     quality=None)

   so one could perform a call like:

   audiotools.open("infile.flac").convert("outfile.mp3", audiotools.MP3Audio)

   Which would perform the proper to_pcm()/from_pcm()/to_wave()/from_wave()
   calls as necessary and could be overloaded to handle specific
   conversion processes, like AIFF->Shorten with a different set of
   IFF chunks.
*** DONE Deprecate wave-specific methods from base AudioFile class
    These methods might still be present, but only on classes that
    have specific need of them.
    - [X] to_wave()
    - [X] from_wave()
    - [X] supports_foreign_riff_chunks()
    - [X] has_foreign_riff_chunks()
*** DONE Convert classes to proper WaveContainer/AiffContainer subclasses
    - [X] FlacAudio
    - [X] OggFlacAudio (should *not* be a WaveContainer/AiffContainer subclass)
    - [X] WaveAudio
    - [X] AiffAudio
    - [X] WavPackAudio
    - [X] ShortenAudio
*** DONE Update old tests to reflect removed methods
*** DONE Update audio formats with convert() short-circuiting as needed
*** DONE Add unit tests for convert() methods
**** DONE Add unit tests which convert() every type to every other type
**** DONE Add unit tests to ensure foreign chunks are converted
*** DONE Update track2track to exploit convert() method
*** DONE Update documentation
**** DONE Add convert() documentation
**** DONE Remove wave-specific documentation
** DONE Update trackverify for multiprocess support
   I'll need some interprocess communication (probably pipes and select)
   to return the results from child processes for totals calculation.
*** DONE Update man page
*** DONE Document ExecQueue2
** DONE Update trackcmp for multiprocess support
*** DONE Update man page
*** DONE Update unit tests to account for -j flag
** DONE Update encoders for thread nonblocking
*** DONE encode_alac
*** DONE encode_flac
*** DONE encode_shn
*** DONE encode_wavpack
** DONE get trackplay working on Mac OS X
   There must be some way to pipe PCM data to its audio system
   without the need for additional libraries.
** DONE Remove -v option to mv(1) for file renaming
   This can be emulated in software.
** DONE Update audiotools.CDDA class
*** DONE Support reading offsets
    Without the horrible hack of reading the whole disc at once
*** DONE Document audiotools.CDDA class
*** DONE Document PCMReaderWindow class
** DONE Add support for System->cdrom_offset
   This will automatically apply offset samples when reading CDs
   so that rips will have the appropate amount of null samples.
*** DONE Add offset support when ripping
    Automatically apply the configfile's cdrom_offset value to tracks
    during reading.
*** DONE Add offset support when burning?
    cd2track and track2cd should round-trip properly
    If cd2track applies a sample offset when reading, does track2cd
    need to apply that same offset when writing?
    One would presume a drive's read offset and write offset are the same,
    but that may not be correct.
** DONE Add support for more lame encoding options
   Although the numerical presets are recommended,
   one should also be able to use the --preset values
   - [X] medium
   - [X] standard
   - [X] extreme
   - [X] insane
** DONE Remove wavegain for applying ReplayGain to .wav files
   This should be done internally instead.
** DONE Add more verbosity to --quality settings
   For formats with varying quality, the "-q help" option
   should indicate what those settings represent.
   - [X] FlacAudio
   - [X] M4AAudio_Nero
   - [X] MP2Audio
   - [X] MP3Audio
   - [X] OggFlacAudio
   - [X] SpeexAudio
   - [X] VorbisAudio
   - [X] WavPackAudio
*** DONE Update tools to indicate quality settings
    - [X] audiotools-config
    - [X] cd2track
    - [X] dvda2track
    - [X] record2track
    - [X] track2track
    - [X] trackcat
    - [X] tracksplit
** DONE Have coverdump build leading directories as needed
** DONE Add -T / --thumbnail option to tracktag
*** DONE Add option to tracktag man page
** DONE Convert ReplayGainReader to C
   The Python implementation simply uses too many CPU cycles,
   which can cause trackplay to stutter on hi-def files.
*** DONE Add audiotools.replaygain.ReplayGainReader object
**** DONE Add sample_rate attribute
**** DONE Add channels attribute
**** DONE Add channel_mask attribute
**** DONE Add bits_per_sample attribute
**** DONE Add read() method
**** DONE Add close() method
*** DONE Convert references to audiotools.ReplayGainReader
*** DONE Update documentation
** DONE Have the *2xmcd utilities delete .xmcd files if cancelled
   - [X] cd2xmcd
   - [X] dvda2xmcd
   - [X] track2xmcd
*** DONE Fix the *2xmcd utilities to use the proper mode on output files
** DONE Add software-based routines for bitstream reading/writing
   These should be optional, at least, for the bitstream writer especially.
   But if fast enough, they could replace the jump tables entirely.
*** DONE bitstream_w.h
    - [X] write_bits_actual_be
    - [X] write_bits_actual_le
    - [X] write_unary_actual_be
    - [X] write_unary_actual_le
** DONE Add individual tag item removal option to tracktag
   - [X] --remove-name
   - [X] --remove-artist
   - [X] --remove-performer
   - [X] --remove-composer
   - [X] --remove-conductor
   - [X] --remove-album
   - [X] --remove-catalog
   - [X] --remove-number
   - [X] --remove-track-total
   - [X] --remove-album-number
   - [X] --remove-album-total
   - [X] --remove-ISRC
   - [X] --remove-media-type
   - [X] --remove-year
   - [X] --remove-date
   - [X] --remove-copyright
   - [X] --remove-comment
*** DONE Unit test tag item addition/removal
*** DONE Update man page with new options
** DONE Add progess indicator to various utilities
   This will likely require an ExecQueue update which can
   receive progress output from multiple subprocesses
   so that the total progress can be generated.
   - [X] track2track
   - [X] cd2track
   - [X] dvda2track
   - [X] tracksplit
   - [X] trackcat
   - [X] trackcmp
   - [X] trackverify
   - [X] tracktag (for ReplayGain)
*** DONE Update AudioFile.convert() with a progress callback option
*** DONE Update AudioFile.add_replay_gain() with a progress callback option
    - [X] AudioFile
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP3Audio
    - [X] VorbisAudio
    - [X] WavPackAudio
    - [X] WaveAudio
*** DONE Update programming documentation with progress callback option
*** DONE Update AudioFile.verify() with a progress callback option
    - [X] AACAudio
    - [X] ALACAudio
    - [X] AiffAudio
    - [X] AuAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] ShortenAudio
    - [X] SpeexAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
    - [X] WaveAudio
*** DONE Add documentation for progress indicators and infrastructure
** DONE Add tool list and documentation to website
   I should probably find a way to either format the man pages
   to HTML directly (though groff's html output has been unfortunate
   in the past) or find an intermediate format that generates
   both man pages and web pages.
   - [X] audiotools-config
   - [X] audiotools.cfg
   - [X] cd2xmcd
   - [X] cdinfo
   - [X] cdplay
   - [X] cd2track
   - [X] coverdump
   - [X] coverview
   - [X] dvda2track
   - [X] dvda2xmcd
   - [X] dvdainfo
   - [X] editxmcd
   - [X] track2cd
   - [X] track2track
   - [X] track2xmcd
   - [X] trackcat
   - [X] trackcmp
   - [X] trackinfo
   - [X] tracklength
   - [X] tracklint
   - [X] trackplay
   - [X] trackrename
   - [X] tracksplit
   - [X] tracktag
   - [X] trackverify
*** DONE Build reStructuredText output
** DONE Add options for ID3v2/ID3v1 tagging
   Perhaps add config file options and corresponding audiotools-config options.
*** DONE Make ID3v2 version selectable
    Either ID3v2.2/ID3v2.3/ID3v2.4/none
*** DONE Make ID3v1 version selectable
    ID3v1.0/ID3v1.1/none
*** DONE Make ID3v2 track number formatting adjustable
    Allow leading 0s, since the spec doesn't forbid them.
*** DONE Display current ID3 info in audiotools-config
*** DONE Add ID3v2.2 option to audiotools-config
*** DONE Add ID3v1 option to audiotools-config
*** DONE Add ID3 number padding to audiotools-config
*** DONE Document new audiotools-config options in man page
*** DONE Document new audiotools config options on website
** DONE Add C-based FLAC encoder
*** DONE Use VERBATIM subframes when necessary
*** DONE Add significant initial padding blocks
    This will save a lot of time during retagging after FLAC creation
*** DONE Add a variety of unit tests
    - [X] test_stream.sh
    - [X] test_flac.sh
*** DONE Convert i_array size and data types to typedefs
*** DONE Convert f_array size and data types to typedefs
*** DONE Add more comprehensive encoding documentation
*** DONE Add a variety of assert() statements
    As with unit tests, these ensure everything is working during testing
    without a performance penalty at runtime.
*** DONE Handle foreign RIFF chunks
*** DONE Ensure FLACs work on a variety of other decoders
    Although decoding properly on the reference decoder *should* guarantee
    the file works everywhere, the only way to be certain is to test it.
*** DONE Ensure encoder raises the proper exceptions
*** DONE Support Rice2 partitions?
    The reference encoder uses these for more efficient handling of 24-bit audio
    but I'm not sure they're strictly necessary for my more basic encoder.
*** DONE Support wasted-bits-per-sample?
    I don't think I've ever seen these used on actual audio data
    that isn't artificial and hasn't been processed specifically for its use.
    As with Rice2, it's something that may get added later.
*** DONE Handle multi-channel PCM data correctly
    Anything higher than 2 channels needs to set a channel mask
    and the vorbis comment to the proper value.
    I expect this will be a long-term project
    coinciding with re-engineering the to_pcm()/from_pcm() methods.
*** DONE Remove external MD5 dependency
*** DONE Generate SEEKTABLE blocks
** DONE Add UTF-8 to FLAC documentation
*** DONE Explain how to decode a UTF-8 value
*** DONE Explain how to encode a UTF-8 value
** DONE Add C-based FLAC decoder
*** DONE Add a variety of unit tests
*** DONE Handle Rice escape codes
    Not sure how to test these, but they should be handled properly.
*** DONE Ensure decoder raises the proper exceptions
*** DONE Handle empty MD5 sums correctly
    If the MD5SUM is 00000000000000000000000000000000
    it's never a mismatch and should not trigger an error.
**** DONE Update tracklint to populate an empty MD5 sum
**** DONE Add unit tests
***** DONE Ensure an empty MD5 doesn't trigger an error at read time
***** DONE Ensure an empty MD5 doesn't trigger an error at verify time
***** DONE Ensure tracklint populates an empty MD5 correctly
** DONE Add substream support to bitstream reader
   Its function is to allow one to pull pieces out of a larger bitstream
   and process them separately.
   For example, while parsing an Ogg stream's pages with one bitstream,
   the extracted Vorbis packets could be processed with smaller substreams -
   including substreams that span one or more pages.
   It's also potentially helpful for MP3, Ogg FLAC, DVD-A and any other format
   with nontrivial wrappers that need to be parsed seperately
   from the main bitstream.
*** DONE Implement substream reader methods
**** DONE bs_read_bits_s_be
**** DONE bs_read_bits_s_le
**** DONE bs_read_signed_bits_s_be
**** DONE bs_read_signed_bits_s_le
**** DONE bs_read_bits64_s_be
**** DONE bs_read_bits64_s_le
**** DONE bs_skip_bits_s_be
**** DONE bs_skip_bits_s_le
**** DONE bs_read_unary_s_be
**** DONE bs_read_unary_s_le
**** DONE bs_read_limited_unary_s_be
**** DONE bs_read_limited_unary_s_le
**** DONE bs_set_endianness_s_be
**** DONE bs_set_endianness_s_le
**** DONE bs_read_huffman_code_s
**** DONE bs_mark_s
**** DONE bs_rewind_s
**** DONE bs_unmark_s
**** DONE bs_close_stream_s
**** DONE bs_substream_new
**** DONE bs_substream_f_be
**** DONE bs_substream_f_le
**** DONE bs_substream_p_be
**** DONE bs_substream_p_le
**** DONE bs_substream_s_be
**** DONE bs_substream_s_le
**** DONE bs_substream_append_f
**** DONE bs_substream_append_p
**** DONE bs_substream_append_s
*** DONE Add substream and substream_append to stream initializers
**** DONE bs_open
     - [X] substream
     - [X] substream_append
**** DONE bs_open_python
     - [X] substream
     - [X] substream_append
*** DONE Update current endianness setters with substream method
**** DONE bs_set_endianness_f_be
**** DONE bs_set_endianness_f_le
**** DONE bs_set_endianness_p_be
**** DONE bs_set_endianness_p_le
*** DONE Add garbage collection to substream
    It should be possible to create a substream, process it partway,
    then append more data to it without causing any overflow problems.
    That is, data at the beginning of the buffer will be recycled
    at append time if it hasn't been marked for rewinding back to.
*** DONE Add Python interface to substream
**** DONE audiotools.decoders.BitstreamReader.substream
**** DONE audiotools.decoders.BitstreamReader.substream_append
*** TODO Add unit tests to substream
** DONE Check objects for invalid init calls
   If an init fails, the subsequent dealloc call shouldn't segfault Python.
*** DONE audiotools.bitstream
    - [X] BitstreamAccumulator
    - [X] BitstreamReader
    - [X] BitstreamRecorder
    - [X] BitstreamWriter
*** DONE audiotools.cdio
    - [X] CDDA
    - [X] CDImage
*** DONE audiotools.decoders
    - [X] ALACDecoder
    - [X] AOBPCMDecoder
    - [X] FlacDecoder
    - [X] MLPDecoder
    - [X] OggFlacDecoder
    - [X] SHNDecoder
    - [X] Sine_Mono
    - [X] Sine_Simple
    - [X] Sine_Stereo
    - [X] WavPackDecoder
*** DONE audiotools.pcm
    - [X] FrameList
    - [X] FloatFrameList
*** DONE audiotools.resample
    - [X] Resampler
** DONE Update BitstreamWriter to work on Python objects
   That is, anything with a .write() and .close() method,
   similar to how BitstreamReader operates.
** DONE Calculate multi-album ReplayGain concurrently
   For instance, if one is calculating --replay-gain for four seperate
   albums and -j 4 is indicated, calculate each album's gain across
   its own core using the existing ProgressQueue facilities.
*** DONE track2track
*** DONE tracktag
**** DONE update man page with -j option
** DONE Adjust FlacMetaData to store blocks internally in order
   That is, they should output in the same order that they are stored on disk.
*** DONE Add size() method to FLAC blocks
    This returns the size of the block data, not including its 32-bit header
    - [X] Flac_STREAMINFO
    - [X] Flac_VORBISCOMMENT
    - [X] Flac_PICTURE
    - [X] Flac_APPLICATION
    - [X] Flac_SEEKTABLE
    - [X] Flac_CUESHEET
    - [X] Flac_PADDING
*** DONE FlacMetaData
    - [X] __init__
    - [X] __setattr__
    - [X] __getattr__
    - [X] __delattr__
    - [X] converted
    - [X] merge
    - [X] add_image
    - [X] delete_image
    - [X] images
    - [X] clean
    - [X] __repr__
    - [X] parse
    - [X] raw_info
    - [X] blocks
    - [X] build
*** DONE FlacAudio
    - [X] channel_mask
    - [X] get_metadata
    - [X] update_metadata
    - [X] set_metadata
    - [X] set_cuesheet
    - [X] get_cuesheet
    - [X] has_foreign_riff_chunks
    - [X] riff_wave_chunks
    - [X] from_wave
    - [X] has_foreign_aiff_chunks
    - [X] from_aiff
    - [X] aiff_chunks
    - [X] add_replay_gain
    - [X] replay_gain
    - [X] clean
*** DONE OggFlacMetaData
    - [X] converted
    - [X] __repr__
    - [X] parse
    - [X] build
*** DONE OggFlacAudio
    - [X] channel_mask
    - [X] update_metadata
    - [X] replay_gain
** DONE Have tracklint add channel mask info to hi-def FLAC files
   If omitted.  Fix cases in which the tag is missing
   from the VORBISCOMMENT block, or the VORBISCOMMENT block
   is absent altogether.
*** DONE Add unit test
*** DONE Add fix to man page
** DONE Update FLAC/Vorbis to support TOTALTRACKS field for track_total
   This seems to be catching on as a standard.
   The best solution may be to implement a set of "fallback" fields
   such that a single metadata field may use a number of
   different Vorbis comment names and the first match is used.
*** DONE Preserve TOTALTRACKS when updating track_total
*** DONE Add unit tests to ensure TOTALTRACKS works
** DONE Don't port ReplayGain tags with AudioFile.set_metadata()
   That is, if we perform:

   >>> track1 = audiotools.open("file1")
   >>> track2 = audiotools.open("file2")
   >>> track1.set_metadata(track2.get_metadata())
   >>> track1.replay_gain() != track2.replay_gain()
   True

   For all audio formats that store ReplayGain as embedded tags
*** DONE Update formats
    - [X] FlacAudio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
*** DONE Add unit tests
    - [X] FlacAudio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
** DONE Have MetaData.converted() always return a new object
   The following should hold for all metadata objects:

   >>> a = MetaData(track_name=u"Foo")
   >>> b = MetaData.converted(a)
   >>> b.track_name = u"Bar"
   >>> a.track_name != b.track_name
   True
*** DONE Update MetaData classes
**** DONE ApeTag
**** DONE FlacMetaData
**** DONE ID3CommentPair
**** DONE ID3v1Comment
**** DONE ID3v22Comment
     - [X] ID3v22_Frame
     - [X] ID3v22_TXX_Frame
     - [X] ID3v22_COM_Frame
     - [X] ID3v22_PIC_Frame
**** DONE ID3v23Comment
     - [X] ID3v23_Frame
     - [X] ID3v23_TXXX_Frame
     - [X] ID3v23_COMM_Frame
     - [X] ID3v23_APIC_Frame
**** DONE ID3v24Comment
     - [X] ID3v24_Frame
     - [X] ID3v24_TXXX_Frame
     - [X] ID3v24_COMM_Frame
     - [X] ID3v24_APIC_Frame
**** DONE M4A_META_Atom
     - [X] M4A_Tree_Atom
     - [X] M4A_Leaf_Atom
     - [X] M4A_META_Atom
     - [X] M4A_FREE_Atom
     - [X] M4A_HDLR_Atom
     - [X] M4A_ILST_Leaf_Atom
     - [X] M4A_ILST_COVR_Data_Atom
     - [X] M4A_ILST_DISK_Data_Atom
     - [X] M4A_ILST_TRKN_Data_Atom
     - [ ] M4A_ILST_Unicode_Data_Atom
**** DONE MetaData
**** DONE OggFlacMetaData
**** DONE VorbisComment
*** DONE Update documentation for converted()'s behavior
*** DONE Add unit tests to all MetaData classes
    - [X] ApeTag
    - [X] FlacMetaData
    - [X] ID3CommentPair
    - [X] ID3v1Comment
    - [X] ID3v22Comment
    - [X] ID3v23Comment
    - [X] ID3v24Comment
    - [X] M4A_META_Atom
    - [X] MetaData
    - [X] OggFlacMetaData
    - [X] VorbisComment
** DONE Add better ID3v2 documentation
   Do a full explanation for frames one will find in nature.
   Don't be too concerned about obscure frames no one ever uses.
   | Frame                       | ID3v2.2 | ID3v2.3 | ID3v2.4 |
   |-----------------------------+---------+---------+---------|
   | all text                    | T__     | T___    | T___    |
   | all web                     | W__     | W___    | W___    |
   | picture                     | PIC     | APIC    | APIC    |
   | comment                     | COM     | COMM    | COMM    |
   | general encapsulated object | GEO     | GEOB    | GEOB    |
   | unsynchronized lyrics       | ULT     | USLT    | USLT    |
*** DONE ID3v2.2
    - [X] COM
    - [X] GEO
    - [X] PIC
    - [X] TAL
    - [X] TBP
    - [X] TCM
    - [X] TCO
    - [X] TCR
    - [X] TDA
    - [X] TDY
    - [X] TEN
    - [X] TFT
    - [X] TIM
    - [X] TKE
    - [X] TLA
    - [X] TLE
    - [X] TMT
    - [X] TOA
    - [X] TOF
    - [X] TOL
    - [X] TOR
    - [X] TOT
    - [X] TP1
    - [X] TP2
    - [X] TP3
    - [X] TP4
    - [X] TPA
    - [X] TPB
    - [X] TRC
    - [X] TRD
    - [X] TRK
    - [X] TSI
    - [X] TSS
    - [X] TT1
    - [X] TT2
    - [X] TT3
    - [X] TXT
    - [X] TXX
    - [X] TYE
    - [X] ULT
    - [X] WAF
    - [X] WAR
    - [X] WAS
    - [X] WCM
    - [X] WCP
    - [X] WPB
    - [X] WXX
*** DONE ID3v2.3
    - [X] APIC
    - [X] COMM
    - [X] GEOB
    - [X] TALB
    - [X] TBPM
    - [X] TCOM
    - [X] TCON
    - [X] TCOP
    - [X] TDAT
    - [X] TDLY
    - [X] TENC
    - [X] TEXT
    - [X] TFLT
    - [X] TIME
    - [X] TIT1
    - [X] TIT2
    - [X] TIT3
    - [X] TKEY
    - [X] TLAN
    - [X] TLEN
    - [X] TMED
    - [X] TOAL
    - [X] TOFN
    - [X] TOLY
    - [X] TOPE
    - [X] TORY
    - [X] TOWN
    - [X] TPE1
    - [X] TPE2
    - [X] TPE3
    - [X] TPE4
    - [X] TPOS
    - [X] TPUB
    - [X] TRCK
    - [X] TRDA
    - [X] TRSN
    - [X] TRSO
    - [X] TSIZ
    - [X] TSRC
    - [X] TSSE
    - [X] TXXX
    - [X] TYER
    - [X] USLT
    - [X] WCOM
    - [X] WCOP
    - [X] WOAF
    - [X] WOAR
    - [X] WOAS
    - [X] WORS
    - [X] WPAY
    - [X] WPUB
    - [X] WXXX
*** DONE ID3v2.4
    - [X] APIC
    - [X] COMM
    - [X] GEOB
    - [X] TALB
    - [X] TBPM
    - [X] TCOM
    - [X] TCON
    - [X] TCOP
    - [X] TDEN
    - [X] TDLY
    - [X] TDOR
    - [X] TDRC
    - [X] TDRL
    - [X] TDTG
    - [X] TENC
    - [X] TEXT
    - [X] TFLT
    - [X] TIPL
    - [X] TIT1
    - [X] TIT2
    - [X] TIT3
    - [X] TKEY
    - [X] TLAN
    - [X] TLEN
    - [X] TMCL
    - [X] TMED
    - [X] TMOO
    - [X] TOAL
    - [X] TOFN
    - [X] TOLY
    - [X] TOPE
    - [X] TOWN
    - [X] TPE1
    - [X] TPE2
    - [X] TPE3
    - [X] TPE4
    - [X] TPOS
    - [X] TPRO
    - [X] TPUB
    - [X] TRCK
    - [X] TRSN
    - [X] TRSO
    - [X] TSOA
    - [X] TSOP
    - [X] TSOT
    - [X] TSRC
    - [X] TSSE
    - [X] TSST
    - [X] TXXX
    - [X] USLT
    - [X] WCOM
    - [X] WCOP
    - [X] WOAF
    - [X] WOAR
    - [X] WOAS
    - [X] WORS
    - [X] WPAY
    - [X] WPUB
    - [X] WXXX
** DONE Adjust ID3v2 to store frames internally in order
   That is, they should output in the same order that they are stored on disk.
*** DONE Rebuild and simplify the ID3v2 frame handling
    Create a simple "frame protocol" which the frames can implement
    and the ID3v2 formats can use so that they parse/build consistently.
**** DONE is_latin_1
**** DONE UCS2Codec
**** DONE decode_syncsafe32
**** DONE encode_syncsafe32
**** DONE __padded_number_pair__
**** DONE __unpadded_number_pair__
**** DONE __number_pair__
**** DONE decode_ascii_c_string
**** DONE encode_ascii_c_string
**** DONE read_id3v2_comment()
     convert to standalone function
**** DONE skip_id3v2_comment()
     convert to standalone function
**** DONE ID3v22Comment
     - [X] __repr__
     - [X] parse
     - [X] build
     - [X] size
     - [X] __len__
     - [X] __getitem__
     - [X] __setitem__
     - [X] __delitem__
     - [X] keys
     - [X] values
     - [X] items
     - [X] __getattr__
     - [X] __setattr__
     - [X] __delattr__
     - [X] raw_info
     - [X] add_image
     - [X] delete_image
     - [X] images
     - [X] converted
     - [X] clean
***** DONE ID3v22_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
      - [X] raw_info
***** DONE ID3v22_TXX_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __unicode__
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] number
      - [X] total
      - [X] raw_info
      - [X] clean
***** DONE ID3v22_PIC_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __getattr__
      - [X] __setattr__
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] raw_info
      - [X] clean
***** DONE ID3v22_COM_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __unicode__
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] raw_info
      - [X] clean
**** DONE ID3v23Comment
     - [X] __repr__
     - [X] parse
     - [X] build
     - [X] size
     - [X] __len__
     - [X] __getitem__
     - [X] __setitem__
     - [X] __delitem__
     - [X] keys
     - [X] values
     - [X] items
     - [X] __setattr__
     - [X] __getattr__
     - [X] __delattr__
     - [X] raw_info
     - [X] add_image
     - [X] delete_image
     - [X] images
     - [X] converted
     - [X] clean
***** DONE ID3v23_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
***** DONE ID3v23_TXXX_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __unicode__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
      - [X] number
      - [X] total
***** DONE ID3v23_APIC_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __getattr__
      - [X] __setattr__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
***** DONE ID3v23_COMM_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __unicode__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
**** DONE ID3v24Comment
     - [X] __repr__
     - [X] parse
     - [X] build
     - [X] size
     - [X] __len__
     - [X] __getitem__
     - [X] __setitem__
     - [X] __delitem__
     - [X] keys
     - [X] values
     - [X] items
     - [X] __setattr__
     - [X] __getattr__
     - [X] __delattr__
     - [X] raw_info
     - [X] add_image
     - [X] delete_image
     - [X] images
     - [X] converted
     - [X] clean
***** DONE ID3v24_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
***** DONE ID3v24_TXXX_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __unicode__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
      - [X] number
      - [X] total
***** DONE ID3v24_APIC_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __getattr__
      - [X] __setattr__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
***** DONE ID3v24_COMM_Frame
      - [X] __init__
      - [X] __repr__
      - [X] __eq__
      - [X] __unicode__
      - [X] raw_info
      - [X] parse
      - [X] build
      - [X] size
      - [X] converted
      - [X] clean
*** DONE Ensure they pass unit tests
*** DONE Ensure UCS-2 C strings are handled correctly
    For UCS-2/UTF-16 encoding, the string should end on 2 NULL bytes
    - [X] ID3v22_COM_Frame
    - [X] ID3v22_PIC_Frame
    - [X] ID3v23_COMM_Frame
    - [X] ID3v23_APIC_Frame
    - [X] ID3v24_COMM_Frame
    - [X] ID3v24_APIC_Frame
*** DONE Handle user-defined text frames properly
    - [X] ID3v22_TXX_Frame
    - [X] ID3v23_TXXX_Frame
    - [X] ID3v24_TXXX_Frame
*** DONE Handle web link frames properly
    - [X] ID3v22_W__Frame
    - [X] ID3v23_W___Frame
    - [X] ID3v24_W___Frame
*** DONE Handle user-defined web link frames properly
    - [X] ID3v22_WXX_Frame
    - [X] ID3v23_WXXX_Frame
    - [X] ID3v24_WXXX_Frame
*** DONE Handle text frames with embedded NULLs
    According to the spec, anything after the first decoded NULL
    should be ignored and not displayed.
    - [X] ID3v22_T__Frame
    - [X] ID3v22_TXX_Frame
    - [X] ID3v23_T___Frame
    - [X] ID3v23_TXXX_Frame
    - [X] ID3v24_T___Frame
    - [X] ID3v24_TXXX_Frame
*** DONE Update tests to always check required/prohibited leading zeroes
    - [X] ID3v22Comment
    - [X] ID3v23Comment
    - [X] ID3v24Comment
** DONE Eliminate the MetaData.merge() method
   The idea of this method is to provide some sort of precedence
   which combining metadata from two sources.
   For example, in track2track, we want provided XMCD metadata
   to override metadata inside the track itself.
   The .merge() method takes a raw MetaData object from XMCD
   and merges it with non-blank fields from the original file
   which means the XMCD metadata is the "base" of sorts.

   A cleaner approach would be to take the raw MetaData object from XMCD,
   get a list of its non-empty fields and call __setattr__ on
   the track's metadata to update those fields.

   MetaData with the highest priority would call __setattr__ last.
*** DONE Remove method from MetaData and subclasses
    - [X] ApeTag
    - [X] FlacMetaData
    - [X] ID3v22Comment
    - [X] ID3v23Comment
    - [X] ID3v24Comment
    - [X] ID3CommentPair
    - [X] M4A_META_Atom
    - [X] MetaData
    - [X] VorbisComment
*** DONE Remove method from tools
    - [X] track2track
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
*** DONE Remove method from documentation
*** DONE Remove method from tests
** DONE Have trackinfo display metadata fields by default
   Instead of displaying the low-level info,
   show fields like "track name", "album name", etc.
   unless a -R/--raw flag is indicated.
*** DONE Replace MetaData.comment_pairs() with MetaData.raw_info()
    This should be even lower level than it is now, and unsorted.
    - [X] ApeTag
    - [X] FlacMetaData
    - [X] ID3CommentPair
    - [X] ID3v1Comment
    - [X] ID3v22Comment
    - [X] ID3v23Comment
    - [X] ID3v24Comment
    - [X] M4A_META_Atom
    - [X] OggFlacMetaData
    - [X] VorbisComment
**** DONE Document MetaData.raw_info() method
*** DONE Convert MetaData.__unicode__() to display fields by name
    This should always use the higher level implementation
    and sort fields by name.
*** DONE Update trackinfo to use MetaData's unicode output by default
*** DONE Add -L/--low-level option to trackinfo
*** DONE Add -L/--low-level option to trackinfo.1
*** DONE Add consistent embedded cuesheet display
*** DONE Update unit tests
** DONE Make metadata fully round-trippable
   For instance, the following should hold:

   >>> track_data1 = open(track.filename).read()
   >>> track.update_metadata(track.get_metadata())
   >>> track_data2 = open(track.filename).read()
   >>> track_data1 == track_data2
   True

   This requires metadata to not jumble fields around until required.
** DONE Don't populate empty track_name, ISRC values during tracksplit
** DONE Fix ALAC channel assignment
   Since the channel assignment is detailed in the specs,
   add proper support for them.
*** DONE Update ALACAudio.channel_mask() method
*** DONE Update ALACAudio.from_pcm() method
    Like FLAC, it should reject unsupported channel masks.
*** DONE Update py_decoders.ALACDecoder's .channel_mask attribute
*** DONE Update py_decoders.ALACDecoder's .read() method
    Convert ALAC channel order to Wave channel order internally
    rather than punt that task to a reordering wrapper.
*** DONE Update py_encoders.encode_mdat
    Convert Wave channel order to ALAC channel order internally
    rather than punt that task to a reordering wrapper.
*** DONE Update decoders.ALACDecoder's .channel_mask attribute
*** DONE Update decoders.ALACDecoder's .read() method
    Convert ALAC channel order to Wave channel order internally
    rather than punt that task to a reordering wrapper.
*** DONE Update encoders.encode_alac
    Convert Wave channel order to ALAC channel order internally
    rather than punt that task to a reordering wrapper.
*** DONE Add unit tests to ensure channel variants encode/decode correctly
    - [X] 1 channel
    - [X] 2 channels
    - [X] 3 channels
    - [X] 4 channels
    - [X] 5 channels
    - [X] 6 channels
    - [X] 7 channels
    - [X] 8 channels
**** DONE Add unit tests to ensure invalid channel counts aren't encoded
**** DONE Add unit tests to ensure invalid channel masks aren't encoded
** DONE Add Python-based file encoders
   Like the Python-based decoders,
   these provide simple reference implementations
   one can easily pull apart to see how the encoders work.
*** DONE py_encoders/encode_flac
*** DONE py_encoders/encode_shn
*** DONE py_encoders/encode_alac
*** DONE py_encoders/encode_wavpack
** DONE Cleanup Shorten for better accuracy
*** DONE Handle 8-bit files correctly
    waves are unsigned, aiffs are signed, Sun AU is ?
    - [X] update py_decoders.SHNDecoder
    - [X] update decoders.SHNDecoder
    - [X] update py_encoders.encode_shn
    - [X] update encoders.encode_shn
    - [X] update __shn__.py
    - [X] update documentation
*** DONE Handle multichannel Shn/AIFF files correctly
**** DONE Ensure multichannel files converted from AIFF work
     Their channels should be kept in whatever order AIFF happens to use
     rather than have them remapped to wave order.
**** DONE Ensure multichannel Shn/AIFF to PCM works
     Output channels should be rearranged to PCMReader order.
*** DONE Improve thread friendliness in decoder/encoder
    - [X] decoders/shn.c
    - [X] encoders/shn.h
** DONE Overhaul array.h
   Just as the bitstream module benefits from having a good design,
   the array module would also be better served by having
   a more elegant API.

   The main goal is to have less function variants and
   data allocation/deallocation routines to remember.
   Something like:

   array = new_int_array();
   array->append(array, value);
   array->del(array);

   which always functions the same whether we're dealing with ints or
   floats or other arrays, yet is still type-checked at compile-time.
*** DONE Better unify FrameList <-> array_ia routines
*** DONE Remove old src/decoders/pcm.h src/decoders/pcm.c module
    Use the unified pcmconv.h module instead
    - [X] mlp.c
    - [X] shn.c
    - [X] sine.c
*** DONE Replace old array.h with new one in all source files
    - [X] decoders/mlp.h
    - [X] decoders/shn.h
    - [X] decoders/sine.h
    - [X] decoders/wavpack.h
    - [X] encoders/alac.h
    - [X] encoders/shn.h
    - [X] encoders/wavpack.h
*** DONE Remove old array.h
*** DONE Replace array2.h with array.h in all source files
** DONE Make second pass through updated documentation
*** DONE Update introduction
**** DONE re-explain endianness
**** DONE explain pseudocode with actual code examples
*** DONE Convert writes to a systax consistent with reads
    var <- read 10 unsigned bits
    var -> write 10 unsigned bits
    - [X] alac.tex
    - [X] flac.tex
    - [X] shorten.tex
    - [X] wavpack.tex
*** DONE Convert for loops to a consistent assignment syntax
    for i <- 0 to x do
       <code block>
    - [X] alac.tex
    - [X] dvda2.tex
    - [X] flac.tex
    - [X] shorten.tex
    - [X] wavpack.tex
*** DONE Double-check codecs for consistency
    - [X] alac.tex
    - [X] dvda2.tex
    - [X] flac.tex
    - [X] shorten.tex
    - [X] wavpack.tex
*** DONE Add hyperref linking
    If one's browsing the PDF,
    one should be able to click on operations directly
    and go to a specific part of the doc.
    - [X] alac.tex
    - [X] dvda2.tex
    - [X] flac.tex
    - [X] shorten.tex
    - [X] wavpack.tex
** DONE Tweak track labeling interactive mode for better usability
   make return key move to the next line
** DONE Combine and simplify DVD-A decoding and documentation
   The current routine bounces back and forth between Python and C
   several times in order to generate output, overcomplicating the design.
   I'd prefer to have a simpler, low-level, random-access reader hooked directly
   to the DVDATrack object - analagous to audiotools.cdda.CDDA.
** DONE Overhaul decoding/encoding documentation
   It needs to be cleaned up so one can better follow the entire
   decoding process, as well as the entire encoding process.
   Use a mix of pseudocode, bit diagrams, bit parsing diagrams
   and examples so that it can be followed with as little effort as possible.
*** DONE FLAC
**** DONE decoding
**** DONE encoding
*** DONE ALAC
**** DONE decoding
**** DONE encoding
*** DONE WavPack
**** DONE decoding
**** DONE encoding
*** DONE Shorten
**** DONE decoding
**** DONE encoding
*** DONE DVD-A
**** DONE decoding
* DONE Finish version 2.18
** DONE Ensure audiotools works on FreeBSD
   the unprotection module, in particular, needs additional testing
** DONE Ensure excessive zero residuals don't overflow output buffers
   Certain formats provide "escape code" blocks of zeroes.
   Ensure these routines don't generate more zeroes than are allowed
   (either accidentally or deliberately).
*** DONE ALACDecoder
*** DONE WavPackDecoder
** DONE Cleaup documentation layout
   Add subdirectories for format figures.
** DONE Spellcheck reference docs
   - [X] introduction.tex
   - [X] basics.tex
   - [X] wav.tex
   - [X] aiff.tex
   - [X] au.tex
   - [X] shorten.tex
   - [X] flac.tex
   - [X] wavpack.tex
   - [X] ape.tex
   - [X] mp3.tex
   - [X] m4a.tex
   - [X] alac.tex
   - [X] vorbis.tex
   - [X] oggflac.tex
   - [X] speex.tex
   - [X] musepack.tex
   - [X] dvda2.tex
   - [X] freedb.tex
   - [X] musicbrainz.tex
   - [X] replaygain.tex
** DONE Make ReplayGain a configurable option
   Even tag-based ReplayGain should be something
   users can turn on or off globally via audiotools-config
*** DONE add audiotools-config option
**** DONE document in audiotools-config man page
*** DONE update tools to use option
    - [X] cdtrack
    - [X] dvda2track
    - [X] track2track
    - [X] tracksplit
** DONE Add progress to track2cd audio file conversion
   - [X] CD quality, embedded cuesheet
   - [X] non-CD quality, embedded cuesheet
   - [X] CD quality, external cuesheet
   - [X] non-CD quality, external cuesheet
   - [X] CD quality, multiple files
   - [X] non-CD quality, multiple files
** DONE Improve .wav performance
   don't read entire data chunk by default
** DONE Integrate MusicBrainz/FreeDB lookup with cd2track/dvda2track
   The two step extraction process is a relic from when I'd do
   batch lookups via modem.
   Combining metadata querying with extraction lets me perform more
   powerful lookups than are possible by using XMCD/XML file intermediaries.

   However, CD lookups may be still be wrong.
   Therefore, it's essential to have a simple, interactive
   track metadata editor so that this data is very easy to populate.
*** DONE Add multi-track interactive editing mode to tracktag
**** DONE Update man page
*** DONE Build unified metadata selection widget for interactive modes
    This is something that can be run while a disc is being extracted
    or a track is being split which will drop the user back
    into a progress indicator once completed and then
    tag/rename the resulting tracks.
*** DONE Add MusicBrainz/FreeDB lookup options to audiotools-config
    It should be possible to decide whether to query either or both
    as a config option.
*** DONE Query MusicBrainz for album_number/album_total info
    Given a particular disc ID, there must be some way to pull
    the disc's album_number/album_total off MusicBrainz's servers
    if it's one of a series of discs.
*** DONE Add pre-extraction metadata lookup to tracksplit
**** DONE Update man page
*** DONE Add pre-extraction metadata lookup to cd2track
**** DONE Update man page with new options
*** DONE Add pre-extraction metadata lookup to dvda2track
**** DONE Update man page with new options
*** DONE Update cdinfo to use new ID calculation routines
    Ensure they handle the FreeDB test disc properly.
*** DONE Add pre-play metadata lookup to cdplay
**** DONE Update man page
*** DONE Add album-number/album-total options to tracksplit
    Allow these values to be populated at split-time
    if none can be found in metadata services
**** DONE Update man page
*** DONE Update album-number/album-total options in cd2track
*** DONE Remove xmcd-specific options
    Automatic CD lookup should be folded into utilites as needed.
    - [X] cd2track
    - [X] cdplay
    - [X] dvda2track
    - [X] track2track
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
*** DONE Remove xmcd-specific tools
    - [X] cd2xmcd
    - [X] dvda2xmcd
    - [X] editxmcd
    - [X] track2xmcd
*** DONE Update unit tests
    - [X] cd2track
    - [X] dvda2track
    - [X] tracksplit
*** DONE Deprecate xmcd-specific modules
    Since metadata lookup handles files internally,
    there's no need for metadata file handling classes/functions
    at the Python level.
**** DONE Update documentation to indicate deprecation
** DONE Adjust album_number/track_number heuristics
   these should be last-resort fields that apply
   *only* if a track has no metadata of any kind
** DONE Don't port cuesheets with AudioFile.set_metadata()
   This is mostly for WavPack since it embeds cuesheet data
   in the APEv2 tag.
   - [X] FlacAudio
   - [X] OggFlacAudio
   - [X] WavPackAudio
** DONE Ensure overly-long files are handled correctly
   That is, anything larger than a .wav can typically handle
*** DONE wave should fail with error
*** DONE aiff should fail with error
*** DONE au should fail with error
*** DONE flac should work
*** DONE ogg flac should work
*** DONE wavpack should work
*** DONE alac should work
*** DONE shorten shouldn't begin
    requires verbatim wave or aiff chunks
    which can't be created because
    the amount of PCM data is too large
** DONE Fix FLAC embedded cuesheets
** DONE Ensure files are PEP8-compliant
*** DONE check user-level scripts
    - [X] audiotools-config
    - [X] cd2track
    - [X] cdinfo
    - [X] cdplay
    - [X] coverdump
    - [X] coverview
    - [X] dvda2track
    - [X] dvdainfo
    - [X] record2track
    - [X] track2cd
    - [X] track2track
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
    - [X] setup.py
*** DONE check audiotools module
    - [X] __aiff__.py
    - [X] __ape__.py
    - [X] __au__.py
    - [X] __dvda__.py
    - [X] __flac__.py
    - [X] __freedb__.py
    - [X] __id3__.py
    - [X] __id3v1__.py
    - [X] __image__.py
    - [X] __init__.py
    - [X] __m4a__.py
    - [X] __m4a_atoms__.py
    - [X] __mp3__.py
    - [X] __musepack__.py
    - [X] __musicbrainz__.py
    - [X] __ogg__.py
    - [X] __shn__.py
    - [X] __vorbis__.py
    - [X] __vorbiscomment__.py
    - [X] __wav__.py
    - [X] __wavpack__.py
    - [X] cue.py
    - [X] delta.py
    - [X] freedb.py
    - [X] musicbrainz.py
    - [X] player.py
    - [X] toc.py
    - [X] ui.py
*** DONE check audiotools.py_decoders module
    - [X] __init__.py
    - [X] alac.py
    - [X] flac.py
    - [X] shn.py
    - [X] wavpack.py
*** DONE check audiotools.py_encoders module
    - [X] __init__.py
    - [X] alac.py
    - [X] flac.py
    - [X] shn.py
    - [X] wavpack.py
*** DONE check test
    - [X] test.py
    - [X] test_core.py
    - [X] test_formats.py
    - [X] test_metadata.py
    - [X] test_streams.py
    - [X] test_utils.py
** DONE Double-check reference docs one last time
*** DONE Ensure pages break correctly in letter mode
*** DONE Ensure pages break correctly in A4 mode
** DONE Fix FLAC seektable generation
   Ensure new seektables are aligned properly.
*** DONE Ensure proper seektable written on from_pcm
*** DONE Add .offsets() method to FlacDecoder
    Instead of decoding the file, this walks through it
    and returns a list of absolute file offsets of all frames.
*** DONE Add method to generate Flac_SEEKTABLE from offset list
*** DONE Add tracklint check/fix for mis-aligned seektables
*** DONE Add unit tests for seektable errors
    - [X] empty seekpoints
    - [X] mis-ordered seekpoints
    - [X] bad seekpoint destinations
** DONE Shift lint to the AudioFile and MetaData subclasses
   Instead of having tracklint have to perform lots of built-in tests,
   it would be better to have clean() functions added to the classes
   themselves.
   For MetaData, it could return a new object with fixed fields.
   For AudioFile, it could function like convert() and build a new file
   with fixes applied.
*** DONE Add clean() method to MetaData and subclasses
**** DONE MetaData
**** DONE ApeTag
**** DONE WavPackAPEv2
**** DONE FlacMetaData
**** DONE ID3v22Comment
**** DONE ID3v23Comment
**** DONE ID3v24Comment
**** DONE ID3v1Comment
**** DONE ID3CommentPair
**** DONE M4AMetaData
**** DONE VorbisComment
***** DONE FlacVorbisComment
***** DONE UnframedVorbisComment
*** DONE Add clean() method to AudioFile and subclasses
    I expect a lot of these will do nothing in the short term.
**** DONE AudioFile
**** DONE AiffAudio
     - [X] Reorder streams in which the COMM chunk doesn't come before data
     - [X] remove duplicate COMM chunks
     - [X] remove duplicate SSND chunks
***** DONE add unit test for verify()
      - [X] multiple COMM chunks found
      - [X] multiple SSND chunks found
      - [X] SSND chunk before COMM chunk
***** DONE add unit test for clean()
      - [X] multiple COMM chunks found
      - [X] multiple SSND chunks found
      - [X] SSND chunk before COMM chunk
**** DONE FlacAudio
**** DONE WaveAudio
     - [X] reorder streams in which the fmt chunk doesn't come before data
     - [X] remove duplicate fmt chunks
     - [X] remove duplicate data chunks
***** DONE add unit test for verify()
      - [X] multiple fmt chunks found
      - [X] multiple data chunks found
      - [X] data chunk before fmt chunk
***** DONE add unit test for clean()
      - [X] multiple fmt chunks found
      - [X] multiple data chunks found
      - [X] data chunk before fmt chunk
*** DONE Document MetaData clean() method
*** DONE Document AudioFile clean() method
*** DONE Add more comprehensive unit tests for clean() methods
*** DONE Convert tracklint to use clean() methods
** DONE Ensure individual unit tests pass
*** DONE Lib
    - [X] core
    - [X] cuesheet
    - [X] freedb
    - [X] image
    - [X] musicbrainz
    - [X] pcm
    - [X] bitstream
    - [X] replaygain
    - [X] resample
    - [X] tocfile
    - [X] verify
    - [X] player
*** DONE Format
    - [X] audiofile
    - [X] lossless
    - [X] lossy
    - [X] aiff
    - [X] alac
    - [X] au
    - [X] dvda
    - [X] flac
    - [X] m4a
    - [X] mp2
    - [X] mp3
    - [X] oggflac
    - [X] shorten
    - [X] sines
    - [X] vorbis
    - [X] wave
    - [X] wavpack
*** DONE Metadata
    - [X] metadata
    - [X] flac
    - [X] wavpack
    - [X] id3v1
    - [X] id3v2
    - [X] vorbis
    - [X] m4a
*** DONE Util
    - [X] audiotools_config
    - [X] cd2track
    - [X] cdinfo
    - [X] cdplay
    - [X] coverdump
    - [X] coverview
    - [X] dvda2track
    - [X] dvdainfo
    - [X] record2track
    - [X] track2cd
    - [X] track2track
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
** DONE Ensure complete unit test passes
   this includes some compound tests
   which may not be covered by individual tests
** DONE Cleanup bitstream module
   This is at the heart of a lot of things so it should be properly cleaned up.
*** DONE Merge bitstream_r and bitstream_w source files
*** DONE Make BitstreamReader and BitstreamWriter more symmetric
*** DONE Add placeholders to BitstreamWriter
    These allow one to put temporary values in the stream
    which can be automatically filled-in later on.
**** DONE Add write_placeholder method to BitstreamWriter
**** DONE Add fill_placeholder method to BitstreamWriter
**** DONE Add write_64_placeholder method to BitstreamWriter
**** DONE Add fill_64_placeholder method to BitstreamWriter
**** DONE Implement bw_write_placeholder_f
**** DONE Implement bw_write_64_placeholder_f
**** DONE Implement bw_fill_placeholder_f
**** DONE Implement bw_fill_64_placeholder_f
**** DONE Implement bw_write_placeholder_r
**** DONE Implement bw_write_64_placeholder_r
**** DONE Implement bw_fill_placeholder_r
**** DONE Implement bw_fill_64_placeholder_r
**** DONE Implement bw_write_placeholder_a
     Should manage the placeholder stack, but only keep track of bits sent
**** DONE Implement bw_write_64_placeholder_a
     Should manage the placeholder stack, but only keep track of bits sent
**** DONE Implement bw_fill_placeholder_a
     Should manage the placeholder stack, but not do anything else
**** DONE Implement bw_fill_64_placeholder_a
     Should manage the placeholder stack, but not do anything else
**** DONE Store filled placeholders in a stack for reuse
**** DONE Clean out allocated placeholders as close() time
***** DONE Trigger warnings if not all placeholders are used at close()
*** DONE Add C-based unit tests
    This should be something I can compile into a standalone file
    and run with no external dependencies.
    The idea is to build something valgrind-able to ensure
    there's no memory errors.
**** DONE BitstreamReader
***** DONE big-endian
      - [X] read
      - [X] read_signed
      - [X] read_64
      - [X] skip
      - [X] skip_bytes
      - [X] unread
      - [X] read_unary
      - [X] read_limited_unary
      - [X] read_huffman_code
      - [X] byte_align
      - [X] read_bytes
      - [X] set_endianness
      - [X] mark
      - [X] unmark
      - [X] rewind
***** DONE little-endian
      - [X] read
      - [X] read_signed
      - [X] read_64
      - [X] skip
      - [X] skip_bytes
      - [X] unread
      - [X] read_unary
      - [X] read_limited_unary
      - [X] read_huffman_code
      - [X] byte_align
      - [X] read_bytes
      - [X] set_endianness
      - [X] mark
      - [X] unmark
      - [X] rewind
***** DONE br_try/etry
      - [X] read
      - [X] read_signed
      - [X] read_64
      - [X] skip
      - [X] skip_bytes
      - [X] read_unary
      - [X] read_limited_unary
      - [X] read_huffman_code
      - [X] read_bytes
      - [X] substream_append
***** DONE Callbacks
      - [X] read
      - [X] read_signed
      - [X] read_64
      - [X] skip
      - [X] skip_bytes
      - [X] read_unary
      - [X] read_limited_unary
      - [X] read_huffman_code
      - [X] read_bytes
**** DONE Substream BitstreamReader
**** DONE BitstreamWriter
***** DONE big-endian
***** DONE little-endian
***** DONE callbacks
**** DONE BitstreamRecorder
**** DONE BitstreamAccumulator
*** DONE Shift BitstreamReader/BitstreamWriters to audiotools.bitstream
*** DONE Add documentation for audiotools.bitstream
**** DONE BitstreamReader
     - [X] add_callback
     - [X] byte_align
     - [X] call_callbacks
     - [X] close
     - [X] limited_unary
     - [X] mark
     - [X] parse
     - [X] pop_callback
     - [X] read
     - [X] read64
     - [X] read_bytes
     - [X] read_huffman_code
     - [X] read_signed
     - [X] read_signed64
     - [X] rewind
     - [X] set_endianness
     - [X] skip
     - [X] skip_bytes
     - [X] substream
     - [X] substream_append
     - [X] unary
     - [X] unmark
     - [X] unread
**** DONE BitstreamWriter
     - [X] add_callback
     - [X] build
     - [X] byte_align
     - [X] call_callbacks
     - [X] close
     - [X] flush
     - [X] pop_callback
     - [X] set_endianness
     - [X] unary
     - [X] write
     - [X] write64
     - [X] write_bytes
     - [X] write_signed
     - [X] write_signed64
**** DONE BitstreamRecorder
     - [X] add_callback
     - [X] bits
     - [X] build
     - [X] byte_align
     - [X] bytes
     - [X] call_callbacks
     - [X] close
     - [X] copy
     - [X] data
     - [X] flush
     - [X] pop_callback
     - [X] reset
     - [X] set_endianness
     - [X] split
     - [X] swap
     - [X] unary
     - [X] write
     - [X] write64
     - [X] write_bytes
     - [X] write_signed
     - [X] write_signed64
**** DONE BitstreamAccumulator
     - [X] bits
     - [X] build
     - [X] byte_align
     - [X] bytes
     - [X] close
     - [X] reset
     - [X] set_endianness
     - [X] unary
     - [X] write
     - [X] write64
     - [X] write_bytes
     - [X] write_signed
     - [X] write_signed64
**** DONE HuffmanTree
**** DONE Substream
**** DONE format_size
*** DONE Handle bitstream closing more consistently
    The basic handle cycle is:

    h = open_handle(substream); /*allocates space for handle*/
    h->method(h);               /*performs reads/writes on handle*/
    ...
    h->close(h);                /*closes substream and deallocates handle*/

    But we also need two additional methods
    for working with the handle and its substream seperately.

    | method            | substream      | handle      |
    |-------------------+----------------+-------------|
    | close()           | flushed/closed | deallocated |
    | close_substream() | flushed/closed | nothing     |
    | free()            | nothing        | deallocated |
    |-------------------+----------------+-------------|

    This is especially important for the Python wrappers
    in which closing and dealloacting will come from different routines.
**** DONE Add functions to bitstream core
***** DONE BitstreamReader
      - [X] br_close_substream_f
      - [X] br_close_substream_s
      - [X] br_close_substream_p
      - [X] br_close_methods
      - [X] br_free_f
      - [X] br_free_s
      - [X] br_free_p
      - [X] br_close
      - [X] br_read_bits_c
      - [X] br_read_bits64_c
      - [X] br_skip_bits_c
      - [X] br_unread_c
      - [X] br_read_unary_c
      - [X] br_read_limited_unary_c
      - [X] br_read_huffman_code_c
      - [X] br_read_bytes_c
      - [X] br_set_endianness_c
      - [X] br_close_substream_c
      - [X] br_mark_c
      - [X] br_rewind_c
      - [X] br_unmark_c
      - [X] br_substream_append_c
***** DONE BitstreamWriter
      - [X] bw_close_substream_f
      - [X] bw_close_substream_r
      - [X] bw_close_substream_p
      - [X] bw_close_substream_a
      - [X] bw_close_methods
      - [X] bw_free_f_a
      - [X] bw_free_r
      - [X] bw_free_p
      - [X] bw_close
      - [X] bw_write_bits_c
      - [X] bw_write_bits64_c
      - [X] bw_write_bytes_c
      - [X] bw_write_signed_bits_c
      - [X] bw_write_signed_bits64_c
      - [X] bw_write_unary_c
      - [X] bw_set_endianness_c
      - [X] bw_close_substream_c
      - [X] bw_byte_align_c
***** DONE Ensure bw_rec_split detects closed stream(s) properly
      Call bw_abort if one attempts to split from or to a closed stream.
***** DONE Ensure bw_dump_bytes detects closed stream properly
      Call bw_abort if one attempts to dump bytes to a closed stream.
***** DONE Ensure bw_rec_copy detects closed stream properly
      Call bw_abort if one attempts to copy records to a closed stream.
**** DONE Update mod_bitstream.c to use new hooks properly
***** DONE Add bw_try/bw_etry wrappers around write methods
      - [X] BitstreamWriter_write
      - [X] BitstreamWriter_write_signed
      - [X] BitstreamWriter_write64
      - [X] BitstreamWriter_write_signed64
      - [X] BitstreamWriter_unary
      - [X] BitstreamWriter_byte_align
      - [X] BitstreamWriter_write_bytes
      - [X] BitstreamWriter_flush
      - [X] BitstreamRecorder_write
      - [X] BitstreamRecorder_write_signed
      - [X] BitstreamRecorder_write64
      - [X] BitstreamRecorder_write_signed64
      - [X] BitstreamRecorder_unary
      - [X] BitstreamRecorder_byte_align
      - [X] BitstreamRecorder_write_bytes
      - [X] BitstreamRecorder_copy
      - [X] BitstreamRecorder_split
      - [X] bitstream_build
      - [X] BitstreamAccumulator_write
      - [X] BitstreamAccumulator_write_signed
      - [X] BitstreamAccumulator_write64
      - [X] BitstreamAccumulator_write_signed64
      - [X] BitstreamAccumulator_unary
      - [X] BitstreamAccumulator_byte_align
      - [X] BitstreamAccumulator_write_bytes
***** DONE Ensure close() method calls bs->close_substream()
      - [X] BitstreamWriter
      - [X] BitstreamRecorder
      - [X] BitstreamAccumulator
***** DONE Ensure dealloc method calls bs->free()
      - [X] BitstreamWriter
      - [X] BitstreamRecorder
      - [X] BitstreamAccumulator
***** DONE Don't fclose() file objects from underneath Python file objects
      Although we may convert a Python file object to a FILE struct,
      we must not fclose that struct out from underneath its parent.
****** DONE BitstreamReader_close
       - [X] call .close() method on Python file object
       - [X] set read methods to raise errors
       - [X] return result of .close() method
****** DONE BitstreamWriter_close
       - [X] flush pending output
       - [X] call .close() method on Python file object
       - [X] set write methods to raise errors
       - [X] return result of .close() method
****** DONE BitstreamRecorder_close
****** DONE BitstreamAccumulator_close
**** DONE Double-check existing C modules for proper free/close usage
     - [X] bitstream.c
     - [X] decoders/alac.c
     - [X] decoders/flac.c
     - [X] decoders/mlp.c
     - [X] decoders/ogg.c
     - [X] decoders/shn.c
     - [X] decoders/wavpack.c
     - [X] encoders/alac.c
     - [X] encoders/flac.c
     - [X] encoders/flac_lpc.c
     - [X] encoders/shn.c
     - [X] encoders/wavpack.c
     - [X] mod_bitstream.c
     - [X] verify/mpeg.c
     - [X] verify/ogg.c
*** DONE Ensure that reading/writing closed streams always fails
    Once a stream's been closed,
    the bitstream should set I/O functions to error generators
    and further closes should do nothing.
**** DONE Add unit test to bitstream.c
**** DONE Add unit test to Python side
** DONE Add update_metadata() method to AudioFile
   Consider how AudioFile.set_metadata() handles six different cases:

   Case 1: adjusting a file's own textual metadata (tracktag)
   >>> m = flac1.get_metadata()
   >>> m.track_name = u"Fixed Name"
   >>> flac1.set_metadata(m)

   Case 2: transferring metadata from the same audio type (track2track)
   >>> flac1.set_metadata(flac2.get_metadata())

   Case 3: transferring metadata from a different audio type (track2track)
   >>> flac1.set_metadata(mp3.get_metadata())

   Case 4: adjusting a file's own low-level metadata (tracklint)
   >>> m = flac1.get_metadata()
   >>> m.streaminfo.md5sum = fixed_md5sum
   >>> flac1.set_metadata(m)

   Case 5: building new metadata from scratch (cd2track)
   >>> flac1 = FlacAudio.from_pcm(pcm_reader)
   >>> flac1.set_metadata(MetaData(track_name=u"New Name", ...))

   Case 6: transferring adjusted metadata from the same audio type
   >>> m = flac2.get_metadata()
   >>> m.track_name = u"Adjusted Name"
   >>> flac1.set_metadata(m)

   What happens to stuff like the STREAMINFO block
   which contains track length, md5sum, etc.
   and is part of FLAC's metadata?

   If set_metadata() works naively and doesn't override any values,
   case 2 breaks since flac1 suddenly has flac2's track length.

   If set_metadata() overrides new metadata with stuff from the current file,
   case 4 breaks since the fixed_md5sum gets overridden.

   Counting on set_metadata() being smart enough to know what you mean
   is a losing proposition for FLAC, M4A and other metadata formats
   with embedded non-textual (side) metadata.

   One solution is to add a low-level AudioFile.update_metadata() method
   which takes only the AudioFile's required metadata type
   and leaves side data as-is.  So case 1 becomes:

   >>> m = flac1.get_metadata()
   >>> m.track_name = u"Fixed Name"
   >>> flac1.update_metadata(m)

   and case 4 becomes:

   >>> m = flac1.get_metadata()
   >>> m.streaminfo.md5sum = fixed_md5sum
   >>> flac1.update_metadata(m)

   while the other cases remain unchanged.
*** DONE Add update_metadata() method to AudioFile and subclasses
    for formats which take metadata at all
    - [X] ALACAudio
    - [X] AiffAudio
    - [X] AudioFile
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
*** DONE Update clean() method to use update_metadata()
    for formats which implement clean() at all
    - [X] ALACAudio
    - [X] AiffAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
*** DONE Add update_metadata() to tracktag
    when not using -r/--replace option
*** DONE Document new set_metadata() behavior
*** DONE Document update_metadata() method
*** DONE Add unit tests for update_metadata()
    - [X] ALACAudio
    - [X] AiffAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
** DONE Ensure Python API docs are updated if necessary
   - [X] audiotools.rst
   - [X] audiotools_bitstream.rst
   - [X] audiotools_cdio.rst
   - [X] audiotools_cue.rst
   - [X] audiotools_pcm.rst
   - [X] audiotools_player.rst
   - [X] audiotools_replaygain.rst
   - [X] audiotools_resample.rst
   - [X] audiotools_toc.rst
   - [X] index.rst
   - [X] metadata.rst
** DONE Spellcheck Python API docs
   - [X] audiotools.rst
   - [X] audiotools_bitstream.rst
   - [X] audiotools_cdio.rst
   - [X] audiotools_cue.rst
   - [X] audiotools_pcm.rst
   - [X] audiotools_player.rst
   - [X] audiotools_replaygain.rst
   - [X] audiotools_resample.rst
   - [X] audiotools_toc.rst
   - [X] index.rst
   - [X] metadata.rst
** DONE Eliminate all compiler warnings
   - [X] check Ubuntu
   - [X] check Fedora
   - [X] check Mac OS X
** DONE Reduce load from progress updating routines
   Send fewer progress updates from child to parent
   when performing progress-based tasks.

   This is harder than it sounds.

   In an ideal world, I'd have the parent poll its children
   on a regular basis and update the progress bars
   and/or start more children.

   In practice, this doesn't work with subprocesses and shared memory
   because shared memory accumulators don't free themselves correctly
   when working with more than one child process.

   It works even less well with threading because subprocess.Popen
   isn't thread-safe and will certainly deadlock if called often enough.

   So although the current system is clunky and inefficient
   at least it works.
** DONE Ensure all Python modules have up-to-date docstrings
   - [X] __aiff__.py
   - [X] __ape__.py
   - [X] __au__.py
   - [X] __dvda__.py
   - [X] __flac__.py
   - [X] __id3__.py
   - [X] __id3v1__.py
   - [X] __image__.py
   - [X] __init__.py
   - [X] __m4a__.py
   - [X] __m4a_atoms__.py
   - [X] __mp3__.py
   - [X] __ogg__.py
   - [X] __shn__.py
   - [X] __vorbis__.py
   - [X] __vorbiscomment__.py
   - [X] __wav__.py
   - [X] __wavpack__.py
   - [X] cue.py
   - [X] delta.py
   - [X] freedb.py
   - [X] musicbrainz.py
   - [X] player.py
   - [X] toc.py
   - [X] ui.py
** DONE Ensure MANIFEST.in is complete
** DONE Update apptest.sh
   It's not much of a test, but it's good to keep it around
   as a last-resort check of things people normally run.
** DONE Run final batch of unit tests on different platforms
   - [X] check Ubuntu
   - [X] check Fedora
   - [X] check Mac OS X
* DONE Finish version 2.19
** DONE Update PCMReader.read() to take a PCM frame count instead of bytes
   Taking a byte count as an argument is a relic from the days
   when most conversion happened through external programs.
   It's time to update this function to work on PCM frames instead
   which is much more natural fit and makes many calculations much easier.
*** DONE Update __init__.py
    - [X] PCMReader.read
    - [X] PCMReaderError.read
    - [X] PCMReaderProgress.read
    - [X] ReorderedPCMReader.read
    - [X] transfer_framelist_data
    - [X] threaded_transfer_framelist_data
    - [X] pcm_cmp
    - [X] pcm_frame_cmp
    - [X] PCMCat.read
    - [X] __buffer__.__init__
    - [X] __buffer__.__len__
    - [X] BufferedPCMReader.read
    - [X] BufferedPCMReader.__fill__
    - [X] LimitedPCMReader.read
    - [X] pcm_split
    - [X] PCMConverter.read
    - [X] ReplayGainReader.read
    - [X] calculate_replay_gain
    - [X] AudioFile.verify
    - [X] PCMReaderWindow.read
    - [X] CDTrackReader.read
    - [X] CDTrackReaderAccurateRipCRC.read
*** DONE Update __aiff__.py
    - [X] AiffReader.read
    - [X] AiffAudio.from_pcm
*** DONE Update __au__.py
    - [X] AuReader.read
    - [X] AuReader.from_pcm
*** DONE Update __flac__.py
    - [X] FlacAudio.__eq__
    - [X] FLAC_Data_Chunk.write
    - [X] FLAC_SSND_Chunk.write
*** DONE Update __shn__.py
    - [X] ShortenAudio.to_wave
    - [X] ShortenAudio.to_aiff
*** DONE Update __wav__.py
    - [X] WaveReader.read
    - [X] WaveAudio.from_pcm
    - [X] WaveAudio.add_replay_gain
*** DONE Update __wavpack__.py
    - [X] WavPackAudio.to_wave
*** DONE Update py_decoders/alac.py
    - [X] ALACDecoder.read
*** DONE Update py_decoders/flac.py
    - [X] FlacDecoder.read
*** DONE Update py_decoders/shn.py
    - [X] SHNDecoder.read
*** DONE Update py_decoders/wavpack.py
    - [X] WavPackDecoder.read
*** DONE Update py_encoders/alac.py
    - [X] encode_mdat
*** DONE Update py_encoders/flac.py
    - [X] encode_flac
*** DONE Update py_encoders/shn.py
    - [X] encode_shn
*** DONE Update py_encoders/wavpack.py
    - [X] encode_wavpack
*** DONE Update src/pcmconv.c
    - [X] pcmreader_read
    - [X] pcmreader_read (alt version)
*** DONE Update src/replaygain.c
    - [X] ReplayGainReader_read
*** DONE Update src/decoders/sine.c
    - [X] Sine_Mono_read
    - [X] Sine_Stereo_read
    - [X] Sine_Simple_read
*** DONE Update test/test.py
    - [X] BLANK_PCM_Reader
    - [X] RANDOM_PCM_Reader
    - [X] EXACT_BLANK_PCM_Reader
    - [X] EXACT_SILENCE_PCM_Reader
    - [X] EXACT_RANDOM_PCM_Reader
    - [X] MD5_Reader
    - [X] Variable_Reader
    - [X] Join_Reader
    - [X] MiniFrameReader
*** DONE Update test/test_core.py
    - [X] BufferedPCMReader.test_pcm
    - [X] LimitedPCMReader.test_read
    - [X] PCMReaderWindow.__test_reader__
    - [X] PCM_Reader_Multiplexer.read
    - [X] TestMultiChannel.__test_assignment__
*** DONE Update test/test_formats.py
    - [X] ERROR_PCM_Reader.read
    - [X] ALACFileTest.__test_reader__
    - [X] ALACFileTest.__test_reader_nonalac__
    - [X] ALACFileTest.test_streams
    - [X] FlacFileTest.test_streams
    - [X] FlacFileTest.__test_reader__
    - [X] ShortenFileTest.test_streams
    - [X] ShortenFileTest.__test_reader__
    - [X] WavPackFileTest.__test_reader__
*** DONE Update test/test_streams.py
    - [X] FrameListReader.read
    - [X] MD5Reader.read
    - [X] Sine8_Mono.read
    - [X] Sine8_Stereo.read
    - [X] Simple_Sine.read
    - [X] WastedBPS16.read
*** DONE Ensure all unit tests pass
**** DONE [Lib]
     - [X] core
     - [X] cuesheet
     - [X] freedb
     - [X] image
     - [X] musicbrainz
     - [X] pcm
     - [X] bitstream
     - [X] replaygain
     - [X] resample
     - [X] tocfile
     - [X] verify
     - [X] player
**** DONE [Format]
     - [X] audiofile
     - [X] lossless
     - [X] lossy
     - [X] aiff
     - [X] alac
     - [X] au
     - [X] dvda
     - [X] flac
     - [X] m4a
     - [X] mp2
     - [X] mp3
     - [X] oggflac
     - [X] shorten
     - [X] sines
     - [X] vorbis
     - [X] wave
     - [X] wavpack
**** DONE [Metadata]
     - [X] metadata
     - [X] flac
     - [X] wavpack
     - [X] id3v1
     - [X] id3v2
     - [X] vorbis
     - [X] m4a
**** DONE [Util]
     - [X] audiotools_config
     - [X] cd2track
     - [X] cdinfo
     - [X] cdplay
     - [X] coverdump
     - [X] coverview
     - [X] dvda2track
     - [X] dvdainfo
     - [X] track2cd
     - [X] track2track
     - [X] trackcat
     - [X] trackcmp
     - [X] trackinfo
     - [X] tracklength
     - [X] tracklint
     - [X] trackplay
     - [X] trackrename
     - [X] tracksplit
     - [X] tracktag
     - [X] trackverify
*** DONE Update reference documentation
** DONE Remove the big pile of imports from various modules
   Only import the stuff we need, when we need it.
*** DONE __init__.py
*** DONE accuraterip.py
*** DONE aiff.py
*** DONE ape.py
*** DONE au.py
*** DONE dvda.py
*** DONE flac.py
*** DONE id3.py
*** DONE id3v1.py
*** DONE image.py
*** DONE m4a.py
*** DONE m4a_atoms.py
*** DONE mp3.py
*** DONE ogg.py
*** DONE shn.py
*** DONE vorbis.py
*** DONE vorbiscomment.py
*** DONE wav.py
*** DONE wavpack.py
*** DONE cue.py
*** DONE delta.py
*** DONE freedb.py
*** DONE musicbrainz.py
*** DONE player.py
*** DONE toc.py
*** DONE ui.py
*** DONE ensure unit tests pass
**** DONE [Lib]
     - [X] core
     - [X] cuesheet
     - [X] freedb
     - [X] image
     - [X] musicbrainz
     - [X] pcm
     - [X] bitstream
     - [X] replaygain
     - [X] resample
     - [X] tocfile
     - [X] verify
     - [X] player
**** DONE [Format]
     - [X] audiofile
     - [X] lossless
     - [X] lossy
     - [X] aiff
     - [X] alac
     - [X] au
     - [X] dvda
     - [X] flac
     - [X] m4a
     - [X] mp2
     - [X] mp3
     - [X] oggflac
     - [X] shorten
     - [X] sines
     - [X] vorbis
     - [X] wave
     - [X] wavpack
**** DONE [Metadata]
     - [X] metadata
     - [X] flac
     - [X] wavpack
     - [X] id3v1
     - [X] id3v2
     - [X] vorbis
     - [X] m4a
**** DONE [Util]
     - [X] audiotools_config
     - [X] cd2track
     - [X] cdinfo
     - [X] cdplay
     - [X] coverdump
     - [X] coverview
     - [X] dvda2track
     - [X] dvdainfo
     - [X] track2cd
     - [X] track2track
     - [X] trackcat
     - [X] trackcmp
     - [X] trackinfo
     - [X] tracklength
     - [X] tracklint
     - [X] trackplay
     - [X] trackrename
     - [X] tracksplit
     - [X] tracktag
     - [X] trackverify
** DONE Integrate Filename object into utilities
   This object should replace the Messenger.filename classmethod.
   It automatically performs filename -> unicode conversion
   and, when files are on disk, compares for equality by device/inode.
*** DONE Update utilities
**** DONE audiotools-config
**** DONE cd2track
**** DONE coverdump
**** DONE coverview
**** DONE dvda2track
**** DONE dvdainfo
**** DONE track2cd
**** DONE track2track
**** DONE trackcat
**** DONE trackcmp
**** DONE trackinfo
**** DONE tracklint
**** DONE trackrename
**** DONE tracksplit
**** DONE tracktag
**** DONE trackverify
*** DONE Add documentation for Filename
*** DONE Add unit tests for Filename
*** DONE Remove Messenger.filename classmethod
**** DONE remove mention in documentation
*** DONE Ensure all unit tests pass
** DONE Sanity check tool inputs/outputs
*** DONE Ensure input files are included only once
    - [X] track2cd - generate warning
    - [X] track2track - generate error
    - [X] trackcat - generate warning
    - [X] trackcmp - short-circuit same file comparison
    - [X] tracklength - generate warning
    - [X] tracklint - generate error
    - [X] trackrename - generate error
    - [X] tracktag - generate error
    - [X] trackverify - skip duplicates
**** DONE Unit test new behavior
    - [X] track2cd
    - [X] track2track
    - [X] trackcat
    - [X] trackcmp
    - [X] tracklint
    - [X] trackrename
    - [X] tracktag
    - [X] trackverify
*** DONE Ensure input file(s) are different from output file(s)
    Overwriting files is okay by default (in the Unix tradition)
    but input and output as same file is not and should generate error.
    - [X] coverdump
    - [X] track2track
    - [X] trackcat
    - [X] tracksplit
**** DONE Unit test new behavior
     - [X] coverdump
     - [X] track2track
     - [X] trackcat
     - [X] tracksplit
*** DONE Ensure same file isn't written twice by the same utility
    This would typically be the result of a misused "--format" argument.
    - [X] cd2track
    - [X] dvda2track
    - [X] track2track
    - [X] trackrename
    - [X] tracksplit
**** DONE unit test new behavior
     - [X] cd2track
     - [X] track2track
     - [X] trackrename
     - [X] tracksplit
** DONE Ensure progress display doesn't overload terminal with rows
   As more cores become commonplace, it's important not to
   overload the screen with too many progress rows
   in case the number of simultaneous jobs
   exceeds the number of terminal rows.
** DONE Improve metadata tagging widget
   I'm not convinced the current opened/closed bottom window
   is the ideal design for editing extended album/track metadata.
   Something more similar to a spreadsheet would be ideal
   but that's complicated by the serious lack of space
   in terminal windows.
** DONE Fix ReplayGain to work on files with different sample rates
   This should handle a wider array of cases than it does now.
*** DONE Update can_add_replay_gain classmethod
    It should take a list of tracks and return True
    if ReplayGain can be added to them, False if not
    which takes the place of applicable_replay_gain
    - [X] AudioFile.can_add_replay_gain
    - [X] FlacAudio.can_add_replay_gain
    - [X] M4AAudio_faac.can_add_replay_gain
    - [X] MP3Audio.can_add_replay_gain
    - [X] VorbisAudio.can_add_replay_gain
    - [X] WaveAudio.can_add_replay_gain
    - [X] WavPackAudio.can_add_replay_gain
**** DONE update reference documentation
**** DONE update unit tests
     - [X] test_formats.py  AudioFileTest.test_replay_gain
     - [X] test_utils.py    track2track.test_options
     - [X] test_utils.py    tracktag.test_options
*** DONE Add supports_replay_gain() classmethod
    Returns True if the class supports ReplayGain of any kind.
    - [X] AudioFile
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
    - [X] WaveAudio
**** DONE Add documentation
*** DONE Remove audiotools.applicable_replay_gain function
    this functionality is shifted to can_add_replay_gain
**** DONE remove from utilities
     - [X] dvda2track
     - [X] track2track
     - [X] tracksplit
**** DONE update reference documentation
**** DONE update unit tests
*** DONE Update calculate_replay_gain function
**** DONE tracks with unsupported sample rates should be resampled
     according to the nearest supported sample rate available
**** DONE tracks with different sample rates should be resampled
     according to the most common sample rate available
**** DONE tracks with more than two channels should be culled
     remove any channels above the first two during calculation
**** DONE update unit tests
     - [X] test_core.py  TestReplayGain.test_basics
*** DONE Update add_replay_gain classmethods as needed
    - [X] AudioFile.add_replay_gain
    - [X] FlacAudio.add_replay_gain
    - [X] M4AAudio_faac.add_replay_gain
    - [X] MP3Audio.add_replay_gain
    - [X] VorbisAudio.add_replay_gain
    - [X] WaveAudio.add_replay_gain
    - [X] WavPackAudio.add_replay_gain
*** DONE Update utilities to use new ReplayGain application procedure
    Given a list of tracks for a given album,
    if all are the same format and can_add_replay_gain returns True,
    queue a call to add_replay_gain on those tracks.
**** DONE audiotools-config
**** DONE cd2track
**** DONE dvda2track
**** DONE track2track
**** DONE tracksplit
**** DONE tracktag
** DONE Display X/Y progress during operations
   When a track is finished transcoding, for instance, output:
   [ 2 / 15 ] input.wav -> output.mp3
   or something similar.
*** DONE Update utilities
    - [X] cd2track
    - [X] dvda2track
    - [X] track2track
    - [X] trackcmp
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
*** DONE Update unit tests
    - [X] cd2track
    - [X] dvda2track
    - [X] track2track
    - [X] trackcmp
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
** DONE Update metadata documentation with examples
*** DONE FLAC
*** DONE MP3
    - [X] ID3v1/ID3v1.1
    - [X] ID3v2.2
    - [X] ID3v2.3
    - [X] ID3v2.4
*** DONE APEv2
*** DONE M4A
** DONE Remove Construct module
   Convert all usage of Construct to BitstreamReader/BitstreamWriter.
   Since this is unlikely to be updated for Python 3,
   removing it should smooth that inevitable transition.
*** DONE __accuraterip__.py
*** DONE __aiff__.py
    - [X] chunks
    - [X] get_metadata
    - [X] set_metadata
    - [X] delete_metadata
    - [X] to_pcm
    - [X] from_pcm
    - [X] pcm_split
    - [X] aiff_from_chunks
**** DONE AiffReader
     - [X] __init__
     - [X] read
*** DONE __ape__.py
*** DONE __au__.py
*** DONE cue.py
*** DONE __dvda__.py
**** DONE DVDAudio
     - [X] __titlesets__
     - [X] __titles__
**** DONE DVDATitle
     - [X] __parse_info__
*** DONE __flac__.py
*** DONE __freedb__.py
*** DONE __id3__.py
*** DONE __id3v1__.py
*** DONE __image__.py
    - [X] __JPEG__
    - [X] __PNG__
    - [X] __GIF__
    - [X] __BMP__
    - [X] __TIFF__
**** DONE check these against PIL's output
**** DONE check against truncated images
*** DONE __init__.py
*** DONE __m4a__.py
**** DONE M4ATaggedAudio
     - [X] get_metadata
     - [X] set_metadata
     - [X] delete_metadata
**** DONE M4A_META_Atom
     - [X] __init__
     - [X] __repr__
     - [X] parse
     - [X] __getattr__
     - [X] __setattr__
     - [X] __delattr__
     - [X] images
     - [X] add_image
     - [X] delete_image
     - [X] converted
     - [X] __comment_name__
     - [X] supports_images
     - [X] __by_pair__
     - [X] __comment_pairs__
     - [X] clean
**** DONE M4AAudio_faac
     - [X] __init__
     - [X] is_type
**** DONE ALACAudio
     - [X] __init__
     - [X] is_type
     - [X] to_pcm
     - [X] from_pcm
     - [X] __ftyp_atom__
     - [X] __moov_atom__
     - [X] __free_atom__
*** DONE __m4a_atoms__.py
    Re-implement atom parsing/building without Construct
**** DONE ftyp
**** DONE moov
***** DONE mvhd
***** DONE trak
****** DONE tkhd
****** DONE mdia
******* DONE mdhd
******* DONE hdlr
******* DONE minf
******** DONE smhd
******** DONE dinf
********* DONE dref
******** DONE stbl
********* DONE stsd
********** DONE alac
********* DONE stts
********* DONE stsc
********* DONE stsz
********* DONE stco
***** DONE udta
****** DONE meta
**** DONE free
**** DONE Rename __m4a_atoms2__.py to __m4a_atoms__.py
*** DONE __mp3__.py
**** DONE MP3
     - [X] __init__
     - [X] is_type
     - [X] __find_next_mp3_frame__
     - [X] __find_mp3_start__
     - [X] __find_last_mp3_frame__
     - [X] verify
**** DONE MP2
     - [X] is_type
*** DONE __musepack__.py
*** DONE __musicbrainz__.py
*** DONE __ogg__.py
*** DONE player.py
*** DONE __shn__.py
*** DONE toc.py
*** DONE __vorbis__.py
**** DONE VorbisAudio
     - [X] __read_metadata__
     - [X] total_frames
     - [X] get_metadata
     - [X] set_metadata
**** DONE Remove cruft
     - [X] OggStreamReader
     - [X] OggStreamWriter
*** DONE __vorbiscomment__.py
*** DONE __wav__.py
*** DONE __wavpack__.py
*** DONE test/test_core.py
**** DONE TestFrameList
     - [X] test_8bit_roundtrip
     - [X] test_16bit_roundtrip
     - [X] test_24bit_roundtrip
*** DONE test/test_formats.py
**** DONE ALACFileTest
     - [X] test_blocksizes
**** DONE FlacFileTest
     - [X] test_blocksizes
**** DONE ShortenFileTest
     - [X] test_blocksizes
**** DONE WavpackFileTest
     - [X] test_blocksizes
** DONE Replace gettext with string constants
   Transforming _(u"some text") to SOME_TEXT
   where SOME_TEXT is a predefined unicode string
   in an audiotools sub-module.
   This makes text more consistent *and* easier to modify.
*** DONE Update utilities
    - [X] audiotools-config
    - [X] cd2track
    - [X] cdinfo
    - [X] cdplay
    - [X] coverdump
    - [X] coverview
    - [X] dvda2track
    - [X] dvdainfo
    - [X] track2cd
    - [X] track2track
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
*** DONE Update modules
    - [X] __init__.py
    - [X] aiff.py
    - [X] ape.py
    - [X] au.py
    - [X] cue.py
    - [X] dvda.py
    - [X] flac.py
    - [X] image.py
    - [X] m4a.py
    - [X] m4a_atoms.py
    - [X] mp3.py
    - [X] ogg.py
    - [X] toc.py
    - [X] ui.py
    - [X] vorbis.py
    - [X] vorbiscomment.py
    - [X] wav.py
    - [X] wavpack.py
*** DONE Remove gettext
    - [X] audiotools-config
    - [X] cd2track
    - [X] cdinfo
    - [X] cdplay
    - [X] coverdump
    - [X] coverview
    - [X] dvda2track
    - [X] dvdainfo
    - [X] track2cd
    - [X] track2track
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
    - [X] audiotools/__init__.py
    - [X] audiotools/aiff.py
    - [X] audiotools/ape.py
    - [X] audiotools/au.py
    - [X] audiotools/cue.py
    - [X] audiotools/flac.py
    - [X] audiotools/id3.py
    - [X] audiotools/image.py
    - [X] audiotools/m4a.py
    - [X] audiotools/mp3.py
    - [X] audiotools/toc.py
    - [X] audiotools/vorbis.py
    - [X] audiotools/wav.py
    - [X] audiotools/wavpack.py
*** DONE Update unit tests
    - [X] test_formats.py
    - [X] test_metadata.py
    - [X] test_utils.py
*** DONE Reduce big import chunks
    Convert "from audiotools.text import (CONSTANT, ...)"
    to "import audiotools.text as t" and "t.CONSTANT"
    to avoid having huge import blocks at the start of utilities.
    - [X] audiotools-config
    - [X] cd2track
    - [X] cdinfo
    - [X] cdplay
    - [X] coverdump
    - [X] coverview
    - [X] dvda2track
    - [X] dvdainfo
    - [X] track2cd
    - [X] track2track
    - [X] trackcat
    - [X] trackcmp
    - [X] trackinfo
    - [X] tracklength
    - [X] tracklint
    - [X] trackplay
    - [X] trackrename
    - [X] tracksplit
    - [X] tracktag
    - [X] trackverify
*** DONE Ensure unit tests pass
** DONE Update C-based ReplayGainReader
   Use a lot of the new C-based facilities to make it simpler.
** DONE Fix --number=0 argument to tracktag
   I'd like to make track_number=0 a valid value
   and have track_number=None indicate a missing field.
   The problem is maintaining consistency between
   metadata formats that store track numbers as text (like ID3v2)
   and those that store track numbers as integers (like M4A).
   - [X] MetaData
   - [X] ApeTag
   - [X] FlacMetaData
   - [X] ID3CommentPair
   - [X] ID3v1Comment
   - [X] ID3v22Comment
   - [X] ID3v23Comment
   - [X] ID3v24Comment
   - [X] M4A_META_Atom
   - [X] VorbisComment
*** DONE Update utilities
*** DONE Update documentation
*** DONE Update unit tests
**** DONE Add getitem/setitem/getattr/setattr/delattr tests to metadata
     - [X] flac
     - [X] wavpack
     - [X] id3v1
     - [X] id3v2
     - [X] vorbis
     - [X] m4a
** DONE Remove Python Imaging Library requirement
   This is only used for thumbnailing
   and for TKinter-based image display.
   Since a Python3 version doesn't seem to be pending,
   it would be better to remove the requirement.
*** DONE Remove thumbnail functions from audiotools.image
    - [X] can_thumbnail
    - [X] thumbnail_formats
    - [X] thumbnail_image
*** DONE Remove thumbnail method from audiotools.Image
*** DONE Remove thumbnail config options
    - [X] audiotools.THUMBNAIL_FORMAT
    - [X] audiotools.THUMBNAIL_SIZE
*** DONE Update utilities
    - [X] audiotools-config
    - [X] track2track
    - [X] tracktag
*** DONE Update utility man pages
    - [X] audiotools-config
    - [X] track2track
    - [X] tracktag
*** DONE Update programming documentation
*** DONE Update unit tests
** DONE Update cuesheet interface to handle non-CD sheets
   Though rare, non-CD audio is sometimes combined
   with cuesheets and should be handled properly
   in those instances.
*** DONE Add sample_rate field to cuesheet pcm_lengths() method
    - [X] Cuesheet.pcm_lengths
    - [X] Flac_CUESHEET.pcm_lengths
    - [X] TOCFile.pcm_lengths
**** DONE Update documentation
**** DONE Update unit tests
*** DONE Remove sheet_to_unicode function
*** DONE Update utilities to use sample_rate field with pcm_lengths
    - [X] trackinfo
    - [X] tracksplit
    - [X] tracktag
*** DONE Ensure unit tests pass
** DONE Add faster and more accurate audio type identifier
   Instead of checking open files on a format-by-format basis
   to determine its type via looping, it's more effecient
   to check for all possible file types from the same stream simultaneously
   via a sort of finite automata.
*** DONE Add file_type function
    - [X] ALACAudio
    - [X] AiffAudio
    - [X] AuAudio
    - [X] FlacAudio - without ID3v2 tag
    - [X] M4AAudio
    - [X] MP2Audio - without ID3v2 tag
    - [X] MP3Audio - without ID3v2 tag
    - [X] OggFlacAudio
    - [X] ShortenAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
    - [X] WaveAudio
    - [X] FlacAudio - with ID3v2 tag
    - [X] MP2Audio - with ID3v2 tag
    - [X] MP3Audio - with ID3v2 tag
*** DONE Update functions which use is_type method to use file_type function
    - [X] trackverify
    - [X] audiotools.open
*** DONE Remove is_type method from AudioFile classes
    - [X] ALACAudio
    - [X] AiffAudio
    - [X] AuAudio
    - [X] FlacAudio
    - [X] M4AAudio
    - [X] MP2Audio
    - [X] MP3Audio
    - [X] OggFlacAudio
    - [X] ShortenAudio
    - [X] VorbisAudio
    - [X] WavPackAudio
    - [X] WaveAudio
*** DONE Update programming documentation
*** DONE Update unit tests
    - [X] test_formats.py
** DONE Update utilities to handle broken track_name template fields
   - [X] cd2track
   - [X] dvda2track
   - [X] track2track
   - [X] trackrename
   - [X] tracksplit
*** DONE Add unit tests for broken track_name template fields
** DONE Split off tracktag's functionality
*** DONE Move the image options into a specialized tool (covertag?)
    Its interactive mode should use PyGTK/Tkinter
    since it's helpful to see the images one is selecting to add/remove.
    - [X] --remove-images
    - [X] --front-cover
    - [X] --back-cover
    - [X] --leaflet
    - [X] --media
    - [X] --other-image
    - [X] -T, --thumbnail
*** DONE Move CD options into a specialized tool
    Something for tagging a group of tracks as if they're an entire CD
    - [X] --cue
    - [X] -l, --lookup
    - [X] --musicbrainz-server
    - [X] --musicbrainz-port
    - [X] --no-musicbrainz
    - [X] --freedb-server
    - [X] --freedb-port
    - [X] --no-freedb
** DONE Add interative mode to audiotools-config
   This is one instance where seeing all the options "up-front"
   is likely to make the process easier.
** DONE Add Python-based file decoders
   These would be low-performance, Python-based PCMReader-style objects
   demonstrating how the decoding process works in a relatively simple
   manner through the use of the BitstreamReader objects.
   They would also provide reference implementations.
*** DONE py_decoders/FlacDecoder
*** DONE py_decoders/SHNDecoder
*** DONE py_decoders/ALACDecoder
*** DONE py_decoders/WavPackDecoder
** DONE Update .convert() method to use fewer temporary files
   .wav and .aiff containers with embedded chunks
   currently route data through actual .wav/.aiff files
   in order to pass those chunks to another format.
   It would be better to avoid creating an intermediate
   file whenever possible.
*** DONE Update wav containers to use new interface
    WaveContainer.has_foreign_wav_chunks()
    returns True if the instance has chunks to convert
    WaveContainer.header_footer()
    returns (header, footer) binary strings
    WaveContainer.from_wave(header, pcmreader, footer)
    returns new instance built from heaeder, PCM data and footer

    Once interface is in place, .convert() can pass header/footer
    and wrap progress monitor around pcmreader in order to avoid
    temporary wav files.
**** DONE Update FlacAudio
     - [X] has_foreign_wave_chunks()
     - [X] wave_header_footer()
     - [X] from_wave(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update OggFlacAudio
     - [X] has_foreign_wave_chunks()
     - [X] wave_header_footer()
     - [X] from_wave(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update ShortenAudio
     - [X] has_foreign_wave_chunks()
     - [X] wave_header_footer()
     - [X] from_wave(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update WavPackAudio
     - [X] has_foreign_wave_chunks()
     - [X] wave_header_footer()
     - [X] from_wave(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update WaveAudio
     - [X] has_foreign_wave_chunks()
     - [X] wave_header_footer()
     - [X] from_wave(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update programming documentation
**** DONE Update unit tests
*** DONE Update aiff containers to use new interface
    AiffContainer.has_foreign_aiff_chunks()
    returns True if the instance has chunks to convert

    AiffContainer.header_footer()
    returns (header, footer) binary strings

    AiffContainer.from_aiff(header, pcmreader, footer)
    returns new instance built from heaeder, PCM data and footer

    Once interface is in place, .convert() can pass header/footer
    and wrap progress monitor around pcmreader in order to avoid
    temporary aiff files.
**** DONE Update AiffAudio
     - [X] has_foreign_aiff_chunks()
     - [X] aiff_header_footer()
     - [X] from_aiff(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update FlacAudio
     - [X] has_foreign_aiff_chunks()
     - [X] aiff_header_footer()
     - [X] from_aiff(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update OggFlacAudio
     - [X] has_foreign_aiff_chunks()
     - [X] aiff_header_footer()
     - [X] from_aiff(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update ShortenAudio
     - [X] has_foreign_aiff_chunks()
     - [X] aiff_header_footer()
     - [X] from_aiff(filename, header, pcmreader, footer, compression)
     - [X] convert(target_page, target_class, compression, progress)
**** DONE Update programming documentation
**** DONE Update unit tests
** DONE Add pause()/resume() methods to low-level output players
   This will hopefully make pausing more responsive
   and work better than simply emptying the output buffer.
** DONE Ensure unicode command-line arguments are parsed properly
*** DONE cd2track
    - [X] --format
    - [X] --dir
*** DONE coverdump
    - [X] filename arguments
    - [X] --dir
    - [X] --prefix
*** DONE covertag
    - [X] filename arguments
    - [X] --front-cover
    - [X] --back-cover
    - [X] --leaflet
    - [X] --media
    - [X] --other-image
*** DONE track2track
    - [X] filename arguments
    - [X] --dir
    - [X] --format
    - [X] --output
*** DONE trackcat
    - [X] filename arguments
    - [X] --output
    - [X] --cue
*** DONE trackcmp
    - [X] filename arguments
*** DONE trackinfo
    - [X] filename arguments
*** DONE tracklength
    - [X] filename arguments
*** DONE tracklint
    - [X] filename arguments
    - [X] --db
*** DONE trackrename
    - [X] filename arguments
    - [X] --format
*** DONE tracksplit
    - [X] filename arguments
    - [X] --cue
    - [X] --dir
    - [X] --format
*** DONE tracktag
    - [X] filename arguments
    - [X] --name
    - [X] --artist
    - [X] --album
    - [X] --performer
    - [X] --com
Download .txt
gitextract_4hj81sl5/

├── COPYING
├── INSTALL
├── MANIFEST.in
├── Makefile
├── TODO
├── audiotools/
│   ├── __init__.py
│   ├── accuraterip.py
│   ├── aiff.py
│   ├── ape.py
│   ├── au.py
│   ├── cdtoc.py
│   ├── coverartarchive.py
│   ├── cue/
│   │   ├── __init__.py
│   │   ├── tokrules.py
│   │   └── yaccrules.py
│   ├── flac.py
│   ├── freedb.py
│   ├── id3.py
│   ├── id3v1.py
│   ├── image.py
│   ├── m4a.py
│   ├── m4a_atoms.py
│   ├── mp3.py
│   ├── mpc.py
│   ├── musicbrainz.py
│   ├── ogg.py
│   ├── opus.py
│   ├── player.py
│   ├── ply/
│   │   ├── README
│   │   ├── __init__.py
│   │   ├── lex.py
│   │   └── yacc.py
│   ├── speex.py
│   ├── text.py
│   ├── toc/
│   │   ├── __init__.py
│   │   ├── tokrules.py
│   │   └── yaccrules.py
│   ├── tta.py
│   ├── ui.py
│   ├── vorbis.py
│   ├── vorbiscomment.py
│   ├── wav.py
│   └── wavpack.py
├── audiotools-config
├── cdda2track
├── cddainfo
├── cddaplay
├── coverbrowse
├── coverdump
├── covertag
├── docs/
│   ├── COPYING
│   ├── Makefile
│   ├── audiotools-config.xml
│   ├── audiotools.cfg.xml
│   ├── cdda2track.xml
│   ├── cddainfo.xml
│   ├── cddaplay.xml
│   ├── coverbrowse.xml
│   ├── coverdump.xml
│   ├── covertag.xml
│   ├── dvda2track.xml
│   ├── dvdainfo.xml
│   ├── manpagexml.py
│   ├── programming/
│   │   ├── Makefile
│   │   └── source/
│   │       ├── audiotools.rst
│   │       ├── audiotools_accuraterip.rst
│   │       ├── audiotools_bitstream.rst
│   │       ├── audiotools_cdio.rst
│   │       ├── audiotools_cue.rst
│   │       ├── audiotools_dvda.rst
│   │       ├── audiotools_freedb.rst
│   │       ├── audiotools_musicbrainz.rst
│   │       ├── audiotools_pcm.rst
│   │       ├── audiotools_pcmconverter.rst
│   │       ├── audiotools_player.rst
│   │       ├── audiotools_replaygain.rst
│   │       ├── audiotools_toc.rst
│   │       ├── audiotools_ui.rst
│   │       ├── conf.py
│   │       ├── huffman.dot
│   │       ├── index.rst
│   │       └── metadata.rst
│   ├── track2cdda.xml
│   ├── track2track.xml
│   ├── trackcat.xml
│   ├── trackcmp.xml
│   ├── trackinfo.xml
│   ├── tracklength.xml
│   ├── tracklint.xml
│   ├── trackplay.xml
│   ├── trackrename.xml
│   ├── tracksplit.xml
│   ├── tracktag.xml
│   └── trackverify.xml
├── dvda2track
├── dvdainfo
├── setup.cfg
├── setup.py
├── src/
│   ├── COPYING.LESSERv3
│   ├── Makefile
│   ├── accuraterip.c
│   ├── accuraterip.h
│   ├── bitstream-table.c
│   ├── bitstream.c
│   ├── bitstream.h
│   ├── buffer.c
│   ├── buffer.h
│   ├── cdiomodule.c
│   ├── cdiomodule.h
│   ├── common/
│   │   ├── flac_crc.c
│   │   ├── flac_crc.h
│   │   ├── m4a_atoms.c
│   │   ├── m4a_atoms.h
│   │   ├── md5.c
│   │   ├── md5.h
│   │   ├── tta_crc.c
│   │   └── tta_crc.h
│   ├── decoders/
│   │   ├── NOTES.rst
│   │   ├── alac.c
│   │   ├── alac.h
│   │   ├── alac_residual.h
│   │   ├── alac_residual.json
│   │   ├── flac.c
│   │   ├── flac.h
│   │   ├── mp3.c
│   │   ├── mp3.h
│   │   ├── mpc.c
│   │   ├── mpc.h
│   │   ├── oggflac.c
│   │   ├── oggflac.h
│   │   ├── opus.c
│   │   ├── opus.h
│   │   ├── sine.c
│   │   ├── sine.h
│   │   ├── tta.c
│   │   ├── tta.h
│   │   ├── vorbis.c
│   │   ├── vorbis.h
│   │   ├── wavpack.c
│   │   └── wavpack.h
│   ├── decoders.c
│   ├── decoders.h
│   ├── dither.c
│   ├── dvdamodule.c
│   ├── dvdamodule.h
│   ├── encoders/
│   │   ├── NOTES.rst
│   │   ├── alac.c
│   │   ├── alac.h
│   │   ├── flac.c
│   │   ├── flac.h
│   │   ├── mp2.c
│   │   ├── mp3.c
│   │   ├── mpc.c
│   │   ├── opus.c
│   │   ├── tta.c
│   │   ├── tta.h
│   │   ├── vorbis.c
│   │   ├── wavpack.c
│   │   └── wavpack.h
│   ├── encoders.c
│   ├── encoders.h
│   ├── framelist.c
│   ├── framelist.h
│   ├── func_io.c
│   ├── func_io.h
│   ├── huffman.c
│   ├── huffman.h
│   ├── libmpcdec/
│   │   ├── AUTHORS
│   │   ├── COPYING
│   │   ├── ChangeLog
│   │   ├── README
│   │   ├── decoder.h
│   │   ├── huffman.c
│   │   ├── huffman.h
│   │   ├── internal.h
│   │   ├── mpc_bits_reader.c
│   │   ├── mpc_bits_reader.h
│   │   ├── mpc_decoder.c
│   │   ├── mpc_demux.c
│   │   ├── mpc_reader.c
│   │   ├── mpcdec_math.h
│   │   ├── requant.c
│   │   ├── requant.h
│   │   ├── streaminfo.c
│   │   └── synth_filter.c
│   ├── libmpcenc/
│   │   ├── analy_filter.c
│   │   ├── bitstream.c
│   │   ├── encode_sv7.c
│   │   ├── huffsv7.c
│   │   ├── libmpcenc.h
│   │   └── quant.c
│   ├── libmpcpsy/
│   │   ├── ans.c
│   │   ├── cvd.c
│   │   ├── fft4g.c
│   │   ├── fft_routines.c
│   │   ├── libmpcpsy.h
│   │   ├── profile.c
│   │   ├── psy.c
│   │   └── psy_tab.c
│   ├── mini-gmp.c
│   ├── mini-gmp.h
│   ├── mod_bitstream.c
│   ├── mod_bitstream.h
│   ├── mod_defs.h
│   ├── mod_ogg.c
│   ├── mod_ogg.h
│   ├── mpc/
│   │   ├── datatypes.h
│   │   ├── minimax.h
│   │   ├── mpc_crc32.c
│   │   ├── mpc_types.h
│   │   ├── mpcdec.h
│   │   ├── mpcmath.h
│   │   ├── reader.h
│   │   └── streaminfo.h
│   ├── ogg.c
│   ├── ogg.h
│   ├── ogg_crc.c
│   ├── ogg_crc.h
│   ├── output/
│   │   ├── alsa.c
│   │   ├── alsa.h
│   │   ├── core_audio.c
│   │   ├── core_audio.h
│   │   ├── pulseaudio.c
│   │   ├── pulseaudio.h
│   │   ├── sfifo.c
│   │   └── sfifo.h
│   ├── output.c
│   ├── parson.c
│   ├── parson.h
│   ├── pcm.c
│   ├── pcm.h
│   ├── pcm_conv.c
│   ├── pcm_conv.h
│   ├── pcmconverter.c
│   ├── pcmconverter.h
│   ├── pcmreader.c
│   ├── pcmreader.h
│   ├── read_bits_table_be.h
│   ├── read_bits_table_le.h
│   ├── read_unary_table_be.h
│   ├── read_unary_table_le.h
│   ├── replaygain.c
│   ├── replaygain.h
│   ├── samplerate/
│   │   ├── common.h
│   │   ├── fastest_coeffs.h
│   │   ├── float_cast.h
│   │   ├── high_qual_coeffs.h
│   │   ├── mid_qual_coeffs.h
│   │   ├── samplerate.c
│   │   ├── samplerate.h
│   │   ├── src_linear.c
│   │   ├── src_sinc.c
│   │   └── src_zoh.c
│   ├── unread_bit_table_be.h
│   └── unread_bit_table_le.h
├── test/
│   ├── 1h.flac
│   ├── 1m.flac
│   ├── 1s.flac
│   ├── aiff-1ch.aiff
│   ├── aiff-2ch.aiff
│   ├── aiff-6ch.aiff
│   ├── aiff-8bit.aiff
│   ├── aiff-metadata.aiff
│   ├── aiff-misordered.aiff
│   ├── aiff-nossnd.aiff
│   ├── alac-allframes.m4a
│   ├── apptest.sh
│   ├── autotag.sh
│   ├── cdda_test.cue
│   ├── cdtoc1.flac
│   ├── cdtoc2.flac
│   ├── error.py
│   ├── flac-allframes.flac
│   ├── flac-disordered.flac
│   ├── flac-id3-2.flac
│   ├── flac-id3.flac
│   ├── flac-nomask1.flac
│   ├── flac-nomask2.flac
│   ├── flac-nomask3.flac
│   ├── flac-nomask4.flac
│   ├── flac-nonmd5.flac
│   ├── flac-noseektable.flac
│   ├── flac-seektable.flac
│   ├── freedb_test_discid-1.cue
│   ├── freedb_test_discid-2.cue
│   ├── freedb_test_discid-3.cue
│   ├── freedb_test_discid-4.cue
│   ├── freedb_test_discid-5.cue
│   ├── huge.bmp.bz2
│   ├── image_test_metrics-6.tiff
│   ├── imagetiff_setup.tiff
│   ├── m4a-faac.m4a
│   ├── m4a-faac2.m4a
│   ├── m4a-faac3.m4a
│   ├── m4a-itunes.m4a
│   ├── m4a-nero.m4a
│   ├── m4a-nero2.m4a
│   ├── m4a-nero3.m4a
│   ├── metadata_flac_cuesheet-1.cue
│   ├── metadata_flac_cuesheet-2.cue
│   ├── metadata_flac_cuesheet-3.cue
│   ├── shorten-frames.shn
│   ├── shorten-lpc.shn
│   ├── silence.wv
│   ├── sine.mp2
│   ├── test.cfg
│   ├── test.py
│   ├── test_cdrdao.py
│   ├── test_cdrecord.py
│   ├── test_core.py
│   ├── test_formats.py
│   ├── test_metadata.py
│   ├── test_streams.py
│   ├── test_utils.py
│   ├── tone.flac
│   ├── tone1.flac
│   ├── tone2.flac
│   ├── tone3.flac
│   ├── tone4.flac
│   ├── tone5.flac
│   ├── tone6.flac
│   ├── tone7.flac
│   ├── tone8.flac
│   ├── trackcat_pre_gap.cue
│   ├── trackcat_pre_gap2.cue
│   ├── trueaudio.tta
│   └── wavpack-combo.wv
├── track2cdda
├── track2track
├── trackcat
├── trackcmp
├── trackinfo
├── tracklength
├── tracklint
├── trackplay
├── trackrename
├── tracksplit
├── tracktag
└── trackverify
Download .txt
Showing preview only (357K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5779 symbols across 175 files)

FILE: audiotools/__init__.py
  class RawConfigParser (line 39) | class RawConfigParser(RawConfigParser):
    method get_default (line 42) | def get_default(self, section, option, default):
    method set_default (line 57) | def set_default(self, section, option, value):
    method getint_default (line 69) | def getint_default(self, section, option, default):
    method getboolean_default (line 84) | def getboolean_default(self, section, option, default):
  class __system_binaries__ (line 109) | class __system_binaries__(object):
    method __init__ (line 110) | def __init__(self, config):
    method __getitem__ (line 113) | def __getitem__(self, command):
    method can_execute (line 126) | def can_execute(self, command):
  function __format_fields__ (line 168) | def __format_fields__():
  function __default_quality__ (line 257) | def __default_quality__(audio_type):
  class Messenger (line 278) | class Messenger(object):
    method __init__ (line 281) | def __init__(self, silent=False):
    method output_isatty (line 295) | def output_isatty(self):
    method info_isatty (line 298) | def info_isatty(self):
    method error_isatty (line 301) | def error_isatty(self):
    method __print_silent__ (line 304) | def __print_silent__(self, string, stream, add_newline, flush):
    method __print_py2__ (line 313) | def __print_py2__(self, string, stream, add_newline, flush):
    method __print_py3__ (line 327) | def __print_py3__(self, string, stream, add_newline, flush):
    method output (line 339) | def output(self, s):
    method partial_output (line 349) | def partial_output(self, s):
    method info (line 359) | def info(self, s):
    method partial_info (line 369) | def partial_info(self, s):
    method error (line 388) | def error(self, s):
    method os_error (line 398) | def os_error(self, oserror):
    method warning (line 408) | def warning(self, s):
    method ansi_clearline (line 418) | def ansi_clearline(self):
    method ansi_uplines (line 435) | def ansi_uplines(self, lines):
    method ansi_cleardown (line 441) | def ansi_cleardown(self):
    method ansi_clearscreen (line 447) | def ansi_clearscreen(self):
    method terminal_size (line 453) | def terminal_size(self, fd):
  class SilentMessenger (line 470) | class SilentMessenger(Messenger):
    method __init__ (line 471) | def __init__(self):
  function khz (line 475) | def khz(hz):
  function hex_string (line 489) | def hex_string(byte_string):
  class output_text (line 500) | class output_text(tuple):
    method __new__ (line 517) | def __new__(cls, unicode_string, fg_color=None, bg_color=None, style=N...
    method __construct__ (line 553) | def __construct__(cls,
    method __repr__ (line 584) | def __repr__(self):
    method __open_codes__ (line 593) | def __open_codes__(cls, fg_color, bg_color, style):
    method __close_codes__ (line 637) | def __close_codes__(cls, fg_color, bg_color, style):
    method __str__ (line 667) | def __str__(self):
    method __str__ (line 670) | def __str__(self):
    method __unicode__ (line 673) | def __unicode__(self):
    method char_widths (line 676) | def char_widths(self):
    method __len__ (line 682) | def __len__(self):
    method fg_color (line 685) | def fg_color(self):
    method bg_color (line 690) | def bg_color(self):
    method style (line 695) | def style(self):
    method set_string (line 700) | def set_string(self, unicode_string, char_widths):
    method set_format (line 713) | def set_format(self, fg_color=None, bg_color=None, style=None):
    method has_formatting (line 729) | def has_formatting(self):
    method format (line 736) | def format(self, is_tty=False):
    method head (line 744) | def head(self, display_characters):
    method tail (line 770) | def tail(self, display_characters):
    method split (line 799) | def split(self, display_characters):
    method join (line 830) | def join(self, output_texts):
  class output_list (line 842) | class output_list(output_text):
    method __new__ (line 852) | def __new__(cls, output_texts, fg_color=None, bg_color=None, style=None):
    method __construct__ (line 873) | def __construct__(cls,
    method __unicode__ (line 903) | def __unicode__(self):
    method char_widths (line 906) | def char_widths(self):
    method __len__ (line 913) | def __len__(self):
    method fg_color (line 916) | def fg_color(self):
    method bg_color (line 921) | def bg_color(self):
    method style (line 926) | def style(self):
    method set_string (line 931) | def set_string(self, output_texts):
    method set_format (line 943) | def set_format(self, fg_color=None, bg_color=None, style=None):
    method has_formatting (line 958) | def has_formatting(self):
    method format (line 965) | def format(self, is_tty=False):
    method head (line 980) | def head(self, display_characters):
    method tail (line 1003) | def tail(self, display_characters):
    method split (line 1026) | def split(self, display_characters):
  class output_table (line 1058) | class output_table(object):
    method __init__ (line 1059) | def __init__(self):
    method row (line 1064) | def row(self):
    method blank_row (line 1071) | def blank_row(self):
    method divider_row (line 1076) | def divider_row(self, dividers):
    method format (line 1083) | def format(self, is_tty=False):
  class output_table_blank (line 1108) | class output_table_blank(object):
    method __init__ (line 1111) | def __init__(self):
    method blank (line 1114) | def blank(self):
    method column_width (line 1117) | def column_width(self, column):
    method format (line 1120) | def format(self, column_widths, is_tty=False):
  class output_table_divider (line 1126) | class output_table_divider(output_table_blank):
    method __init__ (line 1129) | def __init__(self, dividers):
    method blank (line 1132) | def blank(self):
    method __len__ (line 1135) | def __len__(self):
    method column_width (line 1138) | def column_width(self, column):
    method format (line 1141) | def format(self, column_widths, is_tty=False):
  class output_table_row (line 1151) | class output_table_row(output_table_divider):
    method __init__ (line 1152) | def __init__(self):
    method __len__ (line 1157) | def __len__(self):
    method column_width (line 1160) | def column_width(self, column):
    method format (line 1163) | def format(self, column_widths, is_tty=False):
    method add_column (line 1172) | def add_column(self, text, alignment="left", colspan=1):
  class output_table_col (line 1191) | class output_table_col(object):
    method __init__ (line 1192) | def __init__(self, text, alignment="left"):
    method minimum_width (line 1211) | def minimum_width(self):
    method __format_left__ (line 1214) | def __format_left__(self, column_width, is_tty):
    method __format_center__ (line 1225) | def __format_center__(self, column_width, is_tty):
    method __format_right__ (line 1240) | def __format_right__(self, column_width, is_tty):
  class output_table_multicol_accumulator (line 1252) | class output_table_multicol_accumulator(output_table_col):
    method __init__ (line 1253) | def __init__(self):
    method minimum_width (line 1256) | def minimum_width(self):
    method actual_width (line 1259) | def actual_width(self):
    method format (line 1262) | def format(self, column_width, is_tty):
  class output_table_multicol (line 1267) | class output_table_multicol(output_table_col):
    method __init__ (line 1268) | def __init__(self, accumulators, text, alignment="left"):
    method minimum_width (line 1272) | def minimum_width(self):
    method format (line 1275) | def format(self, column_width, is_tty):
  class ProgressDisplay (line 1281) | class ProgressDisplay(object):
    method __init__ (line 1284) | def __init__(self, messenger):
    method add_row (line 1294) | def add_row(self, output_line):
    method remove_row (line 1312) | def remove_row(self, row_index):
    method display_rows (line 1318) | def display_rows(self):
    method clear_rows (line 1331) | def clear_rows(self):
    method output_line (line 1340) | def output_line(self, line):
  class ProgressRow (line 1348) | class ProgressRow(object):
    method __init__ (line 1354) | def __init__(self, progress_display, row_index, output_line):
    method update (line 1369) | def update(self, progress):
    method finish (line 1374) | def finish(self):
    method unicode (line 1379) | def unicode(self, width):
  class SingleProgressDisplay (line 1425) | class SingleProgressDisplay(ProgressDisplay):
    method __init__ (line 1428) | def __init__(self, messenger, progress_text):
    method update (line 1439) | def update(self, progress):
  class ReplayGainProgressDisplay (line 1450) | class ReplayGainProgressDisplay(ProgressDisplay):
    method __init__ (line 1453) | def __init__(self, messenger):
    method initial_message_tty (line 1475) | def initial_message_tty(self):
    method initial_message_nontty (line 1480) | def initial_message_nontty(self):
    method update_tty (line 1487) | def update_tty(self, progress):
    method update_nontty (line 1497) | def update_nontty(self, progress):
    method final_message_tty (line 1502) | def final_message_tty(self):
    method final_message_nontty (line 1510) | def final_message_nontty(self):
  class UnsupportedFile (line 1516) | class UnsupportedFile(Exception):
  class InvalidFile (line 1522) | class InvalidFile(Exception):
  class EncodingError (line 1528) | class EncodingError(IOError):
    method __init__ (line 1532) | def __init__(self, error_message):
    method __str__ (line 1538) | def __str__(self):
    method __str__ (line 1541) | def __str__(self):
    method __unicode__ (line 1544) | def __unicode__(self):
  class UnsupportedChannelMask (line 1548) | class UnsupportedChannelMask(EncodingError):
    method __init__ (line 1551) | def __init__(self, filename, mask):
    method __reduce__ (line 1562) | def __reduce__(self):
  class UnsupportedChannelCount (line 1566) | class UnsupportedChannelCount(EncodingError):
    method __init__ (line 1569) | def __init__(self, filename, count):
    method __reduce__ (line 1580) | def __reduce__(self):
  class UnsupportedBitsPerSample (line 1584) | class UnsupportedBitsPerSample(EncodingError):
    method __init__ (line 1587) | def __init__(self, filename, bits_per_sample):
    method __reduce__ (line 1598) | def __reduce__(self):
  class DecodingError (line 1603) | class DecodingError(IOError):
    method __init__ (line 1609) | def __init__(self, error_message):
    method __str__ (line 1615) | def __str__(self):
    method __str__ (line 1618) | def __str__(self):
    method __unicode__ (line 1621) | def __unicode__(self):
  function file_type (line 1625) | def file_type(file):
  function open (line 1771) | def open(filename):
  class DuplicateFile (line 1792) | class DuplicateFile(Exception):
    method __init__ (line 1795) | def __init__(self, filename):
  class DuplicateOutputFile (line 1803) | class DuplicateOutputFile(Exception):
    method __init__ (line 1806) | def __init__(self, filename):
  class OutputFileIsInput (line 1814) | class OutputFileIsInput(Exception):
    method __init__ (line 1817) | def __init__(self, filename):
  class Filename (line 1825) | class Filename(tuple):
    method __new__ (line 1826) | def __new__(cls, filename):
    method from_unicode (line 1847) | def from_unicode(cls, unicode_string):
    method open (line 1854) | def open(self, mode):
    method disk_file (line 1860) | def disk_file(self):
    method dirname (line 1865) | def dirname(self):
    method basename (line 1870) | def basename(self):
    method expanduser (line 1875) | def expanduser(self):
    method abspath (line 1880) | def abspath(self):
    method __repr__ (line 1885) | def __repr__(self):
    method __eq__ (line 1888) | def __eq__(self, filename):
    method __ne__ (line 1905) | def __ne__(self, filename):
    method __hash__ (line 1908) | def __hash__(self):
    method __str__ (line 1914) | def __str__(self):
    method __unicode__ (line 1918) | def __unicode__(self):
    method __unicode__ (line 1921) | def __unicode__(self):
  function sorted_tracks (line 1925) | def sorted_tracks(audiofiles):
  function open_files (line 1934) | def open_files(filename_list, sorted=True, messenger=None,
  function open_directory (line 1992) | def open_directory(directory, sorted=True, messenger=None):
  function group_tracks (line 2011) | def group_tracks(tracks):
  class UnknownAudioType (line 2037) | class UnknownAudioType(Exception):
    method __init__ (line 2040) | def __init__(self, suffix):
    method error_msg (line 2043) | def error_msg(self, messenger):
  class AmbiguousAudioType (line 2049) | class AmbiguousAudioType(UnknownAudioType):
    method __init__ (line 2052) | def __init__(self, suffix, type_list):
    method error_msg (line 2056) | def error_msg(self, messenger):
  function filename_to_type (line 2067) | def filename_to_type(path):
  class ChannelMask (line 2095) | class ChannelMask(object):
    method __init__ (line 2190) | def __init__(self, mask):
    method __repr__ (line 2198) | def __repr__(self):
    method __str__ (line 2205) | def __str__(self):
    method __str__ (line 2208) | def __str__(self):
    method __unicode__ (line 2211) | def __unicode__(self):
    method __int__ (line 2218) | def __int__(self):
    method __eq__ (line 2228) | def __eq__(self, v):
    method __ne__ (line 2231) | def __ne__(self, v):
    method __len__ (line 2234) | def __len__(self):
    method defined (line 2238) | def defined(self):
    method undefined (line 2243) | def undefined(self):
    method channels (line 2248) | def channels(self):
    method index (line 2263) | def index(self, channel_name):
    method from_fields (line 2273) | def from_fields(cls, **fields):
    method from_channels (line 2292) | def from_channels(cls, channel_count):
  class PCMReader (line 2306) | class PCMReader(object):
    method __init__ (line 2307) | def __init__(self, sample_rate, channels, channel_mask, bits_per_sample):
    method __enter__ (line 2345) | def __enter__(self):
    method __exit__ (line 2348) | def __exit__(self, exc_type, exc_value, traceback):
    method read (line 2351) | def read(self, pcm_frames):
    method close (line 2367) | def close(self):
  class PCMFileReader (line 2375) | class PCMFileReader(PCMReader):
    method __init__ (line 2378) | def __init__(self, file,
    method read (line 2409) | def read(self, pcm_frames):
    method close (line 2440) | def close(self):
    method __del__ (line 2450) | def __del__(self):
  class PCMReaderError (line 2456) | class PCMReaderError(PCMReader):
    method __init__ (line 2462) | def __init__(self, error_message,
    method read (line 2471) | def read(self, pcm_frames):
    method close (line 2476) | def close(self):
  function to_pcm_progress (line 2482) | def to_pcm_progress(audiofile, progress):
  class PCMReaderProgress (line 2491) | class PCMReaderProgress(PCMReader):
    method __init__ (line 2492) | def __init__(self, pcmreader, total_frames, progress, current_frames=0):
    method read (line 2512) | def read(self, pcm_frames):
    method close (line 2518) | def close(self):
  class ReorderedPCMReader (line 2522) | class ReorderedPCMReader(PCMReader):
    method __init__ (line 2525) | def __init__(self, pcmreader, channel_order, channel_mask=None):
    method read (line 2554) | def read(self, pcm_frames):
    method close (line 2562) | def close(self):
  class ThreadedPCMReader (line 2568) | class ThreadedPCMReader(PCMReader):
    method __init__ (line 2577) | def __init__(self, pcmreader):
    method read (line 2615) | def read(self, pcm_frames):
    method close (line 2633) | def close(self):
  function transfer_data (line 2644) | def transfer_data(from_function, to_function):
  function transfer_framelist_data (line 2660) | def transfer_framelist_data(pcmreader, to_function,
  function pcm_cmp (line 2682) | def pcm_cmp(pcmreader1, pcmreader2):
  function pcm_frame_cmp (line 2694) | def pcm_frame_cmp(pcmreader1, pcmreader2):
  class PCMCat (line 2754) | class PCMCat(PCMReader):
    method __init__ (line 2757) | def __init__(self, pcmreaders):
    method read (line 2788) | def read(self, pcm_frames):
    method read_closed (line 2807) | def read_closed(self, pcm_frames):
    method close (line 2810) | def close(self):
  class CounterPCMReader (line 2821) | class CounterPCMReader(PCMReader):
    method __init__ (line 2824) | def __init__(self, pcmreader):
    method bytes_written (line 2833) | def bytes_written(self):
    method read (line 2838) | def read(self, pcm_frames):
    method close (line 2843) | def close(self):
  class LimitedFileReader (line 2847) | class LimitedFileReader(object):
    method __init__ (line 2848) | def __init__(self, file, total_bytes):
    method read (line 2852) | def read(self, x):
    method close (line 2865) | def close(self):
  class LimitedPCMReader (line 2869) | class LimitedPCMReader(PCMReader):
    method __init__ (line 2870) | def __init__(self, buffered_pcmreader, total_pcm_frames):
    method read (line 2886) | def read(self, pcm_frames):
    method read_closed (line 2894) | def read_closed(self, pcm_frames):
    method close (line 2897) | def close(self):
  function PCMConverter (line 2901) | def PCMConverter(pcmreader,
  class ReplayGainCalculator (line 2977) | class ReplayGainCalculator:
    method __init__ (line 2978) | def __init__(self, sample_rate):
    method sample_rate (line 2984) | def sample_rate(self):
    method __iter__ (line 2987) | def __iter__(self):
    method to_pcm (line 2999) | def to_pcm(self, pcmreader):
  class ReplayGainCalculatorReader (line 3013) | class ReplayGainCalculatorReader(PCMReader):
    method __init__ (line 3014) | def __init__(self, replaygain, pcmreader):
    method read (line 3025) | def read(self, pcm_frames):
    method close (line 3030) | def close(self):
    method title_gain (line 3040) | def title_gain(self):
    method title_peak (line 3046) | def title_peak(self):
  function resampled_frame_count (line 3053) | def resampled_frame_count(initial_frame_count,
  function calculate_replay_gain (line 3071) | def calculate_replay_gain(tracks, progress=None):
  function add_replay_gain (line 3122) | def add_replay_gain(tracks, progress=None):
  function ignore_sigint (line 3139) | def ignore_sigint():
  function make_dirs (line 3152) | def make_dirs(destination_path):
  class MetaData (line 3163) | class MetaData(object):
    method __init__ (line 3286) | def __init__(self,
    method __repr__ (line 3361) | def __repr__(self):
    method __delattr__ (line 3368) | def __delattr__(self, field):
    method fields (line 3377) | def fields(self):
    method filled_fields (line 3383) | def filled_fields(self):
    method empty_fields (line 3391) | def empty_fields(self):
    method __str__ (line 3400) | def __str__(self):
    method __str__ (line 3403) | def __str__(self):
    method __unicode__ (line 3406) | def __unicode__(self):
    method raw_info (line 3489) | def raw_info(self):
    method __eq__ (line 3500) | def __eq__(self, metadata):
    method __ne__ (line 3508) | def __ne__(self, metadata):
    method converted (line 3512) | def converted(cls, metadata):
    method supports_images (line 3530) | def supports_images(cls):
    method images (line 3535) | def images(self):
    method front_covers (line 3542) | def front_covers(self):
    method back_covers (line 3547) | def back_covers(self):
    method leaflet_pages (line 3552) | def leaflet_pages(self):
    method media_images (line 3557) | def media_images(self):
    method other_images (line 3562) | def other_images(self):
    method add_image (line 3567) | def add_image(self, image):
    method delete_image (line 3582) | def delete_image(self, image):
    method clean (line 3597) | def clean(self):
    method intersection (line 3613) | def intersection(self, metadata):
  class Image (line 3638) | class Image(object):
    method __init__ (line 3641) | def __init__(self, data, mime_type, width, height,
    method suffix (line 3678) | def suffix(self):
    method type_string (line 3691) | def type_string(self):
    method __repr__ (line 3703) | def __repr__(self):
    method __str__ (line 3715) | def __str__(self):
    method __str__ (line 3718) | def __str__(self):
    method __unicode__ (line 3721) | def __unicode__(self):
    method new (line 3728) | def new(cls, image_data, description, type):
    method __eq__ (line 3753) | def __eq__(self, image):
    method __ne__ (line 3762) | def __ne__(self, image):
  class InvalidImage (line 3766) | class InvalidImage(Exception):
  class ReplayGain (line 3770) | class ReplayGain(object):
    method __init__ (line 3773) | def __init__(self, track_gain, track_peak, album_gain, album_peak):
    method __repr__ (line 3789) | def __repr__(self):
    method __eq__ (line 3795) | def __eq__(self, rg):
    method __ne__ (line 3804) | def __ne__(self, rg):
  class UnsupportedTracknameField (line 3808) | class UnsupportedTracknameField(Exception):
    method __init__ (line 3812) | def __init__(self, field):
    method error_msg (line 3815) | def error_msg(self, messenger):
  class InvalidFilenameFormat (line 3831) | class InvalidFilenameFormat(Exception):
    method __init__ (line 3835) | def __init__(self, *args):
  class AudioFile (line 3840) | class AudioFile(object):
    method __init__ (line 3856) | def __init__(self, filename):
    method __repr__ (line 3863) | def __repr__(self):
    method __sort_key__ (line 3871) | def __sort_key__(self):
    method __eq__ (line 3881) | def __eq__(self, audiofile):
    method __ne__ (line 3888) | def __ne__(self, audiofile):
    method __lt__ (line 3891) | def __lt__(self, audiofile):
    method __le__ (line 3898) | def __le__(self, audiofile):
    method __gt__ (line 3905) | def __gt__(self, audiofile):
    method __ge__ (line 3912) | def __ge__(self, audiofile):
    method __gt__ (line 3919) | def __gt__(self, audiofile):
    method bits_per_sample (line 3926) | def bits_per_sample(self):
    method channels (line 3931) | def channels(self):
    method channel_mask (line 3936) | def channel_mask(self):
    method lossless (line 3946) | def lossless(self):
    method supports_metadata (line 3952) | def supports_metadata(cls):
    method update_metadata (line 3957) | def update_metadata(self, metadata):
    method set_metadata (line 3974) | def set_metadata(self, metadata):
    method get_metadata (line 3987) | def get_metadata(self):
    method delete_metadata (line 3994) | def delete_metadata(self):
    method total_frames (line 4002) | def total_frames(self):
    method cd_frames (line 4007) | def cd_frames(self):
    method seconds_length (line 4017) | def seconds_length(self):
    method sample_rate (line 4028) | def sample_rate(self):
    method supports_to_pcm (line 4034) | def supports_to_pcm(cls):
    method to_pcm (line 4040) | def to_pcm(self):
    method supports_from_pcm (line 4049) | def supports_from_pcm(cls):
    method from_pcm (line 4056) | def from_pcm(cls, filename, pcmreader,
    method convert (line 4088) | def convert(self, target_path, target_class,
    method seekable (line 4104) | def seekable(self):
    method __unlink__ (line 4114) | def __unlink__(cls, filename):
    method track_name (line 4121) | def track_name(cls, file_path, track_metadata=None, format=None,
    method supports_replay_gain (line 4235) | def supports_replay_gain(cls):
    method get_replay_gain (line 4241) | def get_replay_gain(self):
    method set_replay_gain (line 4251) | def set_replay_gain(self, replaygain):
    method delete_replay_gain (line 4259) | def delete_replay_gain(self):
    method supports_cuesheet (line 4268) | def supports_cuesheet(self):
    method set_cuesheet (line 4273) | def set_cuesheet(self, cuesheet):
    method get_cuesheet (line 4280) | def get_cuesheet(self):
    method delete_cuesheet (line 4287) | def delete_cuesheet(self):
    method verify (line 4294) | def verify(self, progress=None):
    method clean (line 4319) | def clean(self, output_filename=None):
  class WaveContainer (line 4360) | class WaveContainer(AudioFile):
    method has_foreign_wave_chunks (line 4361) | def has_foreign_wave_chunks(self):
    method wave_header_footer (line 4368) | def wave_header_footer(self):
    method from_wave (line 4381) | def from_wave(cls, filename, header, pcmreader, footer, compression=No...
    method convert (line 4400) | def convert(self, target_path, target_class, compression=None,
  class AiffContainer (line 4433) | class AiffContainer(AudioFile):
    method has_foreign_aiff_chunks (line 4434) | def has_foreign_aiff_chunks(self):
    method aiff_header_footer (line 4441) | def aiff_header_footer(self):
    method from_aiff (line 4453) | def from_aiff(cls, filename, header, pcmreader, footer, compression=No...
    method convert (line 4472) | def convert(self, target_path, target_class, compression=None,
  class SheetException (line 4506) | class SheetException(ValueError):
  function read_sheet (line 4512) | def read_sheet(filename):
  function read_sheet_string (line 4525) | def read_sheet_string(sheet_string):
  class Sheet (line 4544) | class Sheet(object):
    method __init__ (line 4548) | def __init__(self, sheet_tracks, metadata=None):
    method converted (line 4556) | def converted(cls, sheet):
    method from_cddareader (line 4563) | def from_cddareader(cls, cddareader, filename=u"CDImage.wav"):
    method from_tracks (line 4585) | def from_tracks(cls, audiofiles, filename=u"CDImage.wav"):
    method __repr__ (line 4634) | def __repr__(self):
    method __len__ (line 4638) | def __len__(self):
    method __getitem__ (line 4641) | def __getitem__(self, index):
    method __eq__ (line 4644) | def __eq__(self, sheet):
    method track_numbers (line 4658) | def track_numbers(self):
    method track (line 4663) | def track(self, track_number):
    method pre_gap (line 4673) | def pre_gap(self):
    method track_offset (line 4684) | def track_offset(self, track_number):
    method track_length (line 4693) | def track_length(self, track_number, total_length=None):
    method image_formatted (line 4714) | def image_formatted(self):
    method get_metadata (line 4735) | def get_metadata(self):
  class SheetTrack (line 4743) | class SheetTrack(object):
    method __init__ (line 4744) | def __init__(self, number,
    method converted (line 4775) | def converted(cls, sheet_track):
    method __repr__ (line 4787) | def __repr__(self):
    method __len__ (line 4799) | def __len__(self):
    method __getitem__ (line 4802) | def __getitem__(self, i):
    method indexes (line 4805) | def indexes(self):
    method index (line 4810) | def index(self, index_number):
    method __eq__ (line 4820) | def __eq__(self, sheet_track):
    method __ne__ (line 4839) | def __ne__(self, sheet_track):
    method number (line 4842) | def number(self):
    method get_metadata (line 4847) | def get_metadata(self):
    method filename (line 4852) | def filename(self):
    method is_audio (line 4857) | def is_audio(self):
    method pre_emphasis (line 4862) | def pre_emphasis(self):
    method copy_permitted (line 4867) | def copy_permitted(self):
  class SheetIndex (line 4873) | class SheetIndex(object):
    method __init__ (line 4874) | def __init__(self, number, offset):
    method converted (line 4884) | def converted(cls, sheet_index):
    method __repr__ (line 4890) | def __repr__(self):
    method __eq__ (line 4894) | def __eq__(self, sheet_index):
    method __ne__ (line 4901) | def __ne__(self, sheet_index):
    method number (line 4904) | def number(self):
    method offset (line 4907) | def offset(self):
  function has_pre_gap_track (line 4911) | def has_pre_gap_track(audiofiles):
  function iter_first (line 4945) | def iter_first(iterator):
  function iter_last (line 4957) | def iter_last(iterator):
  function PCMReaderWindow (line 4982) | def PCMReaderWindow(pcmreader, initial_offset, pcm_frames, forward_close...
  class PCMReaderHead (line 5007) | class PCMReaderHead(PCMReader):
    method __init__ (line 5010) | def __init__(self, pcmreader, pcm_frames, forward_close=True):
    method __repr__ (line 5037) | def __repr__(self):
    method read (line 5041) | def read(self, pcm_frames):
    method read_closed (line 5072) | def read_closed(self, pcm_frames):
    method close (line 5075) | def close(self):
  class PCMReaderDeHead (line 5081) | class PCMReaderDeHead(PCMReader):
    method __init__ (line 5084) | def __init__(self, pcmreader, pcm_frames, forward_close=True):
    method __repr__ (line 5108) | def __repr__(self):
    method read (line 5112) | def read(self, pcm_frames):
    method read_closed (line 5147) | def read_closed(self, pcm_frames):
    method close (line 5150) | def close(self):
  function most_numerous (line 5157) | def most_numerous(item_list, empty_list=None, all_differ=None):
  function metadata_lookup (line 5179) | def metadata_lookup(musicbrainz_disc_id,
  function cddareader_metadata_lookup (line 5221) | def cddareader_metadata_lookup(cddareader,
  function track_metadata_lookup (line 5244) | def track_metadata_lookup(audiofiles,
  function sheet_metadata_lookup (line 5297) | def sheet_metadata_lookup(sheet,
  function accuraterip_lookup (line 5327) | def accuraterip_lookup(sorted_tracks,
  function accuraterip_sheet_lookup (line 5351) | def accuraterip_sheet_lookup(sheet, total_pcm_frames, sample_rate,
  function output_progress (line 5373) | def output_progress(u, current, total):
  class ExecProgressQueue (line 5385) | class ExecProgressQueue(object):
    method __init__ (line 5388) | def __init__(self, messenger):
    method execute (line 5398) | def execute(self, function,
    method run (line 5425) | def run(self, max_processes=1):
    method __run_serial__ (line 5439) | def __run_serial__(self):
    method __run_parallel__ (line 5485) | def __run_parallel__(self, max_processes=1):
  class __ProgressQueueJob__ (line 5631) | class __ProgressQueueJob__(object):
    method __init__ (line 5634) | def __init__(self,
    method job_fd (line 5666) | def job_fd(self):
    method progress (line 5671) | def progress(self):
    method spawn (line 5681) | def spawn(cls,
    method result (line 5757) | def result(self):
  class TemporaryFile (line 5768) | class TemporaryFile(object):
    method __init__ (line 5771) | def __init__(self, original_filename):
    method __del__ (line 5783) | def __del__(self):
    method write (line 5788) | def write(self, data):
    method flush (line 5793) | def flush(self):
    method tell (line 5798) | def tell(self):
    method seek (line 5803) | def seek(self, offset, whence=None):
    method close (line 5811) | def close(self):

FILE: audiotools/accuraterip.py
  class __Checksum__ (line 23) | class __Checksum__(object):
    method __init__ (line 26) | def __init__(self, total_pcm_frames,
    method update (line 53) | def update(self, framelist):
    method checksums_v1 (line 79) | def checksums_v1(self):
    method checksums_v2 (line 93) | def checksums_v2(self):
  function match_offset (line 111) | def match_offset(ar_matches, checksums, initial_offset):
  class DiscID (line 150) | class DiscID(object):
    method __init__ (line 151) | def __init__(self, track_numbers, track_offsets,
    method from_cddareader (line 171) | def from_cddareader(cls, cddareader):
    method from_tracks (line 184) | def from_tracks(cls, tracks):
    method from_sheet (line 211) | def from_sheet(cls, sheet, total_pcm_frames, sample_rate):
    method track_numbers (line 227) | def track_numbers(self):
    method id1 (line 230) | def id1(self):
    method id2 (line 233) | def id2(self):
    method freedb_disc_id (line 238) | def freedb_disc_id(self):
    method __str__ (line 242) | def __str__(self):
    method __str__ (line 245) | def __str__(self):
    method __unicode__ (line 248) | def __unicode__(self):
    method __repr__ (line 255) | def __repr__(self):
  function perform_lookup (line 265) | def perform_lookup(disc_id,

FILE: audiotools/aiff.py
  function parse_ieee_extended (line 24) | def parse_ieee_extended(bitstream):
  function build_ieee_extended (line 38) | def build_ieee_extended(bitstream, value):
  function pad_data (line 61) | def pad_data(pcm_frames, channels, bits_per_sample):
  function validate_header (line 68) | def validate_header(header):
  function validate_footer (line 156) | def validate_footer(footer, ssnd_bytes_written):
  class AIFF_Chunk (line 205) | class AIFF_Chunk(object):
    method __init__ (line 208) | def __init__(self, chunk_id, chunk_size, chunk_data):
    method __repr__ (line 219) | def __repr__(self):
    method size (line 222) | def size(self):
    method total_size (line 228) | def total_size(self):
    method data (line 237) | def data(self):
    method verify (line 244) | def verify(self):
    method write (line 249) | def write(self, f):
  class AIFF_File_Chunk (line 262) | class AIFF_File_Chunk(AIFF_Chunk):
    method __init__ (line 265) | def __init__(self, chunk_id, chunk_size, aiff_file, chunk_data_offset):
    method __del__ (line 278) | def __del__(self):
    method __repr__ (line 281) | def __repr__(self):
    method data (line 284) | def data(self):
    method verify (line 292) | def verify(self):
    method write (line 305) | def write(self, f):
  function parse_comm (line 324) | def parse_comm(comm):
  class AiffReader (line 347) | class AiffReader(object):
    method __init__ (line 350) | def __init__(self, aiff_filename):
    method __enter__ (line 431) | def __enter__(self):
    method __exit__ (line 434) | def __exit__(self, exc_type, exc_value, traceback):
    method read (line 437) | def read(self, pcm_frames):
    method read_closed (line 461) | def read_closed(self, pcm_frames):
    method seek (line 464) | def seek(self, pcm_frame_offset):
    method seek_closed (line 484) | def seek_closed(self, pcm_frame_offset):
    method close (line 487) | def close(self):
  function aiff_header (line 495) | def aiff_header(sample_rate,
  class InvalidAIFF (line 528) | class InvalidAIFF(InvalidFile):
  class AiffAudio (line 534) | class AiffAudio(AiffContainer):
    method __init__ (line 546) | def __init__(self, filename):
    method bits_per_sample (line 577) | def bits_per_sample(self):
    method channels (line 582) | def channels(self):
    method channel_mask (line 587) | def channel_mask(self):
    method lossless (line 592) | def lossless(self):
    method total_frames (line 597) | def total_frames(self):
    method sample_rate (line 602) | def sample_rate(self):
    method seekable (line 607) | def seekable(self):
    method chunks (line 612) | def chunks(self):
    method aiff_from_chunks (line 670) | def aiff_from_chunks(cls, aiff_file, chunk_iter):
    method supports_metadata (line 693) | def supports_metadata(cls):
    method get_metadata (line 698) | def get_metadata(self):
    method update_metadata (line 713) | def update_metadata(self, metadata):
    method set_metadata (line 751) | def set_metadata(self, metadata):
    method delete_metadata (line 788) | def delete_metadata(self):
    method supports_to_pcm (line 808) | def supports_to_pcm(cls):
    method to_pcm (line 814) | def to_pcm(self):
    method supports_from_pcm (line 829) | def supports_from_pcm(cls):
    method from_pcm (line 836) | def from_pcm(cls, filename, pcmreader,
    method has_foreign_aiff_chunks (line 906) | def has_foreign_aiff_chunks(self):
    method aiff_header_footer (line 911) | def aiff_header_footer(self):
    method from_aiff (line 975) | def from_aiff(cls, filename, header, pcmreader, footer, compression=No...
    method verify (line 1045) | def verify(self, progress=None):
    method clean (line 1098) | def clean(self, output_filename=None):

FILE: audiotools/ape.py
  function __number_pair__ (line 27) | def __number_pair__(current, total):
  function limited_transfer_data (line 45) | def limited_transfer_data(from_function, to_function, max_bytes):
  class ApeTagItem (line 59) | class ApeTagItem(object):
    method __init__ (line 64) | def __init__(self, item_type, read_only, key, data):
    method __eq__ (line 81) | def __eq__(self, item):
    method total_size (line 89) | def total_size(self):
    method copy (line 94) | def copy(self):
    method __repr__ (line 102) | def __repr__(self):
    method raw_info_pair (line 108) | def raw_info_pair(self):
    method __str__ (line 128) | def __str__(self):
    method __str__ (line 131) | def __str__(self):
    method __unicode__ (line 134) | def __unicode__(self):
    method number (line 137) | def number(self):
    method total (line 162) | def total(self):
    method parse (line 180) | def parse(cls, reader):
    method build (line 197) | def build(self, writer):
    method binary (line 209) | def binary(cls, key, data):
    method external (line 217) | def external(cls, key, data):
    method string (line 225) | def string(cls, key, data):
  class ApeTag (line 237) | class ApeTag(MetaData):
    method __init__ (line 266) | def __init__(self, tags, contains_header=True, contains_footer=True):
    method __repr__ (line 275) | def __repr__(self):
    method total_size (line 280) | def total_size(self):
    method __eq__ (line 292) | def __eq__(self, metadata):
    method keys (line 310) | def keys(self):
    method __contains__ (line 313) | def __contains__(self, key):
    method __getitem__ (line 320) | def __getitem__(self, key):
    method get (line 329) | def get(self, key, default):
    method __setitem__ (line 337) | def __setitem__(self, key, value):
    method index (line 347) | def index(self, key):
    method __delitem__ (line 356) | def __delitem__(self, key):
    method __getattr__ (line 365) | def __getattr__(self, attr):
    method __setattr__ (line 385) | def __setattr__(self, attr, value):
    method __delattr__ (line 427) | def __delattr__(self, attr):
    method converted (line 476) | def converted(cls, metadata):
    method raw_info (line 497) | def raw_info(self):
    method supports_images (line 516) | def supports_images(cls):
    method __parse_image__ (line 521) | def __parse_image__(self, key, type):
    method add_image (line 536) | def add_image(self, image):
    method delete_image (line 554) | def delete_image(self, image):
    method images (line 562) | def images(self):
    method read (line 579) | def read(cls, apefile):
    method build (line 613) | def build(self, writer):
    method clean (line 645) | def clean(self):
    method intersection (line 734) | def intersection(self, metadata):
  class ApeTaggedAudio (line 756) | class ApeTaggedAudio(object):
    method supports_metadata (line 763) | def supports_metadata(cls):
    method get_metadata (line 768) | def get_metadata(self):
    method update_metadata (line 776) | def update_metadata(self, metadata):
    method set_metadata (line 906) | def set_metadata(self, metadata):
    method delete_metadata (line 964) | def delete_metadata(self):
  class ApeGainedAudio (line 1021) | class ApeGainedAudio(object):
    method supports_replay_gain (line 1023) | def supports_replay_gain(cls):
    method get_replay_gain (line 1028) | def get_replay_gain(self):
    method set_replay_gain (line 1057) | def set_replay_gain(self, replaygain):
    method delete_replay_gain (line 1084) | def delete_replay_gain(self):

FILE: audiotools/au.py
  class InvalidAU (line 23) | class InvalidAU(InvalidFile):
  class AuReader (line 27) | class AuReader(object):
    method __init__ (line 28) | def __init__(self, au_filename):
    method __enter__ (line 56) | def __enter__(self):
    method __exit__ (line 59) | def __exit__(self, exc_type, exc_value, traceback):
    method read (line 62) | def read(self, pcm_frames):
    method read_closed (line 84) | def read_closed(self, pcm_frames):
    method seek (line 87) | def seek(self, pcm_frame_offset):
    method seek_closed (line 105) | def seek_closed(self, pcm_frame_offset):
    method close (line 108) | def close(self):
  function au_header (line 114) | def au_header(sample_rate,
  class AuAudio (line 142) | class AuAudio(AudioFile):
    method __init__ (line 149) | def __init__(self, filename):
    method lossless (line 174) | def lossless(self):
    method bits_per_sample (line 179) | def bits_per_sample(self):
    method channels (line 184) | def channels(self):
    method channel_mask (line 189) | def channel_mask(self):
    method sample_rate (line 199) | def sample_rate(self):
    method total_frames (line 204) | def total_frames(self):
    method seekable (line 211) | def seekable(self):
    method supports_to_pcm (line 217) | def supports_to_pcm(cls):
    method to_pcm (line 223) | def to_pcm(self):
    method pcm_split (line 228) | def pcm_split(self):
    method supports_from_pcm (line 243) | def supports_from_pcm(cls):
    method from_pcm (line 250) | def from_pcm(cls, filename, pcmreader,
    method track_name (line 316) | def track_name(cls, file_path, track_metadata=None, format=None,

FILE: audiotools/cdtoc.py
  class CDTOC (line 21) | class CDTOC(Sheet):
    method __init__ (line 24) | def __init__(self, cdtoc_tracks, lead_out):
    method __repr__ (line 31) | def __repr__(self):
    method __str__ (line 36) | def __str__(self):
    method __str__ (line 39) | def __str__(self):
    method __unicode__ (line 42) | def __unicode__(self):
    method from_unicode (line 49) | def from_unicode(cls, u):
    method converted (line 91) | def converted(cls, sheet, seconds_length):
    method __len__ (line 114) | def __len__(self):
    method __getitem__ (line 117) | def __getitem__(self, index):
    method track_length (line 120) | def track_length(self, track_number, total_length=None):
    method get_metadata (line 141) | def get_metadata(self):
  class CDTOC_DataAudio (line 145) | class CDTOC_DataAudio(CDTOC):
    method __init__ (line 146) | def __init__(self, cdtoc_tracks, lead_out):
    method __unicode__ (line 156) | def __unicode__(self):
    method __repr__ (line 162) | def __repr__(self):
  class CDTOC_Track (line 167) | class CDTOC_Track(SheetTrack):
    method __init__ (line 168) | def __init__(self, number, address, is_audio=True):
    method converted (line 182) | def converted(cls, sheet_track):
    method __len__ (line 190) | def __len__(self):
    method __getitem__ (line 193) | def __getitem__(self, i):
    method __str__ (line 197) | def __str__(self):
    method __str__ (line 200) | def __str__(self):
    method __unicode__ (line 203) | def __unicode__(self):
    method __repr__ (line 206) | def __repr__(self):
    method number (line 210) | def number(self):
    method get_metadata (line 215) | def get_metadata(self):
    method filename (line 220) | def filename(self):
    method is_audio (line 225) | def is_audio(self):
    method pre_emphasis (line 230) | def pre_emphasis(self):
    method copy_permitted (line 235) | def copy_permitted(self):
  class CDTOC_Index (line 241) | class CDTOC_Index(SheetIndex):
    method __init__ (line 242) | def __init__(self, number, address):
    method __str__ (line 247) | def __str__(self):
    method __str__ (line 250) | def __str__(self):
    method __unicode__ (line 253) | def __unicode__(self):
    method __repr__ (line 256) | def __repr__(self):
    method number (line 260) | def number(self):
    method offset (line 263) | def offset(self):

FILE: audiotools/coverartarchive.py
  function perform_lookup (line 19) | def perform_lookup(mbid,

FILE: audiotools/cue/__init__.py
  class Cuesheet (line 23) | class Cuesheet(Sheet):
    method __init__ (line 24) | def __init__(self, files,
    method __repr__ (line 46) | def __repr__(self):
    method converted (line 58) | def converted(cls, sheet, filename=None):
    method __len__ (line 95) | def __len__(self):
    method __getitem__ (line 98) | def __getitem__(self, index):
    method get_metadata (line 108) | def get_metadata(self):
    method build (line 130) | def build(self):
  class File (line 159) | class File(object):
    method __init__ (line 160) | def __init__(self, filename, file_type, tracks):
    method __len__ (line 173) | def __len__(self):
    method __getitem__ (line 176) | def __getitem__(self, index):
    method __repr__ (line 179) | def __repr__(self):
    method filename (line 185) | def filename(self):
    method build (line 188) | def build(self):
  class Track (line 197) | class Track(SheetTrack):
    method __init__ (line 198) | def __init__(self, number,
    method __repr__ (line 235) | def __repr__(self):
    method converted (line 251) | def converted(cls, sheettrack):
    method __len__ (line 276) | def __len__(self):
    method __getitem__ (line 279) | def __getitem__(self, index):
    method number (line 282) | def number(self):
    method get_metadata (line 287) | def get_metadata(self):
    method filename (line 307) | def filename(self):
    method is_audio (line 315) | def is_audio(self):
    method pre_emphasis (line 320) | def pre_emphasis(self):
    method copy_permitted (line 328) | def copy_permitted(self):
    method build (line 336) | def build(self):
  class Index (line 378) | class Index(SheetIndex):
    method __init__ (line 379) | def __init__(self, number, timestamp):
    method __repr__ (line 383) | def __repr__(self):
    method converted (line 388) | def converted(cls, index):
    method build (line 394) | def build(self):
    method number (line 400) | def number(self):
    method offset (line 405) | def offset(self):
  function format_string (line 414) | def format_string(s):
  function format_timestamp (line 418) | def format_timestamp(t):
  function read_cuesheet (line 424) | def read_cuesheet(filename):
  function read_cuesheet_string (line 439) | def read_cuesheet_string(cuesheet):
  function write_cuesheet (line 467) | def write_cuesheet(sheet, filename, file):

FILE: audiotools/cue/tokrules.py
  function t_REM (line 52) | def t_REM(t):
  function t_ISRC (line 57) | def t_ISRC(t):
  function t_TIMESTAMP (line 62) | def t_TIMESTAMP(t):
  function t_MP3 (line 69) | def t_MP3(t):
  function t_MODE (line 74) | def t_MODE(t):
  function t_CDI (line 79) | def t_CDI(t):
  function t_NUMBER (line 84) | def t_NUMBER(t):
  function t_ID (line 90) | def t_ID(t):
  function t_STRING (line 99) | def t_STRING(t):
  function t_newline (line 108) | def t_newline(t):
  function t_error (line 113) | def t_error(t):

FILE: audiotools/cue/yaccrules.py
  function p_cuesheet (line 21) | def p_cuesheet(t):
  function p_cuesheet_items (line 37) | def p_cuesheet_items(t):
  function p_cuesheet_item (line 46) | def p_cuesheet_item(t):
  function p_catalog_string (line 55) | def p_catalog_string(t):
  function p_catalog_number (line 61) | def p_catalog_number(t):
  function p_title (line 67) | def p_title(t):
  function p_performer (line 72) | def p_performer(t):
  function p_songwriter (line 77) | def p_songwriter(t):
  function p_cdtextfile (line 82) | def p_cdtextfile(t):
  function p_files (line 87) | def p_files(t):
  function p_file (line 96) | def p_file(t):
  function p_filetype (line 108) | def p_filetype(t):
  function p_tracks (line 118) | def p_tracks(t):
  function p_track (line 127) | def p_track(t):
  function p_tracktype (line 149) | def p_tracktype(t):
  function p_indexes (line 158) | def p_indexes(t):
  function p_trackitem (line 167) | def p_trackitem(t):
  function p_index (line 179) | def p_index(t):
  function p_isrc (line 187) | def p_isrc(t):
  function p_pregap (line 193) | def p_pregap(t):
  function p_postgap (line 198) | def p_postgap(t):
  function p_flags (line 203) | def p_flags(t):
  function p_flaglist (line 208) | def p_flaglist(t):
  function p_flag (line 217) | def p_flag(t):
  function p_error (line 224) | def p_error(t):

FILE: audiotools/flac.py
  class InvalidFLAC (line 29) | class InvalidFLAC(InvalidFile):
  class FlacMetaDataBlockTooLarge (line 33) | class FlacMetaDataBlockTooLarge(Exception):
  class FlacMetaData (line 39) | class FlacMetaData(MetaData):
    method __init__ (line 42) | def __init__(self, blocks):
    method has_block (line 45) | def has_block(self, block_id):
    method add_block (line 50) | def add_block(self, block):
    method get_block (line 74) | def get_block(self, block_id):
    method get_blocks (line 85) | def get_blocks(self, block_id):
    method replace_blocks (line 90) | def replace_blocks(self, block_id, blocks):
    method __setattr__ (line 117) | def __setattr__(self, attr, value):
    method __getattr__ (line 134) | def __getattr__(self, attr):
    method __delattr__ (line 145) | def __delattr__(self, attr):
    method converted (line 156) | def converted(cls, metadata):
    method add_image (line 169) | def add_image(self, image):
    method delete_image (line 174) | def delete_image(self, image):
    method images (line 181) | def images(self):
    method supports_images (line 187) | def supports_images(cls):
    method clean (line 192) | def clean(self):
    method __repr__ (line 262) | def __repr__(self):
    method intersection (line 265) | def intersection(self, metadata):
    method parse (line 295) | def parse(cls, reader):
    method raw_info (line 336) | def raw_info(self):
    method blocks (line 344) | def blocks(self):
    method build (line 350) | def build(self, writer):
    method size (line 366) | def size(self):
  class Flac_STREAMINFO (line 374) | class Flac_STREAMINFO(object):
    method __init__ (line 377) | def __init__(self, minimum_block_size, maximum_block_size,
    method copy (line 394) | def copy(self):
    method __eq__ (line 407) | def __eq__(self, block):
    method __repr__ (line 423) | def __repr__(self):
    method raw_info (line 436) | def raw_info(self):
    method parse (line 456) | def parse(cls, reader):
    method build (line 464) | def build(self, writer):
    method size (line 478) | def size(self):
  class Flac_PADDING (line 485) | class Flac_PADDING(object):
    method __init__ (line 488) | def __init__(self, length):
    method copy (line 491) | def copy(self):
    method __eq__ (line 496) | def __eq__(self, block):
    method __repr__ (line 502) | def __repr__(self):
    method raw_info (line 505) | def raw_info(self):
    method parse (line 516) | def parse(cls, reader, block_length):
    method build (line 522) | def build(self, writer):
    method size (line 527) | def size(self):
  class Flac_APPLICATION (line 534) | class Flac_APPLICATION(object):
    method __init__ (line 537) | def __init__(self, application_id, data):
    method __eq__ (line 541) | def __eq__(self, block):
    method copy (line 549) | def copy(self):
    method __repr__ (line 555) | def __repr__(self):
    method raw_info (line 559) | def raw_info(self):
    method parse (line 571) | def parse(cls, reader, block_length):
    method build (line 577) | def build(self, writer):
    method size (line 583) | def size(self):
  class Flac_SEEKTABLE (line 590) | class Flac_SEEKTABLE(object):
    method __init__ (line 593) | def __init__(self, seekpoints):
    method __eq__ (line 598) | def __eq__(self, block):
    method copy (line 604) | def copy(self):
    method __repr__ (line 609) | def __repr__(self):
    method raw_info (line 612) | def raw_info(self):
    method parse (line 627) | def parse(cls, reader, total_seekpoints):
    method build (line 633) | def build(self, writer):
    method size (line 639) | def size(self):
    method clean (line 647) | def clean(self):
  class Flac_VORBISCOMMENT (line 670) | class Flac_VORBISCOMMENT(VorbisComment):
    method copy (line 673) | def copy(self):
    method __repr__ (line 679) | def __repr__(self):
    method raw_info (line 683) | def raw_info(self):
    method converted (line 713) | def converted(cls, metadata):
    method parse (line 726) | def parse(cls, reader):
    method build (line 741) | def build(self, writer):
    method size (line 757) | def size(self):
  class Flac_CUESHEET (line 767) | class Flac_CUESHEET(Sheet):
    method __init__ (line 770) | def __init__(self, catalog_number, lead_in_samples, is_cdda, tracks):
    method copy (line 786) | def copy(self):
    method __eq__ (line 794) | def __eq__(self, cuesheet):
    method __repr__ (line 805) | def __repr__(self):
    method raw_info (line 813) | def raw_info(self):
    method parse (line 828) | def parse(cls, reader):
    method build (line 841) | def build(self, writer):
    method size (line 852) | def size(self):
    method __len__ (line 859) | def __len__(self):
    method __getitem__ (line 863) | def __getitem__(self, index):
    method track_length (line 867) | def track_length(self, track_number, total_length=None):
    method get_metadata (line 893) | def get_metadata(self):
    method set_track (line 906) | def set_track(self, audiofile):
    method converted (line 917) | def converted(cls, sheet, total_pcm_frames, sample_rate, is_cdda=True):
  class Flac_CUESHEET_track (line 950) | class Flac_CUESHEET_track(SheetTrack):
    method __init__ (line 951) | def __init__(self, offset, number, ISRC, track_type, pre_emphasis,
    method converted (line 977) | def converted(cls, sheet_track, sample_rate):
    method copy (line 1009) | def copy(self):
    method __repr__ (line 1020) | def __repr__(self):
    method raw_info (line 1030) | def raw_info(self, indent):
    method __eq__ (line 1048) | def __eq__(self, track):
    method parse (line 1060) | def parse(cls, reader):
    method build (line 1073) | def build(self, writer):
    method size (line 1086) | def size(self):
    method __len__ (line 1090) | def __len__(self):
    method __getitem__ (line 1093) | def __getitem__(self, index):
    method number (line 1096) | def number(self):
    method get_metadata (line 1101) | def get_metadata(self):
    method filename (line 1112) | def filename(self):
    method is_audio (line 1121) | def is_audio(self):
    method pre_emphasis (line 1126) | def pre_emphasis(self):
    method copy_permitted (line 1131) | def copy_permitted(self):
    method set_track (line 1136) | def set_track(self, audiofile):
  class Flac_CUESHEET_index (line 1146) | class Flac_CUESHEET_index(SheetIndex):
    method __init__ (line 1147) | def __init__(self, track_offset, offset, number, sample_rate=44100):
    method converted (line 1161) | def converted(cls, sheet_index, track_offset, sample_rate):
    method copy (line 1171) | def copy(self):
    method __repr__ (line 1179) | def __repr__(self):
    method __eq__ (line 1184) | def __eq__(self, index):
    method parse (line 1192) | def parse(cls, reader, track_offset):
    method build (line 1201) | def build(self, writer):
    method size (line 1206) | def size(self):
    method raw_info (line 1209) | def raw_info(self, indent):
    method number (line 1215) | def number(self):
    method offset (line 1218) | def offset(self):
    method set_track (line 1224) | def set_track(self, audiofile):
  class Flac_PICTURE (line 1230) | class Flac_PICTURE(Image):
    method __init__ (line 1233) | def __init__(self, picture_type, mime_type, description,
    method copy (line 1267) | def copy(self):
    method __getattr__ (line 1279) | def __getattr__(self, attr):
    method __setattr__ (line 1305) | def __setattr__(self, attr, value):
    method __repr__ (line 1331) | def __repr__(self):
    method raw_info (line 1342) | def raw_info(self):
    method parse (line 1360) | def parse(cls, reader):
    method build (line 1381) | def build(self, writer):
    method size (line 1398) | def size(self):
    method converted (line 1412) | def converted(cls, image):
    method type_string (line 1425) | def type_string(self):
    method clean (line 1454) | def clean(self):
  class FlacAudio (line 1480) | class FlacAudio(WaveContainer, AiffContainer):
    method __init__ (line 1496) | def __init__(self, filename):
    method channel_mask (line 1547) | def channel_mask(self):
    method lossless (line 1606) | def lossless(self):
    method supports_metadata (line 1612) | def supports_metadata(cls):
    method get_metadata (line 1617) | def get_metadata(self):
    method update_metadata (line 1636) | def update_metadata(self, metadata):
    method set_metadata (line 1734) | def set_metadata(self, metadata):
    method delete_metadata (line 1834) | def delete_metadata(self):
    method supports_cuesheet (line 1843) | def supports_cuesheet(cls):
    method set_cuesheet (line 1846) | def set_cuesheet(self, cuesheet):
    method get_cuesheet (line 1877) | def get_cuesheet(self):
    method delete_cuesheet (line 1918) | def delete_cuesheet(self):
    method to_pcm (line 1936) | def to_pcm(self):
    method supports_to_pcm (line 1967) | def supports_to_pcm(cls):
    method from_pcm (line 1975) | def from_pcm(cls, filename, pcmreader,
    method supports_from_pcm (line 2091) | def supports_from_pcm(cls):
    method seekable (line 2098) | def seekable(self):
    method seektable (line 2103) | def seektable(self, offsets=None, seekpoint_interval=None):
    method has_foreign_wave_chunks (line 2138) | def has_foreign_wave_chunks(self):
    method wave_header_footer (line 2153) | def wave_header_footer(self):
    method from_wave (line 2195) | def from_wave(cls, filename, header, pcmreader, footer, compression=No...
    method has_foreign_aiff_chunks (line 2372) | def has_foreign_aiff_chunks(self):
    method aiff_header_footer (line 2382) | def aiff_header_footer(self):
    method from_aiff (line 2424) | def from_aiff(cls, filename, header, pcmreader, footer, compression=No...
    method convert (line 2611) | def convert(self, target_path, target_class, compression=None,
    method bits_per_sample (line 2651) | def bits_per_sample(self):
    method channels (line 2656) | def channels(self):
    method total_frames (line 2661) | def total_frames(self):
    method sample_rate (line 2666) | def sample_rate(self):
    method supports_replay_gain (line 2672) | def supports_replay_gain(cls):
    method get_replay_gain (line 2677) | def get_replay_gain(self):
    method set_replay_gain (line 2705) | def set_replay_gain(self, replaygain):
    method delete_replay_gain (line 2736) | def delete_replay_gain(self):
    method clean (line 2758) | def clean(self, output_filename=None):
  class OggFlacMetaData (line 2903) | class OggFlacMetaData(FlacMetaData):
    method converted (line 2905) | def converted(cls, metadata):
    method __repr__ (line 2917) | def __repr__(self):
    method parse (line 2921) | def parse(cls, packetreader):
    method build (line 2992) | def build(self, pagewriter, serial_number):
  function sizes_to_offsets (line 3056) | def sizes_to_offsets(sizes):

FILE: audiotools/freedb.py
  function digit_sum (line 22) | def digit_sum(i):
  class DiscID (line 28) | class DiscID(object):
    method __init__ (line 29) | def __init__(self, offsets, total_length, track_count, playable_length):
    method from_cddareader (line 48) | def from_cddareader(cls, cddareader):
    method from_tracks (line 69) | def from_tracks(cls, tracks):
    method from_sheet (line 101) | def from_sheet(cls, sheet, total_pcm_frames, sample_rate):
    method __repr__ (line 115) | def __repr__(self):
    method __str__ (line 124) | def __str__(self):
    method __str__ (line 127) | def __str__(self):
    method __unicode__ (line 130) | def __unicode__(self):
    method __int__ (line 133) | def __int__(self):
  function perform_lookup (line 140) | def perform_lookup(disc_id, freedb_server, freedb_port):
  function freedb_command (line 232) | def freedb_command(freedb_server, freedb_port, cmd, *args):
  function xmcd_metadata (line 288) | def xmcd_metadata(freedb_file):

FILE: audiotools/id3.py
  function is_latin_1 (line 25) | def is_latin_1(unicode_string):
  class UCS2Codec (line 38) | class UCS2Codec(codecs.Codec):
    method fix_char (line 45) | def fix_char(cls, c):
    method encode (line 53) | def encode(self, input, errors='strict'):
    method decode (line 59) | def decode(self, input, errors='strict'):
  class UCS2CodecStreamWriter (line 66) | class UCS2CodecStreamWriter(UCS2Codec, codecs.StreamWriter):
  class UCS2CodecStreamReader (line 70) | class UCS2CodecStreamReader(UCS2Codec, codecs.StreamReader):
  function __reg_ucs2__ (line 74) | def __reg_ucs2__(name):
  function decode_syncsafe32 (line 86) | def decode_syncsafe32(i):
  function encode_syncsafe32 (line 110) | def encode_syncsafe32(i):
  class C_string (line 131) | class C_string(object):
    method __init__ (line 143) | def __init__(self, encoding, unicode_string):
    method __repr__ (line 154) | def __repr__(self):
    method __str__ (line 159) | def __str__(self):
    method __str__ (line 162) | def __str__(self):
    method __unicode__ (line 165) | def __unicode__(self):
    method __getitem__ (line 168) | def __getitem__(self, char):
    method __len__ (line 171) | def __len__(self):
    method __eq__ (line 174) | def __eq__(self, s):
    method __ne__ (line 177) | def __ne__(self, s):
    method __lt__ (line 180) | def __lt__(self, s):
    method __le__ (line 183) | def __le__(self, s):
    method __gt__ (line 186) | def __gt__(self, s):
    method __ge__ (line 189) | def __ge__(self, s):
    method parse (line 193) | def parse(cls, encoding, reader):
    method build (line 214) | def build(self, writer):
    method size (line 222) | def size(self):
  function __attrib_equals__ (line 229) | def __attrib_equals__(attributes, o1, o2):
  function __padded__ (line 239) | def __padded__(value):
  function __number_pair__ (line 253) | def __number_pair__(current, total):
  function read_id3v2_comment (line 266) | def read_id3v2_comment(filename):
  function skip_id3v2_comment (line 293) | def skip_id3v2_comment(file):
  function total_id3v2_comments (line 342) | def total_id3v2_comments(file):
  class ID3v22_Frame (line 386) | class ID3v22_Frame(object):
    method __init__ (line 387) | def __init__(self, frame_id, data):
    method copy (line 391) | def copy(self):
    method __repr__ (line 394) | def __repr__(self):
    method raw_info (line 397) | def raw_info(self):
    method __eq__ (line 409) | def __eq__(self, frame):
    method parse (line 413) | def parse(cls, frame_id, frame_size, reader):
    method build (line 419) | def build(self, writer):
    method size (line 425) | def size(self):
    method converted (line 432) | def converted(cls, frame_id, o):
    method clean (line 437) | def clean(self):
  class ID3v22_T__Frame (line 444) | class ID3v22_T__Frame(object):
    method __init__ (line 448) | def __init__(self, frame_id, encoding, data):
    method copy (line 461) | def copy(self):
    method __repr__ (line 464) | def __repr__(self):
    method raw_info (line 468) | def raw_info(self):
    method __eq__ (line 476) | def __eq__(self, frame):
    method __str__ (line 480) | def __str__(self):
    method __str__ (line 483) | def __str__(self):
    method __unicode__ (line 486) | def __unicode__(self):
    method number (line 491) | def number(self):
    method total (line 520) | def total(self):
    method true (line 541) | def true(self):
    method parse (line 551) | def parse(cls, frame_id, frame_size, reader):
    method build (line 558) | def build(self, writer):
    method size (line 565) | def size(self):
    method converted (line 572) | def converted(cls, frame_id, unicode_string):
    method clean (line 580) | def clean(self):
  class ID3v22_TXX_Frame (line 629) | class ID3v22_TXX_Frame(object):
    method __init__ (line 630) | def __init__(self, encoding, description, data):
    method copy (line 637) | def copy(self):
    method __repr__ (line 642) | def __repr__(self):
    method raw_info (line 646) | def raw_info(self):
    method __eq__ (line 655) | def __eq__(self, frame):
    method __str__ (line 660) | def __str__(self):
    method __str__ (line 663) | def __str__(self):
    method __unicode__ (line 666) | def __unicode__(self):
    method parse (line 672) | def parse(cls, frame_id, frame_size, reader):
    method build (line 683) | def build(self, writer):
    method size (line 691) | def size(self):
    method clean (line 697) | def clean(self):
  class ID3v22_W__Frame (line 730) | class ID3v22_W__Frame(object):
    method __init__ (line 731) | def __init__(self, frame_id, data):
    method copy (line 735) | def copy(self):
    method __repr__ (line 738) | def __repr__(self):
    method raw_info (line 741) | def raw_info(self):
    method __eq__ (line 747) | def __eq__(self, frame):
    method parse (line 751) | def parse(cls, frame_id, frame_size, reader):
    method build (line 754) | def build(self, writer):
    method size (line 760) | def size(self):
    method clean (line 766) | def clean(self):
  class ID3v22_WXX_Frame (line 774) | class ID3v22_WXX_Frame(object):
    method __init__ (line 775) | def __init__(self, encoding, description, data):
    method copy (line 782) | def copy(self):
    method __repr__ (line 787) | def __repr__(self):
    method raw_info (line 791) | def raw_info(self):
    method __eq__ (line 800) | def __eq__(self, frame):
    method parse (line 804) | def parse(cls, frame_id, frame_size, reader):
    method build (line 815) | def build(self, writer):
    method size (line 823) | def size(self):
    method clean (line 829) | def clean(self):
  class ID3v22_COM_Frame (line 839) | class ID3v22_COM_Frame(object):
    method __init__ (line 840) | def __init__(self, encoding, language, short_description, data):
    method copy (line 854) | def copy(self):
    method __repr__ (line 860) | def __repr__(self):
    method raw_info (line 864) | def raw_info(self):
    method __eq__ (line 873) | def __eq__(self, frame):
    method __ne__ (line 879) | def __ne__(self, frame):
    method __str__ (line 883) | def __str__(self):
    method __str__ (line 886) | def __str__(self):
    method __unicode__ (line 889) | def __unicode__(self):
    method parse (line 894) | def parse(cls, frame_id, frame_size, reader):
    method build (line 905) | def build(self, writer):
    method size (line 913) | def size(self):
    method converted (line 920) | def converted(cls, frame_id, unicode_string):
    method clean (line 928) | def clean(self):
  class ID3v22_PIC_Frame (line 968) | class ID3v22_PIC_Frame(Image):
    method __init__ (line 969) | def __init__(self, image_format, picture_type, description, data):
    method copy (line 1000) | def copy(self):
    method __repr__ (line 1006) | def __repr__(self):
    method raw_info (line 1010) | def raw_info(self):
    method type_string (line 1021) | def type_string(self):
    method __getattr__ (line 1044) | def __getattr__(self, attr):
    method __setattr__ (line 1062) | def __setattr__(self, attr, value):
    method parse (line 1084) | def parse(cls, frame_id, frame_size, reader):
    method build (line 1094) | def build(self, writer):
    method size (line 1105) | def size(self):
    method converted (line 1112) | def converted(cls, frame_id, image):
    method clean (line 1133) | def clean(self):
  class ID3v22Comment (line 1150) | class ID3v22Comment(MetaData):
    method __init__ (line 1181) | def __init__(self, frames, total_size=None):
    method copy (line 1185) | def copy(self):
    method __repr__ (line 1188) | def __repr__(self):
    method __iter__ (line 1192) | def __iter__(self):
    method raw_info (line 1195) | def raw_info(self):
    method parse (line 1204) | def parse(cls, reader):
    method build (line 1259) | def build(self, writer):
    method size (line 1282) | def size(self):
    method __len__ (line 1289) | def __len__(self):
    method __getitem__ (line 1292) | def __getitem__(self, frame_id):
    method __setitem__ (line 1299) | def __setitem__(self, frame_id, frames):
    method __delitem__ (line 1321) | def __delitem__(self, frame_id):
    method keys (line 1328) | def keys(self):
    method values (line 1331) | def values(self):
    method items (line 1334) | def items(self):
    method __getattr__ (line 1337) | def __getattr__(self, attr):
    method __setattr__ (line 1356) | def __setattr__(self, attr, value):
    method __delattr__ (line 1421) | def __delattr__(self, attr):
    method images (line 1479) | def images(self):
    method add_image (line 1482) | def add_image(self, image):
    method delete_image (line 1486) | def delete_image(self, image):
    method converted (line 1494) | def converted(cls, metadata):
    method clean (line 1537) | def clean(self):
    method intersection (line 1551) | def intersection(self, metadata):
  class ID3v23_Frame (line 1576) | class ID3v23_Frame(ID3v22_Frame):
    method __repr__ (line 1577) | def __repr__(self):
  class ID3v23_T___Frame (line 1581) | class ID3v23_T___Frame(ID3v22_T__Frame):
    method __repr__ (line 1585) | def __repr__(self):
  class ID3v23_TXXX_Frame (line 1590) | class ID3v23_TXXX_Frame(ID3v22_TXX_Frame):
    method __init__ (line 1591) | def __init__(self, encoding, description, data):
    method __repr__ (line 1598) | def __repr__(self):
  class ID3v23_W___Frame (line 1603) | class ID3v23_W___Frame(ID3v22_W__Frame):
    method __repr__ (line 1604) | def __repr__(self):
  class ID3v23_WXXX_Frame (line 1608) | class ID3v23_WXXX_Frame(ID3v22_WXX_Frame):
    method __init__ (line 1609) | def __init__(self, encoding, description, data):
    method __repr__ (line 1616) | def __repr__(self):
  class ID3v23_APIC_Frame (line 1621) | class ID3v23_APIC_Frame(ID3v22_PIC_Frame):
    method __init__ (line 1622) | def __init__(self, mime_type, picture_type, description, data):
    method copy (line 1652) | def copy(self):
    method __repr__ (line 1658) | def __repr__(self):
    method raw_info (line 1662) | def raw_info(self):
    method __getattr__ (line 1673) | def __getattr__(self, attr):
    method __setattr__ (line 1693) | def __setattr__(self, attr, value):
    method parse (line 1719) | def parse(cls, frame_id, frame_size, reader):
    method build (line 1734) | def build(self, writer):
    method size (line 1745) | def size(self):
    method converted (line 1756) | def converted(cls, frame_id, image):
    method clean (line 1771) | def clean(self):
  class ID3v23_COMM_Frame (line 1792) | class ID3v23_COMM_Frame(ID3v22_COM_Frame):
    method __init__ (line 1793) | def __init__(self, encoding, language, short_description, data):
    method __repr__ (line 1807) | def __repr__(self):
    method raw_info (line 1811) | def raw_info(self):
  class ID3v23Comment (line 1821) | class ID3v23Comment(ID3v22Comment):
    method __repr__ (line 1853) | def __repr__(self):
    method parse (line 1857) | def parse(cls, reader):
    method build (line 1912) | def build(self, writer):
    method size (line 1935) | def size(self):
  class ID3v24_Frame (line 1948) | class ID3v24_Frame(ID3v23_Frame):
    method __repr__ (line 1949) | def __repr__(self):
  class ID3v24_T___Frame (line 1953) | class ID3v24_T___Frame(ID3v23_T___Frame):
    method __init__ (line 1954) | def __init__(self, frame_id, encoding, data):
    method __repr__ (line 1962) | def __repr__(self):
    method __unicode__ (line 1966) | def __unicode__(self):
    method raw_info (line 1973) | def raw_info(self):
    method converted (line 1984) | def converted(cls, frame_id, unicode_string):
  class ID3v24_TXXX_Frame (line 1993) | class ID3v24_TXXX_Frame(ID3v23_TXXX_Frame):
    method __repr__ (line 1994) | def __repr__(self):
    method raw_info (line 1998) | def raw_info(self):
    method __unicode__ (line 2010) | def __unicode__(self):
    method parse (line 2018) | def parse(cls, frame_id, frame_size, reader):
  class ID3v24_APIC_Frame (line 2033) | class ID3v24_APIC_Frame(ID3v23_APIC_Frame):
    method __repr__ (line 2034) | def __repr__(self):
    method __setattr__ (line 2040) | def __setattr__(self, attr, value):
    method parse (line 2066) | def parse(cls, frame_id, frame_size, reader):
    method build (line 2083) | def build(self, writer):
    method converted (line 2097) | def converted(cls, frame_id, image):
    method clean (line 2112) | def clean(self):
  class ID3v24_W___Frame (line 2133) | class ID3v24_W___Frame(ID3v23_W___Frame):
    method __repr__ (line 2134) | def __repr__(self):
  class ID3v24_WXXX_Frame (line 2138) | class ID3v24_WXXX_Frame(ID3v23_WXXX_Frame):
    method __repr__ (line 2139) | def __repr__(self):
    method raw_info (line 2143) | def raw_info(self):
    method parse (line 2156) | def parse(cls, frame_id, frame_size, reader):
  class ID3v24_COMM_Frame (line 2171) | class ID3v24_COMM_Frame(ID3v23_COMM_Frame):
    method __repr__ (line 2172) | def __repr__(self):
    method __unicode__ (line 2176) | def __unicode__(self):
    method raw_info (line 2182) | def raw_info(self):
    method parse (line 2198) | def parse(cls, frame_id, frame_size, reader):
    method converted (line 2213) | def converted(cls, frame_id, unicode_string):
    method clean (line 2221) | def clean(self):
  class ID3v24Comment (line 2264) | class ID3v24Comment(ID3v23Comment):
    method __repr__ (line 2277) | def __repr__(self):
    method parse (line 2281) | def parse(cls, reader):
    method build (line 2338) | def build(self, writer):
    method size (line 2363) | def size(self):
  class ID3CommentPair (line 2374) | class ID3CommentPair(MetaData):
    method __init__ (line 2379) | def __init__(self, id3v2_comment, id3v1_comment):
    method __repr__ (line 2394) | def __repr__(self):
    method __getattr__ (line 2397) | def __getattr__(self, attr):
    method __setattr__ (line 2414) | def __setattr__(self, attr, value):
    method __delattr__ (line 2424) | def __delattr__(self, attr):
    method converted (line 2435) | def converted(cls, metadata,
    method raw_info (line 2454) | def raw_info(self):
    method images (line 2475) | def images(self):
    method add_image (line 2483) | def add_image(self, image):
    method delete_image (line 2489) | def delete_image(self, image):
    method supports_images (line 2496) | def supports_images(cls):
    method clean (line 2501) | def clean(self):
    method intersection (line 2517) | def intersection(self, metadata):

FILE: audiotools/id3v1.py
  class ID3v1Comment (line 21) | class ID3v1Comment(MetaData):
    method __init__ (line 37) | def __init__(self, track_name=u"",
    method __repr__ (line 82) | def __repr__(self):
    method __getattr__ (line 92) | def __getattr__(self, attr):
    method __setattr__ (line 110) | def __setattr__(self, attr, value):
    method __delattr__ (line 131) | def __delattr__(self, attr):
    method raw_info (line 144) | def raw_info(self):
    method parse (line 163) | def parse(cls, mp3_file):
    method build (line 195) | def build(self, mp3_file):
    method supports_images (line 220) | def supports_images(cls):
    method converted (line 226) | def converted(cls, metadata):
    method images (line 252) | def images(self):
    method clean (line 257) | def clean(self):
    method intersection (line 294) | def intersection(self, metadata):

FILE: audiotools/image.py
  function image_metrics (line 22) | def image_metrics(file_data):
  class ImageMetrics (line 48) | class ImageMetrics:
    method __init__ (line 51) | def __init__(self, width, height, bits_per_pixel, color_count, mime_ty...
    method __repr__ (line 72) | def __repr__(self):
    method parse (line 81) | def parse(cls, file_data):
  class InvalidJPEG (line 85) | class InvalidJPEG(InvalidImage):
  class __JPEG__ (line 91) | class __JPEG__(ImageMetrics):
    method __init__ (line 92) | def __init__(self, width, height, bits_per_pixel):
    method parse (line 97) | def parse(cls, file_data):
  class InvalidPNG (line 138) | class InvalidPNG(InvalidImage):
  class __PNG__ (line 144) | class __PNG__(ImageMetrics):
    method __init__ (line 145) | def __init__(self, width, height, bits_per_pixel, color_count):
    method parse (line 150) | def parse(cls, file_data):
  class InvalidBMP (line 225) | class InvalidBMP(InvalidImage):
  class __BMP__ (line 231) | class __BMP__(ImageMetrics):
    method __init__ (line 232) | def __init__(self, width, height, bits_per_pixel, color_count):
    method parse (line 237) | def parse(cls, file_data):
  class InvalidGIF (line 274) | class InvalidGIF(InvalidImage):
  class __GIF__ (line 280) | class __GIF__(ImageMetrics):
    method __init__ (line 281) | def __init__(self, width, height, color_count):
    method parse (line 286) | def parse(cls, file_data):
  class InvalidTIFF (line 312) | class InvalidTIFF(InvalidImage):
  class __TIFF__ (line 318) | class __TIFF__(ImageMetrics):
    method __init__ (line 319) | def __init__(self, width, height, bits_per_pixel, color_count):
    method parse (line 325) | def parse(cls, file_data):

FILE: audiotools/m4a.py
  class InvalidM4A (line 23) | class InvalidM4A(InvalidFile):
  function get_m4a_atom (line 27) | def get_m4a_atom(reader, *atoms):
  function get_m4a_atom_offset (line 54) | def get_m4a_atom_offset(reader, *atoms):
  function has_m4a_atom (line 85) | def has_m4a_atom(reader, *atoms):
  class M4ATaggedAudio (line 110) | class M4ATaggedAudio(object):
    method supports_metadata (line 112) | def supports_metadata(cls):
    method get_metadata (line 117) | def get_metadata(self):
    method update_metadata (line 155) | def update_metadata(self, metadata, old_metadata=None):
    method set_metadata (line 261) | def set_metadata(self, metadata):
    method delete_metadata (line 291) | def delete_metadata(self):
  class M4AAudio_faac (line 302) | class M4AAudio_faac(M4ATaggedAudio, AudioFile):
    method __init__ (line 316) | def __init__(self, filename):
    method channel_mask (line 376) | def channel_mask(self):
    method lossless (line 408) | def lossless(self):
    method channels (line 413) | def channels(self):
    method bits_per_sample (line 418) | def bits_per_sample(self):
    method sample_rate (line 423) | def sample_rate(self):
    method cd_frames (line 428) | def cd_frames(self):
    method total_frames (line 435) | def total_frames(self):
    method supports_to_pcm (line 441) | def supports_to_pcm(cls):
    method to_pcm (line 447) | def to_pcm(self):
    method supports_from_pcm (line 467) | def supports_from_pcm(cls):
    method from_pcm (line 474) | def from_pcm(cls, filename, pcmreader,
  class M4AAudio_nero (line 581) | class M4AAudio_nero(M4AAudio_faac):
    method supports_from_pcm (line 598) | def supports_from_pcm(cls):
    method from_pcm (line 605) | def from_pcm(cls, filename, pcmreader,
    method supports_to_pcm (line 653) | def supports_to_pcm(cls):
    method to_pcm (line 659) | def to_pcm(self):
    method __from_wave__ (line 680) | def __from_wave__(cls, filename, wave_filename, compression):
  class InvalidALAC (line 706) | class InvalidALAC(InvalidFile):
  class ALACAudio (line 710) | class ALACAudio(M4ATaggedAudio, AudioFile):
    method __init__ (line 725) | def __init__(self, filename):
    method channels (line 799) | def channels(self):
    method bits_per_sample (line 804) | def bits_per_sample(self):
    method sample_rate (line 809) | def sample_rate(self):
    method total_frames (line 814) | def total_frames(self):
    method channel_mask (line 819) | def channel_mask(self):
    method cd_frames (line 827) | def cd_frames(self):
    method lossless (line 837) | def lossless(self):
    method seekable (line 842) | def seekable(self):
    method supports_to_pcm (line 875) | def supports_to_pcm(cls):
    method to_pcm (line 885) | def to_pcm(self):
    method supports_from_pcm (line 901) | def supports_from_pcm(cls):
    method from_pcm (line 912) | def from_pcm(cls, filename, pcmreader,

FILE: audiotools/m4a_atoms.py
  function parse_sub_atoms (line 52) | def parse_sub_atoms(data_size, reader, parsers):
  class M4A_Tree_Atom (line 79) | class M4A_Tree_Atom(object):
    method __init__ (line 80) | def __init__(self, name, leaf_atoms):
    method copy (line 90) | def copy(self):
    method __repr__ (line 96) | def __repr__(self):
    method __eq__ (line 99) | def __eq__(self, atom):
    method __iter__ (line 107) | def __iter__(self):
    method __getitem__ (line 111) | def __getitem__(self, atom_name):
    method get_child (line 114) | def get_child(self, atom_name):
    method get_children (line 126) | def get_children(self, atom_name):
    method has_child (line 131) | def has_child(self, atom_name):
    method add_child (line 143) | def add_child(self, atom_obj):
    method remove_child (line 148) | def remove_child(self, atom_name):
    method replace_child (line 163) | def replace_child(self, atom_obj):
    method child_offset (line 178) | def child_offset(self, *child_path):
    method parse (line 199) | def parse(cls, name, data_size, reader, parsers):
    method build (line 206) | def build(self, writer):
    method size (line 214) | def size(self):
  class M4A_Leaf_Atom (line 221) | class M4A_Leaf_Atom(object):
    method __init__ (line 222) | def __init__(self, name, data):
    method copy (line 233) | def copy(self):
    method __repr__ (line 239) | def __repr__(self):
    method __eq__ (line 242) | def __eq__(self, atom):
    method __str__ (line 251) | def __str__(self):
    method __str__ (line 254) | def __str__(self):
    method __unicode__ (line 257) | def __unicode__(self):
    method raw_info (line 264) | def raw_info(self):
    method parse (line 279) | def parse(cls, name, data_size, reader, parsers):
    method build (line 286) | def build(self, writer):
    method size (line 292) | def size(self):
  class M4A_FTYP_Atom (line 299) | class M4A_FTYP_Atom(M4A_Leaf_Atom):
    method __init__ (line 300) | def __init__(self, major_brand, major_brand_version, compatible_brands):
    method __repr__ (line 310) | def __repr__(self):
    method parse (line 315) | def parse(cls, name, data_size, reader, parsers):
    method build (line 326) | def build(self, writer):
    method size (line 335) | def size(self):
  class M4A_MVHD_Atom (line 342) | class M4A_MVHD_Atom(M4A_Leaf_Atom):
    method __init__ (line 343) | def __init__(self, version, flags, created_utc_date, modified_utc_date,
    method parse (line 364) | def parse(cls, name, data_size, reader, parsers):
    method __repr__ (line 406) | def __repr__(self):
    method build (line 424) | def build(self, writer):
    method size (line 447) | def size(self):
  class M4A_TKHD_Atom (line 457) | class M4A_TKHD_Atom(M4A_Leaf_Atom):
    method __init__ (line 458) | def __init__(self, version, track_in_poster, track_in_preview,
    method __repr__ (line 480) | def __repr__(self):
    method parse (line 500) | def parse(cls, name, data_size, reader, parsers):
    method build (line 542) | def build(self, writer):
    method size (line 561) | def size(self):
  class M4A_MDHD_Atom (line 571) | class M4A_MDHD_Atom(M4A_Leaf_Atom):
    method __init__ (line 572) | def __init__(self, version, flags, created_utc_date, modified_utc_date,
    method __repr__ (line 584) | def __repr__(self):
    method parse (line 597) | def parse(cls, name, data_size, reader, parsers):
    method build (line 624) | def build(self, writer):
    method size (line 639) | def size(self):
  class M4A_SMHD_Atom (line 649) | class M4A_SMHD_Atom(M4A_Leaf_Atom):
    method __init__ (line 650) | def __init__(self, version, flags, audio_balance):
    method __repr__ (line 656) | def __repr__(self):
    method parse (line 663) | def parse(cls, name, data_size, reader, parsers):
    method build (line 670) | def build(self, writer):
    method size (line 677) | def size(self):
  class M4A_DREF_Atom (line 684) | class M4A_DREF_Atom(M4A_Leaf_Atom):
    method __init__ (line 685) | def __init__(self, version, flags, references):
    method __repr__ (line 691) | def __repr__(self):
    method parse (line 698) | def parse(cls, name, data_size, reader, parsers):
    method build (line 713) | def build(self, writer):
    method size (line 726) | def size(self):
  class M4A_STSD_Atom (line 734) | class M4A_STSD_Atom(M4A_Leaf_Atom):
    method __init__ (line 735) | def __init__(self, version, flags, descriptions):
    method __repr__ (line 741) | def __repr__(self):
    method parse (line 746) | def parse(cls, name, data_size, reader, parsers):
    method build (line 765) | def build(self, writer):
    method size (line 778) | def size(self):
  class M4A_STTS_Atom (line 786) | class M4A_STTS_Atom(M4A_Leaf_Atom):
    method __init__ (line 787) | def __init__(self, version, flags, times):
    method __repr__ (line 793) | def __repr__(self):
    method parse (line 798) | def parse(cls, name, data_size, reader, parsers):
    method build (line 809) | def build(self, writer):
    method size (line 817) | def size(self):
  class M4A_STSC_Atom (line 824) | class M4A_STSC_Atom(M4A_Leaf_Atom):
    method __init__ (line 825) | def __init__(self, version, flags, blocks):
    method __repr__ (line 831) | def __repr__(self):
    method parse (line 836) | def parse(cls, name, data_size, reader, parsers):
    method build (line 847) | def build(self, writer):
    method size (line 856) | def size(self):
  class M4A_STSZ_Atom (line 863) | class M4A_STSZ_Atom(M4A_Leaf_Atom):
    method __init__ (line 864) | def __init__(self, version, flags, byte_size, block_sizes):
    method __repr__ (line 871) | def __repr__(self):
    method parse (line 876) | def parse(cls, name, data_size, reader, parsers):
    method build (line 888) | def build(self, writer):
    method size (line 899) | def size(self):
  class M4A_STCO_Atom (line 906) | class M4A_STCO_Atom(M4A_Leaf_Atom):
    method __init__ (line 907) | def __init__(self, version, flags, offsets):
    method __repr__ (line 913) | def __repr__(self):
    method parse (line 918) | def parse(cls, name, data_size, reader, parsers):
    method build (line 928) | def build(self, writer):
    method size (line 937) | def size(self):
  class M4A_ALAC_Atom (line 944) | class M4A_ALAC_Atom(M4A_Leaf_Atom):
    method __init__ (line 945) | def __init__(self, reference_index, qt_version, qt_revision_level,
    method __repr__ (line 962) | def __repr__(self):
    method parse (line 976) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1007) | def build(self, writer):
    method size (line 1025) | def size(self):
  class M4A_SUB_ALAC_Atom (line 1032) | class M4A_SUB_ALAC_Atom(M4A_Leaf_Atom):
    method __init__ (line 1033) | def __init__(self, max_samples_per_frame, bits_per_sample,
    method __repr__ (line 1049) | def __repr__(self):
    method parse (line 1063) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1072) | def build(self, writer):
    method size (line 1088) | def size(self):
  class M4A_META_Atom (line 1095) | class M4A_META_Atom(MetaData, M4A_Tree_Atom):
    method __init__ (line 1113) | def __init__(self, version, flags, leaf_atoms):
    method __repr__ (line 1118) | def __repr__(self):
    method has_ilst_atom (line 1122) | def has_ilst_atom(self):
    method ilst_atom (line 1131) | def ilst_atom(self):
    method add_ilst_atom (line 1140) | def add_ilst_atom(self):
    method raw_info (line 1150) | def raw_info(self):
    method parse (line 1178) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1188) | def build(self, writer):
    method size (line 1197) | def size(self):
    method __getattr__ (line 1203) | def __getattr__(self, attr):
    method __setattr__ (line 1245) | def __setattr__(self, attr, value):
    method __delattr__ (line 1327) | def __delattr__(self, attr):
    method images (line 1378) | def images(self):
    method add_image (line 1387) | def add_image(self, image):
    method delete_image (line 1404) | def delete_image(self, image):
    method converted (line 1417) | def converted(cls, metadata):
    method supports_images (line 1481) | def supports_images(self):
    method clean (line 1486) | def clean(self):
    method intersection (line 1547) | def intersection(self, metadata):
  class M4A_ILST_Leaf_Atom (line 1582) | class M4A_ILST_Leaf_Atom(M4A_Tree_Atom):
    method copy (line 1583) | def copy(self):
    method __repr__ (line 1589) | def __repr__(self):
    method parse (line 1594) | def parse(cls, name, data_size, reader, parsers):
    method __str__ (line 1618) | def __str__(self):
    method __str__ (line 1621) | def __str__(self):
    method __unicode__ (line 1624) | def __unicode__(self):
    method raw_info_lines (line 1631) | def raw_info_lines(self):
  class M4A_ILST_Unicode_Data_Atom (line 1642) | class M4A_ILST_Unicode_Data_Atom(M4A_Leaf_Atom):
    method __init__ (line 1643) | def __init__(self, type, flags, data):
    method copy (line 1651) | def copy(self):
    method __repr__ (line 1657) | def __repr__(self):
    method __eq__ (line 1661) | def __eq__(self, atom):
    method raw_info (line 1669) | def raw_info(self):
    method parse (line 1675) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1684) | def build(self, writer):
    method size (line 1691) | def size(self):
    method __str__ (line 1698) | def __str__(self):
    method __str__ (line 1701) | def __str__(self):
    method __unicode__ (line 1704) | def __unicode__(self):
  class M4A_ILST_TRKN_Data_Atom (line 1708) | class M4A_ILST_TRKN_Data_Atom(M4A_Leaf_Atom):
    method __init__ (line 1709) | def __init__(self, track_number, track_total):
    method copy (line 1714) | def copy(self):
    method __repr__ (line 1720) | def __repr__(self):
    method __eq__ (line 1724) | def __eq__(self, atom):
    method __str__ (line 1733) | def __str__(self):
    method __str__ (line 1736) | def __str__(self):
    method __unicode__ (line 1739) | def __unicode__(self):
    method raw_info (line 1745) | def raw_info(self):
    method parse (line 1751) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1760) | def build(self, writer):
    method size (line 1767) | def size(self):
    method number (line 1773) | def number(self):
    method total (line 1782) | def total(self):
  class M4A_ILST_DISK_Data_Atom (line 1792) | class M4A_ILST_DISK_Data_Atom(M4A_Leaf_Atom):
    method __init__ (line 1793) | def __init__(self, disk_number, disk_total):
    method copy (line 1798) | def copy(self):
    method __repr__ (line 1804) | def __repr__(self):
    method __eq__ (line 1808) | def __eq__(self, atom):
    method __str__ (line 1817) | def __str__(self):
    method __str__ (line 1820) | def __str__(self):
    method __unicode__ (line 1823) | def __unicode__(self):
    method raw_info (line 1829) | def raw_info(self):
    method parse (line 1835) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1844) | def build(self, writer):
    method size (line 1851) | def size(self):
    method number (line 1857) | def number(self):
    method total (line 1865) | def total(self):
  class M4A_ILST_COVR_Data_Atom (line 1874) | class M4A_ILST_COVR_Data_Atom(Image, M4A_Leaf_Atom):
    method __init__ (line 1875) | def __init__(self, version, flags, image_data):
    method copy (line 1893) | def copy(self):
    method __repr__ (line 1899) | def __repr__(self):
    method raw_info (line 1903) | def raw_info(self):
    method parse (line 1916) | def parse(cls, name, data_size, reader, parsers):
    method build (line 1925) | def build(self, writer):
    method size (line 1932) | def size(self):
    method converted (line 1939) | def converted(cls, image):
  class M4A_HDLR_Atom (line 1946) | class M4A_HDLR_Atom(M4A_Leaf_Atom):
    method __init__ (line 1947) | def __init__(self, version, flags, qt_type, qt_subtype,
    method copy (line 1965) | def copy(self):
    method __repr__ (line 1979) | def __repr__(self):
    method parse (line 1993) | def parse(cls, name, data_size, reader, parsers):
    method build (line 2013) | def build(self, writer):
    method size (line 2029) | def size(self):
  class M4A_FREE_Atom (line 2036) | class M4A_FREE_Atom(M4A_Leaf_Atom):
    method __init__ (line 2037) | def __init__(self, bytes):
    method copy (line 2041) | def copy(self):
    method __repr__ (line 2047) | def __repr__(self):
    method parse (line 2051) | def parse(cls, name, data_size, reader, parsers):
    method build (line 2060) | def build(self, writer):
    method size (line 2066) | def size(self):

FILE: audiotools/mp3.py
  class InvalidMP3 (line 22) | class InvalidMP3(InvalidFile):
  class MP3Audio (line 28) | class MP3Audio(AudioFile):
    method __init__ (line 104) | def __init__(self, filename):
    method lossless (line 196) | def lossless(self):
    method supports_to_pcm (line 202) | def supports_to_pcm(cls):
    method to_pcm (line 212) | def to_pcm(self):
    method supports_from_pcm (line 220) | def supports_from_pcm(cls):
    method from_pcm (line 231) | def from_pcm(cls, filename, pcmreader,
    method bits_per_sample (line 285) | def bits_per_sample(self):
    method channels (line 290) | def channels(self):
    method sample_rate (line 295) | def sample_rate(self):
    method supports_metadata (line 301) | def supports_metadata(cls):
    method get_metadata (line 306) | def get_metadata(self):
    method update_metadata (line 333) | def update_metadata(self, metadata):
    method set_metadata (line 386) | def set_metadata(self, metadata):
    method delete_metadata (line 436) | def delete_metadata(self):
    method clean (line 471) | def clean(self, output_filename=None):
    method __find_next_mp3_frame__ (line 526) | def __find_next_mp3_frame__(cls, mp3file):
    method __find_mp3_start__ (line 562) | def __find_mp3_start__(cls, mp3file):
    method __find_last_mp3_frame__ (line 586) | def __find_last_mp3_frame__(cls, mp3file):
    method frame_length (line 603) | def frame_length(self, mpeg_id, layer, bit_rate, sample_rate, pad):
    method total_frames (line 627) | def total_frames(self):
  class MP2Audio (line 633) | class MP2Audio(MP3Audio):
    method supports_from_pcm (line 649) | def supports_from_pcm(cls):
    method from_pcm (line 660) | def from_pcm(cls, filename, pcmreader,

FILE: audiotools/mpc.py
  class MPC_Size (line 24) | class MPC_Size:
    method __init__ (line 25) | def __init__(self, value, length):
    method __repr__ (line 29) | def __repr__(self):
    method __int__ (line 32) | def __int__(self):
    method __len__ (line 35) | def __len__(self):
    method parse (line 39) | def parse(cls, reader):
    method build (line 50) | def build(self, writer):
  class InvalidMPC (line 56) | class InvalidMPC(InvalidFile):
  class MPCAudio (line 62) | class MPCAudio(ApeTaggedAudio, AudioFile):
    method __init__ (line 85) | def __init__(self, filename):
    method blocks (line 106) | def blocks(self):
    method get_block (line 120) | def get_block(self, block_id):
    method bits_per_sample (line 127) | def bits_per_sample(self):
    method channels (line 132) | def channels(self):
    method lossless (line 137) | def lossless(self):
    method total_frames (line 142) | def total_frames(self):
    method sample_rate (line 147) | def sample_rate(self):
    method supports_to_pcm (line 153) | def supports_to_pcm(cls):
    method to_pcm (line 163) | def to_pcm(self):
    method supports_from_pcm (line 182) | def supports_from_pcm(cls):
    method from_pcm (line 193) | def from_pcm(cls, filename, pcmreader,
    method supports_replay_gain (line 258) | def supports_replay_gain(cls):
    method get_replay_gain (line 263) | def get_replay_gain(self):
    method set_replay_gain (line 296) | def set_replay_gain(self, replaygain):
    method delete_replay_gain (line 341) | def delete_replay_gain(self):

FILE: audiotools/musicbrainz.py
  class DiscID (line 22) | class DiscID(object):
    method __init__ (line 23) | def __init__(self, first_track_number, last_track_number,
    method from_cddareader (line 38) | def from_cddareader(cls, cddareader):
    method from_tracks (line 49) | def from_tracks(cls, tracks):
    method from_sheet (line 77) | def from_sheet(cls, sheet, total_pcm_frames, sample_rate):
    method __repr__ (line 89) | def __repr__(self):
    method __str__ (line 98) | def __str__(self):
    method __str__ (line 101) | def __str__(self):
    method __unicode__ (line 104) | def __unicode__(self):
  function perform_lookup (line 120) | def perform_lookup(disc_id, musicbrainz_server, musicbrainz_port):
  function get_node (line 170) | def get_node(parent, *nodes):
  function get_nodes (line 185) | def get_nodes(parent, node):
  function text (line 193) | def text(node):
  function artist (line 203) | def artist(artist_credit):
  function parse_release (line 222) | def parse_release(release, disc_id):

FILE: audiotools/ogg.py
  class PacketReader (line 21) | class PacketReader(object):
    method __init__ (line 22) | def __init__(self, pagereader):
    method __enter__ (line 35) | def __enter__(self):
    method __exit__ (line 38) | def __exit__(self, exc_type, exc_value, traceback):
    method read_segment (line 41) | def read_segment(self):
    method read_page (line 49) | def read_page(self):
    method read_packet (line 54) | def read_packet(self):
    method close (line 67) | def close(self):
  function packet_to_segments (line 73) | def packet_to_segments(packet):
  function packet_to_pages (line 87) | def packet_to_pages(packet, bitstream_serial_number,
  function packets_to_pages (line 127) | def packets_to_pages(packets, bitstream_serial_number,

FILE: audiotools/opus.py
  class InvalidOpus (line 23) | class InvalidOpus(InvalidFile):
  class OpusAudio (line 31) | class OpusAudio(VorbisAudio):
    method __init__ (line 42) | def __init__(self, filename):
    method supports_replay_gain (line 113) | def supports_replay_gain(cls):
    method get_replay_gain (line 118) | def get_replay_gain(self):
    method set_replay_gain (line 127) | def set_replay_gain(self, replaygain):
    method delete_replay_gain (line 134) | def delete_replay_gain(self):
    method total_frames (line 141) | def total_frames(self):
    method sample_rate (line 159) | def sample_rate(self):
    method supports_to_pcm (line 165) | def supports_to_pcm(cls):
    method to_pcm (line 175) | def to_pcm(self):
    method supports_from_pcm (line 194) | def supports_from_pcm(cls):
    method from_pcm (line 205) | def from_pcm(cls, filename, pcmreader,
    method update_metadata (line 280) | def update_metadata(self, metadata):
    method set_metadata (line 357) | def set_metadata(self, metadata):
    method supports_metadata (line 387) | def supports_metadata(cls):
    method get_metadata (line 392) | def get_metadata(self):
    method delete_metadata (line 416) | def delete_metadata(self):
    method verify (line 428) | def verify(self, progress=None):

FILE: audiotools/player.py
  class Player (line 25) | class Player(object):
    method __init__ (line 31) | def __init__(self, audio_output,
    method open (line 67) | def open(self, track):
    method play (line 74) | def play(self):
    method set_replay_gain (line 79) | def set_replay_gain(self, replay_gain):
    method set_output (line 88) | def set_output(self, output):
    method pause (line 97) | def pause(self):
    method toggle_play_pause (line 104) | def toggle_play_pause(self):
    method stop (line 109) | def stop(self):
    method state (line 116) | def state(self):
    method close (line 122) | def close(self):
    method progress (line 129) | def progress(self):
    method current_output_description (line 136) | def current_output_description(self):
    method current_output_name (line 142) | def current_output_name(self):
    method get_volume (line 148) | def get_volume(self):
    method set_volume (line 154) | def set_volume(self, volume):
    method change_volume (line 160) | def change_volume(self, delta):
  class AudioPlayer (line 170) | class AudioPlayer(object):
    method __init__ (line 171) | def __init__(self, audio_output,
    method set_audiofile (line 189) | def set_audiofile(self, audiofile):
    method state (line 194) | def state(self):
    method progress (line 200) | def progress(self):
    method stop (line 206) | def stop(self):
    method pause (line 221) | def pause(self):
    method play (line 229) | def play(self):
    method output_audio (line 288) | def output_audio(self):
    method run (line 313) | def run(self, commands, responses):
  class CDPlayer (line 374) | class CDPlayer(Player):
    method __init__ (line 375) | def __init__(self, cddareader, audio_output,
    method open (line 407) | def open(self, track_number):
    method set_replay_gain (line 414) | def set_replay_gain(self, replay_gain):
  class CDAudioPlayer (line 420) | class CDAudioPlayer(AudioPlayer):
    method __init__ (line 421) | def __init__(self, cddareader, audio_output,
    method set_audiofile (line 443) | def set_audiofile(self, track_number):
    method play (line 450) | def play(self):
  class AudioOutput (line 498) | class AudioOutput(object):
    method __init__ (line 501) | def __init__(self):
    method __getstate__ (line 507) | def __getstate__(self):
    method __setstate__ (line 512) | def __setstate__(self, name):
    method description (line 521) | def description(self):
    method compatible (line 526) | def compatible(self, sample_rate, channels, channel_mask, bits_per_sam...
    method set_format (line 535) | def set_format(self, sample_rate, channels, channel_mask, bits_per_sam...
    method play (line 551) | def play(self, framelist):
    method pause (line 556) | def pause(self):
    method resume (line 561) | def resume(self):
    method get_volume (line 566) | def get_volume(self):
    method set_volume (line 571) | def set_volume(self, volume):
    method close (line 577) | def close(self):
    method available (line 586) | def available(cls):
  class NULLAudioOutput (line 592) | class NULLAudioOutput(AudioOutput):
    method __init__ (line 600) | def __init__(self):
    method __getstate__ (line 604) | def __getstate__(self):
    method __setstate__ (line 607) | def __setstate__(self, name):
    method description (line 611) | def description(self):
    method play (line 616) | def play(self, framelist):
    method pause (line 623) | def pause(self):
    method resume (line 628) | def resume(self):
    method get_volume (line 633) | def get_volume(self):
    method set_volume (line 638) | def set_volume(self, volume):
    method close (line 647) | def close(self):
    method available (line 653) | def available(cls):
  class OSSAudioOutput (line 659) | class OSSAudioOutput(AudioOutput):
    method __init__ (line 664) | def __init__(self):
    method __getstate__ (line 672) | def __getstate__(self):
    method __setstate__ (line 677) | def __setstate__(self, name):
    method description (line 684) | def description(self):
    method set_format (line 689) | def set_format(self, sample_rate, channels, channel_mask, bits_per_sam...
    method play (line 741) | def play(self, framelist):
    method pause (line 746) | def pause(self):
    method resume (line 751) | def resume(self):
    method get_volume (line 756) | def get_volume(self):
    method set_volume (line 776) | def set_volume(self, volume):
    method close (line 796) | def close(self):
    method available (line 809) | def available(cls):
  class PulseAudioOutput (line 820) | class PulseAudioOutput(AudioOutput):
    method __init__ (line 825) | def __init__(self):
    method __getstate__ (line 829) | def __getstate__(self):
    method __setstate__ (line 834) | def __setstate__(self, name):
    method description (line 840) | def description(self):
    method set_format (line 846) | def set_format(self, sample_rate, channels, channel_mask, bits_per_sam...
    method play (line 885) | def play(self, framelist):
    method pause (line 890) | def pause(self):
    method resume (line 896) | def resume(self):
    method get_volume (line 902) | def get_volume(self):
    method set_volume (line 910) | def set_volume(self, volume):
    method close (line 922) | def close(self):
    method available (line 933) | def available(cls):
  class ALSAAudioOutput (line 944) | class ALSAAudioOutput(AudioOutput):
    method __init__ (line 949) | def __init__(self):
    method __getstate__ (line 953) | def __getstate__(self):
    method __setstate__ (line 958) | def __setstate__(self, name):
    method description (line 964) | def description(self):
    method set_format (line 970) | def set_format(self, sample_rate, channels, channel_mask, bits_per_sam...
    method play (line 1005) | def play(self, framelist):
    method pause (line 1010) | def pause(self):
    method resume (line 1016) | def resume(self):
    method get_volume (line 1022) | def get_volume(self):
    method set_volume (line 1029) | def set_volume(self, volume):
    method close (line 1040) | def close(self):
    method available (line 1051) | def available(cls):
  class CoreAudioOutput (line 1062) | class CoreAudioOutput(AudioOutput):
    method __init__ (line 1067) | def __init__(self):
    method __getstate__ (line 1071) | def __getstate__(self):
    method __setstate__ (line 1076) | def __setstate__(self, name):
    method description (line 1082) | def description(self):
    method set_format (line 1088) | def set_format(self, sample_rate, channels, channel_mask, bits_per_sam...
    method play (line 1123) | def play(self, framelist):
    method pause (line 1128) | def pause(self):
    method resume (line 1134) | def resume(self):
    method get_volume (line 1140) | def get_volume(self):
    method set_volume (line 1151) | def set_volume(self, volume):
    method close (line 1166) | def close(self):
    method available (line 1177) | def available(cls):
  function available_outputs (line 1188) | def available_outputs():
  function open_output (line 1207) | def open_output(output):

FILE: audiotools/ply/lex.py
  class LexError (line 57) | class LexError(Exception):
    method __init__ (line 58) | def __init__(self, message, s):
  class LexToken (line 64) | class LexToken(object):
    method __str__ (line 65) | def __str__(self):
    method __repr__ (line 68) | def __repr__(self):
  class PlyLogger (line 75) | class PlyLogger(object):
    method __init__ (line 76) | def __init__(self, f):
    method critical (line 79) | def critical(self, msg, *args, **kwargs):
    method warning (line 82) | def warning(self, msg, *args, **kwargs):
    method error (line 85) | def error(self, msg, *args, **kwargs):
  class NullLogger (line 93) | class NullLogger(object):
    method __getattribute__ (line 94) | def __getattribute__(self, name):
    method __call__ (line 97) | def __call__(self, *args, **kwargs):
  class Lexer (line 115) | class Lexer:
    method __init__ (line 116) | def __init__(self):
    method clone (line 144) | def clone(self, object=None):
    method writetab (line 174) | def writetab(self, lextab, outputdir=''):
    method readtab (line 211) | def readtab(self, tabfile, fdict):
    method input (line 251) | def input(self, s):
    method begin (line 263) | def begin(self, state):
    method push_state (line 276) | def push_state(self, state):
    method pop_state (line 283) | def pop_state(self):
    method current_state (line 289) | def current_state(self):
    method skip (line 295) | def skip(self, n):
    method token (line 305) | def token(self):
    method __iter__ (line 415) | def __iter__(self):
    method next (line 418) | def next(self):
  function _get_regex (line 439) | def _get_regex(func):
  function get_caller_module_dict (line 449) | def get_caller_module_dict(levels):
  function _funcs_to_names (line 462) | def _funcs_to_names(funclist, namelist):
  function _names_to_funcs (line 477) | def _names_to_funcs(namelist, fdict):
  function _form_master_re (line 493) | def _form_master_re(relist, reflags, ldict, toknames):
  function _statetoken (line 533) | def _statetoken(s, names):
  class LexerReflect (line 558) | class LexerReflect(object):
    method __init__ (line 559) | def __init__(self, ldict, log=None, reflags=0):
    method get_all (line 570) | def get_all(self):
    method validate_all (line 577) | def validate_all(self):
    method get_tokens (line 584) | def get_tokens(self):
    method validate_tokens (line 604) | def validate_tokens(self):
    method get_literals (line 615) | def get_literals(self):
    method validate_literals (line 621) | def validate_literals(self):
    method get_states (line 632) | def get_states(self):
    method get_rules (line 663) | def get_rules(self):
    method validate_rules (line 729) | def validate_rules(self):
    method validate_module (line 832) | def validate_module(self, module):
  function lex (line 860) | def lex(module=None, object=None, debug=False, optimize=False, lextab='l...
  function runmain (line 1052) | def runmain(lexer=None, data=None):
  function TOKEN (line 1086) | def TOKEN(r):

FILE: audiotools/ply/yacc.py
  class PlyLogger (line 109) | class PlyLogger(object):
    method __init__ (line 110) | def __init__(self, f):
    method debug (line 113) | def debug(self, msg, *args, **kwargs):
    method warning (line 118) | def warning(self, msg, *args, **kwargs):
    method error (line 121) | def error(self, msg, *args, **kwargs):
  class NullLogger (line 127) | class NullLogger(object):
    method __getattribute__ (line 128) | def __getattribute__(self, name):
    method __call__ (line 131) | def __call__(self, *args, **kwargs):
  class YaccError (line 135) | class YaccError(Exception):
  function format_result (line 139) | def format_result(r):
  function format_stack_entry (line 149) | def format_stack_entry(r):
  function errok (line 175) | def errok():
  function restart (line 179) | def restart():
  function token (line 183) | def token():
  function call_errorfunc (line 188) | def call_errorfunc(errorfunc, token, parser):
  class YaccSymbol (line 217) | class YaccSymbol:
    method __str__ (line 218) | def __str__(self):
    method __repr__ (line 221) | def __repr__(self):
  class YaccProduction (line 233) | class YaccProduction:
    method __init__ (line 234) | def __init__(self, s, stack=None):
    method __getitem__ (line 240) | def __getitem__(self, n):
    method __setitem__ (line 248) | def __setitem__(self, n, v):
    method __getslice__ (line 251) | def __getslice__(self, i, j):
    method __len__ (line 254) | def __len__(self):
    method lineno (line 257) | def lineno(self, n):
    method set_lineno (line 260) | def set_lineno(self, n, lineno):
    method linespan (line 263) | def linespan(self, n):
    method lexpos (line 268) | def lexpos(self, n):
    method lexspan (line 271) | def lexspan(self, n):
    method error (line 276) | def error(self):
  class LRParser (line 285) | class LRParser:
    method __init__ (line 286) | def __init__(self, lrtab, errorf):
    method errok (line 294) | def errok(self):
    method restart (line 297) | def restart(self):
    method set_defaulted_states (line 313) | def set_defaulted_states(self):
    method disable_defaulted_states (line 320) | def disable_defaulted_states(self):
    method parse (line 323) | def parse(self, input=None, lexer=None, debug=False, tracking=False, t...
    method parsedebug (line 348) | def parsedebug(self, input=None, lexer=None, debug=False, tracking=Fal...
    method parseopt (line 689) | def parseopt(self, input=None, lexer=None, debug=False, tracking=False...
    method parseopt_notrack (line 989) | def parseopt_notrack(self, input=None, lexer=None, debug=False, tracki...
  class Production (line 1291) | class Production(object):
    method __init__ (line 1293) | def __init__(self, number, name, prod, precedence=('right', 0), func=N...
    method __str__ (line 1323) | def __str__(self):
    method __repr__ (line 1326) | def __repr__(self):
    method __len__ (line 1329) | def __len__(self):
    method __nonzero__ (line 1332) | def __nonzero__(self):
    method __getitem__ (line 1335) | def __getitem__(self, index):
    method lr_item (line 1339) | def lr_item(self, n):
    method bind (line 1355) | def bind(self, pdict):
  class MiniProduction (line 1363) | class MiniProduction(object):
    method __init__ (line 1364) | def __init__(self, str, name, len, func, file, line):
    method __str__ (line 1373) | def __str__(self):
    method __repr__ (line 1376) | def __repr__(self):
    method bind (line 1380) | def bind(self, pdict):
  class LRItem (line 1409) | class LRItem(object):
    method __init__ (line 1410) | def __init__(self, p, n):
    method __str__ (line 1421) | def __str__(self):
    method __repr__ (line 1428) | def __repr__(self):
  function rightmost_terminal (line 1436) | def rightmost_terminal(symbols, terminals):
  class GrammarError (line 1452) | class GrammarError(YaccError):
  class Grammar (line 1455) | class Grammar(object):
    method __init__ (line 1456) | def __init__(self, terminals):
    method __len__ (line 1492) | def __len__(self):
    method __getitem__ (line 1495) | def __getitem__(self, index):
    method set_precedence (line 1506) | def set_precedence(self, term, assoc, level):
    method add_production (line 1531) | def add_production(self, prodname, syms, func=None, file='', line=0):
    method set_start (line 1615) | def set_start(self, start=None):
    method find_unreachable (line 1631) | def find_unreachable(self):
    method infinite_cycles (line 1654) | def infinite_cycles(self):
    method undefined_symbols (line 1718) | def undefined_symbols(self):
    method unused_terminals (line 1735) | def unused_terminals(self):
    method unused_rules (line 1750) | def unused_rules(self):
    method unused_precedence (line 1767) | def unused_precedence(self):
    method _first (line 1783) | def _first(self, beta):
    method compute_first (line 1818) | def compute_first(self):
    method compute_follow (line 1855) | def compute_follow(self, start=None):
    method build_lritems (line 1914) | def build_lritems(self):
  class VersionError (line 1950) | class VersionError(YaccError):
  class LRTable (line 1953) | class LRTable(object):
    method __init__ (line 1954) | def __init__(self):
    method read_table (line 1960) | def read_table(self, module):
    method read_pickle (line 1980) | def read_pickle(self, filename):
    method bind_callables (line 2008) | def bind_callables(self, pdict):
  function digraph (line 2037) | def digraph(X, R, FP):
  function traverse (line 2048) | def traverse(x, N, stack, F, X, R, FP):
  class LALRError (line 2071) | class LALRError(YaccError):
  class LRGeneratedTable (line 2081) | class LRGeneratedTable(LRTable):
    method __init__ (line 2082) | def __init__(self, grammar, method='LALR', log=None):
    method lr0_closure (line 2119) | def lr0_closure(self, I):
    method lr0_goto (line 2145) | def lr0_goto(self, I, x):
    method lr0_items (line 2180) | def lr0_items(self):
    method compute_nullable_nonterminals (line 2236) | def compute_nullable_nonterminals(self):
    method find_nonterminal_transitions (line 2265) | def find_nonterminal_transitions(self, C):
    method dr_relation (line 2285) | def dr_relation(self, C, trans, nullable):
    method reads_relation (line 2310) | def reads_relation(self, C, trans, empty):
    method compute_lookback_includes (line 2353) | def compute_lookback_includes(self, C, trans, nullable):
    method compute_read_sets (line 2433) | def compute_read_sets(self, C, ntrans, nullable):
    method compute_follow_sets (line 2455) | def compute_follow_sets(self, ntrans, readsets, inclsets):
    method add_lookaheads (line 2473) | def add_lookaheads(self, lookbacks, followset):
    method add_lalr_lookaheads (line 2491) | def add_lalr_lookaheads(self, C):
    method lr_parse_table (line 2515) | def lr_parse_table(self):
    method write_table (line 2698) | def write_table(self, tabmodule, outputdir='', signature=''):
    method pickle_table (line 2820) | def pickle_table(self, filename, signature=''):
  function get_caller_module_dict (line 2855) | def get_caller_module_dict(levels):
  function parse_grammar (line 2867) | def parse_grammar(doc, file, line):
  class ParserReflect (line 2908) | class ParserReflect(object):
    method __init__ (line 2909) | def __init__(self, pdict, log=None):
    method get_all (line 2924) | def get_all(self):
    method validate_all (line 2932) | def validate_all(self):
    method signature (line 2942) | def signature(self):
    method validate_modules (line 2977) | def validate_modules(self):
    method get_start (line 2999) | def get_start(self):
    method validate_start (line 3003) | def validate_start(self):
    method get_error_func (line 3009) | def get_error_func(self):
    method validate_error_func (line 3013) | def validate_error_func(self):
    method get_tokens (line 3035) | def get_tokens(self):
    method validate_tokens (line 3055) | def validate_tokens(self):
    method get_precedence (line 3069) | def get_precedence(self):
    method validate_precedence (line 3073) | def validate_precedence(self):
    method get_pfunctions (line 3104) | def get_pfunctions(self):
    method validate_pfunctions (line 3125) | def validate_pfunctions(self):
  function yacc (line 3191) | def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_modu...

FILE: audiotools/speex.py
  class InvalidSpeex (line 21) | class InvalidSpeex(InvalidFile):
  class SpeexAudio (line 25) | class SpeexAudio(AudioFile):
    method __init__ (line 40) | def __init__(self, filename):
    method bits_per_sample (line 88) | def bits_per_sample(self):
    method channels (line 93) | def channels(self):
    method total_frames (line 98) | def total_frames(self):
    method lossless (line 116) | def lossless(self):
    method supports_metadata (line 122) | def supports_metadata(cls):
    method update_metadata (line 127) | def update_metadata(self, metadata):
    method set_metadata (line 206) | def set_metadata(self, metadata):
    method get_metadata (line 236) | def get_metadata(self):
    method delete_metadata (line 260) | def delete_metadata(self):
    method sample_rate (line 272) | def sample_rate(self):
    method supports_to_pcm (line 278) | def supports_to_pcm(cls):
    method to_pcm (line 284) | def to_pcm(self):
    method supports_from_pcm (line 309) | def supports_from_pcm(cls):
    method from_pcm (line 316) | def from_pcm(cls, filename, pcmreader,

FILE: audiotools/toc/__init__.py
  class TOCFile (line 23) | class TOCFile(Sheet):
    method __init__ (line 24) | def __init__(self, type, tracks, catalog=None, cd_text=None):
    method __repr__ (line 39) | def __repr__(self):
    method converted (line 49) | def converted(cls, sheet, filename=None):
    method __len__ (line 75) | def __len__(self):
    method __getitem__ (line 78) | def __getitem__(self, index):
    method build (line 81) | def build(self):
    method get_metadata (line 94) | def get_metadata(self):
  class TOCTrack (line 113) | class TOCTrack(SheetTrack):
    method __init__ (line 114) | def __init__(self, mode, flags, sub_channel_mode=None):
    method converted (line 159) | def converted(cls, sheettrack, next_sheettrack, filename=None):
    method first_flag (line 208) | def first_flag(self, flag_class):
    method all_flags (line 218) | def all_flags(self, flag_class):
    method __repr__ (line 223) | def __repr__(self):
    method __len__ (line 232) | def __len__(self):
    method __getitem__ (line 235) | def __getitem__(self, index):
    method number (line 238) | def number(self):
    method get_metadata (line 243) | def get_metadata(self):
    method filename (line 261) | def filename(self):
    method is_audio (line 270) | def is_audio(self):
    method pre_emphasis (line 275) | def pre_emphasis(self):
    method copy_permitted (line 284) | def copy_permitted(self):
    method build (line 293) | def build(self):
  class TOCFlag (line 305) | class TOCFlag(object):
    method __init__ (line 306) | def __init__(self, attrs):
    method __repr__ (line 309) | def __repr__(self):
    method build (line 316) | def build(self):
  class TOCFlag_COPY (line 323) | class TOCFlag_COPY(TOCFlag):
    method __init__ (line 324) | def __init__(self, copy):
    method copy (line 329) | def copy(self):
    method build (line 332) | def build(self):
  class TOCFlag_PRE_EMPHASIS (line 336) | class TOCFlag_PRE_EMPHASIS(TOCFlag):
    method __init__ (line 337) | def __init__(self, pre_emphasis):
    method pre_emphasis (line 342) | def pre_emphasis(self):
    method build (line 345) | def build(self):
  class TOCFlag_CHANNELS (line 349) | class TOCFlag_CHANNELS(TOCFlag):
    method __init__ (line 350) | def __init__(self, channels):
    method build (line 355) | def build(self):
  class TOCFlag_ISRC (line 361) | class TOCFlag_ISRC(TOCFlag):
    method __init__ (line 362) | def __init__(self, isrc):
    method isrc (line 369) | def isrc(self):
    method build (line 372) | def build(self):
  class TOCFlag_FILE (line 376) | class TOCFlag_FILE(TOCFlag):
    method __init__ (line 377) | def __init__(self, type, filename, start, length=None):
    method filename (line 391) | def filename(self):
    method start (line 394) | def start(self):
    method length (line 397) | def length(self):
    method build (line 400) | def build(self):
  class TOCFlag_START (line 412) | class TOCFlag_START(TOCFlag):
    method __init__ (line 413) | def __init__(self, start=None):
    method start (line 419) | def start(self):
    method build (line 422) | def build(self):
  class TOCFlag_INDEX (line 429) | class TOCFlag_INDEX(TOCFlag):
    method __init__ (line 430) | def __init__(self, index):
    method index (line 436) | def index(self):
    method build (line 439) | def build(self):
  class CDText (line 443) | class CDText(object):
    method __init__ (line 444) | def __init__(self, languages, language_map=None):
    method __repr__ (line 448) | def __repr__(self):
    method get (line 452) | def get(self, key, default):
    method build (line 461) | def build(self):
    method to_disc_metadata (line 470) | def to_disc_metadata(self):
    method from_disc_metadata (line 481) | def from_disc_metadata(cls, metadata):
    method to_track_metadata (line 502) | def to_track_metadata(self):
    method from_track_metadata (line 514) | def from_track_metadata(cls, metadata):
  class CDTextLanguage (line 536) | class CDTextLanguage(object):
    method __init__ (line 537) | def __init__(self, language_id, text_pairs):
    method __repr__ (line 541) | def __repr__(self):
    method __len__ (line 545) | def __len__(self):
    method __getitem__ (line 548) | def __getitem__(self, key):
    method build (line 555) | def build(self):
  class CDTextLanguageMap (line 566) | class CDTextLanguageMap(object):
    method __init__ (line 567) | def __init__(self, mapping):
    method __repr__ (line 570) | def __repr__(self):
    method build (line 573) | def build(self):
  function format_string (line 581) | def format_string(s):
  function format_timestamp (line 585) | def format_timestamp(t):
  function format_binary (line 592) | def format_binary(s):
  function read_tocfile (line 596) | def read_tocfile(filename):
  function read_tocfile_string (line 609) | def read_tocfile_string(tocfile):
  function write_tocfile (line 637) | def write_tocfile(sheet, filename, file):

FILE: audiotools/toc/tokrules.py
  function t_COMMENT (line 77) | def t_COMMENT(t):
  function t_ID (line 87) | def t_ID(t):
  function t_STRING (line 94) | def t_STRING(t):
  function t_TIMESTAMP (line 101) | def t_TIMESTAMP(t):
  function t_NUMBER (line 108) | def t_NUMBER(t):
  function t_newline (line 116) | def t_newline(t):
  function t_error (line 121) | def t_error(t):

FILE: audiotools/toc/yaccrules.py
  function p_tocfile (line 21) | def p_tocfile(t):
  function p_headers (line 32) | def p_headers(t):
  function p_header (line 42) | def p_header(t):
  function p_header_cd_text (line 57) | def p_header_cd_text(t):
  function p_language_map (line 63) | def p_language_map(t):
  function p_language_mappings (line 70) | def p_language_mappings(t):
  function p_language_mapping (line 80) | def p_language_mapping(t):
  function p_language (line 86) | def p_language(t):
  function p_language_blocks (line 94) | def p_language_blocks(t):
  function p_language_block (line 104) | def p_language_block(t):
  function p_cd_text_items (line 111) | def p_cd_text_items(t):
  function p_cd_text_item (line 121) | def p_cd_text_item(t):
  function p_binary (line 138) | def p_binary(t):
  function p_bytes (line 143) | def p_bytes(t):
  function p_tracks (line 152) | def p_tracks(t):
  function p_track (line 162) | def p_track(t):
  function p_track_mode (line 174) | def p_track_mode(t):
  function p_sub_channel_mode (line 186) | def p_sub_channel_mode(t):
  function p_track_flags (line 192) | def p_track_flags(t):
  function p_track_flag (line 202) | def p_track_flag(t):
  function p_track_cd_text (line 213) | def p_track_cd_text(t):
  function p_track_flag_copy (line 219) | def p_track_flag_copy(t):
  function p_track_flag_no_copy (line 225) | def p_track_flag_no_copy(t):
  function p_track_flag_pre_emphasis (line 231) | def p_track_flag_pre_emphasis(t):
  function p_track_flag_no_pre_emphasis (line 237) | def p_track_flag_no_pre_emphasis(t):
  function p_track_flag_two_channels (line 243) | def p_track_flag_two_channels(t):
  function p_track_flag_four_channels (line 249) | def p_track_flag_four_channels(t):
  function p_track_flag_isrc (line 255) | def p_track_flag_isrc(t):
  function p_track_file (line 261) | def p_track_file(t):
  function p_track_start (line 278) | def p_track_start(t):
  function p_track_index (line 289) | def p_track_index(t):
  function p_start_number (line 296) | def p_start_number(t):
  function p_start_timestamp (line 303) | def p_start_timestamp(t):
  function p_length_number (line 310) | def p_length_number(t):
  function p_length_timestamp (line 317) | def p_length_timestamp(t):
  function p_error (line 324) | def p_error(t):

FILE: audiotools/tta.py
  function div_ceil (line 23) | def div_ceil(n, d):
  class InvalidTTA (line 29) | class InvalidTTA(InvalidFile):
  class TrueAudio (line 33) | class TrueAudio(ApeTaggedAudio, ApeGainedAudio, AudioFile):
    method __init__ (line 40) | def __init__(self, filename):
    method bits_per_sample (line 76) | def bits_per_sample(self):
    method channels (line 81) | def channels(self):
    method channel_mask (line 86) | def channel_mask(self):
    method lossless (line 98) | def lossless(self):
    method total_frames (line 103) | def total_frames(self):
    method sample_rate (line 108) | def sample_rate(self):
    method seekable (line 113) | def seekable(self):
    method supports_to_pcm (line 119) | def supports_to_pcm(cls):
    method to_pcm (line 131) | def to_pcm(self):
    method supports_from_pcm (line 164) | def supports_from_pcm(cls):
    method from_pcm (line 175) | def from_pcm(cls, filename, pcmreader,
    method data_size (line 234) | def data_size(self):
    method supports_metadata (line 243) | def supports_metadata(cls):
    method supports_cuesheet (line 249) | def supports_cuesheet(cls):
    method get_cuesheet (line 252) | def get_cuesheet(self):
    method set_cuesheet (line 279) | def set_cuesheet(self, cuesheet):
    method delete_cuesheet (line 310) | def delete_cuesheet(self):
  function write_header (line 327) | def write_header(writer,
  function write_seektable (line 348) | def write_seektable(writer, frame_sizes):
  class CRC32 (line 359) | class CRC32(object):
    method __init__ (line 425) | def __init__(self):
    method update (line 428) | def update(self, byte):
    method __int__ (line 431) | def __int__(self):

FILE: audiotools/ui.py
  function choice_selection_unicode (line 27) | def choice_selection_unicode(metadata):
  function Screen (line 58) | def Screen():
  class DownEdit (line 64) | class DownEdit(urwid.Edit):
    method __init__ (line 69) | def __init__(self, *args, **kwargs):
    method keypress (line 73) | def keypress(self, size, key):
  class DownIntEdit (line 80) | class DownIntEdit(urwid.IntEdit):
    method __init__ (line 85) | def __init__(self, *args, **kwargs):
    method keypress (line 89) | def keypress(self, size, key):
  class DownCheckBox (line 96) | class DownCheckBox(urwid.CheckBox):
    method keypress (line 101) | def keypress(self, size, key):
  class FocusFrame (line 107) | class FocusFrame(urwid.Frame):
    method __init__ (line 110) | def __init__(self, *args, **kwargs):
    method set_focus_callback (line 115) | def set_focus_callback(self, callback, user_arg=None):
    method set_focus (line 122) | def set_focus(self, part):
  function get_focus (line 130) | def get_focus(widget):
  class OutputFiller (line 138) | class OutputFiller(urwid.Frame):
    method __init__ (line 142) | def __init__(self,
    method page_changed (line 225) | def page_changed(self, new_page):
    method exit (line 233) | def exit(self, button):
    method complete (line 237) | def complete(self, button):
    method cancelled (line 251) | def cancelled(self):
    method handle_text (line 257) | def handle_text(self, i):
    method output_tracks (line 264) | def output_tracks(self):
  class SingleOutputFiller (line 288) | class SingleOutputFiller(urwid.Frame):
    method __init__ (line 292) | def __init__(self,
    method exit (line 369) | def exit(self, button):
    method complete (line 373) | def complete(self, button):
    method cancelled (line 385) | def cancelled(self):
    method handle_text (line 388) | def handle_text(self, i):
    method output_track (line 396) | def output_track(self):
  class MetaDataFiller (line 413) | class MetaDataFiller(urwid.Pile):
    method __init__ (line 416) | def __init__(self, track_labels, metadata_choices, status):
    method select_match (line 489) | def select_match(self, radio, selected, match):
    method swiveled (line 494) | def swiveled(self, radio_button, selected, swivel):
    method select_previous_item (line 514) | def select_previous_item(self):
    method select_next_item (line 520) | def select_next_item(self):
    method populated_metadata (line 526) | def populated_metadata(self):
  class MetaDataEditor (line 533) | class MetaDataEditor(urwid.Frame):
    method __init__ (line 536) | def __init__(self, tracks,
    method activate_swivel (line 692) | def activate_swivel(self, radio_button, selected, swivel):
    method select_previous_item (line 720) | def select_previous_item(self):
    method select_next_item (line 725) | def select_next_item(self):
    method metadata (line 730) | def metadata(self):
  class OrderedRadioButton (line 740) | class OrderedRadioButton(urwid.RadioButton):
    method __init__ (line 741) | def __init__(self, ordered_group, group, label,
    method previous_radio_button (line 752) | def previous_radio_button(self):
    method next_radio_button (line 761) | def next_radio_button(self):
  class LinkedWidgetHeader (line 770) | class LinkedWidgetHeader(urwid.Columns):
    method __init__ (line 771) | def __init__(self, widget):
  class LinkedWidgetDivider (line 777) | class LinkedWidgetDivider(urwid.Columns):
    method __init__ (line 778) | def __init__(self):
  class LinkedWidgets (line 785) | class LinkedWidgets(urwid.Columns):
    method __init__ (line 786) | def __init__(self, checkbox_group, linked_widget, unlinked_widget,
    method swap_link (line 807) | def swap_link(self, checkbox, linked):
    method value (line 836) | def value(self):
  class BaseMetaData (line 860) | class BaseMetaData(object):
    method __init__ (line 861) | def __init__(self, metadata, on_change=None):
  class TrackMetaData (line 887) | class TrackMetaData(object):
    method __init__ (line 890) | def __init__(self, metadata, base_metadata, on_change=None):
    method edited_metadata (line 927) | def edited_metadata(self):
  class Swivel (line 938) | class Swivel(object):
    method __init__ (line 941) | def __init__(self, swivel_type,
    method rows (line 964) | def rows(self):
  function tab_complete (line 969) | def tab_complete(path):
  function tab_complete_file (line 1001) | def tab_complete_file(path):
  function pop_directory (line 1035) | def pop_directory(path):
  function split_at_cursor (line 1049) | def split_at_cursor(edit):
  class SelectButtons (line 1056) | class SelectButtons(urwid.Pile):
    method __init__ (line 1057) | def __init__(self, widget_list, focus_item=None, cancelled=None):
    method keypress (line 1065) | def keypress(self, size, key):
  class BottomLineBox (line 1073) | class BottomLineBox(urwid.LineBox):
    method __init__ (line 1076) | def __init__(self, original_widget, title="",
  class SelectOneDialog (line 1108) | class SelectOneDialog(urwid.WidgetWrap):
    method __init__ (line 1111) | def __init__(self, select_one, items, selected_value,
    method select_button (line 1134) | def select_button(self, button, label_value):
  class SelectOne (line 1139) | class SelectOne(urwid.PopUpLauncher):
    method __init__ (line 1140) | def __init__(self, items, selected_value=None, on_change=None,
    method create_pop_up (line 1180) | def create_pop_up(self):
    method get_pop_up_parameters (line 1191) | def get_pop_up_parameters(self):
    method make_selection (line 1198) | def make_selection(self, label, value):
    method selection (line 1207) | def selection(self):
    method set_items (line 1210) | def set_items(self, items, selected_value):
  class SelectDirectory (line 1216) | class SelectDirectory(urwid.Columns):
    method __init__ (line 1217) | def __init__(self, initial_directory, on_change=None, user_data=None):
    method set_directory (line 1228) | def set_directory(self, directory):
    method get_directory (line 1232) | def get_directory(self):
  class EditDirectory (line 1235) | class EditDirectory(urwid.Edit):
    method __init__ (line 1236) | def __init__(self, initial_directory):
    method keypress (line 1253) | def keypress(self, size, key):
    method set_directory (line 1287) | def set_directory(self, directory):
    method get_directory (line 1296) | def get_directory(self):
  class BrowseDirectory (line 1304) | class BrowseDirectory(urwid.PopUpLauncher):
    method __init__ (line 1305) | def __init__(self, edit_directory):
    method create_pop_up (line 1315) | def create_pop_up(self):
    method get_pop_up_parameters (line 1321) | def get_pop_up_parameters(self):
  class BrowseDirectoryDialog (line 1329) | class BrowseDirectoryDialog(urwid.WidgetWrap):
    method __init__ (line 1332) | def __init__(self, edit_directory):
    method select_directory (line 1360) | def select_directory(self, selected_directory):
  class DirectoryBrowser (line 1364) | class DirectoryBrowser(urwid.TreeListBox):
    method __init__ (line 1365) | def __init__(self, initial_directory,
    method selected_directory (line 1405) | def selected_directory(self):
    method unhandled_input (line 1419) | def unhandled_input(self, size, input):
  class DirectoryWidget (line 1434) | class DirectoryWidget(urwid.TreeWidget):
    method __init__ (line 1437) | def __init__(self, node):
    method keypress (line 1442) | def keypress(self, size, key):
    method get_display_text (line 1450) | def get_display_text(self):
  class ErrorWidget (line 1457) | class ErrorWidget(urwid.TreeWidget):
    method get_display_text (line 1460) | def get_display_text(self):
  class ErrorNode (line 1463) | class ErrorNode(urwid.TreeNode):
    method load_widget (line 1464) | def load_widget(self):
  class DirectoryNode (line 1467) | class DirectoryNode(urwid.ParentNode):
    method __init__ (line 1468) | def __init__(self, path, parent=None):
    method load_parent (line 1485) | def load_parent(self):
    method load_child_keys (line 1493) | def load_child_keys(self):
    method load_child_node (line 1512) | def load_child_node(self, key):
    method load_widget (line 1521) | def load_widget(self):
  class EditFilename (line 1524) | class EditFilename(urwid.Edit):
    method __init__ (line 1525) | def __init__(self, initial_filename):
    method keypress (line 1542) | def keypress(self, size, key):
    method set_filename (line 1576) | def set_filename(self, filename):
    method get_filename (line 1585) | def get_filename(self):
  class BrowseFields (line 1593) | class BrowseFields(urwid.PopUpLauncher):
    method __init__ (line 1594) | def __init__(self, output_format):
    method create_pop_up (line 1603) | def create_pop_up(self):
    method get_pop_up_parameters (line 1609) | def get_pop_up_parameters(self):
  class BrowseFieldsDialog (line 1619) | class BrowseFieldsDialog(urwid.WidgetWrap):
    method __init__ (line 1622) | def __init__(self, output_format):
    method close (line 1637) | def close(self):
  class FieldsList (line 1640) | class FieldsList(urwid.ListBox):
    method __init__ (line 1641) | def __init__(self, output_format, close):
    method select_field (line 1653) | def select_field(self, button, field_value):
    method cancel (line 1658) | def cancel(self):
    method keypress (line 1661) | def keypress(self, size, input):
  class OutputOptions (line 1670) | class OutputOptions(urwid.Pile):
    method __init__ (line 1674) | def __init__(self,
    method select_type (line 1808) | def select_type(self, audio_class, default_quality=None):
    method directory_changed (line 1839) | def directory_changed(self, widget, new_value):
    method format_changed (line 1847) | def format_changed(self, widget, new_value):
    method update_tracks (line 1855) | def update_tracks(self, output_directory=None, filename_format=None):
    method selected_options (line 1929) | def selected_options(self):
    method set_metadatas (line 1939) | def set_metadatas(self, metadatas):
  class SingleOutputOptions (line 1949) | class SingleOutputOptions(urwid.ListBox):
    method __init__ (line 1953) | def __init__(self,
    method set_metadata (line 2018) | def set_metadata(self, metadata):
    method select_type (line 2024) | def select_type(self, audio_class, default_quality=None):
    method selected_options (line 2052) | def selected_options(self):
  class Wizard (line 2060) | class Wizard(urwid.Frame):
    method __init__ (line 2061) | def __init__(self, pages, cancel_button, completion_button,
    method set_page (line 2110) | def set_page(self, button, user_data):
  class MappedButton (line 2116) | class MappedButton(urwid.Button):
    method __init__ (line 2117) | def __init__(self, label, on_press=None, user_data=None,
    method keypress (line 2124) | def keypress(self, size, key):
  class MappedRadioButton (line 2129) | class MappedRadioButton(urwid.RadioButton):
    method __init__ (line 2130) | def __init__(self, group, label, state='first True',
    method keypress (line 2140) | def keypress(self, size, key):
  class AudioProgressBar (line 2145) | class AudioProgressBar(urwid.ProgressBar):
    method __init__ (line 2146) | def __init__(self, normal, complete, sample_rate, current=0, done=100,
    method get_text (line 2156) | def get_text(self):
  class VolumeControl (line 2166) | class VolumeControl(urwid.ProgressBar):
    method __init__ (line 2167) | def __init__(self, get_volume, volume_delta, change_volume):
    method update (line 2183) | def update(self):
    method get_text (line 2186) | def get_text(self):
    method selectable (line 2192) | def selectable(self):
    method get_cursor_coords (line 2195) | def get_cursor_coords(self, size):
    method keypress (line 2198) | def keypress(self, size, key):
    method render (line 2206) | def render(self, size, focus=False):
    method decrease_volume (line 2214) | def decrease_volume(self):
    method increase_volume (line 2217) | def increase_volume(self):
    method update_volume (line 2220) | def update_volume(self, delta):
  class AdjustOutput (line 2223) | class AdjustOutput(urwid.PopUpLauncher):
    method __init__ (line 2224) | def __init__(self, player, volume_control):
    method create_pop_up (line 2237) | def create_pop_up(self):
    method get_pop_up_parameters (line 2249) | def get_pop_up_parameters(self):
  class AdjustOutputWidget (line 2255) | class AdjustOutputWidget(urwid.Pile):
    method __init__ (line 2256) | def __init__(self, player, volume_control, outputs,
    method keypress (line 2285) | def keypress(self, size, key):
    method change_output (line 2293) | def change_output(self, radio_button, new_state, new_output):
  class AdjustOutputDialog (line 2298) | class AdjustOutputDialog(urwid.WidgetWrap):
    method __init__ (line 2301) | def __init__(self, player, volume_control, outputs):
  class PlayerGUI (line 2313) | class PlayerGUI(urwid.Frame):
    method __init__ (line 2314) | def __init__(self, player, tracks, track_len):
    method select_track (line 2461) | def select_track(self, radio_button, new_state, user_data,
    method next_track (line 2467) | def next_track(self, user_data=None):
    method previous_track (line 2478) | def previous_track(self, user_data=None):
    method update_metadata (line 2489) | def update_metadata(self, track_name=None,
    method update_status (line 2547) | def update_status(self):
    method play_pause (line 2559) | def play_pause(self, user_data):
    method stop (line 2571) | def stop(self):
    method handle_text (line 2575) | def handle_text(self, i):
    method perform_exit (line 2585) | def perform_exit(self, *args):
  function timer (line 2589) | def timer(main_loop, playergui):
  function style (line 2597) | def style():
  function show_available_formats (line 2616) | def show_available_formats(msg):
  function show_available_qualities (line 2651) | def show_available_qualities(msg, audiotype):
  function select_metadata (line 2696) | def select_metadata(metadata_choices, msg, use_default=False):
  function process_output_options (line 2730) | def process_output_options(metadata_choices,
  class PlayerTTY (line 2810) | class PlayerTTY(object):
    method __init__ (line 2817) | def __init__(self, player):
    method previous_track (line 2826) | def previous_track(self):
    method next_track (line 2831) | def next_track(self):
    method set_metadata (line 2837) | def set_metadata(self, track_number,
    method toggle_play_pause (line 2848) | def toggle_play_pause(self):
    method stop (line 2851) | def stop(self):
    method run (line 2854) | def run(self, msg, stdin):
    method progress (line 2922) | def progress(self):
    method progress_line (line 2925) | def progress_line(self, frames_sent, frames_total):
  function not_available_message (line 2938) | def not_available_message(msg):
  function xargs_suggestion (line 2950) | def xargs_suggestion(args):

FILE: audiotools/vorbis.py
  class InvalidVorbis (line 21) | class InvalidVorbis(InvalidFile):
  class VorbisAudio (line 25) | class VorbisAudio(AudioFile):
    method __init__ (line 39) | def __init__(self, filename):
    method __read_identification__ (line 50) | def __read_identification__(self):
    method lossless (line 98) | def lossless(self):
    method bits_per_sample (line 103) | def bits_per_sample(self):
    method channels (line 108) | def channels(self):
    method channel_mask (line 113) | def channel_mask(self):
    method total_frames (line 156) | def total_frames(self):
    method sample_rate (line 174) | def sample_rate(self):
    method supports_to_pcm (line 180) | def supports_to_pcm(cls):
    method to_pcm (line 190) | def to_pcm(self):
    method supports_from_pcm (line 206) | def supports_from_pcm(cls):
    method from_pcm (line 217) | def from_pcm(cls, filename, pcmreader,
    method update_metadata (line 278) | def update_metadata(self, metadata):
    method set_metadata (line 362) | def set_metadata(self, metadata):
    method supports_metadata (line 393) | def supports_metadata(cls):
    method get_metadata (line 398) | def get_metadata(self):
    method delete_metadata (line 426) | def delete_metadata(self):
    method supports_replay_gain (line 439) | def supports_replay_gain(cls):
    method get_replay_gain (line 444) | def get_replay_gain(self):
    method set_replay_gain (line 470) | def set_replay_gain(self, replaygain):
    method delete_replay_gain (line 498) | def delete_replay_gain(self):
  class VorbisChannelMask (line 518) | class VorbisChannelMask(ChannelMask):
    method __repr__ (line 521) | def __repr__(self):
    method channels (line 527) | def channels(self):

FILE: audiotools/vorbiscomment.py
  class VorbisComment (line 23) | class VorbisComment(MetaData):
    method __init__ (line 53) | def __init__(self, comment_strings, vendor_string):
    method keys (line 68) | def keys(self):
    method values (line 73) | def values(self):
    method items (line 76) | def items(self):
    method __contains__ (line 79) | def __contains__(self, key):
    method __getitem__ (line 90) | def __getitem__(self, key):
    method __setitem__ (line 106) | def __setitem__(self, key, values):
    method __delitem__ (line 140) | def __delitem__(self, key):
    method __repr__ (line 159) | def __repr__(self):
    method __comment_name__ (line 163) | def __comment_name__(self):
    method raw_info (line 166) | def raw_info(self):
    method __getattr__ (line 200) | def __getattr__(self, attr):
    method __setattr__ (line 272) | def __setattr__(self, attr, value):
    method __delattr__ (line 375) | def __delattr__(self, attr):
    method __eq__ (line 444) | def __eq__(self, metadata):
    method converted (line 451) | def converted(cls, metadata):
    method supports_images (line 493) | def supports_images(cls):
    method images (line 505) | def images(self):
    method clean (line 510) | def clean(self):
    method intersection (line 587) | def intersection(self, metadata):

FILE: audiotools/wav.py
  class RIFF_Chunk (line 25) | class RIFF_Chunk(object):
    method __init__ (line 28) | def __init__(self, chunk_id, chunk_size, chunk_data):
    method __repr__ (line 38) | def __repr__(self):
    method size (line 41) | def size(self):
    method total_size (line 47) | def total_size(self):
    method data (line 56) | def data(self):
    method verify (line 63) | def verify(self):
    method write (line 68) | def write(self, f):
  class RIFF_File_Chunk (line 81) | class RIFF_File_Chunk(RIFF_Chunk):
    method __init__ (line 84) | def __init__(self, chunk_id, chunk_size, wav_file, chunk_data_offset):
    method __del__ (line 97) | def __del__(self):
    method __repr__ (line 100) | def __repr__(self):
    method data (line 103) | def data(self):
    method verify (line 112) | def verify(self):
    method write (line 125) | def write(self, f):
  function pad_data (line 144) | def pad_data(pcm_frames, channels, bits_per_sample):
  function validate_header (line 151) | def validate_header(header):
  function validate_footer (line 237) | def validate_footer(footer, data_bytes_written):
  function parse_fmt (line 286) | def parse_fmt(fmt):
  function wave_header (line 355) | def wave_header(sample_rate,
  class WaveReader (line 426) | class WaveReader(object):
    method __init__ (line 429) | def __init__(self, wave_filename):
    method __enter__ (line 517) | def __enter__(self):
    method __exit__ (line 520) | def __exit__(self, exc_type, exc_value, traceback):
    method read (line 523) | def read(self, pcm_frames):
    method read_closed (line 548) | def read_closed(self, pcm_frames):
    method seek (line 551) | def seek(self, pcm_frame_offset):
    method seek_closed (line 570) | def seek_closed(self, pcm_frame_offset):
    method close (line 573) | def close(self):
  class TempWaveReader (line 581) | class TempWaveReader(WaveReader):
    method __init__ (line 584) | def __init__(self, tempfile):
    method __del__ (line 592) | def __del__(self):
    method close (line 596) | def close(self):
  class InvalidWave (line 602) | class InvalidWave(InvalidFile):
  class WaveAudio (line 608) | class WaveAudio(WaveContainer):
    method __init__ (line 620) | def __init__(self, filename):
    method lossless (line 661) | def lossless(self):
    method has_foreign_wave_chunks (line 666) | def has_foreign_wave_chunks(self):
    method channel_mask (line 676) | def channel_mask(self):
    method supports_to_pcm (line 682) | def supports_to_pcm(cls):
    method to_pcm (line 689) | def to_pcm(self):
    method supports_from_pcm (line 704) | def supports_from_pcm(cls):
    method from_pcm (line 711) | def from_pcm(cls, filename, pcmreader,
    method total_frames (line 790) | def total_frames(self):
    method sample_rate (line 797) | def sample_rate(self):
    method channels (line 802) | def channels(self):
    method bits_per_sample (line 807) | def bits_per_sample(self):
    method seekable (line 812) | def seekable(self):
    method track_name (line 818) | def track_name(cls, file_path, track_metadata=None, format=None):
    method chunks (line 835) | def chunks(self):
    method wave_from_chunks (line 892) | def wave_from_chunks(cls, filename, chunk_iter):
    method wave_header_footer (line 915) | def wave_header_footer(self):
    method from_wave (line 998) | def from_wave(cls, filename, header, pcmreader, footer, compression=No...
    method verify (line 1070) | def verify(self, progress=None):
    method clean (line 1123) | def clean(self, output_filename=None):

FILE: audiotools/wavpack.py
  class InvalidWavPack (line 23) | class InvalidWavPack(InvalidFile):
  function __riff_chunk_ids__ (line 27) | def __riff_chunk_ids__(data_size, data):
  class WavPackAudio (line 47) | class WavPackAudio(ApeTaggedAudio, ApeGainedAudio, WaveContainer):
    method __init__ (line 67) | def __init__(self, filename):
    method lossless (line 81) | def lossless(self):
    method channel_mask (line 86) | def channel_mask(self):
    method supports_metadata (line 92) | def supports_metadata(cls):
    method get_metadata (line 97) | def get_metadata(self):
    method has_foreign_wave_chunks (line 107) | def has_foreign_wave_chunks(self):
    method wave_header_footer (line 125) | def wave_header_footer(self):
    method from_wave (line 150) | def from_wave(cls, filename, header, pcmreader, footer, compression=None,
    method blocks (line 226) | def blocks(self, reader=None):
    method sub_blocks (line 255) | def sub_blocks(self, reader=None):
    method __read_info__ (line 291) | def __read_info__(self):
    method bits_per_sample (line 393) | def bits_per_sample(self):
    method channels (line 398) | def channels(self):
    method total_frames (line 403) | def total_frames(self):
    method sample_rate (line 408) | def sample_rate(self):
    method seekable (line 413) | def seekable(self):
    method supports_from_pcm (line 419) | def supports_from_pcm(cls):
    method from_pcm (line 430) | def from_pcm(cls, filename, pcmreader,
    method supports_to_pcm (line 491) | def supports_to_pcm(cls):
    method to_pcm (line 501) | def to_pcm(self):
    method fmt_chunk (line 516) | def fmt_chunk(self, reader=None):
    method supports_cuesheet (line 543) | def supports_cuesheet(cls):
    method get_cuesheet (line 546) | def get_cuesheet(self):
    method set_cuesheet (line 573) | def set_cuesheet(self, cuesheet):
    method delete_cuesheet (line 603) | def delete_cuesheet(self):

FILE: docs/manpagexml.py
  function subtag (line 29) | def subtag(node, name):
  function subtags (line 35) | def subtags(node, name):
  function text (line 41) | def text(node):
  function man_escape (line 48) | def man_escape(s):
  function write_u (line 53) | def write_u(stream, unicode_string):
  function write_u (line 57) | def write_u(stream, unicode_string):
  class Manpage (line 62) | class Manpage:
    method __init__ (line 85) | def __init__(self,
    method __repr__ (line 125) | def __repr__(self):
    method flatten_options (line 139) | def flatten_options(self):
    method parse_file (line 145) | def parse_file(cls, filename):
    method parse (line 149) | def parse(cls, xml_dom):
    method to_man (line 182) | def to_man(self, stream, page_time=None):
    method format_fields_man (line 240) | def format_fields_man(self, stream):
    method to_html (line 258) | def to_html(self, stream):
  class Options (line 291) | class Options:
    method __init__ (line 292) | def __init__(self, options, category=None):
    method __repr__ (line 296) | def __repr__(self):
    method parse (line 302) | def parse(cls, xml_dom):
    method to_man (line 312) | def to_man(self, stream):
    method to_html (line 321) | def to_html(self, stream):
  class Option (line 337) | class Option:
    method __init__ (line 338) | def __init__(self,
    method __repr__ (line 348) | def __repr__(self):
    method parse (line 356) | def parse(cls, xml_dom):
    method to_man (line 385) | def to_man(self, stream):
    method to_html (line 431) | def to_html(self, stream):
  class Example (line 480) | class Example:
    method __init__ (line 481) | def __init__(self,
    method __repr__ (line 487) | def __repr__(self):
    method parse (line 493) | def parse(cls, xml_dom):
    method to_man (line 497) | def to_man(self, stream):
    method to_html (line 504) | def to_html(self, stream):
  class Command (line 514) | class Command:
    method __init__ (line 515) | def __init__(self, commandline, note=None):
    method __repr__ (line 519) | def __repr__(self):
    method parse (line 524) | def parse(cls, xml_dom):
    method to_man (line 533) | def to_man(self, stream):
    method to_html (line 542) | def to_html(self, stream):
  class Element_P (line 551) | class Element_P:
    method __init__ (line 552) | def __init__(self, contents):
    method __repr__ (line 555) | def __repr__(self):
    method parse (line 559) | def parse(cls, xml_dom):
    method to_man (line 562) | def to_man(self, stream):
    method to_html (line 566) | def to_html(self, stream):
  class Element_UL (line 570) | class Element_UL:
    method __init__ (line 571) | def __init__(self, list_items):
    method __repr__ (line 574) | def __repr__(self):
    method parse (line 578) | def parse(cls, xml_dom):
    method to_man (line 581) | def to_man(self, stream):
    method to_html (line 588) | def to_html(self, stream):
  class Element_TABLE (line 595) | class Element_TABLE:
    method __init__ (line 596) | def __init__(self, rows):
    method __repr__ (line 599) | def __repr__(self):
    method parse (line 603) | def parse(cls, xml_dom):
    method to_man (line 607) | def to_man(self, stream):
    method to_html (line 625) | def to_html(self, stream):
    method calculate_row_spans (line 638) | def calculate_row_spans(self):
    method calculate_span_column (line 655) | def calculate_span_column(self, row_spans):
  class Element_TR (line 676) | class Element_TR:
    method __init__ (line 677) | def __init__(self, columns, tr_class):
    method __repr__ (line 681) | def __repr__(self):
    method parse (line 688) | def parse(cls, xml_dom):
    method to_man (line 704) | def to_man(self, stream):
    method column_widths (line 718) | def column_widths(self):
    method to_html (line 724) | def to_html(self, stream, rowspans):
  class Element_TD (line 732) | class Element_TD:
    method __init__ (line 733) | def __init__(self, value):
    method __repr__ (line 736) | def __repr__(self):
    method parse (line 740) | def parse(cls, xml_dom):
    method empty (line 748) | def empty(self):
    method string (line 751) | def string(self):
    method to_man (line 757) | def to_man(self, stream):
    method width (line 760) | def width(self):
    method to_html (line 766) | def to_html(self, stream, header, rowspan):
  class Element (line 781) | class Element:
    method __init__ (line 786) | def __init__(self, name, elements):
    method __repr__ (line 790) | def __repr__(self):
    method parse (line 794) | def parse(cls, xml_dom):
    method to_man (line 813) | def to_man(self, stream):
    method to_html (line 818) | def to_html(self, stream):

FILE: setup.py
  class SystemLibraries (line 70) | class SystemLibraries(object):
    method __init__ (line 71) | def __init__(self, configfile):
    method guaranteed_present (line 74) | def guaranteed_present(self, library):
    method present (line 95) | def present(self, library):
    method extra_compile_args (line 114) | def extra_compile_args(self, library):
    method extra_link_args (line 139) | def extra_link_args(self, library):
    method executable_present (line 164) | def executable_present(self, executable, *args):
    method lib_version (line 176) | def lib_version(self, library):
  class output_table (line 205) | class output_table(object):
    method __init__ (line 206) | def __init__(self):
    method row (line 211) | def row(self):
    method blank_row (line 218) | def blank_row(self):
    method divider_row (line 223) | def divider_row(self, dividers):
    method total_width (line 230) | def total_width(self):
    method format (line 235) | def format(self):
  class output_table_row (line 254) | class output_table_row(object):
    method __init__ (line 255) | def __init__(self):
    method __len__ (line 260) | def __len__(self):
    method add_column (line 263) | def add_column(self, text, alignment="left"):
    method column_width (line 273) | def column_width(self, column):
    method format (line 276) | def format(self, column_widths):
  class output_table_divider (line 318) | class output_table_divider(object):
    method __init__ (line 321) | def __init__(self, dividers):
    method __len__ (line 324) | def __len__(self):
    method column_width (line 327) | def column_width(self, column):
    method format (line 330) | def format(self, column_widths):
  class output_table_blank (line 340) | class output_table_blank(object):
    method __init__ (line 343) | def __init__(self):
    method column_width (line 346) | def column_width(self, column):
    method format (line 349) | def format(self, column_widths):
  class build_ext (line 355) | class build_ext(_build_ext):
    method build_extensions (line 356) | def build_extensions(self):
  class audiotools_cdio (line 471) | class audiotools_cdio(Extension):
    method __init__ (line 472) | def __init__(self, system_libraries):
    method library_manifest (line 540) | def library_manifest(self):
    method libraries_present (line 544) | def libraries_present(self):
  class audiotools_dvdaudio (line 552) | class audiotools_dvdaudio(Extension):
    method __init__ (line 553) | def __init__(self, system_libraries):
    method library_manifest (line 589) | def library_manifest(self):
    method libraries_present (line 593) | def libraries_present(self):
  class audiotools_pcm (line 601) | class audiotools_pcm(Extension):
    method __init__ (line 602) | def __init__(self):
  class audiotools_pcmconverter (line 610) | class audiotools_pcmconverter(Extension):
    method __init__ (line 611) | def __init__(self):
  class audiotools_replaygain (line 629) | class audiotools_replaygain(Extension):
    method __init__ (line 630) | def __init__(self):
  class audiotools_decoders (line 643) | class audiotools_decoders(Extension):
    method __init__ (line 644) | def __init__(self, system_libraries):
    method library_manifest (line 760) | def library_manifest(self):
  class audiotools_encoders (line 765) | class audiotools_encoders(Extension):
    method __init__ (line 766) | def __init__(self, system_libraries):
    method library_manifest (line 905) | def library_manifest(self):
  class audiotools_bitstream (line 910) | class audiotools_bitstream(Extension):
    method __init__ (line 911) | def __init__(self):
  class audiotools_ogg (line 923) | class audiotools_ogg(Extension):
    method __init__ (line 924) | def __init__(self):
  class audiotools_accuraterip (line 937) | class audiotools_accuraterip(Extension):
    method __init__ (line 938) | def __init__(self):
  class audiotools_output (line 944) | class audiotools_output(Extension):
    method __init__ (line 945) | def __init__(self, system_libraries):
    method library_manifest (line 1014) | def library_manifest(self):

FILE: src/accuraterip.c
  function MOD_INIT (line 38) | MOD_INIT(_accuraterip)
  function PyObject (line 57) | static PyObject*
  function Checksum_init (line 67) | int
  function Checksum_dealloc (line 167) | void
  function unsigned_ (line 179) | static inline unsigned
  function value (line 185) | static inline unsigned
  function PyObject (line 191) | static PyObject*
  function update_frame_v1 (line 242) | static void
  function update_frame_v2 (line 290) | static void
  function PyObject (line 308) | static PyObject*
  function PyObject (line 342) | static PyObject*
  type queue (line 360) | struct queue
  type queue (line 363) | struct queue
  type queue (line 363) | struct queue
  function free_queue (line 371) | static void

FILE: src/accuraterip.h
  type queue (line 24) | struct queue {
  type accuraterip_v1 (line 31) | struct accuraterip_v1 {
  type accuraterip_v2 (line 43) | struct accuraterip_v2 {
  type accuraterip_Checksum (line 53) | typedef struct {
  type accuraterip_v1 (line 85) | struct accuraterip_v1
  type accuraterip_v2 (line 92) | struct accuraterip_v2
  type queue (line 98) | struct queue
  type queue (line 102) | struct queue
  function queue_full (line 104) | static inline int
  function queue_push (line 110) | static inline void
  function queue_pop (line 116) | static inline uint32_t

FILE: src/bitstream-table.c
  type state (line 39) | struct state {
  type state_t (line 46) | typedef uint16_t state_t;
  type state (line 50) | struct state
  type state (line 54) | struct state
  type state (line 57) | struct state
  type state (line 61) | struct state
  type state (line 65) | struct state
  type state (line 70) | struct state
  type state (line 73) | struct state
  type state (line 75) | struct state
  type state (line 77) | struct state
  type state (line 79) | struct state
  type state (line 81) | struct state
  type state (line 83) | struct state
  type state (line 86) | struct state
  type state (line 93) | struct state
  type state (line 100) | struct state
  type state (line 106) | struct state
  type state (line 112) | struct state
  type state (line 119) | struct state
  function main (line 125) | int main(int argc, char *argv[])
  function unpack_state (line 211) | void
  function state_t (line 231) | state_t
  function state_print (line 246) | void
  function last_state (line 260) | int
  function state_value (line 269) | unsigned
  function value_to_unsigned (line 275) | unsigned
  function read_bits_be_func (line 357) | void
  function read_bits_le_func (line 389) | void
  function unread_bit_be_func (line 420) | void
  function unread_bit_le_func (line 441) | void
  function read_unary_be_func (line 464) | void
  function read_unary_le_func (line 506) | void

FILE: src/bitstream.c
  type read_bits (line 36) | struct read_bits {
  type unread_bit (line 42) | struct unread_bit {
  type read_unary (line 47) | struct read_unary {
  type read_bits (line 53) | struct read_bits
  type read_bits (line 57) | struct read_bits
  type read_unary (line 61) | struct read_unary
  type read_unary (line 65) | struct read_unary
  function DEF_SET_ENDIANNESS (line 108) | DEF_READ_BIGINT(br_read_bits_bigint_f_be)
  function br_buf_free (line 700) | static inline void
  function br_buf_size (line 707) | static inline unsigned
  function br_buf_extend (line 714) | static void
  function br_buf_getc (line 724) | static inline int
  function br_buf_read (line 737) | static unsigned
  type br_buffer (line 749) | struct br_buffer
  type br_queue (line 757) | struct br_queue {
  type br_queue (line 765) | struct br_queue
  type br_queue (line 768) | struct br_queue
  type br_queue (line 768) | struct br_queue
  function br_queue_free (line 777) | static inline void
  function br_queue_getc (line 784) | static inline int
  function br_queue_read (line 794) | static unsigned
  type br_queue (line 806) | struct br_queue
  function br_queue_size (line 809) | static inline unsigned
  function br_queue_available_size (line 816) | static inline unsigned
  function br_queue_resize_for (line 823) | static void
  type br_queue (line 851) | struct br_queue
  type bw_buffer (line 861) | struct bw_buffer {
  type bw_buffer (line 869) | struct bw_buffer
  type bw_buffer (line 872) | struct bw_buffer
  type bw_buffer (line 872) | struct bw_buffer
  function bw_buf_free (line 887) | static inline void
  function bw_buf_putc (line 894) | static inline int
  function bw_buf_write (line 910) | static int
  function bw_buf_getpos (line 928) | static inline void
  function bw_buf_setpos (line 936) | static inline int
  function bw_buf_fseek (line 948) | static int
  function bw_buf_size (line 995) | static inline unsigned
  function bw_buf_reset (line 1000) | static inline void
  function BitstreamReader (line 1008) | static BitstreamReader*
  function BitstreamReader (line 1078) | BitstreamReader*
  function BitstreamReader (line 1121) | BitstreamReader*
  function BitstreamQueue (line 1166) | BitstreamQueue*
  function BitstreamReader (line 1239) | BitstreamReader*
  function br_read_bits_c (line 1409) | static unsigned int
  function br_read_bits64_c (line 1416) | static uint64_t
  function br_read_signed_bits_be (line 1423) | static int
  function br_read_signed_bits_le (line 1433) | static int
  function br_read_signed_bits64_be (line 1445) | static int64_t
  function br_read_signed_bits64_le (line 1455) | static int64_t
  function br_read_bits_bigint_c (line 1573) | static void
  function br_read_signed_bits_bigint_be (line 1581) | static void
  function br_read_signed_bits_bigint_le (line 1623) | static void
  function br_skip_bits_c (line 1759) | static void
  function br_unread_bit_be (line 1766) | static void
  function br_unread_bit_le (line 1780) | static void
  function br_unread_bit_c (line 1794) | static void
  function br_read_unary_c (line 1850) | static unsigned int
  function br_skip_unary_c (line 1900) | static void
  function __br_set_endianness__ (line 1907) | static void
  function br_set_endianness_f (line 1928) | static void
  function br_set_endianness_b (line 1952) | static void
  function br_set_endianness_q (line 1976) | static void
  function br_set_endianness_e (line 2000) | static void
  function br_set_endianness_c (line 2024) | static void
  function br_read_huffman_code_c (line 2064) | static int
  function br_read_bytes_file (line 2073) | static void
  type bs_callback (line 2119) | struct bs_callback
  function br_read_bytes_c (line 2146) | static void
  function br_skip_bytes (line 2155) | static void
  function br_parse (line 2168) | static void
  function br_byte_aligned (line 2255) | static int
  function br_byte_align (line 2262) | static void
  function br_pos_t (line 2272) | static br_pos_t*
  function br_pos_t (line 2283) | static br_pos_t*
  function br_pos_t (line 2294) | static br_pos_t*
  function br_pos_t (line 2311) | static br_pos_t*
  function br_pos_t (line 2337) | static br_pos_t*
  function br_setpos_file (line 2345) | static void
  function br_setpos_b (line 2353) | static void
  function br_setpos_q (line 2361) | static void
  function br_setpos_e (line 2369) | static void
  function br_setpos_c (line 2386) | static void
  function br_pos_del_f (line 2393) | static void
  function br_pos_del_b (line 2399) | static void
  function br_pos_del_q (line 2405) | static void
  function br_pos_del_e (line 2413) | static void
  function br_size_f_e_c (line 2435) | static unsigned
  function br_size_b (line 2441) | static unsigned
  function br_size_q (line 2447) | static unsigned
  function BitstreamReader (line 2454) | static BitstreamReader*
  function br_enqueue (line 2484) | static void
  function br_close_methods (line 2502) | static void
  function br_close_internal_stream_f (line 2526) | static void
  function br_close_internal_stream_b (line 2536) | static void
  function br_close_internal_stream_q (line 2543) | static void
  function br_close_internal_stream_e (line 2550) | static void
  function br_close_internal_stream_c (line 2561) | static void
  function br_free_f (line 2568) | static void
  function br_free_b (line 2600) | static void
  function br_free_q (line 2610) | static void
  function br_free_e (line 2645) | static void
  function br_close (line 2656) | static void
  function br_close_q (line 2663) | static void
  function br_push_q (line 2670) | static void
  function br_reset_q (line 2680) | static void
  function __br_abort__ (line 2694) | void
  function br_abort (line 2705) | void
  function jmp_buf (line 2717) | jmp_buf*
  function __br_etry (line 2733) | void
  function BitstreamWriter (line 2749) | BitstreamWriter*
  function BitstreamWriter (line 2808) | BitstreamWriter*
  function BitstreamRecorder (line 2885) | BitstreamRecorder*
  function BitstreamRecorder (line 2892) | BitstreamRecorder*
  function BitstreamRecorder (line 2947) | BitstreamRecorder*
  function BitstreamRecorder (line 2954) | BitstreamRecorder*
  function BitstreamAccumulator (line 3019) | BitstreamAccumulator*
  function BitstreamAccumulator (line 3067) | BitstreamAccumulator*
  type bs_callback (line 3146) | struct bs_callback
  type bs_callback (line 3193) | struct bs_callback
  function bw_write_bits_c (line 3231) | static void
  function bw_write_signed_bits_c (line 3239) | static void
  function bw_write_signed_bits_be (line 3247) | static void
  function bw_write_signed_bits_le (line 3261) | static void
  function bw_write_bits64_c (line 3288) | static void
  function bw_write_signed_bits64_c (line 3296) | static void
  function bw_write_signed_bits64_be (line 3305) | static void
  function bw_write_signed_bits64_le (line 3319) | static void
  type bs_callback (line 3367) | struct bs_callback
  type bs_callback (line 3447) | struct bs_callback
  function bw_write_bits_bigint_c (line 3486) | static void
  function bw_write_signed_bits_bigint_be (line 3494) | static void
  function bw_write_signed_bits_bigint_le (line 3534) | static void
  function bw_write_bits_a (line 3574) | static void
  function bw_write_signed_bits_a (line 3580) | static void
  function bw_write_bits64_a (line 3586) | static void
  function bw_write_signed_bits64_a (line 3592) | static void
  function bw_write_bits_bigint_a (line 3599) | static void
  function bw_write_signed_bits_bigint_a (line 3607) | static void
  function bw_write_bytes_a (line 3615) | static void
  function bw_write_bits_la (line 3623) | static void
  function bw_write_signed_bits_la (line 3632) | static void
  function bw_write_bits64_la (line 3642) | static void
  function bw_write_signed_bits64_la (line 3651) | static void
  function bw_write_bits_bigint_la (line 3661) | static void
  function bw_write_signed_bits_bigint_la (line 3672) | static void
  function bw_write_bytes_la (line 3683) | static void
  function bw_write_unary (line 3696) | static void
  function bw_write_unary_a (line 3714) | static void
  function bw_write_unary_la (line 3720) | static void
  function __bw_set_endianness__ (line 3731) | static void
  function bw_set_endianness_f (line 3751) | static void
  function bw_set_endianness_e (line 3769) | static void
  function bw_set_endianness_sr (line 3787) | static void
  function bw_set_endianness_a (line 3805) | static void
  function bw_set_endianness_c (line 3811) | static void
  function bw_write_huffman (line 3818) | static int
  function bw_write_bytes_file (line 3843) | static void
  function bw_write_bytes_e (line 3876) | static void
  function bw_write_bytes_sr (line 3910) | static void
  function bw_write_bytes_c (line 3944) | static void
  function bw_build (line 3953) | static void
  function bw_byte_aligned (line 4046) | static int
  function bw_byte_aligned_a (line 4052) | static int
  function bw_byte_aligned_la (line 4058) | static int
  function bw_byte_align (line 4064) | static void
  function bw_byte_align_a (line 4073) | static void
  function bw_flush_f (line 4081) | static void
  function bw_flush_noop (line 4087) | static void
  function bw_flush_e (line 4095) | static void
  function bw_pos_t (line 4103) | static bw_pos_t*
  function bw_pos_t (line 4117) | static bw_pos_t*
  function bw_pos_t (line 4139) | static bw_pos_t*
  function bw_pos_t (line 4153) | static bw_pos_t*
  function bw_setpos_file (line 4161) | static void
  function bw_setpos_e (line 4170) | static void
  function bw_setpos_sr (line 4183) | static void
  function bw_setpos_c (line 4197) | static void
  function bw_seek_file (line 4203) | static void
  function bw_seek_e (line 4213) | static void
  function bw_seek_sr (line 4225) | static void
  function bw_seek_c (line 4237) | static void
  function bw_pos_del_f (line 4244) | static void
  function bw_pos_del_e (line 4250) | static void
  function bw_pos_del_sr (line 4257) | static void
  function bw_close_methods (line 4264) | static void
  function bw_close_internal_stream_f (line 4283) | static void
  function bw_close_internal_stream_cf (line 4295) | static void
  function bw_close_internal_stream_e (line 4301) | static void
  function bw_free_f (line 4314) | static void
  function bw_free_e (line 4346) | static void
  function bw_free_sr (line 4357) | static void
  function bw_close_f_e (line 4392) | static void
  function bw_bits_written_sr (line 4399) | static unsigned int
  function bw_bytes_written_sr (line 4406) | static unsigned int
  function bw_reset_sr (line 4412) | static void
  function bw_write_bits_r (line 4420) | static void
  function playback_write_bits (line 4439) | static void
  function bw_write_signed_bits_r (line 4446) | static void
  function playback_write_signed_bits (line 4465) | static void
  function bw_write_bits64_r (line 4474) | static void
  function playback_write_64 (line 4493) | static void
  function bw_write_signed_bits64_r (line 4502) | static void
  function playback_write_signed_64 (line 4521) | static void
  function bw_write_bits_bigint_r (line 4530) | static void
  function playback_write_bigint (line 4549) | static void
  function reset_write_bigint (line 4558) | static void
  function bw_write_signed_bits_bigint_r (line 4564) | static void
  function playback_write_signed_bigint (line 4583) | static void
  function reset_write_signed_bigint (line 4592) | static void
  function bw_write_unary_r (line 4598) | static void
  function bw_write_unary_c (line 4617) | static void
  function playback_write_unary (line 4625) | static void
  function bw_write_bytes_r (line 4634) | static void
  function playback_write_bytes (line 4656) | static void
  function reset_write_bytes (line 4665) | static void
  function bw_set_endianness_r (line 4671) | static void
  function playback_set_endianness (line 4680) | static void
  function bw_bits_written_r (line 4687) | static unsigned
  function bw_bytes_written_r (line 4693) | static unsigned
  function bw_byte_align_r (line 4699) | static void
  function bw_byte_aligned_r (line 4707) | static int
  function bw_reset_r (line 4713) | static void
  function bw_copy_sr (line 4725) | static void
  function bw_copy_r (line 4741) | static void
  function bw_close_r (line 4753) | static void
  function bw_free_r (line 4760) | static void
  function bw_data_sr (line 4793) | static void
  function bw_data_r (line 4801) | static void
  function bw_bits_written_a (line 4810) | static unsigned int
  function bw_bytes_written_a (line 4816) | static unsigned int
  function bw_reset_a (line 4822) | static void
  function bw_bits_written_la (line 4830) | static unsigned int
  function bw_reset_la (line 4836) | static void
  function bw_free_a (line 4844) | static void
  function bw_close_internal_stream_r (line 4873) | static void
  function bw_close_internal_stream_a (line 4879) | static void
  function bw_close_a (line 4885) | static void
  function bw_abort (line 4892) | void
  function jmp_buf (line 4904) | jmp_buf*
  function __bw_etry (line 4920) | void
  function recorder_swap (line 4936) | void
  function bs_format_size (line 5033) | unsigned
  function bs_format_byte_size (line 5069) | unsigned
  function byte_counter (line 5075) | void
  type BitstreamRecorderEntry (line 5081) | struct BitstreamRecorderEntry
  type BitstreamRecorderEntry (line 5088) | struct BitstreamRecorderEntry
  type BitstreamRecorderEntry (line 5098) | struct BitstreamRecorderEntry
  function reset_noop (line 5107) | static void
  type bw_pos_stack (line 5235) | struct bw_pos_stack
  type bw_pos_stack (line 5235) | struct bw_pos_stack
  type bw_pos_stack (line 5244) | struct bw_pos_stack
  type align_check (line 5662) | typedef struct {
  function main (line 5683) | int main(int argc, char* argv[]) {
  function atexit_cleanup (line 5989) | void atexit_cleanup(void) {
  function sigabort_cleanup (line 5993) | void sigabort_cleanup(int signum) {
  function test_big_endian_reader (line 5997) | void test_big_endian_reader(BitstreamReader* reader,
  function test_big_endian_parse (line 6307) | void test_big_endian_parse(BitstreamReader* reader) {
  function test_little_endian_reader (line 6452) | void test_little_endian_reader(BitstreamReader* reader,
  function test_little_endian_parse (line 6759) | void test_little_endian_parse(BitstreamReader* reader) {
  function test_close_errors (line 6904) | void
  function test_try (line 7041) | void test_try(BitstreamReader* reader,
  function test_callbacks_reader (line 7158) | void test_callbacks_reader(BitstreamReader* reader,
  function test_writer (line 7276) | void
  function writer_perform_write_64 (line 7770) | void
  function writer_perform_write_signed_64 (line 7800) | void
  function writer_perform_write_bigint (line 7832) | void
  function writer_perform_write_signed_bigint (line 7876) | void
  function writer_perform_write_unary_0 (line 7923) | void
  function writer_perform_write_unary_1 (line 7968) | void
  function writer_perform_build_u (line 8019) | void
  function writer_perform_build_U (line 8035) | void
  function writer_perform_build_K (line 8050) | void
  function writer_perform_build_s (line 8084) | void
  function writer_perform_build_S (line 8100) | void
  function writer_perform_build_L (line 8115) | void
  function writer_perform_build_b (line 8149) | void
  function writer_perform_build_mult (line 8158) | void
  function writer_perform_huffman (line 8175) | void
  function writer_perform_write_bytes (line 8236) | void
  function check_output_file (line 8243) | void
  function check_alignment_f (line 8256) | void check_alignment_f(const align_check* check,
  function check_alignment_r (line 8277) | void check_alignment_r(const align_check* check,
  function check_alignment_e (line 8302) | void check_alignment_e(const align_check* check,
  function test_edge_cases (line 8334) | void test_edge_cases(void) {
  function test_edge_reader_be (line 8401) | void
  function test_edge_reader_le (line 8479) | void
  function validate_edge_writer_be (line 8656) | void
  function validate_edge_recorder_be (line 8676) | void
  function BitstreamWriter (line 8703) | BitstreamWriter*
  function BitstreamRecorder (line 8708) | BitstreamRecorder*
  function validate_edge_writer_le (line 8715) | void
  function validate_edge_recorder_le (line 8734) | void
  function test_rec_copy_dumps (line 8758) | void
  function ext_fread_test (line 8802) | unsigned ext_fread_test(void* user_data,
  function ext_fclose_test (line 8811) | int ext_fclose_test(void* user_data)
  function ext_ffree_test (line 8817) | void ext_ffree_test(void* user_data)
  function ext_fwrite_test (line 8822) | int ext_fwrite_test(void* user_data,
  function ext_fflush_test (line 8838) | int ext_fflush_test(void* user_data)
  function ext_fsetpos_test (line 8844) | int ext_fsetpos_test(void *user_data, void *pos)
  function ext_fseek_test (line 8867) | int ext_fseek_test(void *user_data, long location, int whence)
  function ext_free_pos_test (line 8873) | void ext_free_pos_test(void *pos)
  function func_add_one (line 8878) | void func_add_one(uint8_t byte, int* value)
  function func_add_two (line 8883) | void func_add_two(uint8_t byte, int* value)
  function func_mult_three (line 8888) | void func_mult_three(uint8_t byte, int* value)
  function test_writer_marks (line 8893) | void
  function test_writer_seeks (line 8909) | void

FILE: src/bitstream.h
  type state_t (line 56) | typedef uint16_t state_t;
  type bs_endianness (line 58) | typedef enum {BS_BIG_ENDIAN, BS_LITTLE_ENDIAN} bs_endianness;
  type br_type (line 59) | typedef enum {BR_FILE, BR_BUFFER, BR_QUEUE, BR_EXTERNAL} br_type;
  type bw_type (line 60) | typedef enum {BW_FILE,
  type bs_instruction_t (line 66) | typedef enum {BS_INST_UNSIGNED,
  type bs_whence (line 77) | typedef enum {BS_SEEK_SET=0,
  type bs_callback (line 85) | struct bs_callback {
  type bs_exception (line 93) | struct bs_exception {
  type BitstreamReader_s (line 98) | struct BitstreamReader_s
  type BitstreamQueue_s (line 99) | struct BitstreamQueue_s
  type br_buffer (line 100) | struct br_buffer
  type br_queue (line 101) | struct br_queue
  type br_pos_t (line 104) | typedef struct br_pos_s {
  type br_huffman_entry_t (line 139) | typedef struct {
  type br_huffman_entry_t (line 148) | typedef br_huffman_entry_t br_huffman_table_t[0x200];
  type BitstreamReader_s (line 161) | struct BitstreamReader_s
  type BitstreamReader_s (line 166) | struct BitstreamReader_s
  type BitstreamReader_s (line 171) | struct BitstreamReader_s
  type BitstreamReader_s (line 176) | struct BitstreamReader_s
  type BitstreamReader_s (line 182) | struct BitstreamReader_s
  type BitstreamReader_s (line 190) | struct BitstreamReader_s
  type BitstreamReader_s (line 197) | struct BitstreamReader_s
  type BitstreamReader_s (line 211) | struct BitstreamReader_s
  type BitstreamReader_s (line 216) | struct BitstreamReader_s
  type BitstreamReader_s (line 221) | struct BitstreamReader_s
  type BitstreamReader_s (line 226) | struct BitstreamReader_s
  type BitstreamReader_s (line 237) | struct BitstreamReader_s
  type BitstreamReader_s (line 244) | struct BitstreamReader_s
  type br_pos_t (line 250) | typedef br_pos_t*
  type BitstreamReader_s (line 257) | struct BitstreamReader_s
  type BitstreamReader_s (line 264) | struct BitstreamReader_s
  type BitstreamReader_s (line 303) | struct BitstreamReader_s
  type BitstreamReader_s (line 347) | struct BitstreamReader_s
  type BitstreamReader_s (line 351) | struct BitstreamReader_s
  type BitstreamReader_s (line 355) | struct BitstreamReader_s
  type BitstreamReader_s (line 360) | struct BitstreamReader_s
  type BitstreamReader_s (line 368) | struct BitstreamReader_s
  type bs_callback (line 369) | struct bs_callback
  type BitstreamReader_s (line 375) | struct BitstreamReader_s
  type bs_callback (line 376) | struct bs_callback
  type BitstreamReader_s (line 381) | struct BitstreamReader_s
  type BitstreamReader_s (line 396) | struct BitstreamReader_s
  type BitstreamReader_s (line 397) | struct BitstreamReader_s
  type BitstreamReader_s (line 405) | struct BitstreamReader_s
  type BitstreamQueue_s (line 407) | struct BitstreamQueue_s
  type BitstreamReader (line 409) | typedef struct BitstreamReader_s {
  type BitstreamQueue (line 453) | typedef struct BitstreamQueue_s {
  type bw_huffman_table_t (line 615) | typedef struct {
  type BitstreamWriter_s (line 625) | struct BitstreamWriter_s
  type recorder_buffer (line 626) | struct recorder_buffer
  type bw_pos_t (line 629) | typedef struct bw_pos_s {
  type bw_pos_stack (line 649) | struct bw_pos_stack {
  type BitstreamWriter_s (line 656) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 662) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 668) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 674) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 680) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 685) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 692) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 700) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 706) | struct BitstreamWriter_s
  type bw_pos_t (line 713) | typedef bw_pos_t*
  type BitstreamWriter_s (line 721) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 736) | struct BitstreamWriter_s
  type BitstreamRecorderEntry (line 740) | struct BitstreamRecorderEntry
  type BitstreamWriter_s (line 790) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 832) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 837) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 842) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 846) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 851) | struct BitstreamWriter_s
  type BitstreamWriter_s (line 859) | struct BitstreamWriter_s
  type bs_callback (line 860) | struct bs_callback
  type BitstreamWriter_s (line 866) | struct BitstreamWriter_s
  type bs_callback (line 867) | struct bs_callback
  type BitstreamWriter_s (line 872) | struct BitstreamWriter_s
  type BitstreamWriter (line 879) | typedef struct BitstreamWriter_s {
  type BitstreamRecorder (line 907) | typedef struct BitstreamRecorder_s {
  type BitstreamAccumulator (line 952) | typedef struct BitstreamAccumulator_s {
  type bw_pos_stack (line 1138) | struct bw_pos_stack
  type bw_pos_stack (line 1141) | struct bw_pos_stack

FILE: src/buffer.c
  type bs_buffer (line 32) | struct bs_buffer
  type bs_buffer (line 35) | struct bs_buffer
  type bs_buffer (line 35) | struct bs_buffer
  function buf_close (line 43) | void
  function buf_resize (line 50) | void
  function buf_read (line 74) | unsigned
  function buf_skip (line 83) | unsigned
  function buf_write (line 91) | void

FILE: src/buffer.h
  type bs_buffer (line 39) | struct bs_buffer {
  type buf_size_t (line 46) | typedef unsigned buf_size_t;
  type buf_pos_t (line 47) | typedef unsigned buf_pos_t;
  type bs_buffer (line 52) | struct bs_buffer
  type bs_buffer (line 57) | struct bs_buffer
  function buf_window_size (line 60) | static inline unsigned
  function buf_unused_size (line 68) | static inline unsigned
  type bs_buffer (line 77) | struct bs_buffer
  type bs_buffer (line 85) | struct bs_buffer
  type bs_buffer (line 94) | struct bs_buffer
  function buf_reset (line 98) | static inline void
  function buf_getc (line 110) | static inline int
  function buf_putc (line 121) | static inline int
  type bs_buffer (line 140) | struct bs_buffer
  type bs_buffer (line 146) | struct bs_buffer
  type bs_buffer (line 152) | struct bs_buffer
  function buf_extend (line 155) | static inline void

FILE: src/cdiomodule.c
  function MOD_INIT (line 44) | MOD_INIT(cdio)
  function PyObject (line 60) | static PyObject*
  function CDDAReader_init (line 70) | static int
  function CDDAReader_init_image (line 125) | static int
  function CDDAReader_init_device (line 160) | static int
  function CDDAReader_dealloc (line 202) | static void
  function CDDAReader_dealloc_image (line 212) | static void
  function CDDAReader_dealloc_device (line 220) | static void
  function PyObject (line 231) | static PyObject*
  function PyObject (line 238) | static PyObject*
  function PyObject (line 245) | static PyObject*
  function PyObject (line 252) | static PyObject*
  function PyObject (line 259) | static PyObject*
  function CDDAReader_first_track_num_image (line 265) | static int
  function CDDAReader_first_track_num_device (line 271) | static int
  function CDDAReader_last_track_num_image (line 278) | static int
  function CDDAReader_last_track_num_device (line 284) | static int
  function CDDAReader_track_lsn_image (line 291) | static int
  function CDDAReader_track_lsn_device (line 299) | static int
  function CDDAReader_track_last_lsn_image (line 307) | static int
  function CDDAReader_track_last_lsn_device (line 315) | static int
  function PyObject (line 323) | static PyObject*
  function PyObject (line 361) | static PyObject*
  function PyObject (line 400) | static PyObject*
  function CDDAReader_first_sector_image (line 407) | static int
  function CDDAReader_first_sector_device (line 414) | static int
  function PyObject (line 421) | static PyObject*
  function CDDAReader_last_sector_image (line 428) | static int
  function CDDAReader_last_sector_device (line 435) | static int
  function PyObject (line 442) | static PyObject*
  function CDDAReader_read_image (line 495) | static int
  function CDDAReader_read_device (line 524) | static int
  function PyObject (line 560) | static PyObject*
  function CDDAReader_seek_image (line 587) | static unsigned
  function CDDAReader_seek_device (line 595) | static unsigned
  function PyObject (line 607) | static PyObject*
  function PyObject (line 616) | static PyObject*
  function CDDAReader_set_speed_image (line 630) | static void
  function CDDAReader_set_speed_device (line 636) | static void
  function cddareader_callback (line 642) | static void
  function cddareader_reset_log (line 692) | static void
  function cddareader_set_log_item (line 710) | static int
  function PyObject (line 727) | static PyObject*
  function PyObject (line 770) | static PyObject*

FILE: src/cdiomodule.h
  type cdio_log (line 37) | struct cdio_log {
  type cdio_log (line 55) | struct cdio_log
  type cdio_CDDAReader (line 61) | typedef struct cdio_CDDAReader_s {
  type cdio_log (line 246) | struct cdio_log

FILE: src/common/flac_crc.c
  function flac_crc8 (line 22) | void
  function flac_crc16 (line 62) | void

FILE: src/common/m4a_atoms.c
  type qt_atom (line 28) | struct qt_atom
  function set_atom_name (line 90) | static inline void
  type qt_atom_list (line 102) | struct qt_atom_list
  type qt_atom_list (line 103) | struct qt_atom_list
  type qt_atom (line 103) | struct qt_atom
  type qt_atom_list (line 106) | struct qt_atom_list
  type qt_atom_list (line 109) | struct qt_atom_list
  type qt_atom (line 115) | struct qt_atom
  type field_type_t (line 117) | typedef enum {
  type qt_atom (line 149) | struct qt_atom
  type qt_atom (line 154) | struct qt_atom
  type qt_atom (line 154) | struct qt_atom
  type qt_atom (line 168) | struct qt_atom
  type qt_atom (line 173) | struct qt_atom
  type qt_atom (line 173) | struct qt_atom
  type qt_atom (line 182) | struct qt_atom
  type qt_atom (line 195) | struct qt_atom
  type qt_atom (line 201) | struct qt_atom
  type qt_atom (line 201) | struct qt_atom
  type qt_atom (line 224) | struct qt_atom
  type qt_atom (line 227) | struct qt_atom
  type qt_atom (line 227) | struct qt_atom
  type qt_atom (line 240) | struct qt_atom
  type qt_atom (line 256) | struct qt_atom
  type qt_atom (line 256) | struct qt_atom
  type qt_atom (line 281) | struct qt_atom
  type qt_atom (line 295) | struct qt_atom
  type qt_atom (line 295) | struct qt_atom
  type qt_atom (line 318) | struct qt_atom
  type qt_atom (line 328) | struct qt_atom
  type qt_atom (line 328) | struct qt_atom
  type qt_atom (line 347) | struct qt_atom
  type qt_atom (line 358) | struct qt_atom
  type qt_atom (line 358) | struct qt_atom
  type qt_atom (line 379) | struct qt_atom
  type qt_atom (line 384) | struct qt_atom
  type qt_atom (line 384) | struct qt_atom
  type qt_atom (line 398) | struct qt_atom
  type qt_atom (line 404) | struct qt_atom
  type qt_atom (line 404) | struct qt_atom
  type qt_atom (line 415) | struct qt_atom
  type qt_atom (line 430) | struct qt_atom
  type qt_atom (line 436) | struct qt_atom
  type qt_atom (line 436) | struct qt_atom
  type qt_atom (line 447) | struct qt_atom
  type qt_atom (line 462) | struct qt_atom
  type qt_atom (line 472) | struct qt_atom
  type qt_atom (line 474) | struct qt_atom
  type qt_atom (line 474) | struct qt_atom
  type qt_atom (line 495) | struct qt_atom
  type qt_atom (line 507) | struct qt_atom
  type qt_atom (line 507) | struct qt_atom
  type qt_atom (line 528) | struct qt_atom
  type qt_atom (line 531) | struct qt_atom
  type qt_atom (line 531) | struct qt_atom
  function qt_stts_add_time (line 546) | void
  type qt_atom (line 572) | struct qt_atom
  type qt_atom (line 575) | struct qt_atom
  type qt_atom (line 575) | struct qt_atom
  function qt_stsc_add_chunk_size (line 590) | void
  type qt_atom (line 607) | struct qt_atom
  type qt_atom (line 612) | struct qt_atom
  type qt_atom (line 612) | struct qt_atom
  function qt_stsz_add_size (line 628) | void
  type qt_atom (line 642) | struct qt_atom
  type qt_atom (line 646) | struct qt_atom
  type qt_atom (line 646) | struct qt_atom
  function qt_stco_add_offset (line 661) | void
  type qt_atom (line 673) | struct qt_atom
  type qt_atom (line 679) | struct qt_atom
  type qt_atom (line 679) | struct qt_atom
  type qt_atom (line 690) | struct qt_atom
  type qt_atom (line 704) | struct qt_atom
  type qt_atom (line 707) | struct qt_atom
  type qt_atom (line 707) | struct qt_atom
  type qt_atom (line 722) | struct qt_atom
  type qt_atom (line 735) | struct qt_atom
  type qt_atom (line 740) | struct qt_atom
  function qt_time_t (line 752) | qt_time_t
  function build_header (line 769) | static void
  function display_indent (line 776) | static void
  function display_name (line 784) | static void
  type qt_atom_list (line 797) | struct qt_atom_list
  type qt_atom_list (line 798) | struct qt_atom_list
  type qt_atom (line 798) | struct qt_atom
  type qt_atom_list (line 804) | struct qt_atom_list
  type qt_atom_list (line 804) | struct qt_atom_list
  function atom_list_len (line 811) | static unsigned
  function atom_list_free (line 821) | static void
  function display_leaf (line 833) | static void
  type qt_atom (line 843) | struct qt_atom
  type qt_atom (line 848) | struct qt_atom
  function build_leaf (line 866) | static void
  function size_leaf (line 874) | static unsigned
  type qt_atom (line 880) | struct qt_atom
  type qt_atom (line 881) | struct qt_atom
  function free_leaf (line 891) | static void
  function display_tree (line 900) | static void
  type qt_atom (line 914) | struct qt_atom
  type qt_atom (line 919) | struct qt_atom
  type qt_atom (line 923) | struct qt_atom
  function build_tree (line 938) | static void
  function size_tree (line 949) | static unsigned
  type qt_atom (line 960) | struct qt_atom
  type qt_atom (line 961) | struct qt_atom
  type qt_atom_list (line 964) | struct qt_atom_list
  function free_tree (line 981) | static void
  function display_ftyp (line 990) | static void
  type qt_atom (line 1015) | struct qt_atom
  type qt_atom (line 1020) | struct qt_atom
  function build_ftyp (line 1047) | static void
  function size_ftyp (line 1061) | static unsigned
  function free_ftyp (line 1067) | static void
  function display_mvhd (line 1080) | static void
  type qt_atom (line 1104) | struct qt_atom
  function build_mvhd (line 1172) | static void
  function size_mvhd (line 1210) | static unsigned
  function free_mvhd (line 1220) | static void
  function display_tkhd (line 1228) | static void
  type qt_atom (line 1249) | struct qt_atom
  function build_tkhd (line 1313) | static void
  function size_tkhd (line 1352) | static unsigned
  function free_tkhd (line 1362) | static void
  function display_mdhd (line 1370) | static void
  type qt_atom (line 1387) | struct qt_atom
  function build_mdhd (line 1431) | static void
  function size_mdhd (line 1461) | static unsigned
  function free_mdhd (line 1471) | static void
  function display_hdlr (line 1479) | static void
  type qt_atom (line 1497) | struct qt_atom
  type qt_atom (line 1511) | struct qt_atom
  function build_hdlr (line 1546) | static void
  function size_hdlr (line 1563) | static unsigned
  function free_hdlr (line 1569) | static void
  function display_smhd (line 1578) | static void
  type qt_atom (line 1590) | struct qt_atom
  function build_smhd (line 1602) | static void
  function size_smhd (line 1613) | static unsigned
  function free_smhd (line 1619) | static void
  function display_dref (line 1627) | static void
  type qt_atom (line 1645) | struct qt_atom
  type qt_atom (line 1653) | struct qt_atom
  type qt_atom (line 1656) | struct qt_atom
  function build_dref (line 1670) | static void
  function size_dref (line 1688) | static unsigned
  type qt_atom (line 1701) | struct qt_atom
  type qt_atom (line 1702) | struct qt_atom
  type qt_atom_list (line 1705) | struct qt_atom_list
  function free_dref (line 1724) | static void
  function display_stsd (line 1733) | static void
  type qt_atom (line 1752) | struct qt_atom
  type qt_atom (line 1760) | struct qt_atom
  type qt_atom (line 1763) | struct qt_atom
  function build_stsd (line 1777) | static void
  function size_stsd (line 1795) | static unsigned
  type qt_atom (line 1808) | struct qt_atom
  type qt_atom (line 1809) | struct qt_atom
  type qt_atom_list (line 1812) | struct qt_atom_list
  function free_stsd (line 1831) | static void
  function display_alac (line 1840) | static void
  type qt_atom (line 1859) | struct qt_atom
  type qt_atom (line 1873) | struct qt_atom
  function build_alac (line 1906) | static void
  function size_alac (line 1924) | static unsigned
  type qt_atom (line 1930) | struct qt_atom
  type qt_atom (line 1931) | struct qt_atom
  function free_alac (line 1944) | static void
  function display_sub_alac (line 1953) | static void
  type qt_atom (line 1975) | struct qt_atom
  function build_sub_alac (line 2015) | static void
  function size_sub_alac (line 2033) | static unsigned
  function free_sub_alac (line 2039) | static void
  function display_stts (line 2047) | static void
  type qt_atom (line 2067) | struct qt_atom
  type qt_atom (line 2076) | struct qt_atom
  type stts_time (line 2080) | struct stts_time
  function build_stts (line 2098) | static void
  function size_stts (line 2114) | static unsigned
  function free_stts (line 2120) | static void
  function display_stsc (line 2129) | static void
  type qt_atom (line 2149) | struct qt_atom
  type qt_atom (line 2158) | struct qt_atom
  function build_stsc (line 2181) | static void
  function size_stsc (line 2198) | static unsigned
  function free_stsc (line 2204) | static void
  function display_stsz (line 2213) | static void
  type qt_atom (line 2232) | struct qt_atom
  type qt_atom (line 2242) | struct qt_atom
  function build_stsz (line 2260) | static void
  function size_stsz (line 2276) | static unsigned
  function free_stsz (line 2282) | static void
  function display_stco (line 2291) | static void
  type qt_atom (line 2309) | struct qt_atom
  type qt_atom (line 2318) | struct qt_atom
  function build_stco (line 2333) | static void
  function size_stco (line 2348) | static unsigned
  function free_stco (line 2354) | static void
  function display_meta (line 2363) | static void
  type qt_atom (line 2378) | struct qt_atom
  type qt_atom (line 2385) | struct qt_atom
  type qt_atom (line 2389) | struct qt_atom
  function build_meta (line 2404) | static void
  function size_meta (line 2417) | static unsigned
  type qt_atom (line 2428) | struct qt_atom
  type qt_atom (line 2429) | struct qt_atom
  type qt_atom_list (line 2432) | struct qt_atom_list
  function free_meta (line 2449) | static void
  function display_data (line 2458) | static void
  type qt_atom (line 2486) | struct qt_atom
  type qt_atom (line 2494) | struct qt_atom
  function build_data (line 2515) | static void
  function size_data (line 2525) | static unsigned
  function free_data (line 2531) | static void
  function display_free (line 2540) | static void
  type qt_atom (line 2550) | struct qt_atom
  function build_free (line 2559) | static void
  function size_free (line 2570) | static unsigned
  function free_free (line 2576) | static void
  type parser_s (line 2582) | struct parser_s {
  function parser_cmp (line 2587) | static int
  function atom_parser_f (line 2597) | static atom_parser_f
  function add_ftyp_brand (line 2663) | static void
  function display_fields (line 2678) | static void
  function main (line 2791) | int

FILE: src/common/m4a_atoms.h
  type qt_atom_type_t (line 25) | typedef enum {
  type qt_time_t (line 47) | typedef uint64_t qt_time_t;
  type qt_atom_list (line 49) | struct qt_atom_list
  type stts_time (line 50) | struct stts_time
  type stsc_entry (line 51) | struct stsc_entry
  type qt_atom (line 53) | struct qt_atom {
  type qt_atom_list (line 242) | struct qt_atom_list {
  type stts_time (line 247) | struct stts_time {
  type stsc_entry (line 252) | struct stsc_entry {
  type qt_atom (line 258) | struct qt_atom
  type qt_atom (line 266) | struct qt_atom
  type qt_atom (line 271) | struct qt
Copy disabled (too large) Download .json
Condensed preview — 339 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,773K chars).
[
  {
    "path": "COPYING",
    "chars": 18002,
    "preview": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc."
  },
  {
    "path": "INSTALL",
    "chars": 1893,
    "preview": "\t\t\tInstallation Procedure\n\nTo install Python Audio Tools, you simply need to run:\n\nmake install\n\nas root from this sourc"
  },
  {
    "path": "MANIFEST.in",
    "chars": 560,
    "preview": "recursive-include audiotools *\nrecursive-include docs *\nrecursive-include src *\nrecursive-include test *\ninclude audioto"
  },
  {
    "path": "Makefile",
    "chars": 555,
    "preview": "# which Python interpreter to use\nPYTHON = python\n\n# which Python test coverage utility to use\nCOVERAGE = coverage\n\nall:"
  },
  {
    "path": "TODO",
    "chars": 254699,
    "preview": "# -*- Mode: Org -*-\n* Previous Issues\n** DONE Fix WAVE/MP3 formats to support MP3 audio in a WAVE container\n   Instead o"
  },
  {
    "path": "audiotools/__init__.py",
    "chars": 204620,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2020  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/accuraterip.py",
    "chars": 11972,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/aiff.py",
    "chars": 41959,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/ape.py",
    "chars": 39279,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/au.py",
    "chars": 11486,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/cdtoc.py",
    "chars": 9455,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/coverartarchive.py",
    "chars": 2645,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/cue/__init__.py",
    "chars": 16111,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/cue/tokrules.py",
    "chars": 2695,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/cue/yaccrules.py",
    "chars": 4866,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/flac.py",
    "chars": 117364,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/freedb.py",
    "chars": 11911,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/id3.py",
    "chars": 88419,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/id3v1.py",
    "chars": 11355,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/image.py",
    "chars": 14009,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/m4a.py",
    "chars": 36305,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/m4a_atoms.py",
    "chars": 73290,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/mp3.py",
    "chars": 26997,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/mpc.py",
    "chars": 12755,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  James Buren and Brian La"
  },
  {
    "path": "audiotools/musicbrainz.py",
    "chars": 13306,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/ogg.py",
    "chars": 5240,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/opus.py",
    "chars": 17369,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/player.py",
    "chars": 40590,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/ply/README",
    "chars": 8579,
    "preview": "PLY (Python Lex-Yacc)                   Version 3.4\n\nCopyright (C) 2001-2011,\nDavid M. Beazley (Dabeaz LLC)\nAll rights r"
  },
  {
    "path": "audiotools/ply/__init__.py",
    "chars": 1664,
    "preview": "# Copyright (C) 2001-2011,\n# David M. Beazley (Dabeaz LLC)\n# All rights reserved.\n#\n# Redistribution and use in source a"
  },
  {
    "path": "audiotools/ply/lex.py",
    "chars": 42889,
    "preview": "# -----------------------------------------------------------------------------\n# ply: lex.py\n#\n# Copyright (C) 2001-201"
  },
  {
    "path": "audiotools/ply/yacc.py",
    "chars": 135805,
    "preview": "# -----------------------------------------------------------------------------\n# ply: yacc.py\n#\n# Copyright (C) 2001-20"
  },
  {
    "path": "audiotools/speex.py",
    "chars": 14447,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/text.py",
    "chars": 33671,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/toc/__init__.py",
    "chars": 21790,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/toc/tokrules.py",
    "chars": 3434,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/toc/yaccrules.py",
    "chars": 7986,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/tta.py",
    "chars": 16199,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/ui.py",
    "chars": 118054,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/vorbis.py",
    "chars": 20653,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/vorbiscomment.py",
    "chars": 25399,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/wav.py",
    "chars": 42891,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools/wavpack.py",
    "chars": 22994,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian Langenberger\n\n# Th"
  },
  {
    "path": "audiotools-config",
    "chars": 47142,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2020  Brian"
  },
  {
    "path": "cdda2track",
    "chars": 23428,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2020  Brian"
  },
  {
    "path": "cddainfo",
    "chars": 3914,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2020  Brian"
  },
  {
    "path": "cddaplay",
    "chars": 10719,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2020  Brian"
  },
  {
    "path": "coverbrowse",
    "chars": 16942,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "coverdump",
    "chars": 4893,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "covertag",
    "chars": 6209,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "docs/COPYING",
    "chars": 23401,
    "preview": "\t\t\t        Creative Commons\n\n                          Creative Commons Legal Code\n\nAttribution-ShareAlike 3.0 Unported\n"
  },
  {
    "path": "docs/Makefile",
    "chars": 1169,
    "preview": "PYTHON = python\nMAN_PATH = /usr/share/man\nMAN_PAGES = \\\naudiotools-config.1 \\\naudiotools.cfg.5 \\\ncdda2track.1 \\\ncddainfo"
  },
  {
    "path": "docs/audiotools-config.xml",
    "chars": 5019,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/audiotools.cfg.xml",
    "chars": 3994,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/cdda2track.xml",
    "chars": 4748,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/cddainfo.xml",
    "chars": 1157,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/cddaplay.xml",
    "chars": 2623,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/coverbrowse.xml",
    "chars": 981,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/coverdump.xml",
    "chars": 1581,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/covertag.xml",
    "chars": 2477,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/dvda2track.xml",
    "chars": 4029,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/dvdainfo.xml",
    "chars": 1321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/manpagexml.py",
    "chars": 29302,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "docs/programming/Makefile",
    "chars": 3814,
    "preview": "# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2015  Brian Langenberger\n\n# Th"
  },
  {
    "path": "docs/programming/source/audiotools.rst",
    "chars": 84775,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_accuraterip.rst",
    "chars": 5454,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_bitstream.rst",
    "chars": 23277,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_cdio.rst",
    "chars": 3953,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_cue.rst",
    "chars": 3130,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_dvda.rst",
    "chars": 5331,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_freedb.rst",
    "chars": 3127,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_musicbrainz.rst",
    "chars": 3282,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_pcm.rst",
    "chars": 8636,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_pcmconverter.rst",
    "chars": 8088,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_player.rst",
    "chars": 8163,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_replaygain.rst",
    "chars": 3373,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_toc.rst",
    "chars": 2820,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/audiotools_ui.rst",
    "chars": 20848,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/conf.py",
    "chars": 7303,
    "preview": "# -*- coding: utf-8 -*-\n\n#Audio Tools, a module and set of tools for manipulating audio data\n#Copyright (C) 2007-2016  B"
  },
  {
    "path": "docs/programming/source/huffman.dot",
    "chars": 1436,
    "preview": "/********************************************************\n Audio Tools, a module and set of tools for manipulating audio"
  },
  {
    "path": "docs/programming/source/index.rst",
    "chars": 1645,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/programming/source/metadata.rst",
    "chars": 58459,
    "preview": "..\n  Audio Tools, a module and set of tools for manipulating audio data\n  Copyright (C) 2007-2016  Brian Langenberger\n\n "
  },
  {
    "path": "docs/track2cdda.xml",
    "chars": 2085,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/track2track.xml",
    "chars": 5127,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/trackcat.xml",
    "chars": 3404,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/trackcmp.xml",
    "chars": 1846,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/trackinfo.xml",
    "chars": 1749,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/tracklength.xml",
    "chars": 1057,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/tracklint.xml",
    "chars": 2906,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/trackplay.xml",
    "chars": 2116,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/trackrename.xml",
    "chars": 1990,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/tracksplit.xml",
    "chars": 4426,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/tracktag.xml",
    "chars": 6023,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "docs/trackverify.xml",
    "chars": 3771,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nCopyright (C) 2007-2016  Brian Langenberger\nThis work is licensed under the\n"
  },
  {
    "path": "dvda2track",
    "chars": 15425,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "dvdainfo",
    "chars": 4360,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "setup.cfg",
    "chars": 3060,
    "preview": "# Python Audio Tools can make use of additional libraries\n# to support optional functionality.  Possible values are:\n\n# "
  },
  {
    "path": "setup.py",
    "chars": 41468,
    "preview": "#!/usr/bin/python\n\n# Audio Tools, a module and set of tools for manipulating audio data\n# Copyright (C) 2007-2016  Brian"
  },
  {
    "path": "src/COPYING.LESSERv3",
    "chars": 7639,
    "preview": "\t\t   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software"
  },
  {
    "path": "src/Makefile",
    "chars": 5593,
    "preview": "#This makefile is for generating debug standalone executables\n\nFLAGS = -Wall -g\nBINARIES = \\\nalacdec \\\nwvdec \\\nalacenc \\"
  },
  {
    "path": "src/accuraterip.c",
    "chars": 11607,
    "preview": "#include \"accuraterip.h\"\n#include \"pcm.h\"\n#include \"mod_defs.h\"\n\n/******************************************************"
  },
  {
    "path": "src/accuraterip.h",
    "chars": 5716,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <stdint.h>\n\n/*****************************************************"
  },
  {
    "path": "src/bitstream-table.c",
    "chars": 17047,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/bitstream.c",
    "chars": 298557,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/bitstream.h",
    "chars": 47528,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/buffer.c",
    "chars": 2909,
    "preview": "#include \"buffer.h\"\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n\n/**************************************"
  },
  {
    "path": "src/buffer.h",
    "chars": 4691,
    "preview": "#ifndef BUFFER_H\n#define BUFFER_H\n\n#include <stdint.h>\n#include <stdio.h>\n\n/********************************************"
  },
  {
    "path": "src/cdiomodule.c",
    "chars": 22105,
    "preview": "#include \"cdiomodule.h\"\n#include <limits.h>\n#include <cdio/cd_types.h>\n#include <cdio/audio.h>\n#include <cdio/track.h>\n#"
  },
  {
    "path": "src/cdiomodule.h",
    "chars": 9545,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#ifdef PARANOIA_LT_0_90\n#include <cdio/cdda.h>\n#include <cdio/paranoia.h>\n#"
  },
  {
    "path": "src/common/flac_crc.c",
    "chars": 5429,
    "preview": "#include \"flac_crc.h\"\n\n/********************************************************\n Audio Tools, a module and set of tools"
  },
  {
    "path": "src/common/flac_crc.h",
    "chars": 1138,
    "preview": "#include <stdint.h>\n\n/********************************************************\n Audio Tools, a module and set of tools f"
  },
  {
    "path": "src/common/m4a_atoms.c",
    "chars": 84103,
    "preview": "#include \"m4a_atoms.h\"\n#include <string.h>\n#include <ctype.h>\n#include <assert.h>\n\n/************************************"
  },
  {
    "path": "src/common/m4a_atoms.h",
    "chars": 12386,
    "preview": "#include <inttypes.h>\n#include <stdarg.h>\n#include <time.h>\n#include \"../bitstream.h\"\n\n/********************************"
  },
  {
    "path": "src/common/md5.c",
    "chars": 10253,
    "preview": "#include <stdlib.h>     /* for malloc() */\n#include <string.h>     /* for memcpy() */\n\n#include \"md5.h\"\n\n/*\n * This code"
  },
  {
    "path": "src/common/md5.h",
    "chars": 1624,
    "preview": "#ifndef MD5_H\n#define MD5_H\n\n#include <stdint.h>\n\n/*\n * This is the header file for the MD5 message-digest algorithm.\n *"
  },
  {
    "path": "src/common/tta_crc.c",
    "chars": 4765,
    "preview": "#include \"tta_crc.h\"\n\n/********************************************************\n Audio Tools, a module and set of tools "
  },
  {
    "path": "src/common/tta_crc.h",
    "chars": 993,
    "preview": "#include <stdint.h>\n\n/********************************************************\n Audio Tools, a module and set of tools f"
  },
  {
    "path": "src/decoders/NOTES.rst",
    "chars": 9295,
    "preview": "Decoder Implementation\n----------------------\n\nDecoding binary file formats is a typically a nontrivial problem\nthat pur"
  },
  {
    "path": "src/decoders/alac.c",
    "chars": 44230,
    "preview": "#include \"alac.h\"\n#include \"../common/m4a_atoms.h\"\n#include \"../framelist.h\"\n#include <string.h>\n\n/*********************"
  },
  {
    "path": "src/decoders/alac.h",
    "chars": 5562,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n#include <stdint.h>\n#include \"../bitstream.h\"\n\n/*"
  },
  {
    "path": "src/decoders/alac_residual.h",
    "chars": 97563,
    "preview": "/********************************************************\n Audio Tools, a module and set of tools for manipulating audio"
  },
  {
    "path": "src/decoders/alac_residual.json",
    "chars": 223,
    "preview": "[[0], 0,\n [1, 0], 1,\n [1, 1, 0], 2,\n [1, 1, 1, 0], 3,\n [1, 1, 1, 1, 0], 4,\n [1, 1, 1, 1, 1, 0], 5,\n [1, 1, 1, 1, 1, 1, 0"
  },
  {
    "path": "src/decoders/flac.c",
    "chars": 63293,
    "preview": "#include \"flac.h\"\n#include \"../framelist.h\"\n#include \"../common/flac_crc.h\"\n#include <string.h>\n#include <errno.h>\n\n/***"
  },
  {
    "path": "src/decoders/flac.h",
    "chars": 6065,
    "preview": "#ifndef STANDALONE\n#include <Python.h>\n#endif\n#include <stdint.h>\n#include \"../bitstream.h\"\n#include \"../common/md5.h\"\n\n"
  },
  {
    "path": "src/decoders/mp3.c",
    "chars": 4980,
    "preview": "#include \"mp3.h\"\n#include \"../framelist.h\"\n\n/********************************************************\n Audio Tools, a mo"
  },
  {
    "path": "src/decoders/mp3.h",
    "chars": 4815,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <stdint.h>\n#include <mpg123.h>\n\n/*********************************"
  },
  {
    "path": "src/decoders/mpc.c",
    "chars": 5051,
    "preview": "#include \"mpc.h\"\n#include \"../framelist.h\"\n\n/********************************************************\n Audio Tools, a mo"
  },
  {
    "path": "src/decoders/mpc.h",
    "chars": 4823,
    "preview": "#include <Python.h>\n#include \"../mpc/mpcdec.h\"\n\n/********************************************************\n Audio Tools, "
  },
  {
    "path": "src/decoders/oggflac.c",
    "chars": 21318,
    "preview": "#ifdef STANDALONE\n#include <string.h>\n#include <errno.h>\n#endif\n#include \"oggflac.h\"\n#include \"../common/flac_crc.h\"\n#in"
  },
  {
    "path": "src/decoders/oggflac.h",
    "chars": 5962,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n#include <stdint.h>\n#include \"../bitstream.h\"\n#in"
  },
  {
    "path": "src/decoders/opus.c",
    "chars": 9053,
    "preview": "#include \"opus.h\"\n#include \"../framelist.h\"\n\n/********************************************************\n Audio Tools, a m"
  },
  {
    "path": "src/decoders/opus.h",
    "chars": 4813,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <opus/opusfile.h>\n\n/**********************************************"
  },
  {
    "path": "src/decoders/sine.c",
    "chars": 17834,
    "preview": "#include \"sine.h\"\n#include \"../framelist.h\"\n\n/********************************************************\n Audio Tools, a m"
  },
  {
    "path": "src/decoders/sine.h",
    "chars": 17102,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <stdint.h>\n\n/*****************************************************"
  },
  {
    "path": "src/decoders/tta.c",
    "chars": 24741,
    "preview": "#include \"tta.h\"\n#include \"../common/tta_crc.h\"\n#include \"../framelist.h\"\n#include <string.h>\n#include <stdio.h>\n#includ"
  },
  {
    "path": "src/decoders/tta.h",
    "chars": 5321,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n\n#include <stdint.h>\n#include \"../bitstream.h\"\n\n/"
  },
  {
    "path": "src/decoders/vorbis.c",
    "chars": 10563,
    "preview": "#include \"vorbis.h\"\n#include \"../framelist.h\"\n\n/********************************************************\n Audio Tools, a"
  },
  {
    "path": "src/decoders/vorbis.h",
    "chars": 4926,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <stdint.h>\n#include <vorbis/vorbisfile.h>\n\n/**********************"
  },
  {
    "path": "src/decoders/wavpack.c",
    "chars": 8106,
    "preview": "#include \"wavpack.h\"\n#include \"../pcm_conv.h\"\n#include \"../framelist.h\"\n#include <string.h>\n\n/**************************"
  },
  {
    "path": "src/decoders/wavpack.h",
    "chars": 5179,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n#include <stdint.h>\n#include <wavpack/wavpack.h>\n"
  },
  {
    "path": "src/decoders.c",
    "chars": 5815,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include \"mod_defs.h\"\n#include \"decoders.h\"\n#ifdef HAS_MP3\n#include <mpg123"
  },
  {
    "path": "src/decoders.h",
    "chars": 1173,
    "preview": "#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)\ntypedef int Py_ssize_t;\n#define PY_SSIZE_T_MAX INT_MAX\n#defi"
  },
  {
    "path": "src/dither.c",
    "chars": 3565,
    "preview": "/********************************************************\n Audio Tools, a module and set of tools for manipulating audio"
  },
  {
    "path": "src/dvdamodule.c",
    "chars": 12826,
    "preview": "#include \"dvdamodule.h\"\n#include \"mod_defs.h\"\n#include \"framelist.h\"\n\n/*************************************************"
  },
  {
    "path": "src/dvdamodule.h",
    "chars": 16529,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <dvd-audio.h>\n\n/**************************************************"
  },
  {
    "path": "src/encoders/NOTES.rst",
    "chars": 4425,
    "preview": "Encoder Implementation\n^^^^^^^^^^^^^^^^^^^^^^\n\nEncoding binary file formats is typically a CPU-intensive problem\nthat's "
  },
  {
    "path": "src/encoders/alac.c",
    "chars": 60809,
    "preview": "#include \"alac.h\"\n#include <string.h>\n#include <assert.h>\n#include <math.h>\n#include \"../common/m4a_atoms.h\"\n\n/*********"
  },
  {
    "path": "src/encoders/alac.h",
    "chars": 8777,
    "preview": "#ifndef A_ALAC_ENCODE\n#define A_ALAC_ENCODE\n#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n\n#inc"
  },
  {
    "path": "src/encoders/flac.c",
    "chars": 84885,
    "preview": "#include \"flac.h\"\n#include \"../common/md5.h\"\n#include \"../common/flac_crc.h\"\n#include \"../pcm_conv.h\"\n#include <string.h"
  },
  {
    "path": "src/encoders/flac.h",
    "chars": 3016,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n#include \"../bitstream.h\"\n#include \"../pcmreader."
  },
  {
    "path": "src/encoders/mp2.c",
    "chars": 5166,
    "preview": "#include <twolame.h>\n#include \"../pcmreader.h\"\n\n/********************************************************\n Audio Tools, "
  },
  {
    "path": "src/encoders/mp3.c",
    "chars": 7180,
    "preview": "#include <lame/lame.h>\n#include \"../pcmreader.h\"\n\n/********************************************************\n Audio Tools"
  },
  {
    "path": "src/encoders/mpc.c",
    "chars": 34842,
    "preview": "#include \"../mpc/datatypes.h\"\n#include \"../mpc/mpcdec.h\"\n#include \"../mpc/mpcmath.h\"\n#include \"../mpc/minimax.h\"\n#includ"
  },
  {
    "path": "src/encoders/opus.c",
    "chars": 19504,
    "preview": "#include <opus/opus.h>\n#include <opus_multistream.h>\n#include <ogg/ogg.h>\n#include <time.h>\n#include <stdlib.h>\n#include"
  },
  {
    "path": "src/encoders/tta.c",
    "chars": 23959,
    "preview": "#include \"tta.h\"\n#include \"../common/tta_crc.h\"\n\n/********************************************************\n Audio Tools,"
  },
  {
    "path": "src/encoders/tta.h",
    "chars": 1763,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n\n#include \"../bitstream.h\"\n#include \"../pcmreader"
  },
  {
    "path": "src/encoders/vorbis.c",
    "chars": 16342,
    "preview": "#include <stdlib.h>\n#include <time.h>\n#include <vorbis/vorbisenc.h>\n#include <ogg/ogg.h>\n#include \"../pcmreader.h\"\n\n#def"
  },
  {
    "path": "src/encoders/wavpack.c",
    "chars": 17319,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"../pcm_conv.h\"\n#include \"wavpack.h\"\n#include <wavpa"
  },
  {
    "path": "src/encoders/wavpack.h",
    "chars": 1841,
    "preview": "#include <stdint.h>\n#include \"../pcmreader.h\"\n#include \"../bitstream.h\"\n#include \"../common/md5.h\"\n\n/*******************"
  },
  {
    "path": "src/encoders.c",
    "chars": 1234,
    "preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include \"mod_defs.h\"\n#include \"bitstream.h\"\n#include \"encoders.h\"\n\n/******"
  },
  {
    "path": "src/encoders.h",
    "chars": 3274,
    "preview": "#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)\ntypedef int Py_ssize_t;\n#define PY_SSIZE_T_MAX INT_MAX\n#defi"
  },
  {
    "path": "src/framelist.c",
    "chars": 2772,
    "preview": "#include \"framelist.h\"\n\n/********************************************************\n Audio Tools, a module and set of tool"
  },
  {
    "path": "src/framelist.h",
    "chars": 3132,
    "preview": "#ifndef STANDALONE\n#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#endif\n#include \"pcm.h\"\n\n/******************************"
  },
  {
    "path": "src/func_io.c",
    "chars": 11483,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/func_io.h",
    "chars": 6628,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/huffman.c",
    "chars": 25439,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/huffman.h",
    "chars": 5587,
    "preview": "/********************************************************\n Bitstream Library, a module for reading bits of data\n\n Copyri"
  },
  {
    "path": "src/libmpcdec/AUTHORS",
    "chars": 282,
    "preview": "libmpcdec is the result of the work of many people:\n\n* Andree Buschmann and Frank Klemm\n  Original implementation and co"
  },
  {
    "path": "src/libmpcdec/COPYING",
    "chars": 1563,
    "preview": "Copyright (c) 2005, The Musepack Development Team\nAll rights reserved.\n\nRedistribution and use in source and binary form"
  },
  {
    "path": "src/libmpcdec/ChangeLog",
    "chars": 1316,
    "preview": "1.3.0\n    * first sv8 release\n    * major changes in the API (decoder and demuxer are split)\n\n1.2.3\n    * Reduced memory"
  },
  {
    "path": "src/libmpcdec/README",
    "chars": 197,
    "preview": "Musepack Decoder Library:\n\nrun \"./configure [--prefix=/usr]; make\"\n\nTo create a sample app using the musepack decoder li"
  },
  {
    "path": "src/libmpcdec/decoder.h",
    "chars": 3770,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/huffman.c",
    "chars": 22986,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/huffman.h",
    "chars": 2560,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/internal.h",
    "chars": 3836,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/mpc_bits_reader.c",
    "chars": 11063,
    "preview": "/*\n  Copyright (c) 2007-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/mpc_bits_reader.h",
    "chars": 4955,
    "preview": "/*\n  Copyright (c) 2007-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/mpc_decoder.c",
    "chars": 26285,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/mpc_demux.c",
    "chars": 23152,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/mpc_reader.c",
    "chars": 4810,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/mpcdec_math.h",
    "chars": 5107,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/requant.c",
    "chars": 4008,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/requant.h",
    "chars": 2133,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/streaminfo.c",
    "chars": 8435,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcdec/synth_filter.c",
    "chars": 23689,
    "preview": "/*\n  Copyright (c) 2005-2009, The Musepack Development Team\n  All rights reserved.\n\n  Redistribution and use in source a"
  },
  {
    "path": "src/libmpcenc/analy_filter.c",
    "chars": 14499,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcenc/bitstream.c",
    "chars": 13037,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcenc/encode_sv7.c",
    "chars": 14855,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcenc/huffsv7.c",
    "chars": 13929,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcenc/libmpcenc.h",
    "chars": 5222,
    "preview": "/*\n * Musepack audio compression\n *\n * This library is free software; you can redistribute it and/or\n * modify it under "
  },
  {
    "path": "src/libmpcenc/quant.c",
    "chars": 15404,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/ans.c",
    "chars": 11181,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/cvd.c",
    "chars": 14222,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/fft4g.c",
    "chars": 13241,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/fft_routines.c",
    "chars": 7827,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/libmpcpsy.h",
    "chars": 4753,
    "preview": "/*\n * Musepack audio compression\n *\n * This library is free software; you can redistribute it and/or\n * modify it under "
  },
  {
    "path": "src/libmpcpsy/profile.c",
    "chars": 7165,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/psy.c",
    "chars": 47549,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/libmpcpsy/psy_tab.c",
    "chars": 14446,
    "preview": "/*\n * Musepack audio compression\n * Copyright (c) 2005-2009, The Musepack Development Team\n * Copyright (C) 1999-2004 Bu"
  },
  {
    "path": "src/mini-gmp.c",
    "chars": 83367,
    "preview": "/* mini-gmp, a minimalistic implementation of a GNU GMP subset.\n\n   Contributed to the GNU project by Niels Möller\n\nCopy"
  }
]

// ... and 139 more files (download for full content)

About this extraction

This page contains the full source code of the tuffy/python-audio-tools GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 339 files (15.4 MB), approximately 4.1M tokens, and a symbol index with 5779 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!