diff --git a/.vuepress/config.js b/.vuepress/config.js
new file mode 100644
index 0000000000000000000000000000000000000000..1150e5939ba57dc28318184ca074d114119a829e
--- /dev/null
+++ b/.vuepress/config.js
@@ -0,0 +1,26 @@
+module.exports = {
+    base: '/com3001/',
+    title: "COM3001",
+    description: "Final Year Project",
+    themeConfig: {
+        sidebar: 'auto',
+        nav: [
+            { text: 'Home', link: '/' },
+            { text: 'Install', link: '/INSTALL' },
+            { text: 'Examples', link: '/examples/' },
+            { text: 'Modules', link: '/doxygen/modules' },
+            {
+                text: 'Classes',
+                items: [
+                    { text: 'Class List', link: '/doxygen/annotated' },
+                    { text: 'Class Index', link: '/doxygen/classes' },
+                    { text: 'Function Index', link: '/doxygen/functions' },
+                    { text: 'Variable Index', link: '/doxygen/variables' },
+                    { text: 'Enumeration Index', link: '/doxygen/enumerations' }
+                ]
+            },
+            { text: 'Files', link: '/doxygen/files' },
+            { text: 'Pages', link: '/doxygen/pages' }
+        ]
+    }
+}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aad6b87cbc10f3138ee97c8f3575974fbdf2d332..578114f91be521677b9ef7020eac12410c48a4c2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,6 +6,7 @@ option(BUILD_TESTS "Build tests" ON)
 option(BUILD_INSTALL "Install libraries and binaries" ON)
 
 set(CMAKE_CXX_STANDARD 14)
+SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 
 # External libraries
 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libs)
@@ -13,9 +14,7 @@ find_package(Threads)
 
 # Our subdirectories
 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/decoder)
-add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/emitter)
 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/encoder)
-add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/server)
 
 # Add tests
 if(BUILD_TESTS)
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000000000000000000000000000000000000..376218978643ef9f1ae2b5c2ae43e1db65a4121f
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,2425 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "COM3001"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = include
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.h *.hpp
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = examples
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *.cpp
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = YES
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 1
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = .
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        = 
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  = 
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = YES
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = DOXYGEN_SHOULD_SKIP_THIS
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/doxygen/annotated.md b/doxygen/annotated.md
new file mode 100644
index 0000000000000000000000000000000000000000..b53a2ab9e5dbd4897a782c8f1552e29c1c1959b9
--- /dev/null
+++ b/doxygen/annotated.md
@@ -0,0 +1,20 @@
+---
+title: Annotated
+meta:
+  - name: keywords
+    content: Rew AudioWriter Bucket ByteAssembler Decoder Encoder Goertzel Synth ToneSynth WavWriter
+---
+
+# Class List
+
+Here are the classes, structs, unions and interfaces with brief descriptions:
+* namespace [**Rew**](namespace_rew.md)
+  * class [**AudioWriter**](class_rew_1_1_audio_writer.md)
+  * class [**Bucket**](class_rew_1_1_bucket.md)
+  * class [**ByteAssembler**](class_rew_1_1_byte_assembler.md)
+  * class [**Decoder**](class_rew_1_1_decoder.md)
+  * class [**Encoder**](class_rew_1_1_encoder.md)
+  * class [**Goertzel**](class_rew_1_1_goertzel.md)
+  * class [**Synth**](class_rew_1_1_synth.md)
+  * class [**ToneSynth**](class_rew_1_1_tone_synth.md)
+  * class [**WavWriter**](class_rew_1_1_wav_writer.md)
diff --git a/doxygen/audio__writer_8h.md b/doxygen/audio__writer_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..174bda31f44ea8186f84f93d8927160fb610602d
--- /dev/null
+++ b/doxygen/audio__writer_8h.md
@@ -0,0 +1,21 @@
+---
+title: file audio_writer.h
+meta:
+  - name: keywords
+    content: audio_writer.h Rew::AudioWriter
+---
+
+# file audio\_writer.h
+
+**[Go to the source code of this file.](audio__writer_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::AudioWriter**](class_rew_1_1_audio_writer.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/audio\_writer.h`
diff --git a/doxygen/audio__writer_8h_source.md b/doxygen/audio__writer_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..3ce2cd46653e13dbc690a8a4c0541df70f415fae
--- /dev/null
+++ b/doxygen/audio__writer_8h_source.md
@@ -0,0 +1,66 @@
+---
+title: audio_writer.h File Reference
+meta:
+  - name: keywords
+    content: audio_writer.h file
+---
+
+# audio\_writer.h File Reference
+
+**[Go to the documentation of this file.](audio__writer_8h.md)**
+Source: `include/encoder/audio\_writer.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_AUDIO_SAVER
+#define REW_AUDIO_SAVER
+
+#include <fstream>
+#include <string>
+#include "../config.h"
+
+REW_NAMESPACE{
+    class REW_API AudioWriter {
+    public:
+        AudioWriter();
+        virtual ~AudioWriter() = default;
+        virtual bool open(const std::string& path, size_t size, int bitsPerSample, int sampleRate, int numChannels) = 0;
+        virtual bool writeChunk(const unsigned char* data, size_t* bytesWritten) = 0;
+        virtual bool writeFooter() = 0;
+        virtual void close() = 0;
+        virtual bool eof() const = 0;
+        virtual size_t getPos() const = 0;
+        bool isOpen() const;
+        size_t getSize() const;
+        int getSampleRate() const;
+        int getNumOfChannels() const;
+        int getBitsPerSample() const;
+        size_t getChunkSize() const;
+        operator bool() const;
+    protected:
+        bool loaded;
+        size_t size;
+        int sampleRate;
+        int channelCount;
+        int bitsPerSample;
+        size_t chunkSize;
+    };
+};
+#endif
+
+```
+
+
+    
+  
diff --git a/doxygen/bucket_8h.md b/doxygen/bucket_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..203a20f4834cd7bb16f6b73c93a66566a5df5b91
--- /dev/null
+++ b/doxygen/bucket_8h.md
@@ -0,0 +1,21 @@
+---
+title: file bucket.h
+meta:
+  - name: keywords
+    content: bucket.h Rew::Bucket
+---
+
+# file bucket.h
+
+**[Go to the source code of this file.](bucket_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::Bucket**](class_rew_1_1_bucket.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/bucket.h`
diff --git a/doxygen/bucket_8h_source.md b/doxygen/bucket_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..dba124cc2d767288f20059fc6f9a9e9a4b552577
--- /dev/null
+++ b/doxygen/bucket_8h_source.md
@@ -0,0 +1,101 @@
+---
+title: bucket.h File Reference
+meta:
+  - name: keywords
+    content: bucket.h file
+---
+
+# bucket.h File Reference
+
+**[Go to the documentation of this file.](bucket_8h.md)**
+Source: `include/decoder/bucket.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_BUCKET_H
+#define REW_BUCKET_H
+
+#include "../config.h"
+#include <vector>
+
+REW_NAMESPACE {
+    template <typename T>
+    class REW_API Bucket {
+    public:
+        Bucket() = default;
+        Bucket(Bucket&& other) noexcept: vector(std::move(other.vector)) {
+            
+        }
+        Bucket(const Bucket& other) = delete;
+        virtual ~Bucket() = default;
+        void swap(Bucket& other) noexcept {
+            using std::swap;
+            swap(vector, other.vector);
+        }
+        Bucket& operator = (Bucket&& other) noexcept {
+            if (this != &other) {
+                swap(other);
+            }
+            return *this;
+        }
+        Bucket& operator = (const Bucket& other) = delete;
+
+        void pushBack (const typename std::vector<T>::value_type& value) {
+            if (vector.capacity() <= vector.size()) {
+                vector.reserve(vector.capacity() + 64);
+            }
+            vector.push_back(value);
+        }
+
+        size_t size() const {
+            return vector.size();
+        }
+
+        typename std::vector<T>::iterator begin() {
+            return vector.begin();
+        }
+
+        typename std::vector<T>::const_iterator begin() const {
+            return vector.begin();
+        }
+
+        typename std::vector<T>::iterator end() {
+            return vector.end();
+        }
+
+        typename std::vector<T>::const_iterator end() const {
+            return vector.end();
+        }
+
+        void clear() {
+            vector.clear();
+        }
+
+        typename std::vector<T>::value_type& operator[](size_t i) {
+            return vector[i];
+        }
+
+        const typename std::vector<T>::value_type& operator[](size_t i) const {
+            return vector[i];
+        }
+    private:
+        std::vector<T> vector;
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/byte__assembler_8h.md b/doxygen/byte__assembler_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..606b56bf68a3d04f1b3e297c9845a179057f46a6
--- /dev/null
+++ b/doxygen/byte__assembler_8h.md
@@ -0,0 +1,21 @@
+---
+title: file byte_assembler.h
+meta:
+  - name: keywords
+    content: byte_assembler.h Rew::ByteAssembler
+---
+
+# file byte\_assembler.h
+
+**[Go to the source code of this file.](byte__assembler_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/byte\_assembler.h`
diff --git a/doxygen/byte__assembler_8h_source.md b/doxygen/byte__assembler_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..80486e1b31ed88eeeeb5f6e678d41c2ba7fc5342
--- /dev/null
+++ b/doxygen/byte__assembler_8h_source.md
@@ -0,0 +1,56 @@
+---
+title: byte_assembler.h File Reference
+meta:
+  - name: keywords
+    content: byte_assembler.h file
+---
+
+# byte\_assembler.h File Reference
+
+**[Go to the documentation of this file.](byte__assembler_8h.md)**
+Source: `include/decoder/byte\_assembler.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_BYTE_ASSEMBLER_H
+#define REW_BYTE_ASSEMBLER_H
+
+#include "../config.h"
+#include "bucket.h"
+#include <functional>
+
+REW_NAMESPACE {
+    class REW_API ByteAssembler {
+    public:
+        ByteAssembler();
+        ByteAssembler(ByteAssembler&& other) noexcept;
+        ByteAssembler(const ByteAssembler& other) = delete;
+        void swap(ByteAssembler& other) noexcept;
+        ByteAssembler& operator = (ByteAssembler&& other) noexcept;
+        ByteAssembler& operator = (const ByteAssembler& other) = delete;
+
+        void operator()(unsigned char magnitude, const std::function<void(unsigned char)>& callback);
+    private:
+        static size_t countValue(const unsigned char* begin, const unsigned char* end, unsigned char value);
+        static unsigned char toByte(const unsigned char* begin, const unsigned char* end);
+        Bucket<unsigned char> buffer;
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/class_rew_1_1_audio_writer.md b/doxygen/class_rew_1_1_audio_writer.md
new file mode 100644
index 0000000000000000000000000000000000000000..20e01fe916a65ab70656f9e213389dd6bf2c8ed6
--- /dev/null
+++ b/doxygen/class_rew_1_1_audio_writer.md
@@ -0,0 +1,252 @@
+---
+title: class Rew::AudioWriter
+meta:
+  - name: keywords
+    content: Rew::AudioWriter loaded size sampleRate channelCount bitsPerSample chunkSize AudioWriter ~AudioWriter open writeChunk writeFooter close eof getPos isOpen getSize getSampleRate getNumOfChannels getBitsPerSample getChunkSize operator bool
+---
+
+# class Rew::AudioWriter
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**AudioWriter**](class_rew_1_1_audio_writer.md)
+
+
+Audio saver base class. 
+
+
+Inherited by the following classes: **[Rew::WavWriter](class_rew_1_1_wav_writer.md)**
+
+## Protected Attributes
+
+|Type|Name|
+|-----|-----|
+|bool|[**loaded**](class_rew_1_1_audio_writer.md#variable-loaded)|
+|size\_t|[**size**](class_rew_1_1_audio_writer.md#variable-size)|
+|int|[**sampleRate**](class_rew_1_1_audio_writer.md#variable-samplerate)|
+|int|[**channelCount**](class_rew_1_1_audio_writer.md#variable-channelcount)|
+|int|[**bitsPerSample**](class_rew_1_1_audio_writer.md#variable-bitspersample)|
+|size\_t|[**chunkSize**](class_rew_1_1_audio_writer.md#variable-chunksize)|
+
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**AudioWriter**](class_rew_1_1_audio_writer.md#function-audiowriter) () |
+|virtual |[**~AudioWriter**](class_rew_1_1_audio_writer.md#function-audiowriter) () = default |
+|virtual bool|[**open**](class_rew_1_1_audio_writer.md#function-open) (const std::string & path, size\_t size, int bitsPerSample, int sampleRate, int numChannels) = 0<br>Opens a file for writing. |
+|virtual bool|[**writeChunk**](class_rew_1_1_audio_writer.md#function-writechunk) (const unsigned char \* data, size\_t \* bytesWritten) = 0<br>Writes a chunk of data to file. |
+|virtual bool|[**writeFooter**](class_rew_1_1_audio_writer.md#function-writefooter) () = 0<br>Writes a footer. |
+|virtual void|[**close**](class_rew_1_1_audio_writer.md#function-close) () = 0<br>Closes the file. |
+|virtual bool|[**eof**](class_rew_1_1_audio_writer.md#function-eof) () const = 0<br>Checks if end of file. |
+|virtual size\_t|[**getPos**](class_rew_1_1_audio_writer.md#function-getpos) () const = 0<br>Returns current write position in bytes. |
+|bool|[**isOpen**](class_rew_1_1_audio_writer.md#function-isopen) () const <br>Checks if file is open. |
+|size\_t|[**getSize**](class_rew_1_1_audio_writer.md#function-getsize) () const <br>Returns the target output size specified in function create() |
+|int|[**getSampleRate**](class_rew_1_1_audio_writer.md#function-getsamplerate) () const <br>Returns the sample rate. |
+|int|[**getNumOfChannels**](class_rew_1_1_audio_writer.md#function-getnumofchannels) () const <br>Returns the number of channels. |
+|int|[**getBitsPerSample**](class_rew_1_1_audio_writer.md#function-getbitspersample) () const <br>Returns the bit depth of one sample. |
+|size\_t|[**getChunkSize**](class_rew_1_1_audio_writer.md#function-getchunksize) () const <br>Returns the size of a chunk in bytes used by function **[writeChunk()](class_rew_1_1_audio_writer.md#function-writechunk)** |
+||[**operator bool**](class_rew_1_1_audio_writer.md#function-operator-bool) () const <br>Checks if a file is open. |
+
+
+## Protected Attributes Documentation
+
+### variable loaded
+
+```cpp
+bool Rew::AudioWriter::loaded;
+```
+
+
+
+### variable size
+
+```cpp
+size_t Rew::AudioWriter::size;
+```
+
+
+
+### variable sampleRate
+
+```cpp
+int Rew::AudioWriter::sampleRate;
+```
+
+
+
+### variable channelCount
+
+```cpp
+int Rew::AudioWriter::channelCount;
+```
+
+
+
+### variable bitsPerSample
+
+```cpp
+int Rew::AudioWriter::bitsPerSample;
+```
+
+
+
+### variable chunkSize
+
+```cpp
+size_t Rew::AudioWriter::chunkSize;
+```
+
+
+
+## Public Functions Documentation
+
+### function AudioWriter
+
+```cpp
+Rew::AudioWriter::AudioWriter ()
+```
+
+
+
+### function ~AudioWriter
+
+```cpp
+virtual Rew::AudioWriter::~AudioWriter () = default
+```
+
+
+
+### function open
+
+```cpp
+virtual bool Rew::AudioWriter::open (
+    const std::string & path,
+    size_t size,
+    int bitsPerSample,
+    int sampleRate,
+    int numChannels
+) = 0
+```
+
+Opens a file for writing. 
+
+
+### function writeChunk
+
+```cpp
+virtual bool Rew::AudioWriter::writeChunk (
+    const unsigned char * data,
+    size_t * bytesWritten
+) = 0
+```
+
+Writes a chunk of data to file. 
+
+
+
+**See also:** **[getChunkSize](class_rew_1_1_audio_writer.md#function-getchunksize)** 
+
+
+### function writeFooter
+
+```cpp
+virtual bool Rew::AudioWriter::writeFooter () = 0
+```
+
+Writes a footer. 
+
+
+### function close
+
+```cpp
+virtual void Rew::AudioWriter::close () = 0
+```
+
+Closes the file. 
+
+
+### function eof
+
+```cpp
+virtual bool Rew::AudioWriter::eof () const = 0
+```
+
+Checks if end of file. 
+
+
+### function getPos
+
+```cpp
+virtual size_t Rew::AudioWriter::getPos () const = 0
+```
+
+Returns current write position in bytes. 
+
+
+### function isOpen
+
+```cpp
+bool Rew::AudioWriter::isOpen () const
+```
+
+Checks if file is open. 
+
+
+### function getSize
+
+```cpp
+size_t Rew::AudioWriter::getSize () const
+```
+
+Returns the target output size specified in function create() 
+
+
+### function getSampleRate
+
+```cpp
+int Rew::AudioWriter::getSampleRate () const
+```
+
+Returns the sample rate. 
+
+
+### function getNumOfChannels
+
+```cpp
+int Rew::AudioWriter::getNumOfChannels () const
+```
+
+Returns the number of channels. 
+
+
+### function getBitsPerSample
+
+```cpp
+int Rew::AudioWriter::getBitsPerSample () const
+```
+
+Returns the bit depth of one sample. 
+
+
+### function getChunkSize
+
+```cpp
+size_t Rew::AudioWriter::getChunkSize () const
+```
+
+Returns the size of a chunk in bytes used by function **[writeChunk()](class_rew_1_1_audio_writer.md#function-writechunk)** 
+
+
+### function operator bool
+
+```cpp
+Rew::AudioWriter::operator bool () const
+```
+
+Checks if a file is open. 
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/audio\_writer.h`
diff --git a/doxygen/class_rew_1_1_bucket.md b/doxygen/class_rew_1_1_bucket.md
new file mode 100644
index 0000000000000000000000000000000000000000..1d2c84d76761eb1b4d965aa0547a941ab1b81a5a
--- /dev/null
+++ b/doxygen/class_rew_1_1_bucket.md
@@ -0,0 +1,184 @@
+---
+title: class Rew::Bucket
+meta:
+  - name: keywords
+    content: Rew::Bucket Bucket Bucket Bucket ~Bucket swap operator= operator= pushBack size begin begin end end clear operator[] operator[]
+---
+
+# class Rew::Bucket
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**Bucket**](class_rew_1_1_bucket.md)
+
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**Bucket**](class_rew_1_1_bucket.md#function-bucket-1-3) () = default |
+||[**Bucket**](class_rew_1_1_bucket.md#function-bucket-2-3) (**[Bucket](class_rew_1_1_bucket.md)** && other) noexcept |
+||[**Bucket**](class_rew_1_1_bucket.md#function-bucket-3-3) (const **[Bucket](class_rew_1_1_bucket.md)** & other) = delete |
+|virtual |[**~Bucket**](class_rew_1_1_bucket.md#function-bucket) () = default |
+|void|[**swap**](class_rew_1_1_bucket.md#function-swap) (**[Bucket](class_rew_1_1_bucket.md)** & other) noexcept |
+|**[Bucket](class_rew_1_1_bucket.md)** &|[**operator=**](class_rew_1_1_bucket.md#function-operator-1-2) (**[Bucket](class_rew_1_1_bucket.md)** && other) noexcept |
+|**[Bucket](class_rew_1_1_bucket.md)** &|[**operator=**](class_rew_1_1_bucket.md#function-operator-2-2) (const **[Bucket](class_rew_1_1_bucket.md)** & other) = delete |
+|void|[**pushBack**](class_rew_1_1_bucket.md#function-pushback) (const typename std::vector< T >::value\_type & value) |
+|size\_t|[**size**](class_rew_1_1_bucket.md#function-size) () const |
+|std::vector< T >::iterator|[**begin**](class_rew_1_1_bucket.md#function-begin-1-2) () |
+|std::vector< T >::const\_iterator|[**begin**](class_rew_1_1_bucket.md#function-begin-2-2) () const |
+|std::vector< T >::iterator|[**end**](class_rew_1_1_bucket.md#function-end-1-2) () |
+|std::vector< T >::const\_iterator|[**end**](class_rew_1_1_bucket.md#function-end-2-2) () const |
+|void|[**clear**](class_rew_1_1_bucket.md#function-clear) () |
+|std::vector< T >::value\_type &|[**operator[]**](class_rew_1_1_bucket.md#function-operator[]-1-2) (size\_t i) |
+|const std::vector< T >::value\_type &|[**operator[]**](class_rew_1_1_bucket.md#function-operator[]-2-2) (size\_t i) const |
+
+
+## Public Functions Documentation
+
+### function Bucket (1/3)
+
+```cpp
+Rew::Bucket::Bucket () = default
+```
+
+
+
+### function Bucket (2/3)
+
+```cpp
+Rew::Bucket::Bucket (
+    Bucket && other
+) noexcept
+```
+
+
+
+### function Bucket (3/3)
+
+```cpp
+Rew::Bucket::Bucket (
+    const Bucket & other
+) = delete
+```
+
+
+
+### function ~Bucket
+
+```cpp
+virtual Rew::Bucket::~Bucket () = default
+```
+
+
+
+### function swap
+
+```cpp
+void Rew::Bucket::swap (
+    Bucket & other
+) noexcept
+```
+
+
+
+### function operator= (1/2)
+
+```cpp
+Bucket & Rew::Bucket::operator= (
+    Bucket && other
+) noexcept
+```
+
+
+
+### function operator= (2/2)
+
+```cpp
+Bucket & Rew::Bucket::operator= (
+    const Bucket & other
+) = delete
+```
+
+
+
+### function pushBack
+
+```cpp
+void Rew::Bucket::pushBack (
+    const typename std::vector< T >::value_type & value
+)
+```
+
+
+
+### function size
+
+```cpp
+size_t Rew::Bucket::size () const
+```
+
+
+
+### function begin (1/2)
+
+```cpp
+std::vector< T >::iterator Rew::Bucket::begin ()
+```
+
+
+
+### function begin (2/2)
+
+```cpp
+std::vector< T >::const_iterator Rew::Bucket::begin () const
+```
+
+
+
+### function end (1/2)
+
+```cpp
+std::vector< T >::iterator Rew::Bucket::end ()
+```
+
+
+
+### function end (2/2)
+
+```cpp
+std::vector< T >::const_iterator Rew::Bucket::end () const
+```
+
+
+
+### function clear
+
+```cpp
+void Rew::Bucket::clear ()
+```
+
+
+
+### function operator[] (1/2)
+
+```cpp
+std::vector< T >::value_type & Rew::Bucket::operator[] (
+    size_t i
+)
+```
+
+
+
+### function operator[] (2/2)
+
+```cpp
+const std::vector< T >::value_type & Rew::Bucket::operator[] (
+    size_t i
+) const
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/bucket.h`
diff --git a/doxygen/class_rew_1_1_byte_assembler.md b/doxygen/class_rew_1_1_byte_assembler.md
new file mode 100644
index 0000000000000000000000000000000000000000..aedd49dd86aea2321cfe4449421f9359346cd027
--- /dev/null
+++ b/doxygen/class_rew_1_1_byte_assembler.md
@@ -0,0 +1,100 @@
+---
+title: class Rew::ByteAssembler
+meta:
+  - name: keywords
+    content: Rew::ByteAssembler ByteAssembler ByteAssembler ByteAssembler swap operator= operator= operator()
+---
+
+# class Rew::ByteAssembler
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**ByteAssembler**](class_rew_1_1_byte_assembler.md)
+
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**ByteAssembler**](class_rew_1_1_byte_assembler.md#function-byteassembler-1-3) () |
+||[**ByteAssembler**](class_rew_1_1_byte_assembler.md#function-byteassembler-2-3) (**[ByteAssembler](class_rew_1_1_byte_assembler.md)** && other) noexcept |
+||[**ByteAssembler**](class_rew_1_1_byte_assembler.md#function-byteassembler-3-3) (const **[ByteAssembler](class_rew_1_1_byte_assembler.md)** & other) = delete |
+|void|[**swap**](class_rew_1_1_byte_assembler.md#function-swap) (**[ByteAssembler](class_rew_1_1_byte_assembler.md)** & other) noexcept |
+|**[ByteAssembler](class_rew_1_1_byte_assembler.md)** &|[**operator=**](class_rew_1_1_byte_assembler.md#function-operator-1-2) (**[ByteAssembler](class_rew_1_1_byte_assembler.md)** && other) noexcept |
+|**[ByteAssembler](class_rew_1_1_byte_assembler.md)** &|[**operator=**](class_rew_1_1_byte_assembler.md#function-operator-2-2) (const **[ByteAssembler](class_rew_1_1_byte_assembler.md)** & other) = delete |
+|void|[**operator()**](class_rew_1_1_byte_assembler.md#function-operator()) (unsigned char magnitude, const std::function< void(unsigned char)> & callback) |
+
+
+## Public Functions Documentation
+
+### function ByteAssembler (1/3)
+
+```cpp
+Rew::ByteAssembler::ByteAssembler ()
+```
+
+
+
+### function ByteAssembler (2/3)
+
+```cpp
+Rew::ByteAssembler::ByteAssembler (
+    ByteAssembler && other
+) noexcept
+```
+
+
+
+### function ByteAssembler (3/3)
+
+```cpp
+Rew::ByteAssembler::ByteAssembler (
+    const ByteAssembler & other
+) = delete
+```
+
+
+
+### function swap
+
+```cpp
+void Rew::ByteAssembler::swap (
+    ByteAssembler & other
+) noexcept
+```
+
+
+
+### function operator= (1/2)
+
+```cpp
+ByteAssembler & Rew::ByteAssembler::operator= (
+    ByteAssembler && other
+) noexcept
+```
+
+
+
+### function operator= (2/2)
+
+```cpp
+ByteAssembler & Rew::ByteAssembler::operator= (
+    const ByteAssembler & other
+) = delete
+```
+
+
+
+### function operator()
+
+```cpp
+void Rew::ByteAssembler::operator() (
+    unsigned char magnitude,
+    const std::function< void(unsigned char)> & callback
+)
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/byte\_assembler.h`
diff --git a/doxygen/class_rew_1_1_decoder.md b/doxygen/class_rew_1_1_decoder.md
new file mode 100644
index 0000000000000000000000000000000000000000..e5bfa6778ef72b48dd192351e4bf4b1f128b1153
--- /dev/null
+++ b/doxygen/class_rew_1_1_decoder.md
@@ -0,0 +1,151 @@
+---
+title: class Rew::Decoder
+meta:
+  - name: keywords
+    content: Rew::Decoder Decoder Decoder Decoder ~Decoder swap operator= operator= operator() operator() getLowMagnitude getHighMagnitude
+---
+
+# class Rew::Decoder
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**Decoder**](class_rew_1_1_decoder.md)
+
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**Decoder**](class_rew_1_1_decoder.md#function-decoder-1-3) (size\_t lowToneFreq = 2400, size\_t highToneFreq = 4800, double sampleLengthMs = 1.25) |
+||[**Decoder**](class_rew_1_1_decoder.md#function-decoder-2-3) (**[Decoder](class_rew_1_1_decoder.md)** && other) noexcept |
+||[**Decoder**](class_rew_1_1_decoder.md#function-decoder-3-3) (const **[Decoder](class_rew_1_1_decoder.md)** & other) = delete |
+|virtual |[**~Decoder**](class_rew_1_1_decoder.md#function-decoder) () = default |
+|void|[**swap**](class_rew_1_1_decoder.md#function-swap) (**[Decoder](class_rew_1_1_decoder.md)** & other) noexcept |
+|**[Decoder](class_rew_1_1_decoder.md)** &|[**operator=**](class_rew_1_1_decoder.md#function-operator-1-2) (**[Decoder](class_rew_1_1_decoder.md)** && other) noexcept |
+|**[Decoder](class_rew_1_1_decoder.md)** &|[**operator=**](class_rew_1_1_decoder.md#function-operator-2-2) (const **[Decoder](class_rew_1_1_decoder.md)** & other) = delete |
+|void|[**operator()**](class_rew_1_1_decoder.md#function-operator()-1-2) (const float \* samples, size\_t length, const std::function< void(unsigned char)> & callback) |
+|void|[**operator()**](class_rew_1_1_decoder.md#function-operator()-2-2) (const float \* samples, size\_t length, const std::function< void(float, float)> & callback) |
+|float \*|[**getLowMagnitude**](class_rew_1_1_decoder.md#function-getlowmagnitude) (const float \* samples, size\_t length) |
+|float \*|[**getHighMagnitude**](class_rew_1_1_decoder.md#function-gethighmagnitude) (const float \* samples, size\_t length) |
+
+
+## Public Functions Documentation
+
+### function Decoder (1/3)
+
+```cpp
+Rew::Decoder::Decoder (
+    size_t lowToneFreq = 2400,
+    size_t highToneFreq = 4800,
+    double sampleLengthMs = 1.25
+)
+```
+
+
+
+### function Decoder (2/3)
+
+```cpp
+Rew::Decoder::Decoder (
+    Decoder && other
+) noexcept
+```
+
+
+
+### function Decoder (3/3)
+
+```cpp
+Rew::Decoder::Decoder (
+    const Decoder & other
+) = delete
+```
+
+
+
+### function ~Decoder
+
+```cpp
+virtual Rew::Decoder::~Decoder () = default
+```
+
+
+
+### function swap
+
+```cpp
+void Rew::Decoder::swap (
+    Decoder & other
+) noexcept
+```
+
+
+
+### function operator= (1/2)
+
+```cpp
+Decoder & Rew::Decoder::operator= (
+    Decoder && other
+) noexcept
+```
+
+
+
+### function operator= (2/2)
+
+```cpp
+Decoder & Rew::Decoder::operator= (
+    const Decoder & other
+) = delete
+```
+
+
+
+### function operator() (1/2)
+
+```cpp
+void Rew::Decoder::operator() (
+    const float * samples,
+    size_t length,
+    const std::function< void(unsigned char)> & callback
+)
+```
+
+
+
+### function operator() (2/2)
+
+```cpp
+void Rew::Decoder::operator() (
+    const float * samples,
+    size_t length,
+    const std::function< void(float, float)> & callback
+)
+```
+
+
+
+### function getLowMagnitude
+
+```cpp
+float * Rew::Decoder::getLowMagnitude (
+    const float * samples,
+    size_t length
+)
+```
+
+
+
+### function getHighMagnitude
+
+```cpp
+float * Rew::Decoder::getHighMagnitude (
+    const float * samples,
+    size_t length
+)
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/decoder.h`
diff --git a/doxygen/class_rew_1_1_encoder.md b/doxygen/class_rew_1_1_encoder.md
new file mode 100644
index 0000000000000000000000000000000000000000..dd705f030d40148fc03e7ce919484a78871cb3f7
--- /dev/null
+++ b/doxygen/class_rew_1_1_encoder.md
@@ -0,0 +1,115 @@
+---
+title: class Rew::Encoder
+meta:
+  - name: keywords
+    content: Rew::Encoder Encoder Encoder Encoder swap operator= operator= operator() getNumOfSamples
+---
+
+# class Rew::Encoder
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**Encoder**](class_rew_1_1_encoder.md)
+
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**Encoder**](class_rew_1_1_encoder.md#function-encoder-1-3) (size\_t lowToneFreq = 2400, size\_t highToneFreq = 4800, double sampleLengthMs = 1.25) |
+||[**Encoder**](class_rew_1_1_encoder.md#function-encoder-2-3) (**[Encoder](class_rew_1_1_encoder.md)** && other) noexcept |
+||[**Encoder**](class_rew_1_1_encoder.md#function-encoder-3-3) (const **[Encoder](class_rew_1_1_encoder.md)** & other) = delete |
+|void|[**swap**](class_rew_1_1_encoder.md#function-swap) (**[Encoder](class_rew_1_1_encoder.md)** & other) noexcept |
+|**[Encoder](class_rew_1_1_encoder.md)** &|[**operator=**](class_rew_1_1_encoder.md#function-operator-1-2) (**[Encoder](class_rew_1_1_encoder.md)** && other) noexcept |
+|**[Encoder](class_rew_1_1_encoder.md)** &|[**operator=**](class_rew_1_1_encoder.md#function-operator-2-2) (const **[Encoder](class_rew_1_1_encoder.md)** & other) = delete |
+|float \*|[**operator()**](class_rew_1_1_encoder.md#function-operator()) (const unsigned char \* data, size\_t length) const |
+|size\_t|[**getNumOfSamples**](class_rew_1_1_encoder.md#function-getnumofsamples) (size\_t length) const |
+
+
+## Public Functions Documentation
+
+### function Encoder (1/3)
+
+```cpp
+Rew::Encoder::Encoder (
+    size_t lowToneFreq = 2400,
+    size_t highToneFreq = 4800,
+    double sampleLengthMs = 1.25
+)
+```
+
+
+
+### function Encoder (2/3)
+
+```cpp
+Rew::Encoder::Encoder (
+    Encoder && other
+) noexcept
+```
+
+
+
+### function Encoder (3/3)
+
+```cpp
+Rew::Encoder::Encoder (
+    const Encoder & other
+) = delete
+```
+
+
+
+### function swap
+
+```cpp
+void Rew::Encoder::swap (
+    Encoder & other
+) noexcept
+```
+
+
+
+### function operator= (1/2)
+
+```cpp
+Encoder & Rew::Encoder::operator= (
+    Encoder && other
+) noexcept
+```
+
+
+
+### function operator= (2/2)
+
+```cpp
+Encoder & Rew::Encoder::operator= (
+    const Encoder & other
+) = delete
+```
+
+
+
+### function operator()
+
+```cpp
+float * Rew::Encoder::operator() (
+    const unsigned char * data,
+    size_t length
+) const
+```
+
+
+
+### function getNumOfSamples
+
+```cpp
+size_t Rew::Encoder::getNumOfSamples (
+    size_t length
+) const
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/encoder.h`
diff --git a/doxygen/class_rew_1_1_goertzel.md b/doxygen/class_rew_1_1_goertzel.md
new file mode 100644
index 0000000000000000000000000000000000000000..da98ea978609ac49cbe9e8843bfe1beeeb82326a
--- /dev/null
+++ b/doxygen/class_rew_1_1_goertzel.md
@@ -0,0 +1,66 @@
+---
+title: class Rew::Goertzel
+meta:
+  - name: keywords
+    content: Rew::Goertzel Goertzel ~Goertzel operator() getBlockSize
+---
+
+# class Rew::Goertzel
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**Goertzel**](class_rew_1_1_goertzel.md)
+
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**Goertzel**](class_rew_1_1_goertzel.md#function-goertzel) (size\_t blockSize, float targetFrequency, float sampleRate) |
+|virtual |[**~Goertzel**](class_rew_1_1_goertzel.md#function-goertzel) () = default |
+|float|[**operator()**](class_rew_1_1_goertzel.md#function-operator()) (const float \* samples) |
+|size\_t|[**getBlockSize**](class_rew_1_1_goertzel.md#function-getblocksize) () const |
+
+
+## Public Functions Documentation
+
+### function Goertzel
+
+```cpp
+Rew::Goertzel::Goertzel (
+    size_t blockSize,
+    float targetFrequency,
+    float sampleRate
+)
+```
+
+
+
+### function ~Goertzel
+
+```cpp
+virtual Rew::Goertzel::~Goertzel () = default
+```
+
+
+
+### function operator()
+
+```cpp
+float Rew::Goertzel::operator() (
+    const float * samples
+)
+```
+
+
+
+### function getBlockSize
+
+```cpp
+size_t Rew::Goertzel::getBlockSize () const
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/goertzel.h`
diff --git a/doxygen/class_rew_1_1_synth.md b/doxygen/class_rew_1_1_synth.md
new file mode 100644
index 0000000000000000000000000000000000000000..fb74466e59ad435ef3de2afb7d1fb3f20f40716c
--- /dev/null
+++ b/doxygen/class_rew_1_1_synth.md
@@ -0,0 +1,39 @@
+---
+title: class Rew::Synth
+meta:
+  - name: keywords
+    content: Rew::Synth operator()
+---
+
+# class Rew::Synth
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**Synth**](class_rew_1_1_synth.md)
+
+
+
+
+Inherited by the following classes: **[Rew::ToneSynth](class_rew_1_1_tone_synth.md)**
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+|virtual size\_t|[**operator()**](class_rew_1_1_synth.md#function-operator()) (float \* dst) const = 0|
+
+
+## Public Functions Documentation
+
+### function operator()
+
+```cpp
+virtual size_t Rew::Synth::operator() (
+    float * dst
+) const = 0
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/synth.h`
diff --git a/doxygen/class_rew_1_1_tone_synth.md b/doxygen/class_rew_1_1_tone_synth.md
new file mode 100644
index 0000000000000000000000000000000000000000..3a93bf7f5a620ffafc3583c21029af2eab24baa8
--- /dev/null
+++ b/doxygen/class_rew_1_1_tone_synth.md
@@ -0,0 +1,108 @@
+---
+title: class Rew::ToneSynth
+meta:
+  - name: keywords
+    content: Rew::ToneSynth ToneSynth ToneSynth ToneSynth operator= operator= operator() getSamplesPerBlock
+---
+
+# class Rew::ToneSynth
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**ToneSynth**](class_rew_1_1_tone_synth.md)
+
+
+
+
+Inherits the following classes: **[Rew::Synth](class_rew_1_1_synth.md)**
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**ToneSynth**](class_rew_1_1_tone_synth.md#function-tonesynth-1-3) (size\_t frequency, size\_t sampleRate, double ms) |
+||[**ToneSynth**](class_rew_1_1_tone_synth.md#function-tonesynth-2-3) (**[ToneSynth](class_rew_1_1_tone_synth.md)** && other) noexcept |
+||[**ToneSynth**](class_rew_1_1_tone_synth.md#function-tonesynth-3-3) (const **[ToneSynth](class_rew_1_1_tone_synth.md)** & other) = delete |
+|**[ToneSynth](class_rew_1_1_tone_synth.md)** &|[**operator=**](class_rew_1_1_tone_synth.md#function-operator-1-2) (**[ToneSynth](class_rew_1_1_tone_synth.md)** && other) noexcept |
+|**[ToneSynth](class_rew_1_1_tone_synth.md)** &|[**operator=**](class_rew_1_1_tone_synth.md#function-operator-2-2) (const **[ToneSynth](class_rew_1_1_tone_synth.md)** & other) = delete |
+|virtual size\_t|[**operator()**](class_rew_1_1_tone_synth.md#function-operator()) (float \* dst) override const |
+|size\_t|[**getSamplesPerBlock**](class_rew_1_1_tone_synth.md#function-getsamplesperblock) () const |
+
+
+## Public Functions Documentation
+
+### function ToneSynth (1/3)
+
+```cpp
+Rew::ToneSynth::ToneSynth (
+    size_t frequency,
+    size_t sampleRate,
+    double ms
+)
+```
+
+
+
+### function ToneSynth (2/3)
+
+```cpp
+Rew::ToneSynth::ToneSynth (
+    ToneSynth && other
+) noexcept
+```
+
+
+
+### function ToneSynth (3/3)
+
+```cpp
+Rew::ToneSynth::ToneSynth (
+    const ToneSynth & other
+) = delete
+```
+
+
+
+### function operator= (1/2)
+
+```cpp
+ToneSynth & Rew::ToneSynth::operator= (
+    ToneSynth && other
+) noexcept
+```
+
+
+
+### function operator= (2/2)
+
+```cpp
+ToneSynth & Rew::ToneSynth::operator= (
+    const ToneSynth & other
+) = delete
+```
+
+
+
+### function operator()
+
+```cpp
+virtual size_t Rew::ToneSynth::operator() (
+    float * dst
+) const
+```
+
+
+
+Implements **[Synth::operator()](class_rew_1_1_synth.md#function-operator())**
+
+
+### function getSamplesPerBlock
+
+```cpp
+size_t Rew::ToneSynth::getSamplesPerBlock () const
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/tone\_synth.h`
diff --git a/doxygen/class_rew_1_1_wav_writer.md b/doxygen/class_rew_1_1_wav_writer.md
new file mode 100644
index 0000000000000000000000000000000000000000..e1724d6e9f6bc8d55e893e7e614b1034e1cf982b
--- /dev/null
+++ b/doxygen/class_rew_1_1_wav_writer.md
@@ -0,0 +1,138 @@
+---
+title: class Rew::WavWriter
+meta:
+  - name: keywords
+    content: Rew::WavWriter WavWriter ~WavWriter open close writeChunk writeFooter eof getPos
+---
+
+# class Rew::WavWriter
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md) **::** [**WavWriter**](class_rew_1_1_wav_writer.md)
+
+
+WAV file saver. 
+
+
+Inherits the following classes: **[Rew::AudioWriter](class_rew_1_1_audio_writer.md)**
+
+## Public Functions
+
+|Type|Name|
+|-----|-----|
+||[**WavWriter**](class_rew_1_1_wav_writer.md#function-wavwriter) () |
+|virtual |[**~WavWriter**](class_rew_1_1_wav_writer.md#function-wavwriter) () |
+|virtual bool|[**open**](class_rew_1_1_wav_writer.md#function-open) (const std::string & path, size\_t size, int bitsPerSample, int sampleRate, int numChannels) override <br>Opens a file for writing. |
+|virtual void|[**close**](class_rew_1_1_wav_writer.md#function-close) () override <br>Closes the file. |
+|virtual bool|[**writeChunk**](class_rew_1_1_wav_writer.md#function-writechunk) (const unsigned char \* data, size\_t \* bytesWritten) override <br>Writes a chunk of data to file. |
+|virtual bool|[**writeFooter**](class_rew_1_1_wav_writer.md#function-writefooter) () override <br>Writes a footer. |
+|virtual bool|[**eof**](class_rew_1_1_wav_writer.md#function-eof) () override const <br>Checks if end of file. |
+|virtual size\_t|[**getPos**](class_rew_1_1_wav_writer.md#function-getpos) () override const <br>Returns current write position in bytes. |
+
+
+## Public Functions Documentation
+
+### function WavWriter
+
+```cpp
+Rew::WavWriter::WavWriter ()
+```
+
+
+
+### function ~WavWriter
+
+```cpp
+virtual Rew::WavWriter::~WavWriter ()
+```
+
+
+
+### function open
+
+```cpp
+virtual bool Rew::WavWriter::open (
+    const std::string & path,
+    size_t size,
+    int bitsPerSample,
+    int sampleRate,
+    int numChannels
+)
+```
+
+Opens a file for writing. 
+
+
+Implements **[AudioWriter::open](class_rew_1_1_audio_writer.md#function-open)**
+
+
+### function close
+
+```cpp
+virtual void Rew::WavWriter::close ()
+```
+
+Closes the file. 
+
+
+Implements **[AudioWriter::close](class_rew_1_1_audio_writer.md#function-close)**
+
+
+### function writeChunk
+
+```cpp
+virtual bool Rew::WavWriter::writeChunk (
+    const unsigned char * data,
+    size_t * bytesWritten
+)
+```
+
+Writes a chunk of data to file. 
+
+
+
+**See also:** **[getChunkSize](class_rew_1_1_audio_writer.md#function-getchunksize)** 
+
+
+Implements **[AudioWriter::writeChunk](class_rew_1_1_audio_writer.md#function-writechunk)**
+
+
+### function writeFooter
+
+```cpp
+virtual bool Rew::WavWriter::writeFooter ()
+```
+
+Writes a footer. 
+
+
+Implements **[AudioWriter::writeFooter](class_rew_1_1_audio_writer.md#function-writefooter)**
+
+
+### function eof
+
+```cpp
+virtual bool Rew::WavWriter::eof () const
+```
+
+Checks if end of file. 
+
+
+Implements **[AudioWriter::eof](class_rew_1_1_audio_writer.md#function-eof)**
+
+
+### function getPos
+
+```cpp
+virtual size_t Rew::WavWriter::getPos () const
+```
+
+Returns current write position in bytes. 
+
+
+Implements **[AudioWriter::getPos](class_rew_1_1_audio_writer.md#function-getpos)**
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/wav\_writer.h`
diff --git a/doxygen/classes.md b/doxygen/classes.md
new file mode 100644
index 0000000000000000000000000000000000000000..516f86d96c930b3e971a63d5adf09152702c28e1
--- /dev/null
+++ b/doxygen/classes.md
@@ -0,0 +1,50 @@
+---
+title: Class Index
+meta:
+  - name: keywords
+    content: AudioWriter Bucket ByteAssembler Decoder Encoder Goertzel Synth ToneSynth WavWriter
+---
+
+# Class Index
+
+## A
+
+* [**AudioWriter**](class_rew_1_1_audio_writer.md) ([**Rew**](namespace_rew.md))
+
+
+## B
+
+* [**Bucket**](class_rew_1_1_bucket.md) ([**Rew**](namespace_rew.md))
+* [**ByteAssembler**](class_rew_1_1_byte_assembler.md) ([**Rew**](namespace_rew.md))
+
+
+## D
+
+* [**Decoder**](class_rew_1_1_decoder.md) ([**Rew**](namespace_rew.md))
+
+
+## E
+
+* [**Encoder**](class_rew_1_1_encoder.md) ([**Rew**](namespace_rew.md))
+
+
+## G
+
+* [**Goertzel**](class_rew_1_1_goertzel.md) ([**Rew**](namespace_rew.md))
+
+
+## S
+
+* [**Synth**](class_rew_1_1_synth.md) ([**Rew**](namespace_rew.md))
+
+
+## T
+
+* [**ToneSynth**](class_rew_1_1_tone_synth.md) ([**Rew**](namespace_rew.md))
+
+
+## W
+
+* [**WavWriter**](class_rew_1_1_wav_writer.md) ([**Rew**](namespace_rew.md))
+
+
diff --git a/doxygen/config_8h.md b/doxygen/config_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..72adf1222393a16aae0eae1faeb354c1c7b7ef40
--- /dev/null
+++ b/doxygen/config_8h.md
@@ -0,0 +1,94 @@
+---
+title: file config.h
+meta:
+  - name: keywords
+    content: config.h REW_API REW_NAMESPACE NOEXCEPT RAD_TO_DEG DEG_TO_RAD M_PI DEFAULT_LOW_TONE_FREQ DEFAULT_HIGH_TONE_FREQ
+---
+
+# file config.h
+
+**[Go to the source code of this file.](config_8h_source.md)**
+## Defines
+
+|Type|Name|
+|-----|-----|
+||[**REW\_API**](config_8h.md#define-rew-api)|
+||[**REW\_NAMESPACE**](config_8h.md#define-rew-namespace)|
+||[**NOEXCEPT**](config_8h.md#define-noexcept)|
+||[**RAD\_TO\_DEG**](config_8h.md#define-rad-to-deg)|
+||[**DEG\_TO\_RAD**](config_8h.md#define-deg-to-rad)|
+||[**M\_PI**](config_8h.md#define-m-pi)|
+||[**DEFAULT\_LOW\_TONE\_FREQ**](config_8h.md#define-default-low-tone-freq)|
+||[**DEFAULT\_HIGH\_TONE\_FREQ**](config_8h.md#define-default-high-tone-freq)|
+
+
+## Defines Documentation
+
+### define REW\_API
+
+```cpp
+define REW_API;
+```
+
+
+
+### define REW\_NAMESPACE
+
+```cpp
+define REW_NAMESPACE;
+```
+
+
+
+### define NOEXCEPT
+
+```cpp
+define NOEXCEPT;
+```
+
+
+
+### define RAD\_TO\_DEG
+
+```cpp
+define RAD_TO_DEG;
+```
+
+
+
+### define DEG\_TO\_RAD
+
+```cpp
+define DEG_TO_RAD;
+```
+
+
+
+### define M\_PI
+
+```cpp
+define M_PI;
+```
+
+
+
+### define DEFAULT\_LOW\_TONE\_FREQ
+
+```cpp
+define DEFAULT_LOW_TONE_FREQ;
+```
+
+
+
+### define DEFAULT\_HIGH\_TONE\_FREQ
+
+```cpp
+define DEFAULT_HIGH_TONE_FREQ;
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/config.h`
diff --git a/doxygen/config_8h_source.md b/doxygen/config_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..d59219a74f8f6bf6cdb217cb9a7112636af9f04e
--- /dev/null
+++ b/doxygen/config_8h_source.md
@@ -0,0 +1,124 @@
+---
+title: config.h File Reference
+meta:
+  - name: keywords
+    content: config.h file
+---
+
+# config.h File Reference
+
+**[Go to the documentation of this file.](config_8h.md)**
+Source: `include/config.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      
+    
+    
+    
+```cpp
+/*** This file is part of FineFramework project ***/
+#ifndef REW_CONFIG
+#define REW_CONFIG
+
+// Using Visual Studio
+#ifdef _MSC_VER
+#define REW_WINDOWS_MSVC 1
+#define REW_WINDOWS 1
+#pragma warning( disable: 4251 )
+#endif
+
+// Using MinGW
+#ifdef __MINGW32__
+#define REW_WINDOWS_MINGW 1
+#define REW_WINDOWS 1
+#endif
+
+// Using Linux GCC
+#ifdef __linux__
+#define REW_LINUX_GCC 1
+#define REW_LINUX 1
+#endif
+
+// Using MAX OS X
+#if defined(__APPLE__) && defined(__MACH__)
+#define REW_OSX_CLANG 1
+#define REW_OSX 1
+#endif
+
+#if !defined(REW_WINDOWS_MSVC) && !defined(REW_WINDOWS_MINGW) && !defined(REW_LINUX_GCC) && !defined(REW_OSX_CLANG)
+#error Please use Visual Studio, MinGW, Linux GCC, or OS X Clang to compile COM3001!
+#endif
+#if !defined(REW_WINDOWS) && !defined(REW_LINUX) && !defined(REW_OSX)
+#error Target platform not selected!
+#endif
+
+// COM3001 export for Windows
+#if defined(REW_WINDOWS)
+#ifdef REW_EXPORTS
+#define REW_API __declspec(dllexport)
+#else
+#define REW_API __declspec(dllimport)
+#endif
+#else
+#define REW_API
+#endif
+
+#define REW_NAMESPACE namespace Rew
+
+#if !defined(REW_API)
+#error REW_API dllexport not defined!
+#endif
+
+#if !defined(HAS_NOEXCEPT)
+#if defined(__clang__)
+#if __has_feature(cxx_noexcept)
+#define HAS_NOEXCEPT
+#endif
+#else
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026
+#define HAS_NOEXCEPT
+#endif
+#endif
+
+#ifdef HAS_NOEXCEPT
+#define NOEXCEPT noexcept
+#else
+#define NOEXCEPT
+#endif
+#endif
+
+#include <cstddef>
+
+#ifndef RAD_TO_DEG
+#define RAD_TO_DEG  57.2957795131
+#endif
+#ifndef DEG_TO_RAD
+#define DEG_TO_RAD  0.01745329251
+#endif
+#ifndef M_PI
+#define M_PI        3.14159265358979323846
+#endif
+
+#ifndef DEFAULT_LOW_TONE_FREQ
+#define DEFAULT_LOW_TONE_FREQ 2400
+#endif
+
+#ifndef DEFAULT_HIGH_TONE_FREQ
+#define DEFAULT_HIGH_TONE_FREQ 4800
+#endif
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/decoder_8h.md b/doxygen/decoder_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..19f5db52a5ab550e82bfb11b7e532f7af5dca24a
--- /dev/null
+++ b/doxygen/decoder_8h.md
@@ -0,0 +1,21 @@
+---
+title: file decoder.h
+meta:
+  - name: keywords
+    content: decoder.h Rew::Decoder
+---
+
+# file decoder.h
+
+**[Go to the source code of this file.](decoder_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::Decoder**](class_rew_1_1_decoder.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/decoder.h`
diff --git a/doxygen/decoder_8h_source.md b/doxygen/decoder_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..a04fe90b4782f9022a969a34411797da98d56306
--- /dev/null
+++ b/doxygen/decoder_8h_source.md
@@ -0,0 +1,67 @@
+---
+title: decoder.h File Reference
+meta:
+  - name: keywords
+    content: decoder.h file
+---
+
+# decoder.h File Reference
+
+**[Go to the documentation of this file.](decoder_8h.md)**
+Source: `include/decoder/decoder.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_DECODER_H
+#define REW_DECODER_H
+
+#include "goertzel.h"
+#include <utility>
+#include <functional>
+#include <memory>
+#include "byte_assembler.h"
+
+REW_NAMESPACE {
+    class REW_API Decoder {
+    public:
+        Decoder(
+            size_t lowToneFreq = DEFAULT_LOW_TONE_FREQ,
+            size_t highToneFreq = DEFAULT_HIGH_TONE_FREQ,
+            double sampleLengthMs = 1.25);
+        Decoder(Decoder&& other) noexcept;
+        Decoder(const Decoder& other) = delete;
+        virtual ~Decoder() = default;
+        void swap(Decoder& other) noexcept;
+        Decoder& operator = (Decoder&& other) noexcept;
+        Decoder& operator = (const Decoder& other) = delete;
+
+        void operator()(const float* samples, size_t length, const std::function<void(unsigned char)>& callback);
+        void operator()(const float* samples, size_t length, const std::function<void(float, float)>& callback);
+        float* getLowMagnitude(const float* samples, size_t length);
+        float* getHighMagnitude(const float* samples, size_t length);
+    private:
+        size_t blockSize;
+        Goertzel lowGoertzel;
+        Goertzel highGoertzel;
+        std::unique_ptr<float> buffer;
+        ByteAssembler byteAssembler;
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/dir_acb9e55bfefdf4d43f13fff6aa240ad7.md b/doxygen/dir_acb9e55bfefdf4d43f13fff6aa240ad7.md
new file mode 100644
index 0000000000000000000000000000000000000000..fd885ec3e1dd5e57c135f36fd2d9250c6a1a3992
--- /dev/null
+++ b/doxygen/dir_acb9e55bfefdf4d43f13fff6aa240ad7.md
@@ -0,0 +1,16 @@
+---
+title: include/encoder Directory Reference
+meta:
+  - name: keywords
+    content: audio_writer.h encoder.h synth.h tone_synth.h wav_writer.h
+---
+
+# include/encoder Directory Reference
+
+## Files
+
+* **[audio\_writer.h](audio__writer_8h.md)**
+* **[encoder.h](encoder_8h.md)**
+* **[synth.h](synth_8h.md)**
+* **[tone\_synth.h](tone__synth_8h.md)**
+* **[wav\_writer.h](wav__writer_8h.md)**
diff --git a/doxygen/dir_d44c64559bbebec7f509842c48db8b23.md b/doxygen/dir_d44c64559bbebec7f509842c48db8b23.md
new file mode 100644
index 0000000000000000000000000000000000000000..5b9e54d1e4d421423b044f665b18ef69f7555c2e
--- /dev/null
+++ b/doxygen/dir_d44c64559bbebec7f509842c48db8b23.md
@@ -0,0 +1,14 @@
+---
+title: include Directory Reference
+meta:
+  - name: keywords
+    content: include/decoder include/encoder config.h
+---
+
+# include Directory Reference
+
+## Files
+
+* **[include/decoder/](dir_ef4c7dabb16c9bee1e17c47c3bb25728.md)**
+* **[include/encoder/](dir_acb9e55bfefdf4d43f13fff6aa240ad7.md)**
+* **[config.h](config_8h.md)**
diff --git a/doxygen/dir_ef4c7dabb16c9bee1e17c47c3bb25728.md b/doxygen/dir_ef4c7dabb16c9bee1e17c47c3bb25728.md
new file mode 100644
index 0000000000000000000000000000000000000000..201a6319f650196f2c6b03ded9fe2fd6240a688e
--- /dev/null
+++ b/doxygen/dir_ef4c7dabb16c9bee1e17c47c3bb25728.md
@@ -0,0 +1,15 @@
+---
+title: include/decoder Directory Reference
+meta:
+  - name: keywords
+    content: bucket.h byte_assembler.h decoder.h goertzel.h
+---
+
+# include/decoder Directory Reference
+
+## Files
+
+* **[bucket.h](bucket_8h.md)**
+* **[byte\_assembler.h](byte__assembler_8h.md)**
+* **[decoder.h](decoder_8h.md)**
+* **[goertzel.h](goertzel_8h.md)**
diff --git a/doxygen/encoder_8h.md b/doxygen/encoder_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..2f7856c384c2806e69bab72fd3eabecdd19acde6
--- /dev/null
+++ b/doxygen/encoder_8h.md
@@ -0,0 +1,21 @@
+---
+title: file encoder.h
+meta:
+  - name: keywords
+    content: encoder.h Rew::Encoder
+---
+
+# file encoder.h
+
+**[Go to the source code of this file.](encoder_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::Encoder**](class_rew_1_1_encoder.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/encoder.h`
diff --git a/doxygen/encoder_8h_source.md b/doxygen/encoder_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..a49e10ee6ba4471cf5ebf4763bd73e84f87d3180
--- /dev/null
+++ b/doxygen/encoder_8h_source.md
@@ -0,0 +1,58 @@
+---
+title: encoder.h File Reference
+meta:
+  - name: keywords
+    content: encoder.h file
+---
+
+# encoder.h File Reference
+
+**[Go to the documentation of this file.](encoder_8h.md)**
+Source: `include/encoder/encoder.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_ENCODER_H
+#define REW_ENCODER_H
+
+#include "../config.h"
+#include "tone_synth.h"
+#include "wav_writer.h"
+
+REW_NAMESPACE {
+    class REW_API Encoder {
+    public:
+        Encoder(
+            size_t lowToneFreq = DEFAULT_LOW_TONE_FREQ,
+            size_t highToneFreq = DEFAULT_HIGH_TONE_FREQ, 
+            double sampleLengthMs = 1.25);
+        Encoder(Encoder&& other) noexcept;
+        Encoder(const Encoder& other) = delete;
+        void swap(Encoder& other) noexcept;
+        Encoder& operator = (Encoder&& other) noexcept;
+        Encoder& operator = (const Encoder& other) = delete;
+
+        float* operator()(const unsigned char* data, size_t length) const;
+        size_t getNumOfSamples(size_t length) const;
+    private:
+        ToneSynth lowTone;
+        ToneSynth highTone;
+        std::unique_ptr<float[]> nullTone;
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/enumerations.md b/doxygen/enumerations.md
new file mode 100644
index 0000000000000000000000000000000000000000..ea1605e330778fae8d2cc03485447cac6b0d1860
--- /dev/null
+++ b/doxygen/enumerations.md
@@ -0,0 +1,7 @@
+---
+title: Enumeration Index
+---
+
+# Enumeration Index
+
+Here is a list of all enumerations with links to the class documentation for each member:
diff --git a/doxygen/files.md b/doxygen/files.md
new file mode 100644
index 0000000000000000000000000000000000000000..d87aa247e2203af97441beeb4ff2f6b25ffb318e
--- /dev/null
+++ b/doxygen/files.md
@@ -0,0 +1,23 @@
+---
+title: Files
+meta:
+  - name: keywords
+    content: config.h bucket.h byte_assembler.h decoder.h goertzel.h decoder audio_writer.h encoder.h synth.h tone_synth.h wav_writer.h encoder include
+---
+
+# File List
+
+Here is a list of all documented files with brief descriptions:
+* **[include/](dir_d44c64559bbebec7f509842c48db8b23.md)**
+  * **[config.h](config_8h.md)**
+  * **[decoder/](dir_ef4c7dabb16c9bee1e17c47c3bb25728.md)**
+    * **[bucket.h](bucket_8h.md)**
+    * **[byte\_assembler.h](byte__assembler_8h.md)**
+    * **[decoder.h](decoder_8h.md)**
+    * **[goertzel.h](goertzel_8h.md)**
+  * **[encoder/](dir_acb9e55bfefdf4d43f13fff6aa240ad7.md)**
+    * **[audio\_writer.h](audio__writer_8h.md)**
+    * **[encoder.h](encoder_8h.md)**
+    * **[synth.h](synth_8h.md)**
+    * **[tone\_synth.h](tone__synth_8h.md)**
+    * **[wav\_writer.h](wav__writer_8h.md)**
diff --git a/doxygen/functions.md b/doxygen/functions.md
new file mode 100644
index 0000000000000000000000000000000000000000..0a3b6dc45054d24c49da599ddf7885d6222048fd
--- /dev/null
+++ b/doxygen/functions.md
@@ -0,0 +1,113 @@
+---
+title: Function Index
+meta:
+  - name: keywords
+    content: AudioWriter::AudioWriter ToneSynth::allocate Bucket::Bucket ByteAssembler::ByteAssembler Bucket::begin Bucket::clear WavWriter::close ByteAssembler::countValue Decoder::Decoder Encoder::Encoder Bucket::end WavWriter::eof Goertzel::Goertzel AudioWriter::getBitsPerSample Goertzel::getBlockSize AudioWriter::getChunkSize Decoder::getHighMagnitude Decoder::getLowMagnitude Goertzel::getMagnitude AudioWriter::getNumOfChannels Encoder::getNumOfSamples WavWriter::getPos AudioWriter::getSampleRate ToneSynth::getSamplesPerBlock AudioWriter::getSize Goertzel::init AudioWriter::isOpen WavWriter::open AudioWriter::operator bool ToneSynth::operator() ToneSynth::operator= Bucket::operator[] Goertzel::processSample Bucket::pushBack Goertzel::reset Bucket::size Encoder::swap ToneSynth::ToneSynth ByteAssembler::toByte WavWriter::WavWriter WavWriter::writeChunk WavWriter::writeFooter AudioWriter::~AudioWriter Bucket::~Bucket Decoder::~Decoder Goertzel::~Goertzel WavWriter::~WavWriter
+---
+
+# Function Index
+
+Here is a list of all functions with links to the class documentation for each member:
+## A
+
+* **AudioWriter** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-audiowriter))
+* **allocate** ([**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#function-allocate))
+
+
+## B
+
+* **Bucket** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-bucket-1-3))
+* **ByteAssembler** ([**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#function-byteassembler-1-3))
+* **begin** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-begin-1-2))
+
+
+## C
+
+* **clear** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-clear))
+* **close** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-close), [**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-close))
+* **countValue** ([**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#function-countvalue))
+
+
+## D
+
+* **Decoder** ([**Rew::Decoder**](class_rew_1_1_decoder.md#function-decoder-1-3))
+
+
+## E
+
+* **Encoder** ([**Rew::Encoder**](class_rew_1_1_encoder.md#function-encoder-1-3))
+* **end** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-end-1-2))
+* **eof** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-eof), [**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-eof))
+
+
+## G
+
+* **Goertzel** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-goertzel))
+* **getBitsPerSample** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-getbitspersample))
+* **getBlockSize** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-getblocksize))
+* **getChunkSize** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-getchunksize))
+* **getHighMagnitude** ([**Rew::Decoder**](class_rew_1_1_decoder.md#function-gethighmagnitude))
+* **getLowMagnitude** ([**Rew::Decoder**](class_rew_1_1_decoder.md#function-getlowmagnitude))
+* **getMagnitude** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-getmagnitude))
+* **getNumOfChannels** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-getnumofchannels))
+* **getNumOfSamples** ([**Rew::Encoder**](class_rew_1_1_encoder.md#function-getnumofsamples))
+* **getPos** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-getpos), [**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-getpos))
+* **getSampleRate** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-getsamplerate))
+* **getSamplesPerBlock** ([**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#function-getsamplesperblock))
+* **getSize** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-getsize))
+
+
+## I
+
+* **init** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-init))
+* **isOpen** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-isopen))
+
+
+## O
+
+* **open** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-open), [**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-open))
+* **operator bool** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-operator-bool))
+* **operator()** ([**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#function-operator()), [**Rew::Decoder**](class_rew_1_1_decoder.md#function-operator()-1-2), [**Rew::Encoder**](class_rew_1_1_encoder.md#function-operator()), [**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-operator()), [**Rew::Synth**](class_rew_1_1_synth.md#function-operator()), [**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#function-operator()))
+* **operator=** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-operator-1-2), [**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#function-operator-1-2), [**Rew::Decoder**](class_rew_1_1_decoder.md#function-operator-1-2), [**Rew::Encoder**](class_rew_1_1_encoder.md#function-operator-1-2), [**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#function-operator-1-2))
+* **operator[]** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-operator[]-1-2))
+
+
+## P
+
+* **processSample** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-processsample))
+* **pushBack** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-pushback))
+
+
+## R
+
+* **reset** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-reset))
+
+
+## S
+
+* **size** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-size))
+* **swap** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-swap), [**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#function-swap), [**Rew::Decoder**](class_rew_1_1_decoder.md#function-swap), [**Rew::Encoder**](class_rew_1_1_encoder.md#function-swap))
+
+
+## T
+
+* **ToneSynth** ([**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#function-tonesynth-1-3))
+* **toByte** ([**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#function-tobyte))
+
+
+## W
+
+* **WavWriter** ([**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-wavwriter))
+* **writeChunk** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-writechunk), [**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-writechunk))
+* **writeFooter** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-writefooter), [**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-writefooter))
+
+
+## ~
+
+* **~AudioWriter** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#function-audiowriter))
+* **~Bucket** ([**Rew::Bucket**](class_rew_1_1_bucket.md#function-bucket))
+* **~Decoder** ([**Rew::Decoder**](class_rew_1_1_decoder.md#function-decoder))
+* **~Goertzel** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#function-goertzel))
+* **~WavWriter** ([**Rew::WavWriter**](class_rew_1_1_wav_writer.md#function-wavwriter))
+
+
diff --git a/doxygen/goertzel_8h.md b/doxygen/goertzel_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..098d3e3384c62165880e26d651b5759a3501609e
--- /dev/null
+++ b/doxygen/goertzel_8h.md
@@ -0,0 +1,21 @@
+---
+title: file goertzel.h
+meta:
+  - name: keywords
+    content: goertzel.h Rew::Goertzel
+---
+
+# file goertzel.h
+
+**[Go to the source code of this file.](goertzel_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::Goertzel**](class_rew_1_1_goertzel.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/goertzel.h`
diff --git a/doxygen/goertzel_8h_source.md b/doxygen/goertzel_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..c76ef3769b1c98420f22ec0064d459e980b3f2c1
--- /dev/null
+++ b/doxygen/goertzel_8h_source.md
@@ -0,0 +1,60 @@
+---
+title: goertzel.h File Reference
+meta:
+  - name: keywords
+    content: goertzel.h file
+---
+
+# goertzel.h File Reference
+
+**[Go to the documentation of this file.](goertzel_8h.md)**
+Source: `include/decoder/goertzel.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_DECODER_GOERTZEL_H
+#define REW_DECODER_GOERTZEL_H
+
+#include "../config.h"
+
+REW_NAMESPACE{
+    class REW_API Goertzel {
+    public:
+        Goertzel(size_t blockSize, float targetFrequency, float sampleRate);
+        virtual ~Goertzel() = default;
+
+        float operator()(const float* samples);
+
+        inline size_t getBlockSize() const {
+            return blockSize;
+        }
+    private:
+        void processSample(float sample);
+        void init(size_t blockSize, float targetFrequency, float sampleRate);
+        void reset();
+        float getMagnitude() const;
+
+        float coeff;
+        float Q1;
+        float Q2;
+        float sine;
+        float cosine;
+        size_t blockSize;
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/group__decoder.md b/doxygen/group__decoder.md
new file mode 100644
index 0000000000000000000000000000000000000000..8dc37045d6a8772bd0d10d663aa1f339fcb93fcf
--- /dev/null
+++ b/doxygen/group__decoder.md
@@ -0,0 +1,20 @@
+---
+title: group decoder
+meta:
+  - name: keywords
+    content: decoder Rew::Bucket Rew::ByteAssembler Rew::Decoder Rew::Goertzel
+---
+
+# group decoder
+
+The clientside part of the project for decoding the signal. 
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::Bucket**](class_rew_1_1_bucket.md)|
+|class|[**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md)|
+|class|[**Rew::Decoder**](class_rew_1_1_decoder.md)|
+|class|[**Rew::Goertzel**](class_rew_1_1_goertzel.md)|
+
+
diff --git a/doxygen/group__encoder.md b/doxygen/group__encoder.md
new file mode 100644
index 0000000000000000000000000000000000000000..044dd49374f7ff8aafcd80ec66853126f5e050a7
--- /dev/null
+++ b/doxygen/group__encoder.md
@@ -0,0 +1,21 @@
+---
+title: group encoder
+meta:
+  - name: keywords
+    content: encoder Rew::AudioWriter Rew::Encoder Rew::Synth Rew::ToneSynth Rew::WavWriter
+---
+
+# group encoder
+
+The server side part of the project for encoding the data into signal. 
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::AudioWriter**](class_rew_1_1_audio_writer.md)|
+|class|[**Rew::Encoder**](class_rew_1_1_encoder.md)|
+|class|[**Rew::Synth**](class_rew_1_1_synth.md)|
+|class|[**Rew::ToneSynth**](class_rew_1_1_tone_synth.md)|
+|class|[**Rew::WavWriter**](class_rew_1_1_wav_writer.md)|
+
+
diff --git a/doxygen/make.bat b/doxygen/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..f0bd4f678db1e5c2e23b7b7f901ac35c35c98894
--- /dev/null
+++ b/doxygen/make.bat
@@ -0,0 +1,2 @@
+doxygen Doxyfile || exit /b
+doxybook -i doxygen/xml -o doxygen -t vuepress
diff --git a/doxygen/make.sh b/doxygen/make.sh
new file mode 100644
index 0000000000000000000000000000000000000000..18ac30cbba2ef6240aedc5d9394c20cf67f0e394
--- /dev/null
+++ b/doxygen/make.sh
@@ -0,0 +1,3 @@
+set -e
+doxygen Doxyfile
+doxybook -i doxygen/xml -o doxygen -t vuepress
diff --git a/doxygen/modules.md b/doxygen/modules.md
new file mode 100644
index 0000000000000000000000000000000000000000..b7114c4665df97bed095642b83432c45988bb1c6
--- /dev/null
+++ b/doxygen/modules.md
@@ -0,0 +1,12 @@
+---
+title: Modules
+meta:
+  - name: keywords
+    content: decoder encoder
+---
+
+# Modules
+
+Here is a list of all modules:
+* **[decoder](group__decoder.md)** The clientside part of the project for decoding the signal. 
+* **[encoder](group__encoder.md)** The server side part of the project for encoding the data into signal. 
diff --git a/doxygen/namespace_rew.md b/doxygen/namespace_rew.md
new file mode 100644
index 0000000000000000000000000000000000000000..94a61aa741d5f343fe7baf7c996e56c8b68f1863
--- /dev/null
+++ b/doxygen/namespace_rew.md
@@ -0,0 +1,55 @@
+---
+title: namespace Rew
+meta:
+  - name: keywords
+    content: Rew AudioWriter Bucket ByteAssembler Decoder Encoder Goertzel Synth ToneSynth WavWriter saveWav
+---
+
+# namespace Rew
+
+[**Class List**](annotated.md) **>** [**Rew**](namespace_rew.md)
+
+
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**AudioWriter**](class_rew_1_1_audio_writer.md)|
+|class|[**Bucket**](class_rew_1_1_bucket.md)|
+|class|[**ByteAssembler**](class_rew_1_1_byte_assembler.md)|
+|class|[**Decoder**](class_rew_1_1_decoder.md)|
+|class|[**Encoder**](class_rew_1_1_encoder.md)|
+|class|[**Goertzel**](class_rew_1_1_goertzel.md)|
+|class|[**Synth**](class_rew_1_1_synth.md)|
+|class|[**ToneSynth**](class_rew_1_1_tone_synth.md)|
+|class|[**WavWriter**](class_rew_1_1_wav_writer.md)|
+
+
+## Functions
+
+|Type|Name|
+|-----|-----|
+|bool|[**saveWav**](namespace_rew.md#function-savewav) (const std::string & path, const unsigned char \* data, size\_t size, int bitsPerSample, int sampleRate, int numChannels) |
+
+
+## Functions Documentation
+
+### function saveWav
+
+```cpp
+bool Rew::saveWav (
+    const std::string & path,
+    const unsigned char * data,
+    size_t size,
+    int bitsPerSample,
+    int sampleRate,
+    int numChannels
+)
+```
+
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/decoder/bucket.h`
diff --git a/doxygen/pages.md b/doxygen/pages.md
new file mode 100644
index 0000000000000000000000000000000000000000..d94ab5459a75eed8c360c96549227e7c0e1d03c2
--- /dev/null
+++ b/doxygen/pages.md
@@ -0,0 +1,7 @@
+---
+title: Related Pages
+---
+
+# Related Pages
+
+Here is a list of all related documentation pages:
diff --git a/doxygen/synth_8h.md b/doxygen/synth_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..11b74f904f9eec45fba2f0a706a71f796f17b542
--- /dev/null
+++ b/doxygen/synth_8h.md
@@ -0,0 +1,21 @@
+---
+title: file synth.h
+meta:
+  - name: keywords
+    content: synth.h Rew::Synth
+---
+
+# file synth.h
+
+**[Go to the source code of this file.](synth_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::Synth**](class_rew_1_1_synth.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/synth.h`
diff --git a/doxygen/synth_8h_source.md b/doxygen/synth_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..38906744c8a6383d91b93da8bc8bf241319f9e36
--- /dev/null
+++ b/doxygen/synth_8h_source.md
@@ -0,0 +1,41 @@
+---
+title: synth.h File Reference
+meta:
+  - name: keywords
+    content: synth.h file
+---
+
+# synth.h File Reference
+
+**[Go to the documentation of this file.](synth_8h.md)**
+Source: `include/encoder/synth.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_EMITTER_SYNTH_H
+#define REW_EMITTER_SYNTH_H
+
+#include "../config.h"
+
+REW_NAMESPACE {
+    class REW_API Synth {
+    public:
+        virtual size_t operator()(float* dst) const = 0;
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/tone__synth_8h.md b/doxygen/tone__synth_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..83c8d6556235e22872d4d419e02629f07115c3cc
--- /dev/null
+++ b/doxygen/tone__synth_8h.md
@@ -0,0 +1,21 @@
+---
+title: file tone_synth.h
+meta:
+  - name: keywords
+    content: tone_synth.h Rew::ToneSynth
+---
+
+# file tone\_synth.h
+
+**[Go to the source code of this file.](tone__synth_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::ToneSynth**](class_rew_1_1_tone_synth.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/tone\_synth.h`
diff --git a/doxygen/tone__synth_8h_source.md b/doxygen/tone__synth_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..6ea6c2572a800461814905b60e498b42aee19aa7
--- /dev/null
+++ b/doxygen/tone__synth_8h_source.md
@@ -0,0 +1,60 @@
+---
+title: tone_synth.h File Reference
+meta:
+  - name: keywords
+    content: tone_synth.h file
+---
+
+# tone\_synth.h File Reference
+
+**[Go to the documentation of this file.](tone__synth_8h.md)**
+Source: `include/encoder/tone\_synth.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_EMITTER_TONE_SYNTH_H
+#define REW_EMITTER_TONE_SYNTH_H
+
+#include <memory>
+#include "synth.h"
+
+REW_NAMESPACE {
+    class REW_API ToneSynth: public Synth {
+    public:
+        ToneSynth(size_t frequency, size_t sampleRate, double ms);
+        ToneSynth(ToneSynth&& other) noexcept = default;
+        ToneSynth(const ToneSynth& other) = delete;
+        ToneSynth& operator = (ToneSynth&& other) noexcept = default;
+        ToneSynth& operator = (const ToneSynth& other) = delete;
+
+        size_t operator()(float* dst) const override;
+        inline size_t getSamplesPerBlock() const {
+            return total;
+        }
+    private:
+        void allocate(size_t sampleRate, double ms);
+
+
+        size_t frequency;
+        size_t total;
+        std::unique_ptr<float[]> src;
+
+    };
+}
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/variables.md b/doxygen/variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..28a2b9985ef48b0c318f355026587865f8087a67
--- /dev/null
+++ b/doxygen/variables.md
@@ -0,0 +1,89 @@
+---
+title: Variable Index
+meta:
+  - name: keywords
+    content: AudioWriter::bitsPerSample Goertzel::blockSize Decoder::buffer Decoder::byteAssembler AudioWriter::channelCount AudioWriter::chunkSize Goertzel::coeff Goertzel::cosine WavWriter::dataOffset WavWriter::dataWritten WavWriter::eos ToneSynth::frequency Decoder::highGoertzel Encoder::highTone AudioWriter::loaded Decoder::lowGoertzel Encoder::lowTone Encoder::nullTone WavWriter::output Goertzel::Q1 Goertzel::Q2 AudioWriter::sampleRate Goertzel::sine AudioWriter::size ToneSynth::src ToneSynth::total Bucket::vector
+---
+
+# Variable Index
+
+Here is a list of all variables with links to the class documentation for each member:
+## B
+
+* **bitsPerSample** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#variable-bitspersample))
+* **blockSize** ([**Rew::Decoder**](class_rew_1_1_decoder.md#variable-blocksize), [**Rew::Goertzel**](class_rew_1_1_goertzel.md#variable-blocksize))
+* **buffer** ([**Rew::ByteAssembler**](class_rew_1_1_byte_assembler.md#variable-buffer), [**Rew::Decoder**](class_rew_1_1_decoder.md#variable-buffer))
+* **byteAssembler** ([**Rew::Decoder**](class_rew_1_1_decoder.md#variable-byteassembler))
+
+
+## C
+
+* **channelCount** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#variable-channelcount))
+* **chunkSize** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#variable-chunksize))
+* **coeff** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#variable-coeff))
+* **cosine** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#variable-cosine))
+
+
+## D
+
+* **dataOffset** ([**Rew::WavWriter**](class_rew_1_1_wav_writer.md#variable-dataoffset))
+* **dataWritten** ([**Rew::WavWriter**](class_rew_1_1_wav_writer.md#variable-datawritten))
+
+
+## E
+
+* **eos** ([**Rew::WavWriter**](class_rew_1_1_wav_writer.md#variable-eos))
+
+
+## F
+
+* **frequency** ([**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#variable-frequency))
+
+
+## H
+
+* **highGoertzel** ([**Rew::Decoder**](class_rew_1_1_decoder.md#variable-highgoertzel))
+* **highTone** ([**Rew::Encoder**](class_rew_1_1_encoder.md#variable-hightone))
+
+
+## L
+
+* **loaded** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#variable-loaded))
+* **lowGoertzel** ([**Rew::Decoder**](class_rew_1_1_decoder.md#variable-lowgoertzel))
+* **lowTone** ([**Rew::Encoder**](class_rew_1_1_encoder.md#variable-lowtone))
+
+
+## N
+
+* **nullTone** ([**Rew::Encoder**](class_rew_1_1_encoder.md#variable-nulltone))
+
+
+## O
+
+* **output** ([**Rew::WavWriter**](class_rew_1_1_wav_writer.md#variable-output))
+
+
+## Q
+
+* **Q1** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#variable-q1))
+* **Q2** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#variable-q2))
+
+
+## S
+
+* **sampleRate** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#variable-samplerate))
+* **sine** ([**Rew::Goertzel**](class_rew_1_1_goertzel.md#variable-sine))
+* **size** ([**Rew::AudioWriter**](class_rew_1_1_audio_writer.md#variable-size))
+* **src** ([**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#variable-src))
+
+
+## T
+
+* **total** ([**Rew::ToneSynth**](class_rew_1_1_tone_synth.md#variable-total))
+
+
+## V
+
+* **vector** ([**Rew::Bucket**](class_rew_1_1_bucket.md#variable-vector))
+
+
diff --git a/doxygen/wav__writer_8h.md b/doxygen/wav__writer_8h.md
new file mode 100644
index 0000000000000000000000000000000000000000..c5fbf72c80fa7f8e7b03fdefeed0410f5dcd903e
--- /dev/null
+++ b/doxygen/wav__writer_8h.md
@@ -0,0 +1,21 @@
+---
+title: file wav_writer.h
+meta:
+  - name: keywords
+    content: wav_writer.h Rew::WavWriter
+---
+
+# file wav\_writer.h
+
+**[Go to the source code of this file.](wav__writer_8h_source.md)**
+## Classes
+
+|Type|Name|
+|-----|-----|
+|class|[**Rew::WavWriter**](class_rew_1_1_wav_writer.md)|
+
+
+
+
+----------------------------------------
+The documentation for this class was generated from the following file: `include/encoder/wav\_writer.h`
diff --git a/doxygen/wav__writer_8h_source.md b/doxygen/wav__writer_8h_source.md
new file mode 100644
index 0000000000000000000000000000000000000000..05b595a58c928b49d1924ea5fe3ec360ed3b29be
--- /dev/null
+++ b/doxygen/wav__writer_8h_source.md
@@ -0,0 +1,58 @@
+---
+title: wav_writer.h File Reference
+meta:
+  - name: keywords
+    content: wav_writer.h file
+---
+
+# wav\_writer.h File Reference
+
+**[Go to the documentation of this file.](wav__writer_8h.md)**
+Source: `include/encoder/wav\_writer.h`
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+```cpp
+#ifndef REW_WAV_SAVER
+#define REW_WAV_SAVER
+
+#include <fstream>
+#include "audio_writer.h"
+
+REW_NAMESPACE {
+    class REW_API WavWriter : public AudioWriter {
+    public:
+        WavWriter();
+        virtual ~WavWriter();
+
+        bool open(const std::string& path, size_t size, int bitsPerSample, int sampleRate, int numChannels) override;
+        void close() override;
+        bool writeChunk(const unsigned char* data, size_t* bytesWritten) override;
+        bool writeFooter() override;
+        bool eof() const override;
+        size_t getPos() const override;
+    private:
+        std::fstream output;
+        bool eos;
+        size_t dataOffset;
+        size_t dataWritten;
+    };
+
+    bool REW_API saveWav(const std::string& path, const unsigned char* data, size_t size, int bitsPerSample, int sampleRate, int numChannels);
+};
+
+#endif
+```
+
+
+    
+  
diff --git a/doxygen/xml/audio__writer_8h.xml b/doxygen/xml/audio__writer_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..466b2dfcffccd33ab2d4f68f19981b470d43862a
--- /dev/null
+++ b/doxygen/xml/audio__writer_8h.xml
@@ -0,0 +1,100 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="audio__writer_8h" kind="file" language="C++">
+    <compoundname>audio_writer.h</compoundname>
+    <includes local="no">fstream</includes>
+    <includes local="no">string</includes>
+    <includes refid="config_8h" local="yes">../config.h</includes>
+    <includedby refid="wav__writer_8h" local="yes">include/encoder/wav_writer.h</includedby>
+    <incdepgraph>
+      <node id="43">
+        <label>include/encoder/audio_writer.h</label>
+        <link refid="audio__writer_8h"/>
+        <childnode refid="44" relation="include">
+        </childnode>
+        <childnode refid="45" relation="include">
+        </childnode>
+        <childnode refid="46" relation="include">
+        </childnode>
+      </node>
+      <node id="45">
+        <label>string</label>
+      </node>
+      <node id="44">
+        <label>fstream</label>
+      </node>
+      <node id="47">
+        <label>cstddef</label>
+      </node>
+      <node id="46">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="47" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="49">
+        <label>include/encoder/wav_writer.h</label>
+        <link refid="wav__writer_8h"/>
+        <childnode refid="50" relation="include">
+        </childnode>
+      </node>
+      <node id="48">
+        <label>include/encoder/audio_writer.h</label>
+        <link refid="audio__writer_8h"/>
+        <childnode refid="49" relation="include">
+        </childnode>
+      </node>
+      <node id="50">
+        <label>include/encoder/encoder.h</label>
+        <link refid="encoder_8h"/>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_audio_writer" prot="public">Rew::AudioWriter</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_AUDIO_SAVER</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_AUDIO_SAVER</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;fstream&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;string&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;../config.h&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"></highlight></codeline>
+<codeline lineno="8"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref>{</highlight></codeline>
+<codeline lineno="13" refid="class_rew_1_1_audio_writer" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_audio_writer" kindref="compound">AudioWriter</ref><sp/>{</highlight></codeline>
+<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_audio_writer" kindref="compound">AudioWriter</ref>();</highlight></codeline>
+<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/>~<ref refid="class_rew_1_1_audio_writer" kindref="compound">AudioWriter</ref>()<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>open(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::string&amp;<sp/>path,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>size,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>bitsPerSample,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>sampleRate,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>numChannels)<sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>writeChunk(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>data,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal">*<sp/>bytesWritten)<sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>writeFooter()<sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="33"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>close()<sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="37"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>eof()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>getPos()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="45"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>isOpen()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>getSize()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="53"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>getSampleRate()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="57"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>getNumOfChannels()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>getBitsPerSample()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>getChunkSize()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="69"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">operator</highlight><highlight class="normal"><sp/>bool()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="70"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">protected</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="71" refid="class_rew_1_1_audio_writer_1a4eca6a6861551d45c1d079d3971f01df" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a4eca6a6861551d45c1d079d3971f01df" kindref="member">loaded</ref>;</highlight></codeline>
+<codeline lineno="72" refid="class_rew_1_1_audio_writer_1aa84a112f4f791cad425aa63f3b412efa" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1aa84a112f4f791cad425aa63f3b412efa" kindref="member">size</ref>;</highlight></codeline>
+<codeline lineno="73" refid="class_rew_1_1_audio_writer_1a71567e58f680b1f3346727ce20d09115" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a71567e58f680b1f3346727ce20d09115" kindref="member">sampleRate</ref>;</highlight></codeline>
+<codeline lineno="74" refid="class_rew_1_1_audio_writer_1aabfb8aed29b83114ff67ae2a0a063bbb" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1aabfb8aed29b83114ff67ae2a0a063bbb" kindref="member">channelCount</ref>;</highlight></codeline>
+<codeline lineno="75" refid="class_rew_1_1_audio_writer_1ac3d60ac33859cc0688ca3761b5dbf010" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1ac3d60ac33859cc0688ca3761b5dbf010" kindref="member">bitsPerSample</ref>;</highlight></codeline>
+<codeline lineno="76" refid="class_rew_1_1_audio_writer_1a0f0e4ea476c6e557af77ba1902cdde13" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a0f0e4ea476c6e557af77ba1902cdde13" kindref="member">chunkSize</ref>;</highlight></codeline>
+<codeline lineno="77"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="78"><highlight class="normal">};</highlight></codeline>
+<codeline lineno="79"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="80"><highlight class="normal"></highlight></codeline>
+    </programlisting>
+    <location file="include/encoder/audio_writer.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/bucket_8h.xml b/doxygen/xml/bucket_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fe07b05d8faa31593c4aac3a6f04bdf5af37eb3b
--- /dev/null
+++ b/doxygen/xml/bucket_8h.xml
@@ -0,0 +1,130 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="bucket_8h" kind="file" language="C++">
+    <compoundname>bucket.h</compoundname>
+    <includes refid="config_8h" local="yes">../config.h</includes>
+    <includes local="no">vector</includes>
+    <includedby refid="byte__assembler_8h" local="yes">include/decoder/byte_assembler.h</includedby>
+    <incdepgraph>
+      <node id="12">
+        <label>include/decoder/bucket.h</label>
+        <link refid="bucket_8h"/>
+        <childnode refid="13" relation="include">
+        </childnode>
+        <childnode refid="15" relation="include">
+        </childnode>
+      </node>
+      <node id="15">
+        <label>vector</label>
+      </node>
+      <node id="14">
+        <label>cstddef</label>
+      </node>
+      <node id="13">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="14" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="16">
+        <label>include/decoder/bucket.h</label>
+        <link refid="bucket_8h"/>
+        <childnode refid="17" relation="include">
+        </childnode>
+      </node>
+      <node id="18">
+        <label>include/decoder/decoder.h</label>
+        <link refid="decoder_8h"/>
+      </node>
+      <node id="17">
+        <label>include/decoder/byte_assembler.h</label>
+        <link refid="byte__assembler_8h"/>
+        <childnode refid="18" relation="include">
+        </childnode>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_bucket" prot="public">Rew::Bucket</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_BUCKET_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_BUCKET_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;../config.h&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;vector&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight></codeline>
+<codeline lineno="7" refid="namespace_rew" refkind="compound"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="11"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">template</highlight><highlight class="normal"><sp/>&lt;</highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>T&gt;</highlight></codeline>
+<codeline lineno="12" refid="class_rew_1_1_bucket" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref><sp/>{</highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>()<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="15" refid="class_rew_1_1_bucket_1aa80d0bdc739c2446e33312b6f7fa1fae" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_bucket_1aa80d0bdc739c2446e33312b6f7fa1fae" kindref="member">Bucket</ref>(<ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;&amp;<sp/>other)<sp/>noexcept:<sp/>vector(std::move(other.vector))<sp/>{</highlight></codeline>
+<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight></codeline>
+<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/>~<ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>()<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="20" refid="class_rew_1_1_bucket_1aa34958b0d7d35a288b45952460fe322e" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_bucket_1aa34958b0d7d35a288b45952460fe322e" kindref="member">swap</ref>(<ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;<sp/>other)<sp/>noexcept<sp/>{</highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">using</highlight><highlight class="normal"><sp/>std::swap;</highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>swap(vector,<sp/>other.vector);</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="24" refid="class_rew_1_1_bucket_1a24d6780a56671976c1dd50eec59f90f4" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;<sp/>operator<sp/>=<sp/>(<ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;&amp;<sp/>other)<sp/>noexcept<sp/>{</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">this</highlight><highlight class="normal"><sp/>!=<sp/>&amp;other)<sp/>{</highlight></codeline>
+<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>swap(other);</highlight></codeline>
+<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>*</highlight><highlight class="keyword">this</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;<sp/>operator<sp/>=<sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="31"><highlight class="normal"></highlight></codeline>
+<codeline lineno="32" refid="class_rew_1_1_bucket_1ac5cbeedb6b0b579ec26c9669a6754571" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_bucket_1ac5cbeedb6b0b579ec26c9669a6754571" kindref="member">pushBack</ref><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::value_type&amp;<sp/>value)<sp/>{</highlight></codeline>
+<codeline lineno="33"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(vector.capacity()<sp/>&lt;=<sp/>vector.size())<sp/>{</highlight></codeline>
+<codeline lineno="34"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>vector.reserve(vector.capacity()<sp/>+<sp/>64);</highlight></codeline>
+<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="36"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>vector.push_back(value);</highlight></codeline>
+<codeline lineno="37"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="38"><highlight class="normal"></highlight></codeline>
+<codeline lineno="39" refid="class_rew_1_1_bucket_1a220215d7c14acc8ebf3a93918f81468b" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_bucket_1a220215d7c14acc8ebf3a93918f81468b" kindref="member">size</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
+<codeline lineno="40"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector.size();</highlight></codeline>
+<codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="42"><highlight class="normal"></highlight></codeline>
+<codeline lineno="43" refid="class_rew_1_1_bucket_1a412e4d2186c14d8296f17c63ff7465d8" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::iterator<sp/><ref refid="class_rew_1_1_bucket_1a412e4d2186c14d8296f17c63ff7465d8" kindref="member">begin</ref>()<sp/>{</highlight></codeline>
+<codeline lineno="44"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector.begin();</highlight></codeline>
+<codeline lineno="45"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="46"><highlight class="normal"></highlight></codeline>
+<codeline lineno="47" refid="class_rew_1_1_bucket_1afc320156c6efd79f8e86667aa7f7cb05" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::const_iterator<sp/><ref refid="class_rew_1_1_bucket_1afc320156c6efd79f8e86667aa7f7cb05" kindref="member">begin</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
+<codeline lineno="48"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector.begin();</highlight></codeline>
+<codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="50"><highlight class="normal"></highlight></codeline>
+<codeline lineno="51" refid="class_rew_1_1_bucket_1a51fb9092c7601809ce04367ae1cc8beb" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::iterator<sp/><ref refid="class_rew_1_1_bucket_1a51fb9092c7601809ce04367ae1cc8beb" kindref="member">end</ref>()<sp/>{</highlight></codeline>
+<codeline lineno="52"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector.end();</highlight></codeline>
+<codeline lineno="53"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="54"><highlight class="normal"></highlight></codeline>
+<codeline lineno="55" refid="class_rew_1_1_bucket_1a8b0f1a414910a05f2742dccdcb7e3fa9" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::const_iterator<sp/><ref refid="class_rew_1_1_bucket_1a8b0f1a414910a05f2742dccdcb7e3fa9" kindref="member">end</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
+<codeline lineno="56"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector.end();</highlight></codeline>
+<codeline lineno="57"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="58"><highlight class="normal"></highlight></codeline>
+<codeline lineno="59" refid="class_rew_1_1_bucket_1ab0490d14ae89f27f16982294ae1f56e1" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_bucket_1ab0490d14ae89f27f16982294ae1f56e1" kindref="member">clear</ref>()<sp/>{</highlight></codeline>
+<codeline lineno="60"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>vector.clear();</highlight></codeline>
+<codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="62"><highlight class="normal"></highlight></codeline>
+<codeline lineno="63" refid="class_rew_1_1_bucket_1acda8cc938f48bf23c01b3644ff0d114c" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::value_type&amp;<sp/><ref refid="class_rew_1_1_bucket_1acda8cc938f48bf23c01b3644ff0d114c" kindref="member">operator[]</ref>(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>i)<sp/>{</highlight></codeline>
+<codeline lineno="64"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector[i];</highlight></codeline>
+<codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="66"><highlight class="normal"></highlight></codeline>
+<codeline lineno="67" refid="class_rew_1_1_bucket_1a03c0248f1d3e025dda02331ca6e54bd2" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>std::vector&lt;T&gt;::value_type&amp;<sp/><ref refid="class_rew_1_1_bucket_1a03c0248f1d3e025dda02331ca6e54bd2" kindref="member">operator[]</ref>(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>i)</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
+<codeline lineno="68"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>vector[i];</highlight></codeline>
+<codeline lineno="69"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="70"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="71"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;T&gt;<sp/>vector;</highlight></codeline>
+<codeline lineno="72"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="73"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="74"><highlight class="normal"></highlight></codeline>
+<codeline lineno="75"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/decoder/bucket.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/byte__assembler_8h.xml b/doxygen/xml/byte__assembler_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ff1adc7d3d573d9c83fd99637aa399101862d2b4
--- /dev/null
+++ b/doxygen/xml/byte__assembler_8h.xml
@@ -0,0 +1,92 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="byte__assembler_8h" kind="file" language="C++">
+    <compoundname>byte_assembler.h</compoundname>
+    <includes refid="config_8h" local="yes">../config.h</includes>
+    <includes refid="bucket_8h" local="yes">bucket.h</includes>
+    <includes local="no">functional</includes>
+    <includedby refid="decoder_8h" local="yes">include/decoder/decoder.h</includedby>
+    <incdepgraph>
+      <node id="24">
+        <label>functional</label>
+      </node>
+      <node id="22">
+        <label>bucket.h</label>
+        <link refid="bucket_8h"/>
+        <childnode refid="20" relation="include">
+        </childnode>
+        <childnode refid="23" relation="include">
+        </childnode>
+      </node>
+      <node id="23">
+        <label>vector</label>
+      </node>
+      <node id="21">
+        <label>cstddef</label>
+      </node>
+      <node id="20">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="21" relation="include">
+        </childnode>
+      </node>
+      <node id="19">
+        <label>include/decoder/byte_assembler.h</label>
+        <link refid="byte__assembler_8h"/>
+        <childnode refid="20" relation="include">
+        </childnode>
+        <childnode refid="22" relation="include">
+        </childnode>
+        <childnode refid="24" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="26">
+        <label>include/decoder/decoder.h</label>
+        <link refid="decoder_8h"/>
+      </node>
+      <node id="25">
+        <label>include/decoder/byte_assembler.h</label>
+        <link refid="byte__assembler_8h"/>
+        <childnode refid="26" relation="include">
+        </childnode>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_byte_assembler" prot="public">Rew::ByteAssembler</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_BYTE_ASSEMBLER_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_BYTE_ASSEMBLER_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;../config.h&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="bucket_8h" kindref="compound">bucket.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;functional&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"></highlight></codeline>
+<codeline lineno="8"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="12" refid="class_rew_1_1_byte_assembler" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref><sp/>{</highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>();</highlight></codeline>
+<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>(<ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>swap(<ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;<sp/>operator<sp/>=<sp/>(<ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;<sp/>operator<sp/>=<sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="20"><highlight class="normal"></highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>operator()(</highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal"><sp/>magnitude,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::function&lt;</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">(</highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">)&gt;&amp;<sp/>callback);</highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>countValue(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>begin,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>end,<sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal"><sp/>value);</highlight></codeline>
+<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal"><sp/>toByte(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>begin,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>end);</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket&lt;unsigned char&gt;</ref><sp/>buffer;</highlight></codeline>
+<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="27"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"></highlight></codeline>
+<codeline lineno="29"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/decoder/byte_assembler.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_audio_writer.xml b/doxygen/xml/class_rew_1_1_audio_writer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4c6442b657afaa01939e7e1afd57b7616a2eaa7d
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_audio_writer.xml
@@ -0,0 +1,360 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_audio_writer" kind="class" language="C++" prot="public" abstract="yes">
+    <compoundname>Rew::AudioWriter</compoundname>
+    <derivedcompoundref refid="class_rew_1_1_wav_writer" prot="public" virt="non-virtual">Rew::WavWriter</derivedcompoundref>
+    <includes refid="audio__writer_8h" local="no">audio_writer.h</includes>
+      <sectiondef kind="protected-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_audio_writer_1a4eca6a6861551d45c1d079d3971f01df" prot="protected" static="no" mutable="no">
+        <type>bool</type>
+        <definition>bool Rew::AudioWriter::loaded</definition>
+        <argsstring></argsstring>
+        <name>loaded</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="71" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="71" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_audio_writer_1aa84a112f4f791cad425aa63f3b412efa" prot="protected" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::AudioWriter::size</definition>
+        <argsstring></argsstring>
+        <name>size</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="72" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="72" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_audio_writer_1a71567e58f680b1f3346727ce20d09115" prot="protected" static="no" mutable="no">
+        <type>int</type>
+        <definition>int Rew::AudioWriter::sampleRate</definition>
+        <argsstring></argsstring>
+        <name>sampleRate</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="73" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="73" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_audio_writer_1aabfb8aed29b83114ff67ae2a0a063bbb" prot="protected" static="no" mutable="no">
+        <type>int</type>
+        <definition>int Rew::AudioWriter::channelCount</definition>
+        <argsstring></argsstring>
+        <name>channelCount</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="74" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="74" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_audio_writer_1ac3d60ac33859cc0688ca3761b5dbf010" prot="protected" static="no" mutable="no">
+        <type>int</type>
+        <definition>int Rew::AudioWriter::bitsPerSample</definition>
+        <argsstring></argsstring>
+        <name>bitsPerSample</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="75" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="75" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_audio_writer_1a0f0e4ea476c6e557af77ba1902cdde13" prot="protected" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::AudioWriter::chunkSize</definition>
+        <argsstring></argsstring>
+        <name>chunkSize</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="76" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="76" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a7898acd23a7adbbc1c1fe96220608957" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::AudioWriter::AudioWriter</definition>
+        <argsstring>()</argsstring>
+        <name>AudioWriter</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="15" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a88b3be8be3b8bd644a16939e7faefcd5" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type></type>
+        <definition>virtual Rew::AudioWriter::~AudioWriter</definition>
+        <argsstring>()=default</argsstring>
+        <name>~AudioWriter</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="16" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a619c520a49467c7dd6a6bee0d3ac399c" prot="public" static="no" const="no" explicit="no" inline="no" virt="pure-virtual">
+        <type>bool</type>
+        <definition>virtual bool Rew::AudioWriter::open</definition>
+        <argsstring>(const std::string &amp;path, size_t size, int bitsPerSample, int sampleRate, int numChannels)=0</argsstring>
+        <name>open</name>
+        <reimplementedby refid="class_rew_1_1_wav_writer_1a4700f564e14ca54a319ed2a23337581b">open</reimplementedby>
+        <param>
+          <type>const std::string &amp;</type>
+          <declname>path</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>size</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>bitsPerSample</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>sampleRate</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>numChannels</declname>
+        </param>
+        <briefdescription>
+<para>Opens a file for writing. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="20" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a4ac109653fd08b3d51dd54930593b859" prot="public" static="no" const="no" explicit="no" inline="no" virt="pure-virtual">
+        <type>bool</type>
+        <definition>virtual bool Rew::AudioWriter::writeChunk</definition>
+        <argsstring>(const unsigned char *data, size_t *bytesWritten)=0</argsstring>
+        <name>writeChunk</name>
+        <reimplementedby refid="class_rew_1_1_wav_writer_1a21f12fc360fee57a7cfc85d9a4ff07be">writeChunk</reimplementedby>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>data</declname>
+        </param>
+        <param>
+          <type>size_t *</type>
+          <declname>bytesWritten</declname>
+        </param>
+        <briefdescription>
+<para>Writes a chunk of data to file. </para>        </briefdescription>
+        <detaileddescription>
+<para><simplesect kind="see"><para><ref refid="class_rew_1_1_audio_writer_1a16c70083411cc3921233092c0ad632c3" kindref="member">getChunkSize</ref> </para></simplesect>
+</para>        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="25" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1aa8b315cb43e7598aa1b1ea2ff0e036af" prot="public" static="no" const="no" explicit="no" inline="no" virt="pure-virtual">
+        <type>bool</type>
+        <definition>virtual bool Rew::AudioWriter::writeFooter</definition>
+        <argsstring>()=0</argsstring>
+        <name>writeFooter</name>
+        <reimplementedby refid="class_rew_1_1_wav_writer_1a0ca68ad62f42f0eb1334ffc49319f4a1">writeFooter</reimplementedby>
+        <briefdescription>
+<para>Writes a footer. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="29" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a2d891dcd78323ef0ba32335041eb923c" prot="public" static="no" const="no" explicit="no" inline="no" virt="pure-virtual">
+        <type>void</type>
+        <definition>virtual void Rew::AudioWriter::close</definition>
+        <argsstring>()=0</argsstring>
+        <name>close</name>
+        <reimplementedby refid="class_rew_1_1_wav_writer_1a017679508e2b7f7645ff6192e275af54">close</reimplementedby>
+        <briefdescription>
+<para>Closes the file. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="33" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a5288a2b883fab9d06d8292c6a657c077" prot="public" static="no" const="yes" explicit="no" inline="no" virt="pure-virtual">
+        <type>bool</type>
+        <definition>virtual bool Rew::AudioWriter::eof</definition>
+        <argsstring>() const =0</argsstring>
+        <name>eof</name>
+        <reimplementedby refid="class_rew_1_1_wav_writer_1a2fee28dbc8c223c8b7e361eaf65ce22f">eof</reimplementedby>
+        <briefdescription>
+<para>Checks if end of file. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="37" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1ae3d33d0968b52793b545d46c7e8cdb55" prot="public" static="no" const="yes" explicit="no" inline="no" virt="pure-virtual">
+        <type>size_t</type>
+        <definition>virtual size_t Rew::AudioWriter::getPos</definition>
+        <argsstring>() const =0</argsstring>
+        <name>getPos</name>
+        <reimplementedby refid="class_rew_1_1_wav_writer_1a4314c21ee94386f745f951c57d82bc7f">getPos</reimplementedby>
+        <briefdescription>
+<para>Returns current write position in bytes. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="41" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1ab3f42f0f4b515dadd3de7c51f857d042" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>bool</type>
+        <definition>bool Rew::AudioWriter::isOpen</definition>
+        <argsstring>() const</argsstring>
+        <name>isOpen</name>
+        <briefdescription>
+<para>Checks if file is open. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="45" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a344835d861a600f89454e35bfe4958b9" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::AudioWriter::getSize</definition>
+        <argsstring>() const</argsstring>
+        <name>getSize</name>
+        <briefdescription>
+<para>Returns the target output size specified in function create() </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="49" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1af5e4622f9b4faa35bb553522766c5cd8" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>int</type>
+        <definition>int Rew::AudioWriter::getSampleRate</definition>
+        <argsstring>() const</argsstring>
+        <name>getSampleRate</name>
+        <briefdescription>
+<para>Returns the sample rate. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="53" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1ab3a2df9304221bd8e4b593efe277598a" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>int</type>
+        <definition>int Rew::AudioWriter::getNumOfChannels</definition>
+        <argsstring>() const</argsstring>
+        <name>getNumOfChannels</name>
+        <briefdescription>
+<para>Returns the number of channels. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="57" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a8255a4d834e892a6594bcd1e449aa54f" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>int</type>
+        <definition>int Rew::AudioWriter::getBitsPerSample</definition>
+        <argsstring>() const</argsstring>
+        <name>getBitsPerSample</name>
+        <briefdescription>
+<para>Returns the bit depth of one sample. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="61" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1a16c70083411cc3921233092c0ad632c3" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::AudioWriter::getChunkSize</definition>
+        <argsstring>() const</argsstring>
+        <name>getChunkSize</name>
+        <briefdescription>
+<para>Returns the size of a chunk in bytes used by function <ref refid="class_rew_1_1_audio_writer_1a4ac109653fd08b3d51dd54930593b859" kindref="member">writeChunk()</ref> </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="65" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_audio_writer_1ae11b1fa568d431d6a976bee5f14d38d8" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::AudioWriter::operator bool</definition>
+        <argsstring>() const</argsstring>
+        <name>operator bool</name>
+        <briefdescription>
+<para>Checks if a file is open. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/audio_writer.h" line="69" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+<para>Audio saver base class. </para>    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <inheritancegraph>
+      <node id="1">
+        <label>Rew::WavWriter</label>
+        <link refid="class_rew_1_1_wav_writer"/>
+        <childnode refid="0" relation="public-inheritance">
+        </childnode>
+      </node>
+      <node id="0">
+        <label>Rew::AudioWriter</label>
+        <link refid="class_rew_1_1_audio_writer"/>
+      </node>
+    </inheritancegraph>
+    <location file="include/encoder/audio_writer.h" line="13" column="1" bodyfile="include/encoder/audio_writer.h" bodystart="13" bodyend="77"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_audio_writer_1a7898acd23a7adbbc1c1fe96220608957" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>AudioWriter</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ac3d60ac33859cc0688ca3761b5dbf010" prot="protected" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>bitsPerSample</name></member>
+      <member refid="class_rew_1_1_audio_writer_1aabfb8aed29b83114ff67ae2a0a063bbb" prot="protected" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>channelCount</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a0f0e4ea476c6e557af77ba1902cdde13" prot="protected" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>chunkSize</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a2d891dcd78323ef0ba32335041eb923c" prot="public" virt="pure-virtual"><scope>Rew::AudioWriter</scope><name>close</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a5288a2b883fab9d06d8292c6a657c077" prot="public" virt="pure-virtual"><scope>Rew::AudioWriter</scope><name>eof</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a8255a4d834e892a6594bcd1e449aa54f" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>getBitsPerSample</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a16c70083411cc3921233092c0ad632c3" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>getChunkSize</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ab3a2df9304221bd8e4b593efe277598a" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>getNumOfChannels</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ae3d33d0968b52793b545d46c7e8cdb55" prot="public" virt="pure-virtual"><scope>Rew::AudioWriter</scope><name>getPos</name></member>
+      <member refid="class_rew_1_1_audio_writer_1af5e4622f9b4faa35bb553522766c5cd8" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>getSampleRate</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a344835d861a600f89454e35bfe4958b9" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>getSize</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ab3f42f0f4b515dadd3de7c51f857d042" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>isOpen</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a4eca6a6861551d45c1d079d3971f01df" prot="protected" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>loaded</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a619c520a49467c7dd6a6bee0d3ac399c" prot="public" virt="pure-virtual"><scope>Rew::AudioWriter</scope><name>open</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ae11b1fa568d431d6a976bee5f14d38d8" prot="public" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>operator bool</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a71567e58f680b1f3346727ce20d09115" prot="protected" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>sampleRate</name></member>
+      <member refid="class_rew_1_1_audio_writer_1aa84a112f4f791cad425aa63f3b412efa" prot="protected" virt="non-virtual"><scope>Rew::AudioWriter</scope><name>size</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a4ac109653fd08b3d51dd54930593b859" prot="public" virt="pure-virtual"><scope>Rew::AudioWriter</scope><name>writeChunk</name></member>
+      <member refid="class_rew_1_1_audio_writer_1aa8b315cb43e7598aa1b1ea2ff0e036af" prot="public" virt="pure-virtual"><scope>Rew::AudioWriter</scope><name>writeFooter</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a88b3be8be3b8bd644a16939e7faefcd5" prot="public" virt="virtual"><scope>Rew::AudioWriter</scope><name>~AudioWriter</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_bucket.xml b/doxygen/xml/class_rew_1_1_bucket.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bc12fcc79a7c8cb24ec5222daea5588694d0874e
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_bucket.xml
@@ -0,0 +1,295 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_bucket" kind="class" language="C++" prot="public">
+    <compoundname>Rew::Bucket</compoundname>
+    <includes refid="bucket_8h" local="no">bucket.h</includes>
+    <templateparamlist>
+      <param>
+        <type>typename</type>
+        <declname>T</declname>
+        <defname>T</defname>
+      </param>
+    </templateparamlist>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_bucket_1acbc95b93eb4ceff039ee2bf9050dfd3b" prot="private" static="no" mutable="no">
+        <type>std::vector&lt; T &gt;</type>
+        <definition>std::vector&lt;T&gt; Rew::Bucket&lt; T &gt;::vector</definition>
+        <argsstring></argsstring>
+        <name>vector</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="71" column="1" bodyfile="include/decoder/bucket.h" bodystart="71" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a26d4ad2b2302ad18be73b383d70f2c44" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Bucket&lt; T &gt;::Bucket</definition>
+        <argsstring>()=default</argsstring>
+        <name>Bucket</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="14" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1aa80d0bdc739c2446e33312b6f7fa1fae" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Bucket&lt; T &gt;::Bucket</definition>
+        <argsstring>(Bucket &amp;&amp;other) noexcept</argsstring>
+        <name>Bucket</name>
+        <param>
+          <type><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="15" column="1" bodyfile="include/decoder/bucket.h" bodystart="15" bodyend="17"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a44338da96cb18d730ed767896fe148bf" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Bucket&lt; T &gt;::Bucket</definition>
+        <argsstring>(const Bucket &amp;other)=delete</argsstring>
+        <name>Bucket</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="18" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1aff77d0f0031128e321d62c0f6e39f760" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type></type>
+        <definition>virtual Rew::Bucket&lt; T &gt;::~Bucket</definition>
+        <argsstring>()=default</argsstring>
+        <name>~Bucket</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="19" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1aa34958b0d7d35a288b45952460fe322e" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Bucket&lt; T &gt;::swap</definition>
+        <argsstring>(Bucket &amp;other) noexcept</argsstring>
+        <name>swap</name>
+        <param>
+          <type><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="20" column="1" bodyfile="include/decoder/bucket.h" bodystart="20" bodyend="23"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a24d6780a56671976c1dd50eec59f90f4" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;</type>
+        <definition>Bucket&amp; Rew::Bucket&lt; T &gt;::operator=</definition>
+        <argsstring>(Bucket &amp;&amp;other) noexcept</argsstring>
+        <name>operator=</name>
+        <param>
+          <type><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="24" column="1" bodyfile="include/decoder/bucket.h" bodystart="24" bodyend="29"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1acccd57a3a54af96e368ee2434a43e6f0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;</type>
+        <definition>Bucket&amp; Rew::Bucket&lt; T &gt;::operator=</definition>
+        <argsstring>(const Bucket &amp;other)=delete</argsstring>
+        <name>operator=</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="30" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1ac5cbeedb6b0b579ec26c9669a6754571" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Bucket&lt; T &gt;::pushBack</definition>
+        <argsstring>(const typename std::vector&lt; T &gt;::value_type &amp;value)</argsstring>
+        <name>pushBack</name>
+        <param>
+          <type>const typename std::vector&lt; T &gt;::value_type &amp;</type>
+          <declname>value</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="32" column="1" bodyfile="include/decoder/bucket.h" bodystart="32" bodyend="37"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a220215d7c14acc8ebf3a93918f81468b" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::Bucket&lt; T &gt;::size</definition>
+        <argsstring>() const</argsstring>
+        <name>size</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="39" column="1" bodyfile="include/decoder/bucket.h" bodystart="39" bodyend="41"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a412e4d2186c14d8296f17c63ff7465d8" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type>std::vector&lt; T &gt;::iterator</type>
+        <definition>std::vector&lt;T&gt;::iterator Rew::Bucket&lt; T &gt;::begin</definition>
+        <argsstring>()</argsstring>
+        <name>begin</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="43" column="1" bodyfile="include/decoder/bucket.h" bodystart="43" bodyend="45"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1afc320156c6efd79f8e86667aa7f7cb05" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
+        <type>std::vector&lt; T &gt;::const_iterator</type>
+        <definition>std::vector&lt;T&gt;::const_iterator Rew::Bucket&lt; T &gt;::begin</definition>
+        <argsstring>() const</argsstring>
+        <name>begin</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="47" column="1" bodyfile="include/decoder/bucket.h" bodystart="47" bodyend="49"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a51fb9092c7601809ce04367ae1cc8beb" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type>std::vector&lt; T &gt;::iterator</type>
+        <definition>std::vector&lt;T&gt;::iterator Rew::Bucket&lt; T &gt;::end</definition>
+        <argsstring>()</argsstring>
+        <name>end</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="51" column="1" bodyfile="include/decoder/bucket.h" bodystart="51" bodyend="53"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a8b0f1a414910a05f2742dccdcb7e3fa9" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
+        <type>std::vector&lt; T &gt;::const_iterator</type>
+        <definition>std::vector&lt;T&gt;::const_iterator Rew::Bucket&lt; T &gt;::end</definition>
+        <argsstring>() const</argsstring>
+        <name>end</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="55" column="1" bodyfile="include/decoder/bucket.h" bodystart="55" bodyend="57"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1ab0490d14ae89f27f16982294ae1f56e1" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Bucket&lt; T &gt;::clear</definition>
+        <argsstring>()</argsstring>
+        <name>clear</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="59" column="1" bodyfile="include/decoder/bucket.h" bodystart="59" bodyend="61"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1acda8cc938f48bf23c01b3644ff0d114c" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
+        <type>std::vector&lt; T &gt;::value_type &amp;</type>
+        <definition>std::vector&lt;T&gt;::value_type&amp; Rew::Bucket&lt; T &gt;::operator[]</definition>
+        <argsstring>(size_t i)</argsstring>
+        <name>operator[]</name>
+        <param>
+          <type>size_t</type>
+          <declname>i</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="63" column="1" bodyfile="include/decoder/bucket.h" bodystart="63" bodyend="65"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_bucket_1a03c0248f1d3e025dda02331ca6e54bd2" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
+        <type>const std::vector&lt; T &gt;::value_type &amp;</type>
+        <definition>const std::vector&lt;T&gt;::value_type&amp; Rew::Bucket&lt; T &gt;::operator[]</definition>
+        <argsstring>(size_t i) const</argsstring>
+        <name>operator[]</name>
+        <param>
+          <type>size_t</type>
+          <declname>i</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/bucket.h" line="67" column="1" bodyfile="include/decoder/bucket.h" bodystart="67" bodyend="69"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/decoder/bucket.h" line="12" column="1" bodyfile="include/decoder/bucket.h" bodystart="12" bodyend="72"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_bucket_1a412e4d2186c14d8296f17c63ff7465d8" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>begin</name></member>
+      <member refid="class_rew_1_1_bucket_1afc320156c6efd79f8e86667aa7f7cb05" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>begin</name></member>
+      <member refid="class_rew_1_1_bucket_1a26d4ad2b2302ad18be73b383d70f2c44" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>Bucket</name></member>
+      <member refid="class_rew_1_1_bucket_1aa80d0bdc739c2446e33312b6f7fa1fae" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>Bucket</name></member>
+      <member refid="class_rew_1_1_bucket_1a44338da96cb18d730ed767896fe148bf" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>Bucket</name></member>
+      <member refid="class_rew_1_1_bucket_1ab0490d14ae89f27f16982294ae1f56e1" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>clear</name></member>
+      <member refid="class_rew_1_1_bucket_1a51fb9092c7601809ce04367ae1cc8beb" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>end</name></member>
+      <member refid="class_rew_1_1_bucket_1a8b0f1a414910a05f2742dccdcb7e3fa9" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>end</name></member>
+      <member refid="class_rew_1_1_bucket_1a24d6780a56671976c1dd50eec59f90f4" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_bucket_1acccd57a3a54af96e368ee2434a43e6f0" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_bucket_1acda8cc938f48bf23c01b3644ff0d114c" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>operator[]</name></member>
+      <member refid="class_rew_1_1_bucket_1a03c0248f1d3e025dda02331ca6e54bd2" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>operator[]</name></member>
+      <member refid="class_rew_1_1_bucket_1ac5cbeedb6b0b579ec26c9669a6754571" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>pushBack</name></member>
+      <member refid="class_rew_1_1_bucket_1a220215d7c14acc8ebf3a93918f81468b" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>size</name></member>
+      <member refid="class_rew_1_1_bucket_1aa34958b0d7d35a288b45952460fe322e" prot="public" virt="non-virtual"><scope>Rew::Bucket</scope><name>swap</name></member>
+      <member refid="class_rew_1_1_bucket_1acbc95b93eb4ceff039ee2bf9050dfd3b" prot="private" virt="non-virtual"><scope>Rew::Bucket</scope><name>vector</name></member>
+      <member refid="class_rew_1_1_bucket_1aff77d0f0031128e321d62c0f6e39f760" prot="public" virt="virtual"><scope>Rew::Bucket</scope><name>~Bucket</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_byte_assembler.xml b/doxygen/xml/class_rew_1_1_byte_assembler.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e70be2aab8bf9af7d54a48a68ccb6152a4eb9303
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_byte_assembler.xml
@@ -0,0 +1,208 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_byte_assembler" kind="class" language="C++" prot="public">
+    <compoundname>Rew::ByteAssembler</compoundname>
+    <includes refid="byte__assembler_8h" local="no">byte_assembler.h</includes>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_byte_assembler_1a68242e586e317103789946300a7126d8" prot="private" static="no" mutable="no">
+        <type><ref refid="class_rew_1_1_bucket" kindref="compound">Bucket</ref>&lt; unsigned char &gt;</type>
+        <definition>Bucket&lt;unsigned char&gt; Rew::ByteAssembler::buffer</definition>
+        <argsstring></argsstring>
+        <name>buffer</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="25" column="1" bodyfile="include/decoder/byte_assembler.h" bodystart="25" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a5a7a1c9ce7a2e928afa23a0e3598cb92" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::ByteAssembler::ByteAssembler</definition>
+        <argsstring>()</argsstring>
+        <name>ByteAssembler</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="14" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a6b63b45d083d74819ed12dc380b7e64b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::ByteAssembler::ByteAssembler</definition>
+        <argsstring>(ByteAssembler &amp;&amp;other) noexcept</argsstring>
+        <name>ByteAssembler</name>
+        <param>
+          <type><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="15" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a2f3f8050d82ed23bef25cbcd91c51cc7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::ByteAssembler::ByteAssembler</definition>
+        <argsstring>(const ByteAssembler &amp;other)=delete</argsstring>
+        <name>ByteAssembler</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="16" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a1b9676cb634c5e58292528b4dd66a632" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::ByteAssembler::swap</definition>
+        <argsstring>(ByteAssembler &amp;other) noexcept</argsstring>
+        <name>swap</name>
+        <param>
+          <type><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="17" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1ad0c945b42ab0799a909e90819e65282e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;</type>
+        <definition>ByteAssembler&amp; Rew::ByteAssembler::operator=</definition>
+        <argsstring>(ByteAssembler &amp;&amp;other) noexcept</argsstring>
+        <name>operator=</name>
+        <param>
+          <type><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="18" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1aea609342e2813315926997783da794e8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;</type>
+        <definition>ByteAssembler&amp; Rew::ByteAssembler::operator=</definition>
+        <argsstring>(const ByteAssembler &amp;other)=delete</argsstring>
+        <name>operator=</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="19" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a269def0ed892b84e5284f80008dd0837" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::ByteAssembler::operator()</definition>
+        <argsstring>(unsigned char magnitude, const std::function&lt; void(unsigned char)&gt; &amp;callback)</argsstring>
+        <name>operator()</name>
+        <param>
+          <type>unsigned char</type>
+          <declname>magnitude</declname>
+        </param>
+        <param>
+          <type>const std::function&lt; void(unsigned char)&gt; &amp;</type>
+          <declname>callback</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="21" column="1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="private-static-func">
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a1c0c4cc1d99eaada68c33725aa7c90e4" prot="private" static="yes" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>size_t</type>
+        <definition>static size_t Rew::ByteAssembler::countValue</definition>
+        <argsstring>(const unsigned char *begin, const unsigned char *end, unsigned char value)</argsstring>
+        <name>countValue</name>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>begin</declname>
+        </param>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>end</declname>
+        </param>
+        <param>
+          <type>unsigned char</type>
+          <declname>value</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="23" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_byte_assembler_1a15cf8c29c1c6fb7f9eb7f62c82093a80" prot="private" static="yes" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>unsigned char</type>
+        <definition>static unsigned char Rew::ByteAssembler::toByte</definition>
+        <argsstring>(const unsigned char *begin, const unsigned char *end)</argsstring>
+        <name>toByte</name>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>begin</declname>
+        </param>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>end</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/byte_assembler.h" line="24" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/decoder/byte_assembler.h" line="12" column="1" bodyfile="include/decoder/byte_assembler.h" bodystart="12" bodyend="26"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_byte_assembler_1a68242e586e317103789946300a7126d8" prot="private" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>buffer</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a5a7a1c9ce7a2e928afa23a0e3598cb92" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>ByteAssembler</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a6b63b45d083d74819ed12dc380b7e64b" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>ByteAssembler</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a2f3f8050d82ed23bef25cbcd91c51cc7" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>ByteAssembler</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a1c0c4cc1d99eaada68c33725aa7c90e4" prot="private" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>countValue</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a269def0ed892b84e5284f80008dd0837" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>operator()</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1ad0c945b42ab0799a909e90819e65282e" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1aea609342e2813315926997783da794e8" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a1b9676cb634c5e58292528b4dd66a632" prot="public" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>swap</name></member>
+      <member refid="class_rew_1_1_byte_assembler_1a15cf8c29c1c6fb7f9eb7f62c82093a80" prot="private" virt="non-virtual"><scope>Rew::ByteAssembler</scope><name>toByte</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_decoder.xml b/doxygen/xml/class_rew_1_1_decoder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b211ab98951c55889029375eed5dec70873f117e
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_decoder.xml
@@ -0,0 +1,317 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_decoder" kind="class" language="C++" prot="public">
+    <compoundname>Rew::Decoder</compoundname>
+    <includes refid="decoder_8h" local="no">decoder.h</includes>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_decoder_1af6cc7425e112b2db1f2641a501ec3cda" prot="private" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::Decoder::blockSize</definition>
+        <argsstring></argsstring>
+        <name>blockSize</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="37" column="1" bodyfile="include/decoder/decoder.h" bodystart="37" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_decoder_1adf24b0af05fa183f082c2c1541389abf" prot="private" static="no" mutable="no">
+        <type><ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref></type>
+        <definition>Goertzel Rew::Decoder::lowGoertzel</definition>
+        <argsstring></argsstring>
+        <name>lowGoertzel</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="38" column="1" bodyfile="include/decoder/decoder.h" bodystart="38" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_decoder_1a97039031c00bdf00dc64bb2d373795bb" prot="private" static="no" mutable="no">
+        <type><ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref></type>
+        <definition>Goertzel Rew::Decoder::highGoertzel</definition>
+        <argsstring></argsstring>
+        <name>highGoertzel</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="39" column="1" bodyfile="include/decoder/decoder.h" bodystart="39" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_decoder_1a58c85fb9b5be4a9c00e2e9e351991cb9" prot="private" static="no" mutable="no">
+        <type>std::unique_ptr&lt; float &gt;</type>
+        <definition>std::unique_ptr&lt;float&gt; Rew::Decoder::buffer</definition>
+        <argsstring></argsstring>
+        <name>buffer</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="40" column="1" bodyfile="include/decoder/decoder.h" bodystart="40" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_decoder_1a8aca3fb866d8d663a863b375b26a4490" prot="private" static="no" mutable="no">
+        <type><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref></type>
+        <definition>ByteAssembler Rew::Decoder::byteAssembler</definition>
+        <argsstring></argsstring>
+        <name>byteAssembler</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="41" column="1" bodyfile="include/decoder/decoder.h" bodystart="41" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_decoder_1ae253e716569f260f8c00bba62b715ac3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Decoder::Decoder</definition>
+        <argsstring>(size_t lowToneFreq=2400, size_t highToneFreq=4800, double sampleLengthMs=1.25)</argsstring>
+        <name>Decoder</name>
+        <param>
+          <type>size_t</type>
+          <declname>lowToneFreq</declname>
+          <defval>2400</defval>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>highToneFreq</declname>
+          <defval>4800</defval>
+        </param>
+        <param>
+          <type>double</type>
+          <declname>sampleLengthMs</declname>
+          <defval>1.25</defval>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="21" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1ac3eff2261a903149a73dd6006bdbb51b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Decoder::Decoder</definition>
+        <argsstring>(Decoder &amp;&amp;other) noexcept</argsstring>
+        <name>Decoder</name>
+        <param>
+          <type><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="25" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1a52a421be82572621f079bbfc6ddefef5" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Decoder::Decoder</definition>
+        <argsstring>(const Decoder &amp;other)=delete</argsstring>
+        <name>Decoder</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="26" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1a9f64b20ac742596b863ae501eae8d487" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type></type>
+        <definition>virtual Rew::Decoder::~Decoder</definition>
+        <argsstring>()=default</argsstring>
+        <name>~Decoder</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="27" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1ad969594c2b324386833aa72ad797ed6c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Decoder::swap</definition>
+        <argsstring>(Decoder &amp;other) noexcept</argsstring>
+        <name>swap</name>
+        <param>
+          <type><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="28" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1a632a4f0a49b4296fd1ad72e0d9c80704" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;</type>
+        <definition>Decoder&amp; Rew::Decoder::operator=</definition>
+        <argsstring>(Decoder &amp;&amp;other) noexcept</argsstring>
+        <name>operator=</name>
+        <param>
+          <type><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="29" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1a189cb08a95c53b70c35164286c5a9061" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;</type>
+        <definition>Decoder&amp; Rew::Decoder::operator=</definition>
+        <argsstring>(const Decoder &amp;other)=delete</argsstring>
+        <name>operator=</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="30" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1ac241d859a05f016a4f8b0c3959539426" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Decoder::operator()</definition>
+        <argsstring>(const float *samples, size_t length, const std::function&lt; void(unsigned char)&gt; &amp;callback)</argsstring>
+        <name>operator()</name>
+        <param>
+          <type>const float *</type>
+          <declname>samples</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>length</declname>
+        </param>
+        <param>
+          <type>const std::function&lt; void(unsigned char)&gt; &amp;</type>
+          <declname>callback</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="32" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1a650bd842d77f10777a1af25a60cea7d2" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Decoder::operator()</definition>
+        <argsstring>(const float *samples, size_t length, const std::function&lt; void(float, float)&gt; &amp;callback)</argsstring>
+        <name>operator()</name>
+        <param>
+          <type>const float *</type>
+          <declname>samples</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>length</declname>
+        </param>
+        <param>
+          <type>const std::function&lt; void(float, float)&gt; &amp;</type>
+          <declname>callback</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="33" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1aa3febdd0293f6d329f55964d64ed9559" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>float *</type>
+        <definition>float* Rew::Decoder::getLowMagnitude</definition>
+        <argsstring>(const float *samples, size_t length)</argsstring>
+        <name>getLowMagnitude</name>
+        <param>
+          <type>const float *</type>
+          <declname>samples</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>length</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="34" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_decoder_1a954fcde976db8571a1550a23a38e376b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>float *</type>
+        <definition>float* Rew::Decoder::getHighMagnitude</definition>
+        <argsstring>(const float *samples, size_t length)</argsstring>
+        <name>getHighMagnitude</name>
+        <param>
+          <type>const float *</type>
+          <declname>samples</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>length</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/decoder.h" line="35" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/decoder/decoder.h" line="19" column="1" bodyfile="include/decoder/decoder.h" bodystart="19" bodyend="42"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_decoder_1af6cc7425e112b2db1f2641a501ec3cda" prot="private" virt="non-virtual"><scope>Rew::Decoder</scope><name>blockSize</name></member>
+      <member refid="class_rew_1_1_decoder_1a58c85fb9b5be4a9c00e2e9e351991cb9" prot="private" virt="non-virtual"><scope>Rew::Decoder</scope><name>buffer</name></member>
+      <member refid="class_rew_1_1_decoder_1a8aca3fb866d8d663a863b375b26a4490" prot="private" virt="non-virtual"><scope>Rew::Decoder</scope><name>byteAssembler</name></member>
+      <member refid="class_rew_1_1_decoder_1ae253e716569f260f8c00bba62b715ac3" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>Decoder</name></member>
+      <member refid="class_rew_1_1_decoder_1ac3eff2261a903149a73dd6006bdbb51b" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>Decoder</name></member>
+      <member refid="class_rew_1_1_decoder_1a52a421be82572621f079bbfc6ddefef5" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>Decoder</name></member>
+      <member refid="class_rew_1_1_decoder_1a954fcde976db8571a1550a23a38e376b" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>getHighMagnitude</name></member>
+      <member refid="class_rew_1_1_decoder_1aa3febdd0293f6d329f55964d64ed9559" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>getLowMagnitude</name></member>
+      <member refid="class_rew_1_1_decoder_1a97039031c00bdf00dc64bb2d373795bb" prot="private" virt="non-virtual"><scope>Rew::Decoder</scope><name>highGoertzel</name></member>
+      <member refid="class_rew_1_1_decoder_1adf24b0af05fa183f082c2c1541389abf" prot="private" virt="non-virtual"><scope>Rew::Decoder</scope><name>lowGoertzel</name></member>
+      <member refid="class_rew_1_1_decoder_1ac241d859a05f016a4f8b0c3959539426" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>operator()</name></member>
+      <member refid="class_rew_1_1_decoder_1a650bd842d77f10777a1af25a60cea7d2" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>operator()</name></member>
+      <member refid="class_rew_1_1_decoder_1a632a4f0a49b4296fd1ad72e0d9c80704" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_decoder_1a189cb08a95c53b70c35164286c5a9061" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_decoder_1ad969594c2b324386833aa72ad797ed6c" prot="public" virt="non-virtual"><scope>Rew::Decoder</scope><name>swap</name></member>
+      <member refid="class_rew_1_1_decoder_1a9f64b20ac742596b863ae501eae8d487" prot="public" virt="virtual"><scope>Rew::Decoder</scope><name>~Decoder</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_encoder.xml b/doxygen/xml/class_rew_1_1_encoder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1a877b48ecb5d088c699597ddffa1c0b7385376
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_encoder.xml
@@ -0,0 +1,219 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_encoder" kind="class" language="C++" prot="public">
+    <compoundname>Rew::Encoder</compoundname>
+    <includes refid="encoder_8h" local="no">encoder.h</includes>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_encoder_1abab25a20be3f4f7cc8fada65321fb855" prot="private" static="no" mutable="no">
+        <type><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref></type>
+        <definition>ToneSynth Rew::Encoder::lowTone</definition>
+        <argsstring></argsstring>
+        <name>lowTone</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="32" column="1" bodyfile="include/encoder/encoder.h" bodystart="32" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_encoder_1a21b9fb238f3b7cc1b56a58b75e22018f" prot="private" static="no" mutable="no">
+        <type><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref></type>
+        <definition>ToneSynth Rew::Encoder::highTone</definition>
+        <argsstring></argsstring>
+        <name>highTone</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="33" column="1" bodyfile="include/encoder/encoder.h" bodystart="33" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_encoder_1ae9018203e48442fc11f71ca4dc91d11b" prot="private" static="no" mutable="no">
+        <type>std::unique_ptr&lt; float[]&gt;</type>
+        <definition>std::unique_ptr&lt;float[]&gt; Rew::Encoder::nullTone</definition>
+        <argsstring></argsstring>
+        <name>nullTone</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="34" column="1" bodyfile="include/encoder/encoder.h" bodystart="34" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a1ef7cf58b6f6addfb22fdaa1c9ba7df7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Encoder::Encoder</definition>
+        <argsstring>(size_t lowToneFreq=2400, size_t highToneFreq=4800, double sampleLengthMs=1.25)</argsstring>
+        <name>Encoder</name>
+        <param>
+          <type>size_t</type>
+          <declname>lowToneFreq</declname>
+          <defval>2400</defval>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>highToneFreq</declname>
+          <defval>4800</defval>
+        </param>
+        <param>
+          <type>double</type>
+          <declname>sampleLengthMs</declname>
+          <defval>1.25</defval>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="19" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1ab018bb9b035bd40da89d04109e4c2374" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Encoder::Encoder</definition>
+        <argsstring>(Encoder &amp;&amp;other) noexcept</argsstring>
+        <name>Encoder</name>
+        <param>
+          <type><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="23" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a81fb438ec14c31d3e86f1c6f35b0f41c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Encoder::Encoder</definition>
+        <argsstring>(const Encoder &amp;other)=delete</argsstring>
+        <name>Encoder</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="24" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a2d121516fb43077f1d8dc318a02feac6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Encoder::swap</definition>
+        <argsstring>(Encoder &amp;other) noexcept</argsstring>
+        <name>swap</name>
+        <param>
+          <type><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="25" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a487d21e4e2135a174f08fbc71c182ae9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;</type>
+        <definition>Encoder&amp; Rew::Encoder::operator=</definition>
+        <argsstring>(Encoder &amp;&amp;other) noexcept</argsstring>
+        <name>operator=</name>
+        <param>
+          <type><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="26" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a7cb96ed4848060c6479076eb8d79ab87" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;</type>
+        <definition>Encoder&amp; Rew::Encoder::operator=</definition>
+        <argsstring>(const Encoder &amp;other)=delete</argsstring>
+        <name>operator=</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="27" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a0fbf3ed6f39c0099771eef9e64d294ea" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>float *</type>
+        <definition>float* Rew::Encoder::operator()</definition>
+        <argsstring>(const unsigned char *data, size_t length) const</argsstring>
+        <name>operator()</name>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>data</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>length</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="29" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_encoder_1a5a0eff754a3373a361ae2c78d692bdc4" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::Encoder::getNumOfSamples</definition>
+        <argsstring>(size_t length) const</argsstring>
+        <name>getNumOfSamples</name>
+        <param>
+          <type>size_t</type>
+          <declname>length</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/encoder.h" line="30" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/encoder/encoder.h" line="17" column="1" bodyfile="include/encoder/encoder.h" bodystart="17" bodyend="35"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_encoder_1a1ef7cf58b6f6addfb22fdaa1c9ba7df7" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>Encoder</name></member>
+      <member refid="class_rew_1_1_encoder_1ab018bb9b035bd40da89d04109e4c2374" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>Encoder</name></member>
+      <member refid="class_rew_1_1_encoder_1a81fb438ec14c31d3e86f1c6f35b0f41c" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>Encoder</name></member>
+      <member refid="class_rew_1_1_encoder_1a5a0eff754a3373a361ae2c78d692bdc4" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>getNumOfSamples</name></member>
+      <member refid="class_rew_1_1_encoder_1a21b9fb238f3b7cc1b56a58b75e22018f" prot="private" virt="non-virtual"><scope>Rew::Encoder</scope><name>highTone</name></member>
+      <member refid="class_rew_1_1_encoder_1abab25a20be3f4f7cc8fada65321fb855" prot="private" virt="non-virtual"><scope>Rew::Encoder</scope><name>lowTone</name></member>
+      <member refid="class_rew_1_1_encoder_1ae9018203e48442fc11f71ca4dc91d11b" prot="private" virt="non-virtual"><scope>Rew::Encoder</scope><name>nullTone</name></member>
+      <member refid="class_rew_1_1_encoder_1a0fbf3ed6f39c0099771eef9e64d294ea" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>operator()</name></member>
+      <member refid="class_rew_1_1_encoder_1a487d21e4e2135a174f08fbc71c182ae9" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_encoder_1a7cb96ed4848060c6479076eb8d79ab87" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_encoder_1a2d121516fb43077f1d8dc318a02feac6" prot="public" virt="non-virtual"><scope>Rew::Encoder</scope><name>swap</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_goertzel.xml b/doxygen/xml/class_rew_1_1_goertzel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ae37d6367484da387dc502c0f4d1b65797900de4
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_goertzel.xml
@@ -0,0 +1,248 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_goertzel" kind="class" language="C++" prot="public">
+    <compoundname>Rew::Goertzel</compoundname>
+    <includes refid="goertzel_8h" local="no">goertzel.h</includes>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_goertzel_1aa4d84715b925577ab63368b59044edc9" prot="private" static="no" mutable="no">
+        <type>float</type>
+        <definition>float Rew::Goertzel::coeff</definition>
+        <argsstring></argsstring>
+        <name>coeff</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="26" column="1" bodyfile="include/decoder/goertzel.h" bodystart="26" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_goertzel_1af231f9f7c1d7abcba220d8c648e121a1" prot="private" static="no" mutable="no">
+        <type>float</type>
+        <definition>float Rew::Goertzel::Q1</definition>
+        <argsstring></argsstring>
+        <name>Q1</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="27" column="1" bodyfile="include/decoder/goertzel.h" bodystart="27" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_goertzel_1a10a385a1ef24f90178fc8ac5ea89767c" prot="private" static="no" mutable="no">
+        <type>float</type>
+        <definition>float Rew::Goertzel::Q2</definition>
+        <argsstring></argsstring>
+        <name>Q2</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="28" column="1" bodyfile="include/decoder/goertzel.h" bodystart="28" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_goertzel_1a64e806f9edd8eeee230547b2f99bde19" prot="private" static="no" mutable="no">
+        <type>float</type>
+        <definition>float Rew::Goertzel::sine</definition>
+        <argsstring></argsstring>
+        <name>sine</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="29" column="1" bodyfile="include/decoder/goertzel.h" bodystart="29" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_goertzel_1ac7be9bdbcd8c4ba2ac281c0ff4747f6b" prot="private" static="no" mutable="no">
+        <type>float</type>
+        <definition>float Rew::Goertzel::cosine</definition>
+        <argsstring></argsstring>
+        <name>cosine</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="30" column="1" bodyfile="include/decoder/goertzel.h" bodystart="30" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_goertzel_1a9d9347d8bfa02fc805875d3bb52ce6bd" prot="private" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::Goertzel::blockSize</definition>
+        <argsstring></argsstring>
+        <name>blockSize</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="31" column="1" bodyfile="include/decoder/goertzel.h" bodystart="31" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1ae5f0a6149e1c9a8cbf2e3a89cbb3a0ef" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::Goertzel::Goertzel</definition>
+        <argsstring>(size_t blockSize, float targetFrequency, float sampleRate)</argsstring>
+        <name>Goertzel</name>
+        <param>
+          <type>size_t</type>
+          <declname>blockSize</declname>
+        </param>
+        <param>
+          <type>float</type>
+          <declname>targetFrequency</declname>
+        </param>
+        <param>
+          <type>float</type>
+          <declname>sampleRate</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="12" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1a07d48d1c8342c443f5573a661a240da3" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type></type>
+        <definition>virtual Rew::Goertzel::~Goertzel</definition>
+        <argsstring>()=default</argsstring>
+        <name>~Goertzel</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="13" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1a781fe776d1841c2591d16a4288c67757" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>float</type>
+        <definition>float Rew::Goertzel::operator()</definition>
+        <argsstring>(const float *samples)</argsstring>
+        <name>operator()</name>
+        <param>
+          <type>const float *</type>
+          <declname>samples</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="15" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1ae28f15fc29df22d452b61fc43fb66aa8" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::Goertzel::getBlockSize</definition>
+        <argsstring>() const</argsstring>
+        <name>getBlockSize</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="17" column="1" bodyfile="include/decoder/goertzel.h" bodystart="17" bodyend="19"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="private-func">
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1a308f30e32fef56737d077941730a9fe3" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Goertzel::processSample</definition>
+        <argsstring>(float sample)</argsstring>
+        <name>processSample</name>
+        <param>
+          <type>float</type>
+          <declname>sample</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="21" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1a679a7cf5c39ed0d6960c3d72ce23c4c2" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Goertzel::init</definition>
+        <argsstring>(size_t blockSize, float targetFrequency, float sampleRate)</argsstring>
+        <name>init</name>
+        <param>
+          <type>size_t</type>
+          <declname>blockSize</declname>
+        </param>
+        <param>
+          <type>float</type>
+          <declname>targetFrequency</declname>
+        </param>
+        <param>
+          <type>float</type>
+          <declname>sampleRate</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="22" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1ab2e4991eb6a7a1ef205d6f2dc26785f0" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::Goertzel::reset</definition>
+        <argsstring>()</argsstring>
+        <name>reset</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="23" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_goertzel_1a5178077648810edec45d07462a59df86" prot="private" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+        <type>float</type>
+        <definition>float Rew::Goertzel::getMagnitude</definition>
+        <argsstring>() const</argsstring>
+        <name>getMagnitude</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/decoder/goertzel.h" line="24" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/decoder/goertzel.h" line="10" column="1" bodyfile="include/decoder/goertzel.h" bodystart="10" bodyend="32"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_goertzel_1a9d9347d8bfa02fc805875d3bb52ce6bd" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>blockSize</name></member>
+      <member refid="class_rew_1_1_goertzel_1aa4d84715b925577ab63368b59044edc9" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>coeff</name></member>
+      <member refid="class_rew_1_1_goertzel_1ac7be9bdbcd8c4ba2ac281c0ff4747f6b" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>cosine</name></member>
+      <member refid="class_rew_1_1_goertzel_1ae28f15fc29df22d452b61fc43fb66aa8" prot="public" virt="non-virtual"><scope>Rew::Goertzel</scope><name>getBlockSize</name></member>
+      <member refid="class_rew_1_1_goertzel_1a5178077648810edec45d07462a59df86" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>getMagnitude</name></member>
+      <member refid="class_rew_1_1_goertzel_1ae5f0a6149e1c9a8cbf2e3a89cbb3a0ef" prot="public" virt="non-virtual"><scope>Rew::Goertzel</scope><name>Goertzel</name></member>
+      <member refid="class_rew_1_1_goertzel_1a679a7cf5c39ed0d6960c3d72ce23c4c2" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>init</name></member>
+      <member refid="class_rew_1_1_goertzel_1a781fe776d1841c2591d16a4288c67757" prot="public" virt="non-virtual"><scope>Rew::Goertzel</scope><name>operator()</name></member>
+      <member refid="class_rew_1_1_goertzel_1a308f30e32fef56737d077941730a9fe3" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>processSample</name></member>
+      <member refid="class_rew_1_1_goertzel_1af231f9f7c1d7abcba220d8c648e121a1" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>Q1</name></member>
+      <member refid="class_rew_1_1_goertzel_1a10a385a1ef24f90178fc8ac5ea89767c" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>Q2</name></member>
+      <member refid="class_rew_1_1_goertzel_1ab2e4991eb6a7a1ef205d6f2dc26785f0" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>reset</name></member>
+      <member refid="class_rew_1_1_goertzel_1a64e806f9edd8eeee230547b2f99bde19" prot="private" virt="non-virtual"><scope>Rew::Goertzel</scope><name>sine</name></member>
+      <member refid="class_rew_1_1_goertzel_1a07d48d1c8342c443f5573a661a240da3" prot="public" virt="virtual"><scope>Rew::Goertzel</scope><name>~Goertzel</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_synth.xml b/doxygen/xml/class_rew_1_1_synth.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd0c64ffbf616d6756d7eb548510f7d25ff6dcc1
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_synth.xml
@@ -0,0 +1,48 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_synth" kind="class" language="C++" prot="public" abstract="yes">
+    <compoundname>Rew::Synth</compoundname>
+    <derivedcompoundref refid="class_rew_1_1_tone_synth" prot="public" virt="non-virtual">Rew::ToneSynth</derivedcompoundref>
+    <includes refid="synth_8h" local="no">synth.h</includes>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_synth_1ace1cefd258dc0d74251541a59f5b2ac6" prot="public" static="no" const="yes" explicit="no" inline="no" virt="pure-virtual">
+        <type>size_t</type>
+        <definition>virtual size_t Rew::Synth::operator()</definition>
+        <argsstring>(float *dst) const =0</argsstring>
+        <name>operator()</name>
+        <reimplementedby refid="class_rew_1_1_tone_synth_1aac7488713a60314c28bf2ce69254bed3">operator()</reimplementedby>
+        <param>
+          <type>float *</type>
+          <declname>dst</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/synth.h" line="12" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <inheritancegraph>
+      <node id="14">
+        <label>Rew::ToneSynth</label>
+        <link refid="class_rew_1_1_tone_synth"/>
+        <childnode refid="13" relation="public-inheritance">
+        </childnode>
+      </node>
+      <node id="13">
+        <label>Rew::Synth</label>
+        <link refid="class_rew_1_1_synth"/>
+      </node>
+    </inheritancegraph>
+    <location file="include/encoder/synth.h" line="10" column="1" bodyfile="include/encoder/synth.h" bodystart="10" bodyend="13"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_synth_1ace1cefd258dc0d74251541a59f5b2ac6" prot="public" virt="pure-virtual"><scope>Rew::Synth</scope><name>operator()</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_tone_synth.xml b/doxygen/xml/class_rew_1_1_tone_synth.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d89e10201e070bd0fdb3059a0e23313e6239b648
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_tone_synth.xml
@@ -0,0 +1,240 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_tone_synth" kind="class" language="C++" prot="public">
+    <compoundname>Rew::ToneSynth</compoundname>
+    <basecompoundref refid="class_rew_1_1_synth" prot="public" virt="non-virtual">Rew::Synth</basecompoundref>
+    <includes refid="tone__synth_8h" local="no">tone_synth.h</includes>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_tone_synth_1a6aa45a42763100554f5062dd8f03bb37" prot="private" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::ToneSynth::frequency</definition>
+        <argsstring></argsstring>
+        <name>frequency</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="27" column="1" bodyfile="include/encoder/tone_synth.h" bodystart="27" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_tone_synth_1aa27efd3fcc9a3da57aab4c528654dff7" prot="private" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::ToneSynth::total</definition>
+        <argsstring></argsstring>
+        <name>total</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="28" column="1" bodyfile="include/encoder/tone_synth.h" bodystart="28" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_tone_synth_1a665a2d073189fd425d21c405da41ab8e" prot="private" static="no" mutable="no">
+        <type>std::unique_ptr&lt; float[]&gt;</type>
+        <definition>std::unique_ptr&lt;float[]&gt; Rew::ToneSynth::src</definition>
+        <argsstring></argsstring>
+        <name>src</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="29" column="1" bodyfile="include/encoder/tone_synth.h" bodystart="29" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1aa07adb49b8173acbe587634375296b83" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::ToneSynth::ToneSynth</definition>
+        <argsstring>(size_t frequency, size_t sampleRate, double ms)</argsstring>
+        <name>ToneSynth</name>
+        <param>
+          <type>size_t</type>
+          <declname>frequency</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>sampleRate</declname>
+        </param>
+        <param>
+          <type>double</type>
+          <declname>ms</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="13" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1a8198c80ea4d9f4fa5756b0da55c7cb3d" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::ToneSynth::ToneSynth</definition>
+        <argsstring>(ToneSynth &amp;&amp;other) noexcept=default</argsstring>
+        <name>ToneSynth</name>
+        <param>
+          <type><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="14" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1a442ec4059583bebb796999a77d6e54a0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::ToneSynth::ToneSynth</definition>
+        <argsstring>(const ToneSynth &amp;other)=delete</argsstring>
+        <name>ToneSynth</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="15" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1af9f03f7e685e9ec65e7a2af37375d2f1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref> &amp;</type>
+        <definition>ToneSynth&amp; Rew::ToneSynth::operator=</definition>
+        <argsstring>(ToneSynth &amp;&amp;other) noexcept=default</argsstring>
+        <name>operator=</name>
+        <param>
+          <type><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref> &amp;&amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="16" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1a9ef2c6fe4b3a77a30310ae2db7767921" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref> &amp;</type>
+        <definition>ToneSynth&amp; Rew::ToneSynth::operator=</definition>
+        <argsstring>(const ToneSynth &amp;other)=delete</argsstring>
+        <name>operator=</name>
+        <param>
+          <type>const <ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref> &amp;</type>
+          <declname>other</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="17" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1aac7488713a60314c28bf2ce69254bed3" prot="public" static="no" const="yes" explicit="no" inline="no" virt="virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::ToneSynth::operator()</definition>
+        <argsstring>(float *dst) const override</argsstring>
+        <name>operator()</name>
+        <reimplements refid="class_rew_1_1_synth_1ace1cefd258dc0d74251541a59f5b2ac6">operator()</reimplements>
+        <param>
+          <type>float *</type>
+          <declname>dst</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="19" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1afe306b4551ee6abf6383d0c9b75e1d17" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::ToneSynth::getSamplesPerBlock</definition>
+        <argsstring>() const</argsstring>
+        <name>getSamplesPerBlock</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="20" column="1" bodyfile="include/encoder/tone_synth.h" bodystart="20" bodyend="22"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="private-func">
+      <memberdef kind="function" id="class_rew_1_1_tone_synth_1a27740d024ea2ee4115882c5ecb650341" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void Rew::ToneSynth::allocate</definition>
+        <argsstring>(size_t sampleRate, double ms)</argsstring>
+        <name>allocate</name>
+        <param>
+          <type>size_t</type>
+          <declname>sampleRate</declname>
+        </param>
+        <param>
+          <type>double</type>
+          <declname>ms</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/tone_synth.h" line="24" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <inheritancegraph>
+      <node id="16">
+        <label>Rew::ToneSynth</label>
+        <link refid="class_rew_1_1_tone_synth"/>
+        <childnode refid="17" relation="public-inheritance">
+        </childnode>
+      </node>
+      <node id="17">
+        <label>Rew::Synth</label>
+        <link refid="class_rew_1_1_synth"/>
+      </node>
+    </inheritancegraph>
+    <collaborationgraph>
+      <node id="18">
+        <label>Rew::ToneSynth</label>
+        <link refid="class_rew_1_1_tone_synth"/>
+        <childnode refid="19" relation="public-inheritance">
+        </childnode>
+      </node>
+      <node id="19">
+        <label>Rew::Synth</label>
+        <link refid="class_rew_1_1_synth"/>
+      </node>
+    </collaborationgraph>
+    <location file="include/encoder/tone_synth.h" line="11" column="1" bodyfile="include/encoder/tone_synth.h" bodystart="11" bodyend="31"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_tone_synth_1a27740d024ea2ee4115882c5ecb650341" prot="private" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>allocate</name></member>
+      <member refid="class_rew_1_1_tone_synth_1a6aa45a42763100554f5062dd8f03bb37" prot="private" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>frequency</name></member>
+      <member refid="class_rew_1_1_tone_synth_1afe306b4551ee6abf6383d0c9b75e1d17" prot="public" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>getSamplesPerBlock</name></member>
+      <member refid="class_rew_1_1_tone_synth_1aac7488713a60314c28bf2ce69254bed3" prot="public" virt="virtual"><scope>Rew::ToneSynth</scope><name>operator()</name></member>
+      <member refid="class_rew_1_1_tone_synth_1af9f03f7e685e9ec65e7a2af37375d2f1" prot="public" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_tone_synth_1a9ef2c6fe4b3a77a30310ae2db7767921" prot="public" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>operator=</name></member>
+      <member refid="class_rew_1_1_tone_synth_1a665a2d073189fd425d21c405da41ab8e" prot="private" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>src</name></member>
+      <member refid="class_rew_1_1_tone_synth_1aa07adb49b8173acbe587634375296b83" prot="public" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>ToneSynth</name></member>
+      <member refid="class_rew_1_1_tone_synth_1a8198c80ea4d9f4fa5756b0da55c7cb3d" prot="public" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>ToneSynth</name></member>
+      <member refid="class_rew_1_1_tone_synth_1a442ec4059583bebb796999a77d6e54a0" prot="public" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>ToneSynth</name></member>
+      <member refid="class_rew_1_1_tone_synth_1aa27efd3fcc9a3da57aab4c528654dff7" prot="private" virt="non-virtual"><scope>Rew::ToneSynth</scope><name>total</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/class_rew_1_1_wav_writer.xml b/doxygen/xml/class_rew_1_1_wav_writer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..caa4dad8fc90e7826fde889ade821e5406ae1877
--- /dev/null
+++ b/doxygen/xml/class_rew_1_1_wav_writer.xml
@@ -0,0 +1,261 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="class_rew_1_1_wav_writer" kind="class" language="C++" prot="public">
+    <compoundname>Rew::WavWriter</compoundname>
+    <basecompoundref refid="class_rew_1_1_audio_writer" prot="public" virt="non-virtual">Rew::AudioWriter</basecompoundref>
+    <includes refid="wav__writer_8h" local="no">wav_writer.h</includes>
+      <sectiondef kind="private-attrib">
+      <memberdef kind="variable" id="class_rew_1_1_wav_writer_1a4bdeea5d1815794649ca3cfd17725e65" prot="private" static="no" mutable="no">
+        <type>std::fstream</type>
+        <definition>std::fstream Rew::WavWriter::output</definition>
+        <argsstring></argsstring>
+        <name>output</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="24" column="1" bodyfile="include/encoder/wav_writer.h" bodystart="24" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_wav_writer_1a7d15122ae661ec7be4065b1417401642" prot="private" static="no" mutable="no">
+        <type>bool</type>
+        <definition>bool Rew::WavWriter::eos</definition>
+        <argsstring></argsstring>
+        <name>eos</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="25" column="1" bodyfile="include/encoder/wav_writer.h" bodystart="25" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_wav_writer_1a99940678fabcd731c90e2dec3802e935" prot="private" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::WavWriter::dataOffset</definition>
+        <argsstring></argsstring>
+        <name>dataOffset</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="26" column="1" bodyfile="include/encoder/wav_writer.h" bodystart="26" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="variable" id="class_rew_1_1_wav_writer_1a18999b980002a2aaa91a330d9177ecca" prot="private" static="no" mutable="no">
+        <type>size_t</type>
+        <definition>size_t Rew::WavWriter::dataWritten</definition>
+        <argsstring></argsstring>
+        <name>dataWritten</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="27" column="1" bodyfile="include/encoder/wav_writer.h" bodystart="27" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+      <sectiondef kind="public-func">
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1af9a57cca60c3e4332ed403d3c5a9aac5" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type></type>
+        <definition>Rew::WavWriter::WavWriter</definition>
+        <argsstring>()</argsstring>
+        <name>WavWriter</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="14" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1ab47e21b2b233b8a4ac56bcfcd4426b5f" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type></type>
+        <definition>virtual Rew::WavWriter::~WavWriter</definition>
+        <argsstring>()</argsstring>
+        <name>~WavWriter</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="15" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1a4700f564e14ca54a319ed2a23337581b" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type>bool</type>
+        <definition>bool Rew::WavWriter::open</definition>
+        <argsstring>(const std::string &amp;path, size_t size, int bitsPerSample, int sampleRate, int numChannels) override</argsstring>
+        <name>open</name>
+        <reimplements refid="class_rew_1_1_audio_writer_1a619c520a49467c7dd6a6bee0d3ac399c">open</reimplements>
+        <param>
+          <type>const std::string &amp;</type>
+          <declname>path</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>size</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>bitsPerSample</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>sampleRate</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>numChannels</declname>
+        </param>
+        <briefdescription>
+<para>Opens a file for writing. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="17" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1a017679508e2b7f7645ff6192e275af54" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type>void</type>
+        <definition>void Rew::WavWriter::close</definition>
+        <argsstring>() override</argsstring>
+        <name>close</name>
+        <reimplements refid="class_rew_1_1_audio_writer_1a2d891dcd78323ef0ba32335041eb923c">close</reimplements>
+        <briefdescription>
+<para>Closes the file. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="18" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1a21f12fc360fee57a7cfc85d9a4ff07be" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type>bool</type>
+        <definition>bool Rew::WavWriter::writeChunk</definition>
+        <argsstring>(const unsigned char *data, size_t *bytesWritten) override</argsstring>
+        <name>writeChunk</name>
+        <reimplements refid="class_rew_1_1_audio_writer_1a4ac109653fd08b3d51dd54930593b859">writeChunk</reimplements>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>data</declname>
+        </param>
+        <param>
+          <type>size_t *</type>
+          <declname>bytesWritten</declname>
+        </param>
+        <briefdescription>
+<para>Writes a chunk of data to file. </para>        </briefdescription>
+        <detaileddescription>
+<para><simplesect kind="see"><para><ref refid="class_rew_1_1_audio_writer_1a16c70083411cc3921233092c0ad632c3" kindref="member">getChunkSize</ref> </para></simplesect>
+</para>        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="19" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1a0ca68ad62f42f0eb1334ffc49319f4a1" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
+        <type>bool</type>
+        <definition>bool Rew::WavWriter::writeFooter</definition>
+        <argsstring>() override</argsstring>
+        <name>writeFooter</name>
+        <reimplements refid="class_rew_1_1_audio_writer_1aa8b315cb43e7598aa1b1ea2ff0e036af">writeFooter</reimplements>
+        <briefdescription>
+<para>Writes a footer. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="20" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1a2fee28dbc8c223c8b7e361eaf65ce22f" prot="public" static="no" const="yes" explicit="no" inline="no" virt="virtual">
+        <type>bool</type>
+        <definition>bool Rew::WavWriter::eof</definition>
+        <argsstring>() const override</argsstring>
+        <name>eof</name>
+        <reimplements refid="class_rew_1_1_audio_writer_1a5288a2b883fab9d06d8292c6a657c077">eof</reimplements>
+        <briefdescription>
+<para>Checks if end of file. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="21" column="1"/>
+      </memberdef>
+      <memberdef kind="function" id="class_rew_1_1_wav_writer_1a4314c21ee94386f745f951c57d82bc7f" prot="public" static="no" const="yes" explicit="no" inline="no" virt="virtual">
+        <type>size_t</type>
+        <definition>size_t Rew::WavWriter::getPos</definition>
+        <argsstring>() const override</argsstring>
+        <name>getPos</name>
+        <reimplements refid="class_rew_1_1_audio_writer_1ae3d33d0968b52793b545d46c7e8cdb55">getPos</reimplements>
+        <briefdescription>
+<para>Returns current write position in bytes. </para>        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="22" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+<para>WAV file saver. </para>    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <inheritancegraph>
+      <node id="20">
+        <label>Rew::WavWriter</label>
+        <link refid="class_rew_1_1_wav_writer"/>
+        <childnode refid="21" relation="public-inheritance">
+        </childnode>
+      </node>
+      <node id="21">
+        <label>Rew::AudioWriter</label>
+        <link refid="class_rew_1_1_audio_writer"/>
+      </node>
+    </inheritancegraph>
+    <collaborationgraph>
+      <node id="22">
+        <label>Rew::WavWriter</label>
+        <link refid="class_rew_1_1_wav_writer"/>
+        <childnode refid="23" relation="public-inheritance">
+        </childnode>
+      </node>
+      <node id="23">
+        <label>Rew::AudioWriter</label>
+        <link refid="class_rew_1_1_audio_writer"/>
+      </node>
+    </collaborationgraph>
+    <location file="include/encoder/wav_writer.h" line="12" column="1" bodyfile="include/encoder/wav_writer.h" bodystart="12" bodyend="28"/>
+    <listofallmembers>
+      <member refid="class_rew_1_1_audio_writer_1a7898acd23a7adbbc1c1fe96220608957" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>AudioWriter</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ac3d60ac33859cc0688ca3761b5dbf010" prot="protected" virt="non-virtual"><scope>Rew::WavWriter</scope><name>bitsPerSample</name></member>
+      <member refid="class_rew_1_1_audio_writer_1aabfb8aed29b83114ff67ae2a0a063bbb" prot="protected" virt="non-virtual"><scope>Rew::WavWriter</scope><name>channelCount</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a0f0e4ea476c6e557af77ba1902cdde13" prot="protected" virt="non-virtual"><scope>Rew::WavWriter</scope><name>chunkSize</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a017679508e2b7f7645ff6192e275af54" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>close</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a99940678fabcd731c90e2dec3802e935" prot="private" virt="non-virtual"><scope>Rew::WavWriter</scope><name>dataOffset</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a18999b980002a2aaa91a330d9177ecca" prot="private" virt="non-virtual"><scope>Rew::WavWriter</scope><name>dataWritten</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a2fee28dbc8c223c8b7e361eaf65ce22f" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>eof</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a7d15122ae661ec7be4065b1417401642" prot="private" virt="non-virtual"><scope>Rew::WavWriter</scope><name>eos</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a8255a4d834e892a6594bcd1e449aa54f" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>getBitsPerSample</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a16c70083411cc3921233092c0ad632c3" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>getChunkSize</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ab3a2df9304221bd8e4b593efe277598a" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>getNumOfChannels</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a4314c21ee94386f745f951c57d82bc7f" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>getPos</name></member>
+      <member refid="class_rew_1_1_audio_writer_1af5e4622f9b4faa35bb553522766c5cd8" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>getSampleRate</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a344835d861a600f89454e35bfe4958b9" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>getSize</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ab3f42f0f4b515dadd3de7c51f857d042" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>isOpen</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a4eca6a6861551d45c1d079d3971f01df" prot="protected" virt="non-virtual"><scope>Rew::WavWriter</scope><name>loaded</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a4700f564e14ca54a319ed2a23337581b" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>open</name></member>
+      <member refid="class_rew_1_1_audio_writer_1ae11b1fa568d431d6a976bee5f14d38d8" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>operator bool</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a4bdeea5d1815794649ca3cfd17725e65" prot="private" virt="non-virtual"><scope>Rew::WavWriter</scope><name>output</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a71567e58f680b1f3346727ce20d09115" prot="protected" virt="non-virtual"><scope>Rew::WavWriter</scope><name>sampleRate</name></member>
+      <member refid="class_rew_1_1_audio_writer_1aa84a112f4f791cad425aa63f3b412efa" prot="protected" virt="non-virtual"><scope>Rew::WavWriter</scope><name>size</name></member>
+      <member refid="class_rew_1_1_wav_writer_1af9a57cca60c3e4332ed403d3c5a9aac5" prot="public" virt="non-virtual"><scope>Rew::WavWriter</scope><name>WavWriter</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a21f12fc360fee57a7cfc85d9a4ff07be" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>writeChunk</name></member>
+      <member refid="class_rew_1_1_wav_writer_1a0ca68ad62f42f0eb1334ffc49319f4a1" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>writeFooter</name></member>
+      <member refid="class_rew_1_1_audio_writer_1a88b3be8be3b8bd644a16939e7faefcd5" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>~AudioWriter</name></member>
+      <member refid="class_rew_1_1_wav_writer_1ab47e21b2b233b8a4ac56bcfcd4426b5f" prot="public" virt="virtual"><scope>Rew::WavWriter</scope><name>~WavWriter</name></member>
+    </listofallmembers>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/combine.xslt b/doxygen/xml/combine.xslt
new file mode 100644
index 0000000000000000000000000000000000000000..c148ee4f2f0aa93015c19a2868bcc017c41334c1
--- /dev/null
+++ b/doxygen/xml/combine.xslt
@@ -0,0 +1,15 @@
+<!-- XSLT script to combine the generated output into a single file. 
+     If you have xsltproc you could use:
+     xsltproc combine.xslt index.xml >all.xml
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:output method="xml" version="1.0" indent="no" standalone="yes" />
+  <xsl:template match="/">
+    <doxygen version="{doxygenindex/@version}">
+      <!-- Load all doxgen generated xml files -->
+      <xsl:for-each select="doxygenindex/compound">
+        <xsl:copy-of select="document( concat( @refid, '.xml' ) )/doxygen/*" />
+      </xsl:for-each>
+    </doxygen>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/doxygen/xml/compound.xsd b/doxygen/xml/compound.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..81b5e513b33292c0e742e1e051f4cdb1f8ae5991
--- /dev/null
+++ b/doxygen/xml/compound.xsd
@@ -0,0 +1,1131 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="doxygen" type="DoxygenType"/>
+
+  <!-- Complex types -->
+
+  <xsd:complexType name="DoxygenType">
+    <xsd:sequence maxOccurs="unbounded">
+      <xsd:element name="compounddef" type="compounddefType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="version" type="DoxVersionNumber" use="required" />
+  </xsd:complexType>
+
+  <xsd:complexType name="compounddefType">
+    <xsd:sequence>
+      <xsd:element name="compoundname" type="xsd:string"/>
+      <xsd:element name="title" type="xsd:string" minOccurs="0" />
+      <xsd:element name="basecompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="derivedcompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="includes" type="incType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="includedby" type="incType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="incdepgraph" type="graphType" minOccurs="0" />
+      <xsd:element name="invincdepgraph" type="graphType" minOccurs="0" />
+      <xsd:element name="innerdir" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innerfile" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innerclass" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innernamespace" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innerpage" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="innergroup" type="refType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
+      <xsd:element name="sectiondef" type="sectiondefType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="tableofcontents" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="inheritancegraph" type="graphType" minOccurs="0" />
+      <xsd:element name="collaborationgraph" type="graphType" minOccurs="0" />
+      <xsd:element name="programlisting" type="listingType" minOccurs="0" />
+      <xsd:element name="location" type="locationType" minOccurs="0" />
+      <xsd:element name="listofallmembers" type="listofallmembersType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="kind" type="DoxCompoundKind" />
+    <xsd:attribute name="language" type="DoxLanguage" use="optional"/>
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+    <xsd:attribute name="final" type="DoxBool" use="optional"/>
+    <xsd:attribute name="sealed" type="DoxBool" use="optional"/>
+    <xsd:attribute name="abstract" type="DoxBool" use="optional"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="listofallmembersType">
+    <xsd:sequence>
+      <xsd:element name="member" type="memberRefType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="memberRefType">
+    <xsd:sequence>
+      <xsd:element name="scope" />
+      <xsd:element name="name" />
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+    <xsd:attribute name="virt" type="DoxVirtualKind" />
+    <xsd:attribute name="ambiguityscope" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="compoundRefType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" use="optional" />
+        <xsd:attribute name="prot" type="DoxProtectionKind" />
+        <xsd:attribute name="virt" type="DoxVirtualKind" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="reimplementType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="incType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" />
+        <xsd:attribute name="local" type="DoxBool" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="refType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="refid" type="xsd:string" />
+        <xsd:attribute name="prot" type="DoxProtectionKind" use="optional"/>
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="refTextType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+       <xsd:attribute name="refid" type="xsd:string" />
+       <xsd:attribute name="kindref" type="DoxRefKind" />
+       <xsd:attribute name="external" type="xsd:string" use="optional"/>
+       <xsd:attribute name="tooltip" type="xsd:string" use="optional"/>
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="sectiondefType">
+    <xsd:sequence>
+      <xsd:element name="header" type="xsd:string" minOccurs="0" />
+      <xsd:element name="description" type="descriptionType" minOccurs="0" />
+      <xsd:element name="memberdef" type="memberdefType" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxSectionKind" />
+  </xsd:complexType>
+
+  <xsd:complexType name="memberdefType">
+    <xsd:sequence>
+      <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
+      <xsd:element name="type" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="definition" minOccurs="0" />
+      <xsd:element name="argsstring" minOccurs="0" />
+      <xsd:element name="name" />
+      <xsd:element name="read" minOccurs="0" />
+      <xsd:element name="write" minOccurs="0" />
+      <xsd:element name="bitfield" minOccurs="0" />
+      <xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="enumvalue" type="enumvalueType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="exceptions" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="inbodydescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="location" type="locationType" />
+      <xsd:element name="references" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="referencedby" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxMemberKind" />
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+    <xsd:attribute name="static" type="DoxBool" />
+    <xsd:attribute name="strong" type="DoxBool" use="optional"/>
+    <xsd:attribute name="const" type="DoxBool" use="optional"/>
+    <xsd:attribute name="explicit" type="DoxBool" use="optional"/>
+    <xsd:attribute name="inline" type="DoxBool" use="optional"/>
+    <xsd:attribute name="refqual" type="DoxRefQualifierKind" use="optional"/>
+    <xsd:attribute name="virt" type="DoxVirtualKind" use="optional"/>
+    <xsd:attribute name="volatile" type="DoxBool" use="optional"/>
+    <xsd:attribute name="mutable" type="DoxBool" use="optional"/>
+    <!-- Qt property -->
+    <xsd:attribute name="readable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="writable" type="DoxBool" use="optional"/>
+    <!-- C++/CLI variable -->
+    <xsd:attribute name="initonly" type="DoxBool" use="optional"/>
+    <!-- C++/CLI and C# property -->
+    <xsd:attribute name="settable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="gettable" type="DoxBool" use="optional"/>
+    <!-- C++/CLI function -->
+    <xsd:attribute name="final" type="DoxBool" use="optional"/>
+    <xsd:attribute name="sealed" type="DoxBool" use="optional"/>
+    <xsd:attribute name="new" type="DoxBool" use="optional"/>
+    <!-- C++/CLI event -->
+    <xsd:attribute name="add" type="DoxBool" use="optional"/>
+    <xsd:attribute name="remove" type="DoxBool" use="optional"/>
+    <xsd:attribute name="raise" type="DoxBool" use="optional"/>
+    <!-- Objective-C 2.0 protocol method -->
+    <xsd:attribute name="optional" type="DoxBool" use="optional"/>
+    <xsd:attribute name="required" type="DoxBool" use="optional"/>
+    <!-- Objective-C 2.0 property accessor -->
+    <xsd:attribute name="accessor" type="DoxAccessor" use="optional"/>
+    <!-- UNO IDL -->
+    <xsd:attribute name="attribute" type="DoxBool" use="optional"/>
+    <xsd:attribute name="property" type="DoxBool" use="optional"/>
+    <xsd:attribute name="readonly" type="DoxBool" use="optional"/>
+    <xsd:attribute name="bound" type="DoxBool" use="optional"/>
+    <xsd:attribute name="removable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="contrained" type="DoxBool" use="optional"/>
+    <xsd:attribute name="transient" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybevoid" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybedefault" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybeambiguous" type="DoxBool" use="optional"/>
+
+  </xsd:complexType>
+
+  <xsd:complexType name="descriptionType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" minOccurs="0"/>	    
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalType" minOccurs="0" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="enumvalueType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="name" />
+      <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+      <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="prot" type="DoxProtectionKind" />
+  </xsd:complexType>
+
+  <xsd:complexType name="templateparamlistType">
+    <xsd:sequence>
+      <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="paramType">
+    <xsd:sequence>
+      <xsd:element name="type" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="declname" minOccurs="0" />
+      <xsd:element name="defname" minOccurs="0" />
+      <xsd:element name="array" minOccurs="0" />
+      <xsd:element name="defval" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="typeconstraint" type="linkedTextType" minOccurs="0" />
+      <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="linkedTextType" mixed="true">
+    <xsd:sequence>
+    <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="graphType">
+    <xsd:sequence>
+      <xsd:element name="node" type="nodeType" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="nodeType">
+    <xsd:sequence>
+      <xsd:element name="label" />
+      <xsd:element name="link" type="linkType" minOccurs="0" />
+      <xsd:element name="childnode" type="childnodeType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="childnodeType">
+    <xsd:sequence>
+      <xsd:element name="edgelabel" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="relation" type="DoxGraphRelation" />
+  </xsd:complexType>
+
+  <xsd:complexType name="linkType">
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="external" type="xsd:string" use="optional"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="listingType">
+    <xsd:sequence>
+      <xsd:element name="codeline" type="codelineType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="filename" type="xsd:string" use="optional"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="codelineType">
+    <xsd:sequence>
+      <xsd:element name="highlight" type="highlightType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="lineno" type="xsd:integer" />
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="refkind" type="DoxRefKind" />
+    <xsd:attribute name="external" type="DoxBool" />
+  </xsd:complexType>
+
+  <xsd:complexType name="highlightType" mixed="true">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="sp" type="spType" />
+      <xsd:element name="ref" type="refTextType" />
+    </xsd:choice>
+    <xsd:attribute name="class" type="DoxHighlightClass" />
+  </xsd:complexType>
+
+  <xsd:complexType name="spType" mixed="true">
+    <xsd:attribute name="value" type="xsd:integer" use="optional"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="referenceType" mixed="true">
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="compoundref" type="xsd:string" use="optional" />
+    <xsd:attribute name="startline" type="xsd:integer" />
+    <xsd:attribute name="endline" type="xsd:integer" />
+  </xsd:complexType>
+
+  <xsd:complexType name="locationType">
+    <xsd:attribute name="file" type="xsd:string" />
+    <xsd:attribute name="line" type="xsd:integer" />
+    <xsd:attribute name="column" type="xsd:integer" use="optional"/>
+    <xsd:attribute name="bodyfile" type="xsd:string" />
+    <xsd:attribute name="bodystart" type="xsd:integer" />
+    <xsd:attribute name="bodyend" type="xsd:integer" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect1Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />	    
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS1Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect2Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />	    
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS2Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect3Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />	    
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect4" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS3Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docSect4Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="title" type="xsd:string" />	    
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalS4Type" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS1Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS2Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS3Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect3" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docInternalS4Type" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="para"  type="docParaType"  minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+ 
+  <xsd:group name="docTitleCmdGroup">
+    <xsd:choice>
+      <xsd:element name="ulink" type="docURLLink" />
+      <xsd:element name="bold" type="docMarkupType" />
+      <xsd:element name="emphasis" type="docMarkupType" />
+      <xsd:element name="computeroutput" type="docMarkupType" />
+      <xsd:element name="subscript" type="docMarkupType" />
+      <xsd:element name="superscript" type="docMarkupType" />
+      <xsd:element name="center" type="docMarkupType" />
+      <xsd:element name="small" type="docMarkupType" />
+      <xsd:element name="htmlonly" type="xsd:string" />
+      <xsd:element name="manonly" type="xsd:string" />
+      <xsd:element name="xmlonly" type="xsd:string" />
+      <xsd:element name="rtfonly" type="xsd:string" />
+      <xsd:element name="latexonly" type="xsd:string" />
+      <xsd:element name="dot" type="xsd:string" />
+      <xsd:element name="plantuml" type="xsd:string" />
+      <xsd:element name="anchor" type="docAnchorType" />
+      <xsd:element name="formula" type="docFormulaType" />
+      <xsd:element name="ref" type="docRefTextType" />
+      <xsd:element name="nonbreakablespace" type="docEmptyType" />
+      <xsd:element name="iexcl" type="docEmptyType" />
+      <xsd:element name="cent" type="docEmptyType" />
+      <xsd:element name="pound" type="docEmptyType" />
+      <xsd:element name="curren" type="docEmptyType" />
+      <xsd:element name="yen" type="docEmptyType" />
+      <xsd:element name="brvbar" type="docEmptyType" />
+      <xsd:element name="sect" type="docEmptyType" />
+      <xsd:element name="umlaut" type="docEmptyType" />
+      <xsd:element name="copy" type="docEmptyType" />
+      <xsd:element name="ordf" type="docEmptyType" />
+      <xsd:element name="laquo" type="docEmptyType" />
+      <xsd:element name="not" type="docEmptyType" />
+      <xsd:element name="shy" type="docEmptyType" />
+      <xsd:element name="registered" type="docEmptyType" />
+      <xsd:element name="macr" type="docEmptyType" />
+      <xsd:element name="deg" type="docEmptyType" />
+      <xsd:element name="plusmn" type="docEmptyType" />
+      <xsd:element name="sup2" type="docEmptyType" />
+      <xsd:element name="sup3" type="docEmptyType" />
+      <xsd:element name="acute" type="docEmptyType" />
+      <xsd:element name="micro" type="docEmptyType" />
+      <xsd:element name="para" type="docEmptyType" />
+      <xsd:element name="middot" type="docEmptyType" />
+      <xsd:element name="cedil" type="docEmptyType" />
+      <xsd:element name="sup1" type="docEmptyType" />
+      <xsd:element name="ordm" type="docEmptyType" />
+      <xsd:element name="raquo" type="docEmptyType" />
+      <xsd:element name="frac14" type="docEmptyType" />
+      <xsd:element name="frac12" type="docEmptyType" />
+      <xsd:element name="frac34" type="docEmptyType" />
+      <xsd:element name="iquest" type="docEmptyType" />
+      <xsd:element name="Agrave" type="docEmptyType" />
+      <xsd:element name="Aacute" type="docEmptyType" />
+      <xsd:element name="Acirc" type="docEmptyType" />
+      <xsd:element name="Atilde" type="docEmptyType" />
+      <xsd:element name="Aumlaut" type="docEmptyType" />
+      <xsd:element name="Aring" type="docEmptyType" />
+      <xsd:element name="AElig" type="docEmptyType" />
+      <xsd:element name="Ccedil" type="docEmptyType" />
+      <xsd:element name="Egrave" type="docEmptyType" />
+      <xsd:element name="Eacute" type="docEmptyType" />
+      <xsd:element name="Ecirc" type="docEmptyType" />
+      <xsd:element name="Eumlaut" type="docEmptyType" />
+      <xsd:element name="Igrave" type="docEmptyType" />
+      <xsd:element name="Iacute" type="docEmptyType" />
+      <xsd:element name="Icirc" type="docEmptyType" />
+      <xsd:element name="Iumlaut" type="docEmptyType" />
+      <xsd:element name="ETH" type="docEmptyType" />
+      <xsd:element name="Ntilde" type="docEmptyType" />
+      <xsd:element name="Ograve" type="docEmptyType" />
+      <xsd:element name="Oacute" type="docEmptyType" />
+      <xsd:element name="Ocirc" type="docEmptyType" />
+      <xsd:element name="Otilde" type="docEmptyType" />
+      <xsd:element name="Oumlaut" type="docEmptyType" />
+      <xsd:element name="times" type="docEmptyType" />
+      <xsd:element name="Oslash" type="docEmptyType" />
+      <xsd:element name="Ugrave" type="docEmptyType" />
+      <xsd:element name="Uacute" type="docEmptyType" />
+      <xsd:element name="Ucirc" type="docEmptyType" />
+      <xsd:element name="Uumlaut" type="docEmptyType" />
+      <xsd:element name="Yacute" type="docEmptyType" />
+      <xsd:element name="THORN" type="docEmptyType" />
+      <xsd:element name="szlig" type="docEmptyType" />
+      <xsd:element name="agrave" type="docEmptyType" />
+      <xsd:element name="aacute" type="docEmptyType" />
+      <xsd:element name="acirc" type="docEmptyType" />
+      <xsd:element name="atilde" type="docEmptyType" />
+      <xsd:element name="aumlaut" type="docEmptyType" />
+      <xsd:element name="aring" type="docEmptyType" />
+      <xsd:element name="aelig" type="docEmptyType" />
+      <xsd:element name="ccedil" type="docEmptyType" />
+      <xsd:element name="egrave" type="docEmptyType" />
+      <xsd:element name="eacute" type="docEmptyType" />
+      <xsd:element name="ecirc" type="docEmptyType" />
+      <xsd:element name="eumlaut" type="docEmptyType" />
+      <xsd:element name="igrave" type="docEmptyType" />
+      <xsd:element name="iacute" type="docEmptyType" />
+      <xsd:element name="icirc" type="docEmptyType" />
+      <xsd:element name="iumlaut" type="docEmptyType" />
+      <xsd:element name="eth" type="docEmptyType" />
+      <xsd:element name="ntilde" type="docEmptyType" />
+      <xsd:element name="ograve" type="docEmptyType" />
+      <xsd:element name="oacute" type="docEmptyType" />
+      <xsd:element name="ocirc" type="docEmptyType" />
+      <xsd:element name="otilde" type="docEmptyType" />
+      <xsd:element name="oumlaut" type="docEmptyType" />
+      <xsd:element name="divide" type="docEmptyType" />
+      <xsd:element name="oslash" type="docEmptyType" />
+      <xsd:element name="ugrave" type="docEmptyType" />
+      <xsd:element name="uacute" type="docEmptyType" />
+      <xsd:element name="ucirc" type="docEmptyType" />
+      <xsd:element name="uumlaut" type="docEmptyType" />
+      <xsd:element name="yacute" type="docEmptyType" />
+      <xsd:element name="thorn" type="docEmptyType" />
+      <xsd:element name="yumlaut" type="docEmptyType" />
+      <xsd:element name="fnof" type="docEmptyType" />
+      <xsd:element name="Alpha" type="docEmptyType" />
+      <xsd:element name="Beta" type="docEmptyType" />
+      <xsd:element name="Gamma" type="docEmptyType" />
+      <xsd:element name="Delta" type="docEmptyType" />
+      <xsd:element name="Epsilon" type="docEmptyType" />
+      <xsd:element name="Zeta" type="docEmptyType" />
+      <xsd:element name="Eta" type="docEmptyType" />
+      <xsd:element name="Theta" type="docEmptyType" />
+      <xsd:element name="Iota" type="docEmptyType" />
+      <xsd:element name="Kappa" type="docEmptyType" />
+      <xsd:element name="Lambda" type="docEmptyType" />
+      <xsd:element name="Mu" type="docEmptyType" />
+      <xsd:element name="Nu" type="docEmptyType" />
+      <xsd:element name="Xi" type="docEmptyType" />
+      <xsd:element name="Omicron" type="docEmptyType" />
+      <xsd:element name="Pi" type="docEmptyType" />
+      <xsd:element name="Rho" type="docEmptyType" />
+      <xsd:element name="Sigma" type="docEmptyType" />
+      <xsd:element name="Tau" type="docEmptyType" />
+      <xsd:element name="Upsilon" type="docEmptyType" />
+      <xsd:element name="Phi" type="docEmptyType" />
+      <xsd:element name="Chi" type="docEmptyType" />
+      <xsd:element name="Psi" type="docEmptyType" />
+      <xsd:element name="Omega" type="docEmptyType" />
+      <xsd:element name="alpha" type="docEmptyType" />
+      <xsd:element name="beta" type="docEmptyType" />
+      <xsd:element name="gamma" type="docEmptyType" />
+      <xsd:element name="delta" type="docEmptyType" />
+      <xsd:element name="epsilon" type="docEmptyType" />
+      <xsd:element name="zeta" type="docEmptyType" />
+      <xsd:element name="eta" type="docEmptyType" />
+      <xsd:element name="theta" type="docEmptyType" />
+      <xsd:element name="iota" type="docEmptyType" />
+      <xsd:element name="kappa" type="docEmptyType" />
+      <xsd:element name="lambda" type="docEmptyType" />
+      <xsd:element name="mu" type="docEmptyType" />
+      <xsd:element name="nu" type="docEmptyType" />
+      <xsd:element name="xi" type="docEmptyType" />
+      <xsd:element name="omicron" type="docEmptyType" />
+      <xsd:element name="pi" type="docEmptyType" />
+      <xsd:element name="rho" type="docEmptyType" />
+      <xsd:element name="sigmaf" type="docEmptyType" />
+      <xsd:element name="sigma" type="docEmptyType" />
+      <xsd:element name="tau" type="docEmptyType" />
+      <xsd:element name="upsilon" type="docEmptyType" />
+      <xsd:element name="phi" type="docEmptyType" />
+      <xsd:element name="chi" type="docEmptyType" />
+      <xsd:element name="psi" type="docEmptyType" />
+      <xsd:element name="omega" type="docEmptyType" />
+      <xsd:element name="thetasym" type="docEmptyType" />
+      <xsd:element name="upsih" type="docEmptyType" />
+      <xsd:element name="piv" type="docEmptyType" />
+      <xsd:element name="bull" type="docEmptyType" />
+      <xsd:element name="hellip" type="docEmptyType" />
+      <xsd:element name="prime" type="docEmptyType" />
+      <xsd:element name="Prime" type="docEmptyType" />
+      <xsd:element name="oline" type="docEmptyType" />
+      <xsd:element name="frasl" type="docEmptyType" />
+      <xsd:element name="weierp" type="docEmptyType" />
+      <xsd:element name="imaginary" type="docEmptyType" />
+      <xsd:element name="real" type="docEmptyType" />
+      <xsd:element name="trademark" type="docEmptyType" />
+      <xsd:element name="alefsym" type="docEmptyType" />
+      <xsd:element name="larr" type="docEmptyType" />
+      <xsd:element name="uarr" type="docEmptyType" />
+      <xsd:element name="rarr" type="docEmptyType" />
+      <xsd:element name="darr" type="docEmptyType" />
+      <xsd:element name="harr" type="docEmptyType" />
+      <xsd:element name="crarr" type="docEmptyType" />
+      <xsd:element name="lArr" type="docEmptyType" />
+      <xsd:element name="uArr" type="docEmptyType" />
+      <xsd:element name="rArr" type="docEmptyType" />
+      <xsd:element name="dArr" type="docEmptyType" />
+      <xsd:element name="hArr" type="docEmptyType" />
+      <xsd:element name="forall" type="docEmptyType" />
+      <xsd:element name="part" type="docEmptyType" />
+      <xsd:element name="exist" type="docEmptyType" />
+      <xsd:element name="empty" type="docEmptyType" />
+      <xsd:element name="nabla" type="docEmptyType" />
+      <xsd:element name="isin" type="docEmptyType" />
+      <xsd:element name="notin" type="docEmptyType" />
+      <xsd:element name="ni" type="docEmptyType" />
+      <xsd:element name="prod" type="docEmptyType" />
+      <xsd:element name="sum" type="docEmptyType" />
+      <xsd:element name="minus" type="docEmptyType" />
+      <xsd:element name="lowast" type="docEmptyType" />
+      <xsd:element name="radic" type="docEmptyType" />
+      <xsd:element name="prop" type="docEmptyType" />
+      <xsd:element name="infin" type="docEmptyType" />
+      <xsd:element name="ang" type="docEmptyType" />
+      <xsd:element name="and" type="docEmptyType" />
+      <xsd:element name="or" type="docEmptyType" />
+      <xsd:element name="cap" type="docEmptyType" />
+      <xsd:element name="cup" type="docEmptyType" />
+      <xsd:element name="int" type="docEmptyType" />
+      <xsd:element name="there4" type="docEmptyType" />
+      <xsd:element name="sim" type="docEmptyType" />
+      <xsd:element name="cong" type="docEmptyType" />
+      <xsd:element name="asymp" type="docEmptyType" />
+      <xsd:element name="ne" type="docEmptyType" />
+      <xsd:element name="equiv" type="docEmptyType" />
+      <xsd:element name="le" type="docEmptyType" />
+      <xsd:element name="ge" type="docEmptyType" />
+      <xsd:element name="sub" type="docEmptyType" />
+      <xsd:element name="sup" type="docEmptyType" />
+      <xsd:element name="nsub" type="docEmptyType" />
+      <xsd:element name="sube" type="docEmptyType" />
+      <xsd:element name="supe" type="docEmptyType" />
+      <xsd:element name="oplus" type="docEmptyType" />
+      <xsd:element name="otimes" type="docEmptyType" />
+      <xsd:element name="perp" type="docEmptyType" />
+      <xsd:element name="sdot" type="docEmptyType" />
+      <xsd:element name="lceil" type="docEmptyType" />
+      <xsd:element name="rceil" type="docEmptyType" />
+      <xsd:element name="lfloor" type="docEmptyType" />
+      <xsd:element name="rfloor" type="docEmptyType" />
+      <xsd:element name="lang" type="docEmptyType" />
+      <xsd:element name="rang" type="docEmptyType" />
+      <xsd:element name="loz" type="docEmptyType" />
+      <xsd:element name="spades" type="docEmptyType" />
+      <xsd:element name="clubs" type="docEmptyType" />
+      <xsd:element name="hearts" type="docEmptyType" />
+      <xsd:element name="diams" type="docEmptyType" />
+      <xsd:element name="OElig" type="docEmptyType" />
+      <xsd:element name="oelig" type="docEmptyType" />
+      <xsd:element name="Scaron" type="docEmptyType" />
+      <xsd:element name="scaron" type="docEmptyType" />
+      <xsd:element name="Yumlaut" type="docEmptyType" />
+      <xsd:element name="circ" type="docEmptyType" />
+      <xsd:element name="tilde" type="docEmptyType" />
+      <xsd:element name="ensp" type="docEmptyType" />
+      <xsd:element name="emsp" type="docEmptyType" />
+      <xsd:element name="thinsp" type="docEmptyType" />
+      <xsd:element name="zwnj" type="docEmptyType" />
+      <xsd:element name="zwj" type="docEmptyType" />
+      <xsd:element name="lrm" type="docEmptyType" />
+      <xsd:element name="rlm" type="docEmptyType" />
+      <xsd:element name="ndash" type="docEmptyType" />
+      <xsd:element name="mdash" type="docEmptyType" />
+      <xsd:element name="lsquo" type="docEmptyType" />
+      <xsd:element name="rsquo" type="docEmptyType" />
+      <xsd:element name="sbquo" type="docEmptyType" />
+      <xsd:element name="ldquo" type="docEmptyType" />
+      <xsd:element name="rdquo" type="docEmptyType" />
+      <xsd:element name="bdquo" type="docEmptyType" />
+      <xsd:element name="dagger" type="docEmptyType" />
+      <xsd:element name="Dagger" type="docEmptyType" />
+      <xsd:element name="permil" type="docEmptyType" />
+      <xsd:element name="lsaquo" type="docEmptyType" />
+      <xsd:element name="rsaquo" type="docEmptyType" />
+      <xsd:element name="euro" type="docEmptyType" />
+      <xsd:element name="tm" type="docEmptyType" />
+    </xsd:choice>
+  </xsd:group>
+
+  <xsd:complexType name="docTitleType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:group name="docCmdGroup">
+    <xsd:choice>
+      <xsd:group ref="docTitleCmdGroup"/>
+      <xsd:element name="linebreak" type="docEmptyType" />
+      <xsd:element name="hruler" type="docEmptyType" />
+      <xsd:element name="preformatted" type="docMarkupType" />
+      <xsd:element name="programlisting" type="listingType" />
+      <xsd:element name="verbatim" type="xsd:string" />
+      <xsd:element name="indexentry" type="docIndexEntryType" />
+      <xsd:element name="orderedlist" type="docListType" />
+      <xsd:element name="itemizedlist" type="docListType" />
+      <xsd:element name="simplesect" type="docSimpleSectType" />
+      <xsd:element name="title" type="docTitleType" />
+      <xsd:element name="variablelist" type="docVariableListType" />
+      <xsd:element name="table" type="docTableType" />
+      <xsd:element name="heading" type="docHeadingType" />
+      <xsd:element name="image" type="docImageType" />
+      <xsd:element name="dotfile" type="docFileType" />
+      <xsd:element name="mscfile" type="docFileType" />
+      <xsd:element name="diafile" type="docFileType" />
+      <xsd:element name="toclist" type="docTocListType" />
+      <xsd:element name="language" type="docLanguageType" />
+      <xsd:element name="parameterlist" type="docParamListType" />
+      <xsd:element name="xrefsect" type="docXRefSectType" />
+      <xsd:element name="copydoc" type="docCopyType" />
+      <xsd:element name="blockquote" type="docBlockQuoteType" />
+      <xsd:element name="parblock" type="docParBlockType" />
+    </xsd:choice>
+  </xsd:group>
+
+  <xsd:complexType name="docParaType" mixed="true">
+    <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docMarkupType" mixed="true">
+    <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docURLLink" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="url" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docAnchorType" mixed="true">
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docFormulaType" mixed="true">
+    <xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docIndexEntryType">
+    <xsd:sequence>
+      <xsd:element name="primaryie" type="xsd:string" />
+      <xsd:element name="secondaryie" type="xsd:string" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docListType">
+    <xsd:sequence>
+      <xsd:element name="listitem" type="docListItemType" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docListItemType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docSimpleSectType">
+    <xsd:sequence>
+      <xsd:element name="title" type="docTitleType" minOccurs="0" />
+      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+        <xsd:element name="para" type="docParaType" minOccurs="1" maxOccurs="unbounded" />
+      </xsd:sequence>
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxSimpleSectKind" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docVarListEntryType">
+    <xsd:sequence>
+      <xsd:element name="term" type="docTitleType" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:group name="docVariableListGroup">
+    <xsd:sequence>
+      <xsd:element name="varlistentry" type="docVarListEntryType" />
+      <xsd:element name="listitem" type="docListItemType" />
+    </xsd:sequence>
+  </xsd:group>
+
+  <xsd:complexType name="docVariableListType">
+    <xsd:sequence>
+      <xsd:group ref="docVariableListGroup" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docRefTextType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="refid" type="xsd:string" />
+    <xsd:attribute name="kindref" type="DoxRefKind" />
+    <xsd:attribute name="external" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docTableType">
+    <xsd:sequence>
+      <xsd:element name="row" type="docRowType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="caption" type="docCaptionType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="rows" type="xsd:integer" />
+    <xsd:attribute name="cols" type="xsd:integer" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docRowType">
+    <xsd:sequence>
+      <xsd:element name="entry" type="docEntryType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docEntryType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="thead" type="DoxBool" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docCaptionType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docHeadingType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="level" type="xsd:integer" /> <!-- todo: range 1-6 -->
+  </xsd:complexType>
+
+  <xsd:complexType name="docImageType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="type" type="DoxImageKind" /> 
+    <xsd:attribute name="name" type="xsd:string" /> 
+    <xsd:attribute name="width" type="xsd:string" /> 
+    <xsd:attribute name="height" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docFileType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="name" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docTocItemType" mixed="true">
+    <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+    <xsd:attribute name="id" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docTocListType">
+    <xsd:sequence>
+      <xsd:element name="tocitem" type="docTocItemType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docLanguageType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="langid" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamListType">
+    <xsd:sequence>
+      <xsd:element name="parameteritem" type="docParamListItem" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="kind" type="DoxParamListKind" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamListItem">
+    <xsd:sequence>
+      <xsd:element name="parameternamelist" type="docParamNameList" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="parameterdescription" type="descriptionType" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamNameList">
+    <xsd:sequence>
+      <xsd:element name="parametertype" type="docParamType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParamName" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
+    </xsd:sequence>
+    <xsd:attribute name="direction" type="DoxParamDir" use="optional" />
+  </xsd:complexType>
+
+  <xsd:complexType name="docXRefSectType">
+    <xsd:sequence>
+      <xsd:element name="xreftitle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="xrefdescription" type="descriptionType" />
+    </xsd:sequence>
+    <xsd:attribute name="id" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docCopyType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="internal" type="docInternalType" minOccurs="0" />
+    </xsd:sequence>
+    <xsd:attribute name="link" type="xsd:string" /> 
+  </xsd:complexType>
+
+  <xsd:complexType name="docBlockQuoteType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docParBlockType">
+    <xsd:sequence>
+      <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="docEmptyType"/>
+
+  <!-- Simple types -->
+
+  <xsd:simpleType name="DoxBool">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="yes" />
+      <xsd:enumeration value="no" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxGraphRelation">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="include" />
+      <xsd:enumeration value="usage" />
+      <xsd:enumeration value="template-instance" />
+      <xsd:enumeration value="public-inheritance" />
+      <xsd:enumeration value="protected-inheritance" />
+      <xsd:enumeration value="private-inheritance" />
+      <xsd:enumeration value="type-constraint" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxRefKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="compound" />
+      <xsd:enumeration value="member" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxMemberKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="define" />
+      <xsd:enumeration value="property" />
+      <xsd:enumeration value="event" />
+      <xsd:enumeration value="variable" />
+      <xsd:enumeration value="typedef" />
+      <xsd:enumeration value="enum" />
+      <xsd:enumeration value="function" />
+      <xsd:enumeration value="signal" />
+      <xsd:enumeration value="prototype" />
+      <xsd:enumeration value="friend" />
+      <xsd:enumeration value="dcop" />
+      <xsd:enumeration value="slot" />
+      <xsd:enumeration value="interface" />
+      <xsd:enumeration value="service" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxProtectionKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="public" />
+      <xsd:enumeration value="protected" />
+      <xsd:enumeration value="private" />
+      <xsd:enumeration value="package" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxRefQualifierKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="lvalue" />
+      <xsd:enumeration value="rvalue" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxLanguage">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="Unknown" />
+      <xsd:enumeration value="IDL" />
+      <xsd:enumeration value="Java" />
+      <xsd:enumeration value="C#" />
+      <xsd:enumeration value="D" />
+      <xsd:enumeration value="PHP" />
+      <xsd:enumeration value="Objective-C" />
+      <xsd:enumeration value="C++" />
+      <xsd:enumeration value="Javascript" />
+      <xsd:enumeration value="Python" />
+      <xsd:enumeration value="Fortran" />
+      <xsd:enumeration value="VHDL" />
+      <xsd:enumeration value="XML" />
+      <xsd:enumeration value="SQL" />
+      <xsd:enumeration value="Tcl" />
+      <xsd:enumeration value="Markdown" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxVirtualKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="non-virtual" />
+      <xsd:enumeration value="virtual" />
+      <xsd:enumeration value="pure-virtual" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxCompoundKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="class" />
+      <xsd:enumeration value="struct" />
+      <xsd:enumeration value="union" />
+      <xsd:enumeration value="interface" />
+      <xsd:enumeration value="protocol" />
+      <xsd:enumeration value="category" />
+      <xsd:enumeration value="exception" />
+      <xsd:enumeration value="service" />
+      <xsd:enumeration value="singleton" />
+      <xsd:enumeration value="module" />
+      <xsd:enumeration value="type" />
+      <xsd:enumeration value="file" />
+      <xsd:enumeration value="namespace" />
+      <xsd:enumeration value="group" />
+      <xsd:enumeration value="page" />
+      <xsd:enumeration value="example" />
+      <xsd:enumeration value="dir" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxSectionKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="user-defined" />
+      <xsd:enumeration value="public-type" />
+      <xsd:enumeration value="public-func" />
+      <xsd:enumeration value="public-attrib" />
+      <xsd:enumeration value="public-slot" />
+      <xsd:enumeration value="signal" />
+      <xsd:enumeration value="dcop-func" />
+      <xsd:enumeration value="property" />
+      <xsd:enumeration value="event" />
+      <xsd:enumeration value="public-static-func" />
+      <xsd:enumeration value="public-static-attrib" />
+      <xsd:enumeration value="protected-type" />
+      <xsd:enumeration value="protected-func" />
+      <xsd:enumeration value="protected-attrib" />
+      <xsd:enumeration value="protected-slot" />
+      <xsd:enumeration value="protected-static-func" />
+      <xsd:enumeration value="protected-static-attrib" />
+      <xsd:enumeration value="package-type" />
+      <xsd:enumeration value="package-func" />
+      <xsd:enumeration value="package-attrib" />
+      <xsd:enumeration value="package-static-func" />
+      <xsd:enumeration value="package-static-attrib" />
+      <xsd:enumeration value="private-type" />
+      <xsd:enumeration value="private-func" />
+      <xsd:enumeration value="private-attrib" />
+      <xsd:enumeration value="private-slot" />
+      <xsd:enumeration value="private-static-func" />
+      <xsd:enumeration value="private-static-attrib" />
+      <xsd:enumeration value="friend" />
+      <xsd:enumeration value="related" />
+      <xsd:enumeration value="define" />
+      <xsd:enumeration value="prototype" />
+      <xsd:enumeration value="typedef" />
+      <xsd:enumeration value="enum" />
+      <xsd:enumeration value="func" />
+      <xsd:enumeration value="var" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxHighlightClass">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="comment" />
+      <xsd:enumeration value="normal" />
+      <xsd:enumeration value="preprocessor" />
+      <xsd:enumeration value="keyword" />
+      <xsd:enumeration value="keywordtype" />
+      <xsd:enumeration value="keywordflow" />
+      <xsd:enumeration value="stringliteral" />
+      <xsd:enumeration value="charliteral" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxSimpleSectKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="see" />
+      <xsd:enumeration value="return" />
+      <xsd:enumeration value="author" />
+      <xsd:enumeration value="authors" />
+      <xsd:enumeration value="version" />
+      <xsd:enumeration value="since" />
+      <xsd:enumeration value="date" />
+      <xsd:enumeration value="note" />
+      <xsd:enumeration value="warning" />
+      <xsd:enumeration value="pre" />
+      <xsd:enumeration value="post" />
+      <xsd:enumeration value="copyright" />
+      <xsd:enumeration value="invariant" />
+      <xsd:enumeration value="remark" />
+      <xsd:enumeration value="attention" />
+      <xsd:enumeration value="par" />
+      <xsd:enumeration value="rcs" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxVersionNumber">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="\d+\.\d+.*" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxImageKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="html" />
+      <xsd:enumeration value="latex" />
+      <xsd:enumeration value="rtf" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxParamListKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="param" />
+      <xsd:enumeration value="retval" />
+      <xsd:enumeration value="exception" />
+      <xsd:enumeration value="templateparam" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxCharRange">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="[aeiouncAEIOUNC]" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxParamDir">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="in"/>
+      <xsd:enumeration value="out"/>
+      <xsd:enumeration value="inout"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="DoxAccessor">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="retain"/>
+      <xsd:enumeration value="copy"/>
+      <xsd:enumeration value="assign"/>
+      <xsd:enumeration value="weak"/>
+      <xsd:enumeration value="strong"/>
+      <xsd:enumeration value="unretained"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/doxygen/xml/config_8h.xml b/doxygen/xml/config_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ba417065016c0837b7877e80e07689dc322a6c34
--- /dev/null
+++ b/doxygen/xml/config_8h.xml
@@ -0,0 +1,279 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="config_8h" kind="file" language="C++">
+    <compoundname>config.h</compoundname>
+    <includes local="no">cstddef</includes>
+    <includedby refid="bucket_8h" local="yes">include/decoder/bucket.h</includedby>
+    <includedby refid="byte__assembler_8h" local="yes">include/decoder/byte_assembler.h</includedby>
+    <includedby refid="goertzel_8h" local="yes">include/decoder/goertzel.h</includedby>
+    <includedby refid="audio__writer_8h" local="yes">include/encoder/audio_writer.h</includedby>
+    <includedby refid="encoder_8h" local="yes">include/encoder/encoder.h</includedby>
+    <includedby refid="synth_8h" local="yes">include/encoder/synth.h</includedby>
+    <incdepgraph>
+      <node id="1">
+        <label>cstddef</label>
+      </node>
+      <node id="0">
+        <label>include/config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="1" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="11">
+        <label>include/encoder/tone_synth.h</label>
+        <link refid="tone__synth_8h"/>
+        <childnode refid="9" relation="include">
+        </childnode>
+      </node>
+      <node id="8">
+        <label>include/encoder/wav_writer.h</label>
+        <link refid="wav__writer_8h"/>
+        <childnode refid="9" relation="include">
+        </childnode>
+      </node>
+      <node id="7">
+        <label>include/encoder/audio_writer.h</label>
+        <link refid="audio__writer_8h"/>
+        <childnode refid="8" relation="include">
+        </childnode>
+      </node>
+      <node id="3">
+        <label>include/decoder/bucket.h</label>
+        <link refid="bucket_8h"/>
+        <childnode refid="4" relation="include">
+        </childnode>
+      </node>
+      <node id="5">
+        <label>include/decoder/decoder.h</label>
+        <link refid="decoder_8h"/>
+      </node>
+      <node id="10">
+        <label>include/encoder/synth.h</label>
+        <link refid="synth_8h"/>
+        <childnode refid="11" relation="include">
+        </childnode>
+      </node>
+      <node id="6">
+        <label>include/decoder/goertzel.h</label>
+        <link refid="goertzel_8h"/>
+        <childnode refid="5" relation="include">
+        </childnode>
+      </node>
+      <node id="2">
+        <label>include/config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="3" relation="include">
+        </childnode>
+        <childnode refid="4" relation="include">
+        </childnode>
+        <childnode refid="6" relation="include">
+        </childnode>
+        <childnode refid="7" relation="include">
+        </childnode>
+        <childnode refid="9" relation="include">
+        </childnode>
+        <childnode refid="10" relation="include">
+        </childnode>
+      </node>
+      <node id="9">
+        <label>include/encoder/encoder.h</label>
+        <link refid="encoder_8h"/>
+      </node>
+      <node id="4">
+        <label>include/decoder/byte_assembler.h</label>
+        <link refid="byte__assembler_8h"/>
+        <childnode refid="5" relation="include">
+        </childnode>
+      </node>
+    </invincdepgraph>
+      <sectiondef kind="define">
+      <memberdef kind="define" id="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" prot="public" static="no">
+        <name>REW_API</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="45" column="10" bodyfile="include/config.h" bodystart="45" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" prot="public" static="no">
+        <name>REW_NAMESPACE</name>
+        <initializer>namespace Rew</initializer>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="48" column="9" bodyfile="include/config.h" bodystart="48" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1a10a59554805ac7ce3905fd3540f98137" prot="public" static="no">
+        <name>NOEXCEPT</name>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="68" column="10" bodyfile="include/config.h" bodystart="68" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1a89e47af0449640d4f15191aba5ca24c6" prot="public" static="no">
+        <name>RAD_TO_DEG</name>
+        <initializer>57.2957795131</initializer>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="75" column="9" bodyfile="include/config.h" bodystart="75" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1a212460e743fecb084d717bb2180c5a56" prot="public" static="no">
+        <name>DEG_TO_RAD</name>
+        <initializer>0.01745329251</initializer>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="78" column="9" bodyfile="include/config.h" bodystart="78" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1ae71449b1cc6e6250b91f539153a7a0d3" prot="public" static="no">
+        <name>M_PI</name>
+        <initializer>3.14159265358979323846</initializer>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="81" column="9" bodyfile="include/config.h" bodystart="81" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1a04662083967db54721ae4d5c9fa75dea" prot="public" static="no">
+        <name>DEFAULT_LOW_TONE_FREQ</name>
+        <initializer>2400</initializer>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="85" column="9" bodyfile="include/config.h" bodystart="85" bodyend="-1"/>
+      </memberdef>
+      <memberdef kind="define" id="config_8h_1a36ccf37a8ab12ce335c3249bb87ae789" prot="public" static="no">
+        <name>DEFAULT_HIGH_TONE_FREQ</name>
+        <initializer>4800</initializer>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/config.h" line="89" column="9" bodyfile="include/config.h" bodystart="89" bodyend="-1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="comment">/***<sp/>This<sp/>file<sp/>is<sp/>part<sp/>of<sp/>FineFramework<sp/>project<sp/>***/</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#ifndef<sp/>REW_CONFIG</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_CONFIG</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Using<sp/>Visual<sp/>Studio</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#ifdef<sp/>_MSC_VER</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_WINDOWS_MSVC<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="8"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_WINDOWS<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="9"><highlight class="normal"></highlight><highlight class="preprocessor">#pragma<sp/>warning(<sp/>disable:<sp/>4251<sp/>)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="10"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="11"><highlight class="normal"></highlight></codeline>
+<codeline lineno="12"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Using<sp/>MinGW</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="13"><highlight class="normal"></highlight><highlight class="preprocessor">#ifdef<sp/>__MINGW32__</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="14"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_WINDOWS_MINGW<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="15"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_WINDOWS<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="16"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="17"><highlight class="normal"></highlight></codeline>
+<codeline lineno="18"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Using<sp/>Linux<sp/>GCC</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="19"><highlight class="normal"></highlight><highlight class="preprocessor">#ifdef<sp/>__linux__</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="20"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_LINUX_GCC<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="21"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_LINUX<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="22"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="23"><highlight class="normal"></highlight></codeline>
+<codeline lineno="24"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Using<sp/>MAX<sp/>OS<sp/>X</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="25"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>defined(__APPLE__)<sp/>&amp;&amp;<sp/>defined(__MACH__)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="26"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_OSX_CLANG<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="27"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_OSX<sp/>1</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="28"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="29"><highlight class="normal"></highlight></codeline>
+<codeline lineno="30"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>!defined(REW_WINDOWS_MSVC)<sp/>&amp;&amp;<sp/>!defined(REW_WINDOWS_MINGW)<sp/>&amp;&amp;<sp/>!defined(REW_LINUX_GCC)<sp/>&amp;&amp;<sp/>!defined(REW_OSX_CLANG)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="31"><highlight class="normal"></highlight><highlight class="preprocessor">#error<sp/>Please<sp/>use<sp/>Visual<sp/>Studio,<sp/>MinGW,<sp/>Linux<sp/>GCC,<sp/>or<sp/>OS<sp/>X<sp/>Clang<sp/>to<sp/>compile<sp/>COM3001!</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="32"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="33"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>!defined(REW_WINDOWS)<sp/>&amp;&amp;<sp/>!defined(REW_LINUX)<sp/>&amp;&amp;<sp/>!defined(REW_OSX)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="34"><highlight class="normal"></highlight><highlight class="preprocessor">#error<sp/>Target<sp/>platform<sp/>not<sp/>selected!</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="35"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="36"><highlight class="normal"></highlight></codeline>
+<codeline lineno="37"><highlight class="normal"></highlight><highlight class="comment">//<sp/>COM3001<sp/>export<sp/>for<sp/>Windows</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="38"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>defined(REW_WINDOWS)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="39"><highlight class="normal"></highlight><highlight class="preprocessor">#ifdef<sp/>REW_EXPORTS</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="40"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_API<sp/>__declspec(dllexport)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="41"><highlight class="normal"></highlight><highlight class="preprocessor">#else</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="42"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_API<sp/>__declspec(dllimport)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="43"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="44"><highlight class="normal"></highlight><highlight class="preprocessor">#else</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="45" refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_API</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="46"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="47"><highlight class="normal"></highlight></codeline>
+<codeline lineno="48" refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_NAMESPACE<sp/>namespace<sp/>Rew</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="49"><highlight class="normal"></highlight></codeline>
+<codeline lineno="50"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>!defined(REW_API)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="51"><highlight class="normal"></highlight><highlight class="preprocessor">#error<sp/>REW_API<sp/>dllexport<sp/>not<sp/>defined!</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="52"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="53"><highlight class="normal"></highlight></codeline>
+<codeline lineno="54"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>!defined(HAS_NOEXCEPT)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="55"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>defined(__clang__)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="56"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>__has_feature(cxx_noexcept)</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="57"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>HAS_NOEXCEPT</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="58"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="59"><highlight class="normal"></highlight><highlight class="preprocessor">#else</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="60"><highlight class="normal"></highlight><highlight class="preprocessor">#if<sp/>defined(__GXX_EXPERIMENTAL_CXX0X__)<sp/>&amp;&amp;<sp/>__GNUC__<sp/>*<sp/>10<sp/>+<sp/>__GNUC_MINOR__<sp/>&gt;=<sp/>46<sp/>||<sp/>defined(_MSC_FULL_VER)<sp/>&amp;&amp;<sp/>_MSC_FULL_VER<sp/>&gt;=<sp/>190023026</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="61"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>HAS_NOEXCEPT</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="62"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="63"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="64"><highlight class="normal"></highlight></codeline>
+<codeline lineno="65"><highlight class="normal"></highlight><highlight class="preprocessor">#ifdef<sp/>HAS_NOEXCEPT</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="66"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>NOEXCEPT<sp/>noexcept</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="67"><highlight class="normal"></highlight><highlight class="preprocessor">#else</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="68" refid="config_8h_1a10a59554805ac7ce3905fd3540f98137" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>NOEXCEPT</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="69"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="70"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="71"><highlight class="normal"></highlight></codeline>
+<codeline lineno="72"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;cstddef&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="73"><highlight class="normal"></highlight></codeline>
+<codeline lineno="74"><highlight class="normal"></highlight><highlight class="preprocessor">#ifndef<sp/>RAD_TO_DEG</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="75" refid="config_8h_1a89e47af0449640d4f15191aba5ca24c6" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>RAD_TO_DEG<sp/><sp/>57.2957795131</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="76"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="77"><highlight class="normal"></highlight><highlight class="preprocessor">#ifndef<sp/>DEG_TO_RAD</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="78" refid="config_8h_1a212460e743fecb084d717bb2180c5a56" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>DEG_TO_RAD<sp/><sp/>0.01745329251</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="79"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="80"><highlight class="normal"></highlight><highlight class="preprocessor">#ifndef<sp/>M_PI</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="81" refid="config_8h_1ae71449b1cc6e6250b91f539153a7a0d3" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>M_PI<sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>3.14159265358979323846</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="82"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="83"><highlight class="normal"></highlight></codeline>
+<codeline lineno="84"><highlight class="normal"></highlight><highlight class="preprocessor">#ifndef<sp/>DEFAULT_LOW_TONE_FREQ</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="85" refid="config_8h_1a04662083967db54721ae4d5c9fa75dea" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>DEFAULT_LOW_TONE_FREQ<sp/>2400</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="86"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="87"><highlight class="normal"></highlight></codeline>
+<codeline lineno="88"><highlight class="normal"></highlight><highlight class="preprocessor">#ifndef<sp/>DEFAULT_HIGH_TONE_FREQ</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="89" refid="config_8h_1a36ccf37a8ab12ce335c3249bb87ae789" refkind="member"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>DEFAULT_HIGH_TONE_FREQ<sp/>4800</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="90"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="91"><highlight class="normal"></highlight></codeline>
+<codeline lineno="92"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/config.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/decoder_8h.xml b/doxygen/xml/decoder_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fcd9c3990acb991513ecf6fcdabad00ac24daf03
--- /dev/null
+++ b/doxygen/xml/decoder_8h.xml
@@ -0,0 +1,118 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="decoder_8h" kind="file" language="C++">
+    <compoundname>decoder.h</compoundname>
+    <includes refid="goertzel_8h" local="yes">goertzel.h</includes>
+    <includes local="no">utility</includes>
+    <includes local="no">functional</includes>
+    <includes local="no">memory</includes>
+    <includes refid="byte__assembler_8h" local="yes">byte_assembler.h</includes>
+    <incdepgraph>
+      <node id="32">
+        <label>functional</label>
+      </node>
+      <node id="35">
+        <label>bucket.h</label>
+        <link refid="bucket_8h"/>
+        <childnode refid="29" relation="include">
+        </childnode>
+        <childnode refid="36" relation="include">
+        </childnode>
+      </node>
+      <node id="27">
+        <label>include/decoder/decoder.h</label>
+        <link refid="decoder_8h"/>
+        <childnode refid="28" relation="include">
+        </childnode>
+        <childnode refid="31" relation="include">
+        </childnode>
+        <childnode refid="32" relation="include">
+        </childnode>
+        <childnode refid="33" relation="include">
+        </childnode>
+        <childnode refid="34" relation="include">
+        </childnode>
+      </node>
+      <node id="36">
+        <label>vector</label>
+      </node>
+      <node id="31">
+        <label>utility</label>
+      </node>
+      <node id="28">
+        <label>goertzel.h</label>
+        <link refid="goertzel_8h"/>
+        <childnode refid="29" relation="include">
+        </childnode>
+      </node>
+      <node id="30">
+        <label>cstddef</label>
+      </node>
+      <node id="29">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="30" relation="include">
+        </childnode>
+      </node>
+      <node id="34">
+        <label>byte_assembler.h</label>
+        <link refid="byte__assembler_8h"/>
+        <childnode refid="29" relation="include">
+        </childnode>
+        <childnode refid="35" relation="include">
+        </childnode>
+        <childnode refid="32" relation="include">
+        </childnode>
+      </node>
+      <node id="33">
+        <label>memory</label>
+      </node>
+    </incdepgraph>
+    <innerclass refid="class_rew_1_1_decoder" prot="public">Rew::Decoder</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_DECODER_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_DECODER_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="goertzel_8h" kindref="compound">goertzel.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;utility&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;functional&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;memory&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="8"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="byte__assembler_8h" kindref="compound">byte_assembler.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="9"><highlight class="normal"></highlight></codeline>
+<codeline lineno="15"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="19" refid="class_rew_1_1_decoder" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref><sp/>{</highlight></codeline>
+<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>(</highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>lowToneFreq<sp/>=<sp/><ref refid="config_8h_1a04662083967db54721ae4d5c9fa75dea" kindref="member">DEFAULT_LOW_TONE_FREQ</ref>,</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>highToneFreq<sp/>=<sp/><ref refid="config_8h_1a36ccf37a8ab12ce335c3249bb87ae789" kindref="member">DEFAULT_HIGH_TONE_FREQ</ref>,</highlight></codeline>
+<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>sampleLengthMs<sp/>=<sp/>1.25);</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>(<ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/>~<ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>()<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>swap(<ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;<sp/>operator<sp/>=<sp/>(<ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;<sp/>operator<sp/>=<sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_decoder" kindref="compound">Decoder</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="31"><highlight class="normal"></highlight></codeline>
+<codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>operator()(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>samples,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>length,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::function&lt;</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">(</highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">)&gt;&amp;<sp/>callback);</highlight></codeline>
+<codeline lineno="33"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>operator()(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>samples,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>length,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::function&lt;</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">(</highlight><highlight class="keywordtype">float</highlight><highlight class="normal">,<sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">)&gt;&amp;<sp/>callback);</highlight></codeline>
+<codeline lineno="34"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>getLowMagnitude(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>samples,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>length);</highlight></codeline>
+<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>getHighMagnitude(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>samples,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>length);</highlight></codeline>
+<codeline lineno="36"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="37"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>blockSize;</highlight></codeline>
+<codeline lineno="38"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref><sp/>lowGoertzel;</highlight></codeline>
+<codeline lineno="39"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref><sp/>highGoertzel;</highlight></codeline>
+<codeline lineno="40"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::unique_ptr&lt;float&gt;<sp/>buffer;</highlight></codeline>
+<codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_byte_assembler" kindref="compound">ByteAssembler</ref><sp/>byteAssembler;</highlight></codeline>
+<codeline lineno="42"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="43"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="44"><highlight class="normal"></highlight></codeline>
+<codeline lineno="45"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/decoder/decoder.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/dir_acb9e55bfefdf4d43f13fff6aa240ad7.xml b/doxygen/xml/dir_acb9e55bfefdf4d43f13fff6aa240ad7.xml
new file mode 100644
index 0000000000000000000000000000000000000000..712389793c6049a42700392e9a94a74a89098005
--- /dev/null
+++ b/doxygen/xml/dir_acb9e55bfefdf4d43f13fff6aa240ad7.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="dir_acb9e55bfefdf4d43f13fff6aa240ad7" kind="dir">
+    <compoundname>include/encoder</compoundname>
+    <innerfile refid="audio__writer_8h">audio_writer.h</innerfile>
+    <innerfile refid="encoder_8h">encoder.h</innerfile>
+    <innerfile refid="synth_8h">synth.h</innerfile>
+    <innerfile refid="tone__synth_8h">tone_synth.h</innerfile>
+    <innerfile refid="wav__writer_8h">wav_writer.h</innerfile>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/encoder/"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/dir_d44c64559bbebec7f509842c48db8b23.xml b/doxygen/xml/dir_d44c64559bbebec7f509842c48db8b23.xml
new file mode 100644
index 0000000000000000000000000000000000000000..64147e51d72ce0bf6172b15cd7435014d8c173b0
--- /dev/null
+++ b/doxygen/xml/dir_d44c64559bbebec7f509842c48db8b23.xml
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="dir_d44c64559bbebec7f509842c48db8b23" kind="dir">
+    <compoundname>include</compoundname>
+    <innerdir refid="dir_ef4c7dabb16c9bee1e17c47c3bb25728">include/decoder</innerdir>
+    <innerdir refid="dir_acb9e55bfefdf4d43f13fff6aa240ad7">include/encoder</innerdir>
+    <innerfile refid="config_8h">config.h</innerfile>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/dir_ef4c7dabb16c9bee1e17c47c3bb25728.xml b/doxygen/xml/dir_ef4c7dabb16c9bee1e17c47c3bb25728.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3b508e2a512c2d922414c28c7a38c7e396634b50
--- /dev/null
+++ b/doxygen/xml/dir_ef4c7dabb16c9bee1e17c47c3bb25728.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="dir_ef4c7dabb16c9bee1e17c47c3bb25728" kind="dir">
+    <compoundname>include/decoder</compoundname>
+    <innerfile refid="bucket_8h">bucket.h</innerfile>
+    <innerfile refid="byte__assembler_8h">byte_assembler.h</innerfile>
+    <innerfile refid="decoder_8h">decoder.h</innerfile>
+    <innerfile refid="goertzel_8h">goertzel.h</innerfile>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/decoder/"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/encoder_8h.xml b/doxygen/xml/encoder_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da8c982913285a7318eb72613dae264e6d1dc820
--- /dev/null
+++ b/doxygen/xml/encoder_8h.xml
@@ -0,0 +1,110 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="encoder_8h" kind="file" language="C++">
+    <compoundname>encoder.h</compoundname>
+    <includes refid="config_8h" local="yes">../config.h</includes>
+    <includes refid="tone__synth_8h" local="yes">tone_synth.h</includes>
+    <includes refid="wav__writer_8h" local="yes">wav_writer.h</includes>
+    <incdepgraph>
+      <node id="54">
+        <label>tone_synth.h</label>
+        <link refid="tone__synth_8h"/>
+        <childnode refid="55" relation="include">
+        </childnode>
+        <childnode refid="56" relation="include">
+        </childnode>
+      </node>
+      <node id="57">
+        <label>wav_writer.h</label>
+        <link refid="wav__writer_8h"/>
+        <childnode refid="58" relation="include">
+        </childnode>
+        <childnode refid="59" relation="include">
+        </childnode>
+      </node>
+      <node id="59">
+        <label>audio_writer.h</label>
+        <link refid="audio__writer_8h"/>
+        <childnode refid="58" relation="include">
+        </childnode>
+        <childnode refid="60" relation="include">
+        </childnode>
+        <childnode refid="52" relation="include">
+        </childnode>
+      </node>
+      <node id="60">
+        <label>string</label>
+      </node>
+      <node id="58">
+        <label>fstream</label>
+      </node>
+      <node id="56">
+        <label>synth.h</label>
+        <link refid="synth_8h"/>
+        <childnode refid="52" relation="include">
+        </childnode>
+      </node>
+      <node id="53">
+        <label>cstddef</label>
+      </node>
+      <node id="52">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="53" relation="include">
+        </childnode>
+      </node>
+      <node id="51">
+        <label>include/encoder/encoder.h</label>
+        <link refid="encoder_8h"/>
+        <childnode refid="52" relation="include">
+        </childnode>
+        <childnode refid="54" relation="include">
+        </childnode>
+        <childnode refid="57" relation="include">
+        </childnode>
+      </node>
+      <node id="55">
+        <label>memory</label>
+      </node>
+    </incdepgraph>
+    <innerclass refid="class_rew_1_1_encoder" prot="public">Rew::Encoder</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_ENCODER_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_ENCODER_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;../config.h&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="tone__synth_8h" kindref="compound">tone_synth.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="wav__writer_8h" kindref="compound">wav_writer.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"></highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="17" refid="class_rew_1_1_encoder" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref><sp/>{</highlight></codeline>
+<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>(</highlight></codeline>
+<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>lowToneFreq<sp/>=<sp/><ref refid="config_8h_1a04662083967db54721ae4d5c9fa75dea" kindref="member">DEFAULT_LOW_TONE_FREQ</ref>,</highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>highToneFreq<sp/>=<sp/><ref refid="config_8h_1a36ccf37a8ab12ce335c3249bb87ae789" kindref="member">DEFAULT_HIGH_TONE_FREQ</ref>,<sp/></highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>sampleLengthMs<sp/>=<sp/>1.25);</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>(<ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>swap(<ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;<sp/>operator<sp/>=<sp/>(<ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;&amp;<sp/>other)<sp/>noexcept;</highlight></codeline>
+<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;<sp/>operator<sp/>=<sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_encoder" kindref="compound">Encoder</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"></highlight></codeline>
+<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>operator()(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>data,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>length)<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>getNumOfSamples(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>length)<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref><sp/>lowTone;</highlight></codeline>
+<codeline lineno="33"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref><sp/>highTone;</highlight></codeline>
+<codeline lineno="34"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::unique_ptr&lt;float[]&gt;<sp/>nullTone;</highlight></codeline>
+<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="36"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="37"><highlight class="normal"></highlight></codeline>
+<codeline lineno="38"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/encoder/encoder.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/goertzel_8h.xml b/doxygen/xml/goertzel_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d100ef72a37d3c3597f1cf3f1effdc10732f4751
--- /dev/null
+++ b/doxygen/xml/goertzel_8h.xml
@@ -0,0 +1,78 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="goertzel_8h" kind="file" language="C++">
+    <compoundname>goertzel.h</compoundname>
+    <includes refid="config_8h" local="yes">../config.h</includes>
+    <includedby refid="decoder_8h" local="yes">include/decoder/decoder.h</includedby>
+    <incdepgraph>
+      <node id="38">
+        <label>include/decoder/goertzel.h</label>
+        <link refid="goertzel_8h"/>
+        <childnode refid="39" relation="include">
+        </childnode>
+      </node>
+      <node id="40">
+        <label>cstddef</label>
+      </node>
+      <node id="39">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="40" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="42">
+        <label>include/decoder/decoder.h</label>
+        <link refid="decoder_8h"/>
+      </node>
+      <node id="41">
+        <label>include/decoder/goertzel.h</label>
+        <link refid="goertzel_8h"/>
+        <childnode refid="42" relation="include">
+        </childnode>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_goertzel" prot="public">Rew::Goertzel</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_DECODER_GOERTZEL_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_DECODER_GOERTZEL_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;../config.h&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref>{</highlight></codeline>
+<codeline lineno="10" refid="class_rew_1_1_goertzel" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref><sp/>{</highlight></codeline>
+<codeline lineno="11"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="12"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref>(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>blockSize,<sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>targetFrequency,<sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>sampleRate);</highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/>~<ref refid="class_rew_1_1_goertzel" kindref="compound">Goertzel</ref>()<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="14"><highlight class="normal"></highlight></codeline>
+<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>operator()(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>samples);</highlight></codeline>
+<codeline lineno="16"><highlight class="normal"></highlight></codeline>
+<codeline lineno="17" refid="class_rew_1_1_goertzel_1ae28f15fc29df22d452b61fc43fb66aa8" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">inline</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_goertzel_1ae28f15fc29df22d452b61fc43fb66aa8" kindref="member">getBlockSize</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
+<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>blockSize;</highlight></codeline>
+<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>processSample(</highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>sample);</highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>init(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>blockSize,<sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>targetFrequency,<sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>sampleRate);</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>reset();</highlight></codeline>
+<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>getMagnitude()<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"></highlight></codeline>
+<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>coeff;</highlight></codeline>
+<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>Q1;</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>Q2;</highlight></codeline>
+<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>sine;</highlight></codeline>
+<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/>cosine;</highlight></codeline>
+<codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>blockSize;</highlight></codeline>
+<codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="33"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="34"><highlight class="normal"></highlight></codeline>
+<codeline lineno="35"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/decoder/goertzel.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/group__decoder.xml b/doxygen/xml/group__decoder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..56e032f73c7d141e82d2e0aeb03a10151a759618
--- /dev/null
+++ b/doxygen/xml/group__decoder.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="group__decoder" kind="group">
+    <compoundname>decoder</compoundname>
+    <title>Decoder</title>
+    <innerclass refid="class_rew_1_1_bucket" prot="public">Rew::Bucket</innerclass>
+    <innerclass refid="class_rew_1_1_byte_assembler" prot="public">Rew::ByteAssembler</innerclass>
+    <innerclass refid="class_rew_1_1_decoder" prot="public">Rew::Decoder</innerclass>
+    <innerclass refid="class_rew_1_1_goertzel" prot="public">Rew::Goertzel</innerclass>
+    <briefdescription>
+<para>The clientside part of the project for decoding the signal. </para>    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/group__encoder.xml b/doxygen/xml/group__encoder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..77b8950792e7db748f82e85264c3e377c867cadf
--- /dev/null
+++ b/doxygen/xml/group__encoder.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="group__encoder" kind="group">
+    <compoundname>encoder</compoundname>
+    <title>Encoder</title>
+    <innerclass refid="class_rew_1_1_audio_writer" prot="public">Rew::AudioWriter</innerclass>
+    <innerclass refid="class_rew_1_1_encoder" prot="public">Rew::Encoder</innerclass>
+    <innerclass refid="class_rew_1_1_synth" prot="public">Rew::Synth</innerclass>
+    <innerclass refid="class_rew_1_1_tone_synth" prot="public">Rew::ToneSynth</innerclass>
+    <innerclass refid="class_rew_1_1_wav_writer" prot="public">Rew::WavWriter</innerclass>
+    <briefdescription>
+<para>The server side part of the project for encoding the data into signal. </para>    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/index.xml b/doxygen/xml/index.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a7cdf99fdd29bb4b695af1c4f309c9178821a46f
--- /dev/null
+++ b/doxygen/xml/index.xml
@@ -0,0 +1,175 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygenindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="index.xsd" version="1.8.14">
+  <compound refid="class_rew_1_1_audio_writer" kind="class"><name>Rew::AudioWriter</name>
+    <member refid="class_rew_1_1_audio_writer_1a4eca6a6861551d45c1d079d3971f01df" kind="variable"><name>loaded</name></member>
+    <member refid="class_rew_1_1_audio_writer_1aa84a112f4f791cad425aa63f3b412efa" kind="variable"><name>size</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a71567e58f680b1f3346727ce20d09115" kind="variable"><name>sampleRate</name></member>
+    <member refid="class_rew_1_1_audio_writer_1aabfb8aed29b83114ff67ae2a0a063bbb" kind="variable"><name>channelCount</name></member>
+    <member refid="class_rew_1_1_audio_writer_1ac3d60ac33859cc0688ca3761b5dbf010" kind="variable"><name>bitsPerSample</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a0f0e4ea476c6e557af77ba1902cdde13" kind="variable"><name>chunkSize</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a7898acd23a7adbbc1c1fe96220608957" kind="function"><name>AudioWriter</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a88b3be8be3b8bd644a16939e7faefcd5" kind="function"><name>~AudioWriter</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a619c520a49467c7dd6a6bee0d3ac399c" kind="function"><name>open</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a4ac109653fd08b3d51dd54930593b859" kind="function"><name>writeChunk</name></member>
+    <member refid="class_rew_1_1_audio_writer_1aa8b315cb43e7598aa1b1ea2ff0e036af" kind="function"><name>writeFooter</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a2d891dcd78323ef0ba32335041eb923c" kind="function"><name>close</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a5288a2b883fab9d06d8292c6a657c077" kind="function"><name>eof</name></member>
+    <member refid="class_rew_1_1_audio_writer_1ae3d33d0968b52793b545d46c7e8cdb55" kind="function"><name>getPos</name></member>
+    <member refid="class_rew_1_1_audio_writer_1ab3f42f0f4b515dadd3de7c51f857d042" kind="function"><name>isOpen</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a344835d861a600f89454e35bfe4958b9" kind="function"><name>getSize</name></member>
+    <member refid="class_rew_1_1_audio_writer_1af5e4622f9b4faa35bb553522766c5cd8" kind="function"><name>getSampleRate</name></member>
+    <member refid="class_rew_1_1_audio_writer_1ab3a2df9304221bd8e4b593efe277598a" kind="function"><name>getNumOfChannels</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a8255a4d834e892a6594bcd1e449aa54f" kind="function"><name>getBitsPerSample</name></member>
+    <member refid="class_rew_1_1_audio_writer_1a16c70083411cc3921233092c0ad632c3" kind="function"><name>getChunkSize</name></member>
+    <member refid="class_rew_1_1_audio_writer_1ae11b1fa568d431d6a976bee5f14d38d8" kind="function"><name>operator bool</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_bucket" kind="class"><name>Rew::Bucket</name>
+    <member refid="class_rew_1_1_bucket_1acbc95b93eb4ceff039ee2bf9050dfd3b" kind="variable"><name>vector</name></member>
+    <member refid="class_rew_1_1_bucket_1a26d4ad2b2302ad18be73b383d70f2c44" kind="function"><name>Bucket</name></member>
+    <member refid="class_rew_1_1_bucket_1aa80d0bdc739c2446e33312b6f7fa1fae" kind="function"><name>Bucket</name></member>
+    <member refid="class_rew_1_1_bucket_1a44338da96cb18d730ed767896fe148bf" kind="function"><name>Bucket</name></member>
+    <member refid="class_rew_1_1_bucket_1aff77d0f0031128e321d62c0f6e39f760" kind="function"><name>~Bucket</name></member>
+    <member refid="class_rew_1_1_bucket_1aa34958b0d7d35a288b45952460fe322e" kind="function"><name>swap</name></member>
+    <member refid="class_rew_1_1_bucket_1a24d6780a56671976c1dd50eec59f90f4" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_bucket_1acccd57a3a54af96e368ee2434a43e6f0" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_bucket_1ac5cbeedb6b0b579ec26c9669a6754571" kind="function"><name>pushBack</name></member>
+    <member refid="class_rew_1_1_bucket_1a220215d7c14acc8ebf3a93918f81468b" kind="function"><name>size</name></member>
+    <member refid="class_rew_1_1_bucket_1a412e4d2186c14d8296f17c63ff7465d8" kind="function"><name>begin</name></member>
+    <member refid="class_rew_1_1_bucket_1afc320156c6efd79f8e86667aa7f7cb05" kind="function"><name>begin</name></member>
+    <member refid="class_rew_1_1_bucket_1a51fb9092c7601809ce04367ae1cc8beb" kind="function"><name>end</name></member>
+    <member refid="class_rew_1_1_bucket_1a8b0f1a414910a05f2742dccdcb7e3fa9" kind="function"><name>end</name></member>
+    <member refid="class_rew_1_1_bucket_1ab0490d14ae89f27f16982294ae1f56e1" kind="function"><name>clear</name></member>
+    <member refid="class_rew_1_1_bucket_1acda8cc938f48bf23c01b3644ff0d114c" kind="function"><name>operator[]</name></member>
+    <member refid="class_rew_1_1_bucket_1a03c0248f1d3e025dda02331ca6e54bd2" kind="function"><name>operator[]</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_byte_assembler" kind="class"><name>Rew::ByteAssembler</name>
+    <member refid="class_rew_1_1_byte_assembler_1a68242e586e317103789946300a7126d8" kind="variable"><name>buffer</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a5a7a1c9ce7a2e928afa23a0e3598cb92" kind="function"><name>ByteAssembler</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a6b63b45d083d74819ed12dc380b7e64b" kind="function"><name>ByteAssembler</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a2f3f8050d82ed23bef25cbcd91c51cc7" kind="function"><name>ByteAssembler</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a1b9676cb634c5e58292528b4dd66a632" kind="function"><name>swap</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1ad0c945b42ab0799a909e90819e65282e" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1aea609342e2813315926997783da794e8" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a269def0ed892b84e5284f80008dd0837" kind="function"><name>operator()</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a1c0c4cc1d99eaada68c33725aa7c90e4" kind="function"><name>countValue</name></member>
+    <member refid="class_rew_1_1_byte_assembler_1a15cf8c29c1c6fb7f9eb7f62c82093a80" kind="function"><name>toByte</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_decoder" kind="class"><name>Rew::Decoder</name>
+    <member refid="class_rew_1_1_decoder_1af6cc7425e112b2db1f2641a501ec3cda" kind="variable"><name>blockSize</name></member>
+    <member refid="class_rew_1_1_decoder_1adf24b0af05fa183f082c2c1541389abf" kind="variable"><name>lowGoertzel</name></member>
+    <member refid="class_rew_1_1_decoder_1a97039031c00bdf00dc64bb2d373795bb" kind="variable"><name>highGoertzel</name></member>
+    <member refid="class_rew_1_1_decoder_1a58c85fb9b5be4a9c00e2e9e351991cb9" kind="variable"><name>buffer</name></member>
+    <member refid="class_rew_1_1_decoder_1a8aca3fb866d8d663a863b375b26a4490" kind="variable"><name>byteAssembler</name></member>
+    <member refid="class_rew_1_1_decoder_1ae253e716569f260f8c00bba62b715ac3" kind="function"><name>Decoder</name></member>
+    <member refid="class_rew_1_1_decoder_1ac3eff2261a903149a73dd6006bdbb51b" kind="function"><name>Decoder</name></member>
+    <member refid="class_rew_1_1_decoder_1a52a421be82572621f079bbfc6ddefef5" kind="function"><name>Decoder</name></member>
+    <member refid="class_rew_1_1_decoder_1a9f64b20ac742596b863ae501eae8d487" kind="function"><name>~Decoder</name></member>
+    <member refid="class_rew_1_1_decoder_1ad969594c2b324386833aa72ad797ed6c" kind="function"><name>swap</name></member>
+    <member refid="class_rew_1_1_decoder_1a632a4f0a49b4296fd1ad72e0d9c80704" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_decoder_1a189cb08a95c53b70c35164286c5a9061" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_decoder_1ac241d859a05f016a4f8b0c3959539426" kind="function"><name>operator()</name></member>
+    <member refid="class_rew_1_1_decoder_1a650bd842d77f10777a1af25a60cea7d2" kind="function"><name>operator()</name></member>
+    <member refid="class_rew_1_1_decoder_1aa3febdd0293f6d329f55964d64ed9559" kind="function"><name>getLowMagnitude</name></member>
+    <member refid="class_rew_1_1_decoder_1a954fcde976db8571a1550a23a38e376b" kind="function"><name>getHighMagnitude</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_encoder" kind="class"><name>Rew::Encoder</name>
+    <member refid="class_rew_1_1_encoder_1abab25a20be3f4f7cc8fada65321fb855" kind="variable"><name>lowTone</name></member>
+    <member refid="class_rew_1_1_encoder_1a21b9fb238f3b7cc1b56a58b75e22018f" kind="variable"><name>highTone</name></member>
+    <member refid="class_rew_1_1_encoder_1ae9018203e48442fc11f71ca4dc91d11b" kind="variable"><name>nullTone</name></member>
+    <member refid="class_rew_1_1_encoder_1a1ef7cf58b6f6addfb22fdaa1c9ba7df7" kind="function"><name>Encoder</name></member>
+    <member refid="class_rew_1_1_encoder_1ab018bb9b035bd40da89d04109e4c2374" kind="function"><name>Encoder</name></member>
+    <member refid="class_rew_1_1_encoder_1a81fb438ec14c31d3e86f1c6f35b0f41c" kind="function"><name>Encoder</name></member>
+    <member refid="class_rew_1_1_encoder_1a2d121516fb43077f1d8dc318a02feac6" kind="function"><name>swap</name></member>
+    <member refid="class_rew_1_1_encoder_1a487d21e4e2135a174f08fbc71c182ae9" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_encoder_1a7cb96ed4848060c6479076eb8d79ab87" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_encoder_1a0fbf3ed6f39c0099771eef9e64d294ea" kind="function"><name>operator()</name></member>
+    <member refid="class_rew_1_1_encoder_1a5a0eff754a3373a361ae2c78d692bdc4" kind="function"><name>getNumOfSamples</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_goertzel" kind="class"><name>Rew::Goertzel</name>
+    <member refid="class_rew_1_1_goertzel_1aa4d84715b925577ab63368b59044edc9" kind="variable"><name>coeff</name></member>
+    <member refid="class_rew_1_1_goertzel_1af231f9f7c1d7abcba220d8c648e121a1" kind="variable"><name>Q1</name></member>
+    <member refid="class_rew_1_1_goertzel_1a10a385a1ef24f90178fc8ac5ea89767c" kind="variable"><name>Q2</name></member>
+    <member refid="class_rew_1_1_goertzel_1a64e806f9edd8eeee230547b2f99bde19" kind="variable"><name>sine</name></member>
+    <member refid="class_rew_1_1_goertzel_1ac7be9bdbcd8c4ba2ac281c0ff4747f6b" kind="variable"><name>cosine</name></member>
+    <member refid="class_rew_1_1_goertzel_1a9d9347d8bfa02fc805875d3bb52ce6bd" kind="variable"><name>blockSize</name></member>
+    <member refid="class_rew_1_1_goertzel_1ae5f0a6149e1c9a8cbf2e3a89cbb3a0ef" kind="function"><name>Goertzel</name></member>
+    <member refid="class_rew_1_1_goertzel_1a07d48d1c8342c443f5573a661a240da3" kind="function"><name>~Goertzel</name></member>
+    <member refid="class_rew_1_1_goertzel_1a781fe776d1841c2591d16a4288c67757" kind="function"><name>operator()</name></member>
+    <member refid="class_rew_1_1_goertzel_1ae28f15fc29df22d452b61fc43fb66aa8" kind="function"><name>getBlockSize</name></member>
+    <member refid="class_rew_1_1_goertzel_1a308f30e32fef56737d077941730a9fe3" kind="function"><name>processSample</name></member>
+    <member refid="class_rew_1_1_goertzel_1a679a7cf5c39ed0d6960c3d72ce23c4c2" kind="function"><name>init</name></member>
+    <member refid="class_rew_1_1_goertzel_1ab2e4991eb6a7a1ef205d6f2dc26785f0" kind="function"><name>reset</name></member>
+    <member refid="class_rew_1_1_goertzel_1a5178077648810edec45d07462a59df86" kind="function"><name>getMagnitude</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_synth" kind="class"><name>Rew::Synth</name>
+    <member refid="class_rew_1_1_synth_1ace1cefd258dc0d74251541a59f5b2ac6" kind="function"><name>operator()</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_tone_synth" kind="class"><name>Rew::ToneSynth</name>
+    <member refid="class_rew_1_1_tone_synth_1a6aa45a42763100554f5062dd8f03bb37" kind="variable"><name>frequency</name></member>
+    <member refid="class_rew_1_1_tone_synth_1aa27efd3fcc9a3da57aab4c528654dff7" kind="variable"><name>total</name></member>
+    <member refid="class_rew_1_1_tone_synth_1a665a2d073189fd425d21c405da41ab8e" kind="variable"><name>src</name></member>
+    <member refid="class_rew_1_1_tone_synth_1aa07adb49b8173acbe587634375296b83" kind="function"><name>ToneSynth</name></member>
+    <member refid="class_rew_1_1_tone_synth_1a8198c80ea4d9f4fa5756b0da55c7cb3d" kind="function"><name>ToneSynth</name></member>
+    <member refid="class_rew_1_1_tone_synth_1a442ec4059583bebb796999a77d6e54a0" kind="function"><name>ToneSynth</name></member>
+    <member refid="class_rew_1_1_tone_synth_1af9f03f7e685e9ec65e7a2af37375d2f1" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_tone_synth_1a9ef2c6fe4b3a77a30310ae2db7767921" kind="function"><name>operator=</name></member>
+    <member refid="class_rew_1_1_tone_synth_1aac7488713a60314c28bf2ce69254bed3" kind="function"><name>operator()</name></member>
+    <member refid="class_rew_1_1_tone_synth_1afe306b4551ee6abf6383d0c9b75e1d17" kind="function"><name>getSamplesPerBlock</name></member>
+    <member refid="class_rew_1_1_tone_synth_1a27740d024ea2ee4115882c5ecb650341" kind="function"><name>allocate</name></member>
+  </compound>
+  <compound refid="class_rew_1_1_wav_writer" kind="class"><name>Rew::WavWriter</name>
+    <member refid="class_rew_1_1_wav_writer_1a4bdeea5d1815794649ca3cfd17725e65" kind="variable"><name>output</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a7d15122ae661ec7be4065b1417401642" kind="variable"><name>eos</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a99940678fabcd731c90e2dec3802e935" kind="variable"><name>dataOffset</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a18999b980002a2aaa91a330d9177ecca" kind="variable"><name>dataWritten</name></member>
+    <member refid="class_rew_1_1_wav_writer_1af9a57cca60c3e4332ed403d3c5a9aac5" kind="function"><name>WavWriter</name></member>
+    <member refid="class_rew_1_1_wav_writer_1ab47e21b2b233b8a4ac56bcfcd4426b5f" kind="function"><name>~WavWriter</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a4700f564e14ca54a319ed2a23337581b" kind="function"><name>open</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a017679508e2b7f7645ff6192e275af54" kind="function"><name>close</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a21f12fc360fee57a7cfc85d9a4ff07be" kind="function"><name>writeChunk</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a0ca68ad62f42f0eb1334ffc49319f4a1" kind="function"><name>writeFooter</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a2fee28dbc8c223c8b7e361eaf65ce22f" kind="function"><name>eof</name></member>
+    <member refid="class_rew_1_1_wav_writer_1a4314c21ee94386f745f951c57d82bc7f" kind="function"><name>getPos</name></member>
+  </compound>
+  <compound refid="namespace_rew" kind="namespace"><name>Rew</name>
+    <member refid="namespace_rew_1ac7d4b7e2a8dee078194367ced9f823bc" kind="function"><name>saveWav</name></member>
+  </compound>
+  <compound refid="config_8h" kind="file"><name>config.h</name>
+    <member refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kind="define"><name>REW_API</name></member>
+    <member refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kind="define"><name>REW_NAMESPACE</name></member>
+    <member refid="config_8h_1a10a59554805ac7ce3905fd3540f98137" kind="define"><name>NOEXCEPT</name></member>
+    <member refid="config_8h_1a89e47af0449640d4f15191aba5ca24c6" kind="define"><name>RAD_TO_DEG</name></member>
+    <member refid="config_8h_1a212460e743fecb084d717bb2180c5a56" kind="define"><name>DEG_TO_RAD</name></member>
+    <member refid="config_8h_1ae71449b1cc6e6250b91f539153a7a0d3" kind="define"><name>M_PI</name></member>
+    <member refid="config_8h_1a04662083967db54721ae4d5c9fa75dea" kind="define"><name>DEFAULT_LOW_TONE_FREQ</name></member>
+    <member refid="config_8h_1a36ccf37a8ab12ce335c3249bb87ae789" kind="define"><name>DEFAULT_HIGH_TONE_FREQ</name></member>
+  </compound>
+  <compound refid="bucket_8h" kind="file"><name>bucket.h</name>
+  </compound>
+  <compound refid="byte__assembler_8h" kind="file"><name>byte_assembler.h</name>
+  </compound>
+  <compound refid="decoder_8h" kind="file"><name>decoder.h</name>
+  </compound>
+  <compound refid="goertzel_8h" kind="file"><name>goertzel.h</name>
+  </compound>
+  <compound refid="audio__writer_8h" kind="file"><name>audio_writer.h</name>
+  </compound>
+  <compound refid="encoder_8h" kind="file"><name>encoder.h</name>
+  </compound>
+  <compound refid="synth_8h" kind="file"><name>synth.h</name>
+  </compound>
+  <compound refid="tone__synth_8h" kind="file"><name>tone_synth.h</name>
+  </compound>
+  <compound refid="wav__writer_8h" kind="file"><name>wav_writer.h</name>
+  </compound>
+  <compound refid="group__decoder" kind="group"><name>decoder</name>
+  </compound>
+  <compound refid="group__encoder" kind="group"><name>encoder</name>
+  </compound>
+  <compound refid="dir_ef4c7dabb16c9bee1e17c47c3bb25728" kind="dir"><name>include/decoder</name>
+  </compound>
+  <compound refid="dir_acb9e55bfefdf4d43f13fff6aa240ad7" kind="dir"><name>include/encoder</name>
+  </compound>
+  <compound refid="dir_d44c64559bbebec7f509842c48db8b23" kind="dir"><name>include</name>
+  </compound>
+</doxygenindex>
diff --git a/doxygen/xml/index.xsd b/doxygen/xml/index.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..d7ab2a906b19983c8b1d375e4167b2841ec07c78
--- /dev/null
+++ b/doxygen/xml/index.xsd
@@ -0,0 +1,66 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="doxygenindex" type="DoxygenType"/>
+
+  <xsd:complexType name="DoxygenType">
+    <xsd:sequence>
+      <xsd:element name="compound" type="CompoundType" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="version" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="CompoundType">
+    <xsd:sequence>
+      <xsd:element name="name" type="xsd:string"/>
+      <xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" use="required"/>
+    <xsd:attribute name="kind" type="CompoundKind" use="required"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="MemberType">
+    <xsd:sequence>
+      <xsd:element name="name" type="xsd:string"/>
+    </xsd:sequence>
+    <xsd:attribute name="refid" type="xsd:string" use="required"/>
+    <xsd:attribute name="kind" type="MemberKind" use="required"/>
+  </xsd:complexType>
+  
+  <xsd:simpleType name="CompoundKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="class"/>
+      <xsd:enumeration value="struct"/>
+      <xsd:enumeration value="union"/>
+      <xsd:enumeration value="interface"/>
+      <xsd:enumeration value="protocol"/>
+      <xsd:enumeration value="category"/>
+      <xsd:enumeration value="exception"/>
+      <xsd:enumeration value="file"/>
+      <xsd:enumeration value="namespace"/>
+      <xsd:enumeration value="group"/>
+      <xsd:enumeration value="page"/>
+      <xsd:enumeration value="example"/>
+      <xsd:enumeration value="dir"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="MemberKind">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="define"/>
+      <xsd:enumeration value="property"/>
+      <xsd:enumeration value="event"/>
+      <xsd:enumeration value="variable"/>
+      <xsd:enumeration value="typedef"/>
+      <xsd:enumeration value="enum"/>
+      <xsd:enumeration value="enumvalue"/>
+      <xsd:enumeration value="function"/>
+      <xsd:enumeration value="signal"/>
+      <xsd:enumeration value="prototype"/>
+      <xsd:enumeration value="friend"/>
+      <xsd:enumeration value="dcop"/>
+      <xsd:enumeration value="slot"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/doxygen/xml/namespace_rew.xml b/doxygen/xml/namespace_rew.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ac3e17d42be676960da587516da8e605cc7c4577
--- /dev/null
+++ b/doxygen/xml/namespace_rew.xml
@@ -0,0 +1,59 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="namespace_rew" kind="namespace" language="C++">
+    <compoundname>Rew</compoundname>
+    <innerclass refid="class_rew_1_1_audio_writer" prot="public">Rew::AudioWriter</innerclass>
+    <innerclass refid="class_rew_1_1_bucket" prot="public">Rew::Bucket</innerclass>
+    <innerclass refid="class_rew_1_1_byte_assembler" prot="public">Rew::ByteAssembler</innerclass>
+    <innerclass refid="class_rew_1_1_decoder" prot="public">Rew::Decoder</innerclass>
+    <innerclass refid="class_rew_1_1_encoder" prot="public">Rew::Encoder</innerclass>
+    <innerclass refid="class_rew_1_1_goertzel" prot="public">Rew::Goertzel</innerclass>
+    <innerclass refid="class_rew_1_1_synth" prot="public">Rew::Synth</innerclass>
+    <innerclass refid="class_rew_1_1_tone_synth" prot="public">Rew::ToneSynth</innerclass>
+    <innerclass refid="class_rew_1_1_wav_writer" prot="public">Rew::WavWriter</innerclass>
+      <sectiondef kind="func">
+      <memberdef kind="function" id="namespace_rew_1ac7d4b7e2a8dee078194367ced9f823bc" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>bool</type>
+        <definition>bool Rew::saveWav</definition>
+        <argsstring>(const std::string &amp;path, const unsigned char *data, size_t size, int bitsPerSample, int sampleRate, int numChannels)</argsstring>
+        <name>saveWav</name>
+        <param>
+          <type>const std::string &amp;</type>
+          <declname>path</declname>
+        </param>
+        <param>
+          <type>const unsigned char *</type>
+          <declname>data</declname>
+        </param>
+        <param>
+          <type>size_t</type>
+          <declname>size</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>bitsPerSample</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>sampleRate</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>numChannels</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="include/encoder/wav_writer.h" line="30" column="1"/>
+      </memberdef>
+      </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="include/decoder/bucket.h" line="7" column="1"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/synth_8h.xml b/doxygen/xml/synth_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..50767d2e8e10c9984fc9dc0df08469699ecb31db
--- /dev/null
+++ b/doxygen/xml/synth_8h.xml
@@ -0,0 +1,65 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="synth_8h" kind="file" language="C++">
+    <compoundname>synth.h</compoundname>
+    <includes refid="config_8h" local="yes">../config.h</includes>
+    <includedby refid="tone__synth_8h" local="yes">include/encoder/tone_synth.h</includedby>
+    <incdepgraph>
+      <node id="62">
+        <label>include/encoder/synth.h</label>
+        <link refid="synth_8h"/>
+        <childnode refid="63" relation="include">
+        </childnode>
+      </node>
+      <node id="64">
+        <label>cstddef</label>
+      </node>
+      <node id="63">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="64" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="66">
+        <label>include/encoder/tone_synth.h</label>
+        <link refid="tone__synth_8h"/>
+        <childnode refid="67" relation="include">
+        </childnode>
+      </node>
+      <node id="65">
+        <label>include/encoder/synth.h</label>
+        <link refid="synth_8h"/>
+        <childnode refid="66" relation="include">
+        </childnode>
+      </node>
+      <node id="67">
+        <label>include/encoder/encoder.h</label>
+        <link refid="encoder_8h"/>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_synth" prot="public">Rew::Synth</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_EMITTER_SYNTH_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_EMITTER_SYNTH_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;../config.h&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="10" refid="class_rew_1_1_synth" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_synth" kindref="compound">Synth</ref><sp/>{</highlight></codeline>
+<codeline lineno="11"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="12"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>operator()(</highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>dst)<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>=<sp/>0;</highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="14"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="15"><highlight class="normal"></highlight></codeline>
+<codeline lineno="16"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/encoder/synth.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/tone__synth_8h.xml b/doxygen/xml/tone__synth_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f8936d940d774d64319e86c1e26393cf4abf5a7e
--- /dev/null
+++ b/doxygen/xml/tone__synth_8h.xml
@@ -0,0 +1,89 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="tone__synth_8h" kind="file" language="C++">
+    <compoundname>tone_synth.h</compoundname>
+    <includes local="no">memory</includes>
+    <includes refid="synth_8h" local="yes">synth.h</includes>
+    <includedby refid="encoder_8h" local="yes">include/encoder/encoder.h</includedby>
+    <incdepgraph>
+      <node id="68">
+        <label>include/encoder/tone_synth.h</label>
+        <link refid="tone__synth_8h"/>
+        <childnode refid="69" relation="include">
+        </childnode>
+        <childnode refid="70" relation="include">
+        </childnode>
+      </node>
+      <node id="70">
+        <label>synth.h</label>
+        <link refid="synth_8h"/>
+        <childnode refid="71" relation="include">
+        </childnode>
+      </node>
+      <node id="72">
+        <label>cstddef</label>
+      </node>
+      <node id="71">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="72" relation="include">
+        </childnode>
+      </node>
+      <node id="69">
+        <label>memory</label>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="73">
+        <label>include/encoder/tone_synth.h</label>
+        <link refid="tone__synth_8h"/>
+        <childnode refid="74" relation="include">
+        </childnode>
+      </node>
+      <node id="74">
+        <label>include/encoder/encoder.h</label>
+        <link refid="encoder_8h"/>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_tone_synth" prot="public">Rew::ToneSynth</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_EMITTER_TONE_SYNTH_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_EMITTER_TONE_SYNTH_H</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;memory&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="synth_8h" kindref="compound">synth.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="11" refid="class_rew_1_1_tone_synth" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>:<sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_synth" kindref="compound">Synth</ref><sp/>{</highlight></codeline>
+<codeline lineno="12"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>frequency,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>sampleRate,<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>ms);</highlight></codeline>
+<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>(<ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>&amp;&amp;<sp/>other)<sp/>noexcept<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>&amp;<sp/>operator<sp/>=<sp/>(<ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>&amp;&amp;<sp/>other)<sp/>noexcept<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>&amp;<sp/>operator<sp/>=<sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_tone_synth" kindref="compound">ToneSynth</ref>&amp;<sp/>other)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="18"><highlight class="normal"></highlight></codeline>
+<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_synth_1ace1cefd258dc0d74251541a59f5b2ac6" kindref="member">operator()</ref>(</highlight><highlight class="keywordtype">float</highlight><highlight class="normal">*<sp/>dst)<sp/></highlight><highlight class="keyword">const<sp/>override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="20" refid="class_rew_1_1_tone_synth_1afe306b4551ee6abf6383d0c9b75e1d17" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">inline</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_tone_synth_1afe306b4551ee6abf6383d0c9b75e1d17" kindref="member">getSamplesPerBlock</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>total;</highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>allocate(</highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>sampleRate,<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>ms);</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"></highlight></codeline>
+<codeline lineno="26"><highlight class="normal"></highlight></codeline>
+<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>frequency;</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>total;</highlight></codeline>
+<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::unique_ptr&lt;float[]&gt;<sp/>src;</highlight></codeline>
+<codeline lineno="30"><highlight class="normal"></highlight></codeline>
+<codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="32"><highlight class="normal">}</highlight></codeline>
+<codeline lineno="33"><highlight class="normal"></highlight></codeline>
+<codeline lineno="34"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/encoder/tone_synth.h"/>
+  </compounddef>
+</doxygen>
diff --git a/doxygen/xml/wav__writer_8h.xml b/doxygen/xml/wav__writer_8h.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dc20d980cd21e57570bd083341f9b2fa327f65b3
--- /dev/null
+++ b/doxygen/xml/wav__writer_8h.xml
@@ -0,0 +1,94 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.14">
+  <compounddef id="wav__writer_8h" kind="file" language="C++">
+    <compoundname>wav_writer.h</compoundname>
+    <includes local="no">fstream</includes>
+    <includes refid="audio__writer_8h" local="yes">audio_writer.h</includes>
+    <includedby refid="encoder_8h" local="yes">include/encoder/encoder.h</includedby>
+    <incdepgraph>
+      <node id="75">
+        <label>include/encoder/wav_writer.h</label>
+        <link refid="wav__writer_8h"/>
+        <childnode refid="76" relation="include">
+        </childnode>
+        <childnode refid="77" relation="include">
+        </childnode>
+      </node>
+      <node id="77">
+        <label>audio_writer.h</label>
+        <link refid="audio__writer_8h"/>
+        <childnode refid="76" relation="include">
+        </childnode>
+        <childnode refid="78" relation="include">
+        </childnode>
+        <childnode refid="79" relation="include">
+        </childnode>
+      </node>
+      <node id="78">
+        <label>string</label>
+      </node>
+      <node id="76">
+        <label>fstream</label>
+      </node>
+      <node id="80">
+        <label>cstddef</label>
+      </node>
+      <node id="79">
+        <label>../config.h</label>
+        <link refid="config_8h"/>
+        <childnode refid="80" relation="include">
+        </childnode>
+      </node>
+    </incdepgraph>
+    <invincdepgraph>
+      <node id="81">
+        <label>include/encoder/wav_writer.h</label>
+        <link refid="wav__writer_8h"/>
+        <childnode refid="82" relation="include">
+        </childnode>
+      </node>
+      <node id="82">
+        <label>include/encoder/encoder.h</label>
+        <link refid="encoder_8h"/>
+      </node>
+    </invincdepgraph>
+    <innerclass refid="class_rew_1_1_wav_writer" prot="public">Rew::WavWriter</innerclass>
+    <innernamespace refid="namespace_rew">Rew</innernamespace>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <programlisting>
+<codeline lineno="1"><highlight class="preprocessor">#ifndef<sp/>REW_WAV_SAVER</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#define<sp/>REW_WAV_SAVER</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="3"><highlight class="normal"></highlight></codeline>
+<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;fstream&gt;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="audio__writer_8h" kindref="compound">audio_writer.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
+<codeline lineno="6"><highlight class="normal"></highlight></codeline>
+<codeline lineno="7"><highlight class="normal"><ref refid="config_8h_1a3f4d110f8706ad06ec910a8c7907163f" kindref="member">REW_NAMESPACE</ref><sp/>{</highlight></codeline>
+<codeline lineno="12" refid="class_rew_1_1_wav_writer" refkind="compound"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="class_rew_1_1_wav_writer" kindref="compound">WavWriter</ref><sp/>:<sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer" kindref="compound">AudioWriter</ref><sp/>{</highlight></codeline>
+<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="class_rew_1_1_wav_writer" kindref="compound">WavWriter</ref>();</highlight></codeline>
+<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">virtual</highlight><highlight class="normal"><sp/>~<ref refid="class_rew_1_1_wav_writer" kindref="compound">WavWriter</ref>();</highlight></codeline>
+<codeline lineno="16"><highlight class="normal"></highlight></codeline>
+<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a619c520a49467c7dd6a6bee0d3ac399c" kindref="member">open</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::string&amp;<sp/>path,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>size,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>bitsPerSample,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>sampleRate,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>numChannels)<sp/></highlight><highlight class="keyword">override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a2d891dcd78323ef0ba32335041eb923c" kindref="member">close</ref>()<sp/></highlight><highlight class="keyword">override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a4ac109653fd08b3d51dd54930593b859" kindref="member">writeChunk</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>data,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal">*<sp/>bytesWritten)<sp/></highlight><highlight class="keyword">override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1aa8b315cb43e7598aa1b1ea2ff0e036af" kindref="member">writeFooter</ref>()<sp/></highlight><highlight class="keyword">override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1a5288a2b883fab9d06d8292c6a657c077" kindref="member">eof</ref>()<sp/></highlight><highlight class="keyword">const<sp/>override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/><ref refid="class_rew_1_1_audio_writer_1ae3d33d0968b52793b545d46c7e8cdb55" kindref="member">getPos</ref>()<sp/></highlight><highlight class="keyword">const<sp/>override</highlight><highlight class="normal">;</highlight></codeline>
+<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
+<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::fstream<sp/>output;</highlight></codeline>
+<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>eos;</highlight></codeline>
+<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>dataOffset;</highlight></codeline>
+<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>dataWritten;</highlight></codeline>
+<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
+<codeline lineno="29"><highlight class="normal"></highlight></codeline>
+<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="config_8h_1a8b2e2c4b30d14b145a2841f4bf083bf3" kindref="member">REW_API</ref><sp/><ref refid="namespace_rew_1ac7d4b7e2a8dee078194367ced9f823bc" kindref="member">saveWav</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::string&amp;<sp/>path,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">unsigned</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>data,<sp/></highlight><highlight class="keywordtype">size_t</highlight><highlight class="normal"><sp/>size,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>bitsPerSample,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>sampleRate,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>numChannels);</highlight></codeline>
+<codeline lineno="31"><highlight class="normal">};</highlight></codeline>
+<codeline lineno="32"><highlight class="normal"></highlight></codeline>
+<codeline lineno="33"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight></codeline>
+    </programlisting>
+    <location file="include/encoder/wav_writer.h"/>
+  </compounddef>
+</doxygen>
diff --git a/include/decoder/bucket.h b/include/decoder/bucket.h
new file mode 100644
index 0000000000000000000000000000000000000000..3d554c261e38ee905bdf4459c6310e42cec80aac
--- /dev/null
+++ b/include/decoder/bucket.h
@@ -0,0 +1,75 @@
+#ifndef REW_BUCKET_H
+#define REW_BUCKET_H
+
+#include "../config.h"
+#include <vector>
+
+REW_NAMESPACE {
+	/*!
+     * @ingroup decoder
+     */
+	template <typename T>
+	class REW_API Bucket {
+	public:
+		Bucket() = default;
+		Bucket(Bucket&& other) noexcept: vector(std::move(other.vector)) {
+			
+		}
+		Bucket(const Bucket& other) = delete;
+		virtual ~Bucket() = default;
+		void swap(Bucket& other) noexcept {
+			using std::swap;
+			swap(vector, other.vector);
+		}
+		Bucket& operator = (Bucket&& other) noexcept {
+			if (this != &other) {
+				swap(other);
+			}
+			return *this;
+		}
+		Bucket& operator = (const Bucket& other) = delete;
+
+		void pushBack (const typename std::vector<T>::value_type& value) {
+			if (vector.capacity() <= vector.size()) {
+				vector.reserve(vector.capacity() + 64);
+			}
+			vector.push_back(value);
+		}
+
+		size_t size() const {
+			return vector.size();
+		}
+
+		typename std::vector<T>::iterator begin() {
+			return vector.begin();
+		}
+
+		typename std::vector<T>::const_iterator begin() const {
+			return vector.begin();
+		}
+
+		typename std::vector<T>::iterator end() {
+			return vector.end();
+		}
+
+		typename std::vector<T>::const_iterator end() const {
+			return vector.end();
+		}
+
+		void clear() {
+			vector.clear();
+		}
+
+		typename std::vector<T>::value_type& operator[](size_t i) {
+			return vector[i];
+		}
+
+		const typename std::vector<T>::value_type& operator[](size_t i) const {
+			return vector[i];
+		}
+	private:
+		std::vector<T> vector;
+	};
+}
+
+#endif
diff --git a/include/decoder/byte_assembler.h b/include/decoder/byte_assembler.h
new file mode 100644
index 0000000000000000000000000000000000000000..008f2603dcf4f5edf018273e3947261672318471
--- /dev/null
+++ b/include/decoder/byte_assembler.h
@@ -0,0 +1,29 @@
+#ifndef REW_BYTE_ASSEMBLER_H
+#define REW_BYTE_ASSEMBLER_H
+
+#include "../config.h"
+#include "bucket.h"
+#include <functional>
+
+REW_NAMESPACE {
+	/*!
+     * @ingroup decoder
+     */
+	class REW_API ByteAssembler {
+	public:
+		ByteAssembler();
+		ByteAssembler(ByteAssembler&& other) noexcept;
+		ByteAssembler(const ByteAssembler& other) = delete;
+		void swap(ByteAssembler& other) noexcept;
+		ByteAssembler& operator = (ByteAssembler&& other) noexcept;
+		ByteAssembler& operator = (const ByteAssembler& other) = delete;
+
+		void operator()(unsigned char magnitude, const std::function<void(unsigned char)>& callback);
+	private:
+		static size_t countValue(const unsigned char* begin, const unsigned char* end, unsigned char value);
+		static unsigned char toByte(const unsigned char* begin, const unsigned char* end);
+		Bucket<unsigned char> buffer;
+	};
+}
+
+#endif
diff --git a/include/decoder/decoder.h b/include/decoder/decoder.h
index bd429faa68394848af6737b438095994f8020783..9b0fb67e641ddf468acf51531f788c9888184e76 100644
--- a/include/decoder/decoder.h
+++ b/include/decoder/decoder.h
@@ -1,10 +1,22 @@
 #ifndef REW_DECODER_H
 #define REW_DECODER_H
 
-#include "goertzel.h"
 #include <utility>
+#include <functional>
+#include <memory>
+#include "goertzel.h"
+#include "byte_assembler.h"
+#include "decompressor.h"
+
+/*!
+ * @defgroup decoder Decoder
+ * @brief The clientside part of the project for decoding the signal
+ */
 
 REW_NAMESPACE {
+	/*!
+     * @ingroup decoder
+     */
     class REW_API Decoder {
     public:
         Decoder(
@@ -13,18 +25,21 @@ REW_NAMESPACE {
 			double sampleLengthMs = 1.25);
         Decoder(Decoder&& other) noexcept;
         Decoder(const Decoder& other) = delete;
+		virtual ~Decoder() = default;
         void swap(Decoder& other) noexcept;
         Decoder& operator = (Decoder&& other) noexcept;
         Decoder& operator = (const Decoder& other) = delete;
 
-		void process(const float* samples, size_t length);
+		void operator()(const float* samples, size_t length, const std::function<void(unsigned char)>& callback);
+		void operator()(const float* samples, size_t length, const std::function<void(float, float)>& callback);
 		float* getLowMagnitude(const float* samples, size_t length);
 		float* getHighMagnitude(const float* samples, size_t length);
     private:
 		size_t blockSize;
 		Goertzel lowGoertzel;
 		Goertzel highGoertzel;
-		double sampleLengthMs;
+		std::unique_ptr<float> buffer;
+		ByteAssembler byteAssembler;
     };
 }
 
diff --git a/include/decoder/decompressor.h b/include/decoder/decompressor.h
new file mode 100644
index 0000000000000000000000000000000000000000..186fec24f44a9f39dc212897f548b6e58e64a916
--- /dev/null
+++ b/include/decoder/decompressor.h
@@ -0,0 +1,29 @@
+#ifndef REW_DECOMPRESSOR_H
+#define REW_DECOMPRESSOR_H
+
+#include "../config.h"
+#include <memory>
+#include <vector>
+
+REW_NAMESPACE{
+	/*!
+	 * @ingroup decoder
+	 */
+	class REW_API Decompressor {
+	public:
+		Decompressor();
+		virtual ~Decompressor();
+		Decompressor(const Decompressor& other) = delete;
+		Decompressor(Decompressor&& other) noexcept;
+		void swap(Decompressor& other) noexcept;
+		Decompressor& operator = (const Decompressor& other) = delete;
+		Decompressor& operator = (Decompressor&& other) noexcept;
+
+		std::vector<unsigned char> operator()(const unsigned char* data, size_t length) const;
+	private:
+		struct Impl;
+		std::unique_ptr<Impl> pimpl;
+	};
+}
+
+#endif
diff --git a/include/decoder/goertzel.h b/include/decoder/goertzel.h
index e200ab1f5711a5f8bfa025e32384bf29a2a04135..b27e5cc0d450b624b7497ec3395bce9910467220 100644
--- a/include/decoder/goertzel.h
+++ b/include/decoder/goertzel.h
@@ -4,6 +4,9 @@
 #include "../config.h"
 
 REW_NAMESPACE{
+    /*!
+     * @ingroup decoder
+     */
     class REW_API Goertzel {
     public:
         Goertzel(size_t blockSize, float targetFrequency, float sampleRate);
diff --git a/include/decoder/packet.h b/include/decoder/packet.h
new file mode 100644
index 0000000000000000000000000000000000000000..7b363d972ec4aaa01d23b8dafbfbebed1387ed0b
--- /dev/null
+++ b/include/decoder/packet.h
@@ -0,0 +1,22 @@
+#ifndef REW_PACKET_H
+#define REW_PACKET_H
+
+#include "../config.h"
+
+REW_NAMESPACE{
+	/*!
+	 * @ingroup decoder
+	 */
+	class REW_API Packet {
+	public:
+		Packet();
+		virtual ~Packet() = default;
+		Packet(const Packet& other) = delete;
+		Packet(Packet&& other) noexcept;
+		void swap(Packet& other) noexcept;
+		Packet& operator = (const Packet& other) = delete;
+		Packet& operator = (Packet&& other) noexcept;
+	};
+}
+
+#endif
diff --git a/include/decoder/packet_assembler.h b/include/decoder/packet_assembler.h
new file mode 100644
index 0000000000000000000000000000000000000000..b5262ee9afb7cc0992720aa9d4684080e2b3a4aa
--- /dev/null
+++ b/include/decoder/packet_assembler.h
@@ -0,0 +1,27 @@
+#ifndef REW_PACKET_ASSEMBLER_H
+#define REW_PACKET_ASSEMBLER_H
+
+#include "../config.h"
+#include "bucket.h"
+#include <functional>
+
+REW_NAMESPACE {
+	/*!
+	 * @ingroup decoder
+	 */
+	class REW_API PacketAssembler {
+	public:
+		PacketAssembler();
+		PacketAssembler(PacketAssembler&& other) noexcept;
+		PacketAssembler(const PacketAssembler& other) = delete;
+		void swap(PacketAssembler& other) noexcept;
+		PacketAssembler& operator = (PacketAssembler&& other) noexcept;
+		PacketAssembler& operator = (const PacketAssembler& other) = delete;
+
+		void operator()(unsigned char magnitude, const std::function<void(unsigned char)>& callback);
+	private:
+		Bucket<unsigned char> buffer;
+	};
+}
+
+#endif
diff --git a/include/emitter/emitter.h b/include/emitter/emitter.h
deleted file mode 100644
index 906f2694aff849bb1edbc7823015a1687006f695..0000000000000000000000000000000000000000
--- a/include/emitter/emitter.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef REW_EMITTER_H
-#define REW_EMITTER_H
-
-#include "../config.h"
-
-REW_NAMESPACE {
-    class REW_API Emitter {
-    public:
-        Emitter();
-        Emitter(Emitter&& other) noexcept;
-        Emitter(const Emitter& other) = delete;
-        void swap(Emitter& other) noexcept;
-        Emitter& operator = (Emitter&& other) noexcept;
-        Emitter& operator = (const Emitter& other) = delete;
-    };
-}
-
-#endif
diff --git a/include/encoder/audio_writer.h b/include/encoder/audio_writer.h
index 6a20d0ec7abb140c02a2ff0fc460a2bffa2abf85..08379d87068a93dfa2d0050925d6211eaf417862 100644
--- a/include/encoder/audio_writer.h
+++ b/include/encoder/audio_writer.h
@@ -8,6 +8,7 @@
 REW_NAMESPACE{
     /*!
      * @brief Audio saver base class
+     * @ingroup encoder
      */
     class REW_API AudioWriter {
     public:
diff --git a/include/encoder/compressor.h b/include/encoder/compressor.h
new file mode 100644
index 0000000000000000000000000000000000000000..34192343fd116940495fe484266ac8c00df7f831
--- /dev/null
+++ b/include/encoder/compressor.h
@@ -0,0 +1,29 @@
+#ifndef REW_COMPRESSOR_H
+#define REW_COMPRESSOR_H
+
+#include "../config.h"
+#include <vector>
+#include <memory>
+
+REW_NAMESPACE{
+	/*!
+	 * @ingroup decoder
+	 */
+	class REW_API Compressor {
+	public:
+		Compressor();
+		virtual ~Compressor();
+		Compressor(const Compressor& other) = delete;
+		Compressor(Compressor&& other) noexcept;
+		void swap(Compressor& other) noexcept;
+		Compressor& operator = (const Compressor& other) = delete;
+		Compressor& operator = (Compressor&& other) noexcept;
+
+		std::vector<unsigned char> operator()(const unsigned char* data, size_t length) const;
+	private:
+		struct Impl;
+		std::unique_ptr<Impl> pimpl;
+	};
+}
+
+#endif
diff --git a/include/encoder/encoder.h b/include/encoder/encoder.h
index fef78ac2e1cec32f91cae82cb30fee87ef14770e..5a0c0f8093f7f67489bab9e651d815052dc1813c 100644
--- a/include/encoder/encoder.h
+++ b/include/encoder/encoder.h
@@ -4,8 +4,17 @@
 #include "../config.h"
 #include "tone_synth.h"
 #include "wav_writer.h"
+#include "compressor.h"
+
+/*!
+ * @defgroup encoder Encoder
+ * @brief The server side part of the project for encoding the data into signal
+ */
 
 REW_NAMESPACE {
+    /*!
+     * @ingroup encoder
+     */
     class REW_API Encoder {
     public:
         Encoder(
@@ -18,12 +27,13 @@ REW_NAMESPACE {
         Encoder& operator = (Encoder&& other) noexcept;
         Encoder& operator = (const Encoder& other) = delete;
 
-		float* operator()(const unsigned char* data, size_t length) const;
+		float* operator()(const unsigned char* data, size_t length, bool compress = false) const;
 		size_t getNumOfSamples(size_t length) const;
     private:
 		ToneSynth lowTone;
 		ToneSynth highTone;
 		std::unique_ptr<float[]> nullTone;
+		Compressor compressor;
     };
 }
 
diff --git a/include/encoder/synth.h b/include/encoder/synth.h
index 9b0f491790bcff3c569a2116316dbb43fbe8c5e7..cf51db7d0e7b89c23d0da336e172f1af21755b32 100644
--- a/include/encoder/synth.h
+++ b/include/encoder/synth.h
@@ -4,6 +4,9 @@
 #include "../config.h"
 
 REW_NAMESPACE {
+    /*!
+     * @ingroup encoder
+     */
     class REW_API Synth {
     public:
         virtual size_t operator()(float* dst) const = 0;
diff --git a/include/encoder/tone_synth.h b/include/encoder/tone_synth.h
index 8556cbc00f6a152c69edf88500dbdebd068ebf4b..b5285604c948c3b6285cc8713751a2af57ea7f22 100644
--- a/include/encoder/tone_synth.h
+++ b/include/encoder/tone_synth.h
@@ -5,8 +5,12 @@
 #include "synth.h"
 
 REW_NAMESPACE {
+    /*!
+     * @ingroup encoder
+     */
     class REW_API ToneSynth: public Synth {
     public:
+		ToneSynth() = default;
         ToneSynth(size_t frequency, size_t sampleRate, double ms);
         ToneSynth(ToneSynth&& other) noexcept = default;
         ToneSynth(const ToneSynth& other) = delete;
diff --git a/include/encoder/wav_writer.h b/include/encoder/wav_writer.h
index 356693e30e8d030bcdac6b50429fc746fed4c6a9..77c2250d1a2145b56918c47eeaa1fec8a6064bdd 100644
--- a/include/encoder/wav_writer.h
+++ b/include/encoder/wav_writer.h
@@ -7,6 +7,7 @@
 REW_NAMESPACE {
     /*!
      * @brief WAV file saver
+     * @ingroup encoder
      */
     class REW_API WavWriter : public AudioWriter {
     public:
diff --git a/include/server/server.h b/include/server/server.h
deleted file mode 100644
index 6fbea734bc204a8b8e3216fed1e1ec0ad3ed6eab..0000000000000000000000000000000000000000
--- a/include/server/server.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef REW_SERVER_H
-#define REW_SERVER_H
-
-#include "../config.h"
-#include <thread>
-
-REW_NAMESPACE {
-    class REW_API Server {
-    public:
-        Server();
-        Server(Server&& other) noexcept;
-        Server(const Server& other) = delete;
-        virtual ~Server();
-        void swap(Server& other) noexcept;
-        Server& operator = (Server&& other) noexcept;
-        Server& operator = (const Server& other) = delete;
-
-    private:
-        void threadFunc();
-        std::thread threadRunner;
-    };
-}
-
-#endif
diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt
index 3a8f85cc4615d79581a5e84761a5e5102b36c4a3..86925eea25d6c1487b063fc98365be485dd162dc 100644
--- a/libs/CMakeLists.txt
+++ b/libs/CMakeLists.txt
@@ -12,13 +12,13 @@ ExternalProject_Add(ZLIB
 )
 
 if(MSVC)
-  set(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/zlib PARENT_SCOPE)
+  set(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/zlib ${CMAKE_BINARY_DIR}/libs/ZLIB-prefix/src/ZLIB-build PARENT_SCOPE)
   set(ZLIB_LIBRARY ${CMAKE_BINARY_DIR}/libs/ZLIB-prefix/src/ZLIB-build/MinSizeRel/zlibstatic.lib PARENT_SCOPE)
 elseif(MINGW)
-  set(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/zlib)
+  set(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/zlib ${CMAKE_BINARY_DIR}/libs/ZLIB-prefix/src/ZLIB-build PARENT_SCOPE)
   set(ZLIB_LIBRARY ${CMAKE_BINARY_DIR}/libs/ZLIB-prefix/src/ZLIB-build/libzlibstatic.a PARENT_SCOPE)
 else()
-  set(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/zlib PARENT_SCOPE)
+  set(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/zlib ${CMAKE_BINARY_DIR}/libs/ZLIB-prefix/src/ZLIB-build PARENT_SCOPE)
   set(ZLIB_LIBRARY ${CMAKE_BINARY_DIR}/libs/ZLIB-prefix/src/ZLIB-build/libz.a PARENT_SCOPE)
 endif()
 
diff --git a/samples_to_graph.py b/samples_to_graph.py
index 2c2e2ef80bf4ea6e69befbb95df6b3a7159c9db5..bbfaa88cb53b3524690fffb2890b4d08b09b5fdd 100644
--- a/samples_to_graph.py
+++ b/samples_to_graph.py
@@ -30,4 +30,5 @@ bin_to_plot('build/tests/convert_high_samples.png', ['build/tests/convert_high_s
 bin_to_plot('build/tests/convert_low_clamped_samples.png', ['build/tests/convert_low_clamped_samples.bin'])
 bin_to_plot('build/tests/convert_high_clamped_samples.png', ['build/tests/convert_high_clamped_samples.bin'])
 bin_to_plot('build/tests/convert_hl_samples.png', ['build/tests/convert_low_samples.bin', 'build/tests/convert_high_samples.bin'])
+bin_to_plot('build/tests/decode_hl_samples.png', ['build/tests/decode_low_samples.bin', 'build/tests/decode_high_samples.bin'])
 bin_to_plot('build/tests/convert_hl_clamped_samples.png', ['build/tests/convert_low_clamped_samples.bin', 'build/tests/convert_high_clamped_samples.bin'])
diff --git a/src/decoder/CMakeLists.txt b/src/decoder/CMakeLists.txt
index fecb4191eb78e39b79c5af8891deeb4458324a8c..b1e2b57aabd75aa7f87c1785b9c9e40cfc317a53 100644
--- a/src/decoder/CMakeLists.txt
+++ b/src/decoder/CMakeLists.txt
@@ -18,9 +18,15 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "com3001/libs")
 
 # Dependencies
 target_include_directories(${PROJECT_NAME} PRIVATE ${ZLIB_INCLUDE_DIR})
+target_include_directories(${PROJECT_NAME} PRIVATE ${ASIO_INCLUDE_DIR})
+
 target_link_libraries(${PROJECT_NAME} ${ZLIB_LIBRARY})
 add_dependencies(${PROJECT_NAME} ZLIB)
 
+if(WIN32)
+    target_link_libraries(${PROJECT_NAME} wsock32 ws2_32)
+endif()
+
 set(DECODER_PROJECT ${PROJECT_NAME} PARENT_SCOPE)
 set(DECODER_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include/decoder PARENT_SCOPE)
 
diff --git a/src/decoder/byte_assembler.cpp b/src/decoder/byte_assembler.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..583179747ff8f367537e34a12f59c31acee029fa
--- /dev/null
+++ b/src/decoder/byte_assembler.cpp
@@ -0,0 +1,78 @@
+#include "../../include/decoder/byte_assembler.h"
+#include <iostream>
+
+///=============================================================================
+Rew::ByteAssembler::ByteAssembler() {
+
+}
+
+///=============================================================================
+Rew::ByteAssembler::ByteAssembler(ByteAssembler&& other) noexcept {
+	swap(other);
+}
+
+///=============================================================================
+void Rew::ByteAssembler::swap(ByteAssembler& other) noexcept {
+	using std::swap;
+	swap(buffer, other.buffer);
+}
+
+///=============================================================================
+Rew::ByteAssembler& Rew::ByteAssembler::operator = (ByteAssembler&& other) noexcept {
+	if (this != &other) {
+		swap(other);
+	}
+	return *this;
+}
+
+///=============================================================================
+void Rew::ByteAssembler::operator()(const unsigned char magnitude, const std::function<void(unsigned char)>& callback) {
+	if (magnitude == 0) {
+		//buffer.clear();
+
+		// Check last N samples if they all are equal to zero
+		constexpr size_t n = 10;
+		if (buffer.size() > n) {
+			//std::cout << "byte assembler has: " << buffer.size() << std::endl;
+			const auto count = countValue(&buffer[buffer.size() - n - 1], &buffer[buffer.size() - 1], 0);
+			//std::cout << "byte assembler last N count: " << count << std::endl;
+			if (count == 10) {
+				//std::cout << "assembling byte..." << std::endl;
+				callback(toByte(&buffer[0], &buffer[buffer.size() - 1]));
+				buffer.clear();
+				return;
+			} else {
+				buffer.pushBack(magnitude);
+			}
+		} else {
+			return;
+		}
+	} else {
+		buffer.pushBack(magnitude);
+	}
+}
+
+///=============================================================================
+size_t Rew::ByteAssembler::countValue(const unsigned char* begin, 
+	const unsigned char* end, const unsigned char value) {
+
+	size_t ret = 0;
+	while(begin != end) {
+		if (*begin++ == value) ret++;
+	}
+	return ret;
+}
+
+///=============================================================================
+unsigned char Rew::ByteAssembler::toByte(const unsigned char* begin, const unsigned char* end) {
+	unsigned char ret = 0;
+	const auto eight = (end - begin) / 8.0;
+	for (size_t i = 0; i < 8; i++) {
+		const auto countLow = countValue(begin + size_t(eight * i), begin + size_t(eight * (i + 1)), 1);
+		const auto countHigh = countValue(begin + size_t(eight * i), begin + size_t(eight * (i + 1)), 2);
+		if (countHigh > countLow) {
+			ret |= 1 << i;
+		}
+	}
+	return ret;
+}
diff --git a/src/decoder/decoder.cpp b/src/decoder/decoder.cpp
index d402cb7cd68a8d8b56ec8a6f456aa47a2ac1ed36..b59b98977c097a1ca29a576df0986fa9579c4ac6 100644
--- a/src/decoder/decoder.cpp
+++ b/src/decoder/decoder.cpp
@@ -5,17 +5,20 @@
 
 ///=============================================================================
 Rew::Decoder::Decoder(const size_t lowToneFreq, const size_t highToneFreq, const double sampleLengthMs):
-blockSize((48000.0 / 1000.0) * sampleLengthMs * 1.0f),
-lowGoertzel(blockSize, lowToneFreq, 48000.0f),
-highGoertzel(blockSize, highToneFreq, 48000.0f) {
-    
+blockSize(static_cast<size_t>((48000.0 / 1000.0) * sampleLengthMs * 1.0)),
+lowGoertzel(blockSize, static_cast<float>(lowToneFreq), 48000.0f),
+highGoertzel(blockSize, static_cast<float>(highToneFreq), 48000.0f),
+buffer(new float[blockSize]){
+	std::fill(buffer.get(), buffer.get() + blockSize, 0.0f);
 }
 
 ///=============================================================================
 Rew::Decoder::Decoder(Decoder&& other) noexcept :
 blockSize(other.blockSize),
 lowGoertzel(std::move(other.lowGoertzel)),
-highGoertzel(std::move(other.highGoertzel)){
+highGoertzel(std::move(other.highGoertzel)),
+buffer(std::move(other.buffer)),
+byteAssembler(std::move(other.byteAssembler)){
 }
 
 ///=============================================================================
@@ -24,6 +27,8 @@ void Rew::Decoder::swap(Decoder& other) noexcept {
 	swap(blockSize, other.blockSize);
 	swap(lowGoertzel, other.lowGoertzel);
 	swap(highGoertzel, other.highGoertzel);
+	swap(buffer, other.buffer);
+	swap(byteAssembler, other.byteAssembler);
 }
 
 ///=============================================================================
@@ -35,13 +40,36 @@ Rew::Decoder& Rew::Decoder::operator = (Decoder&& other) noexcept {
 }
 
 ///=============================================================================
-void Rew::Decoder::process(const float* samples, const size_t length) {
-	//std::cout << std::fixed;
-	//std::cout << std::setprecision(2);
+void Rew::Decoder::operator()(const float* samples, const size_t length, const std::function<void(unsigned char)>& callback) {
+	this->operator()(samples, length, [&](const float low, const float high) -> void {
+		unsigned char bit = 0;
+		if (low >= 1.0f) bit = 1;
+		if (high >= 1.0f) bit = 2;
+		byteAssembler.operator()(bit, callback);
+	});
+}
 
-	for (size_t i = 0; i < length - lowGoertzel.getBlockSize(); i+= 1) {
-		const auto magLow = lowGoertzel(samples + i);
-		const auto magHigh = highGoertzel(samples + i);
+///=============================================================================
+void Rew::Decoder::operator()(const float* samples, const size_t length, const std::function<void(float, float)>& callback) {
+	const auto dst = buffer.get();
+	auto src = samples;
+	while(src != samples + length) {
+		// Move by one
+		for (size_t i = 0; i < blockSize - 1; i++) {
+			dst[i] = dst[i + 1];
+		}
+		dst[blockSize - 1] = *src++;
+
+		auto magLow = lowGoertzel(dst) / 5000000.0f;
+		auto magHigh = highGoertzel(dst) / 5000000.0f;
+
+		if (magLow < 0.5f) magLow = 0.0f;
+		else magLow = 1.0f;
+
+		if (magHigh < 0.5f) magHigh = 0.0f;
+		else magHigh = 1.0f;
+
+		callback(magLow, magHigh);
 	}
 }
 
diff --git a/src/decoder/decompressor.cpp b/src/decoder/decompressor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a3ed6d13dee5671ac23bd15b9387beee06854abd
--- /dev/null
+++ b/src/decoder/decompressor.cpp
@@ -0,0 +1,68 @@
+#include "../../include/decoder/decompressor.h"
+#include <iostream>
+#include <zlib.h>
+
+///=============================================================================
+struct Rew::Decompressor::Impl {
+	z_stream infstream;
+};
+
+///=============================================================================
+Rew::Decompressor::Decompressor():pimpl(new Impl) {
+	pimpl->infstream.zalloc = Z_NULL;
+	pimpl->infstream.zfree = Z_NULL;
+	pimpl->infstream.opaque = Z_NULL;
+}
+
+///=============================================================================
+Rew::Decompressor::~Decompressor() {
+
+}
+
+///=============================================================================
+Rew::Decompressor::Decompressor(Decompressor&& other) noexcept {
+	swap(other);
+}
+
+///=============================================================================
+void Rew::Decompressor::swap(Decompressor& other) noexcept {
+	using std::swap;
+	swap(pimpl, other.pimpl);
+}
+
+///=============================================================================
+Rew::Decompressor& Rew::Decompressor::operator = (Decompressor&& other) noexcept {
+	if (this != &other) {
+		swap(other);
+	}
+	return *this;
+}
+
+///=============================================================================
+std::vector<unsigned char> Rew::Decompressor::operator()(const unsigned char* data, const size_t length) const {
+	std::vector<unsigned char> ret;
+	ret.resize(32);
+	
+	pimpl->infstream.avail_in = length; // size of input
+	pimpl->infstream.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(data)); // input char array
+	pimpl->infstream.avail_out = 32; // size of output
+	pimpl->infstream.next_out = reinterpret_cast<Bytef*>(&ret[0]); // output char array
+
+	inflateInit(&pimpl->infstream);
+	
+	while(true) {
+		const auto status = inflate(&pimpl->infstream, Z_SYNC_FLUSH);
+		if (status == Z_STREAM_END) break;
+
+		const auto oldSize = ret.size();
+		ret.resize(ret.size() + 32);
+		pimpl->infstream.avail_out = 32;
+		pimpl->infstream.next_out = reinterpret_cast<Bytef*>(&ret[oldSize]);
+	}
+
+	inflateEnd(&pimpl->infstream);
+
+	const auto size = pimpl->infstream.next_out - &ret[0];
+	ret.resize(size);
+	return ret;
+}
diff --git a/src/decoder/goertzel.cpp b/src/decoder/goertzel.cpp
index 4f214254e80436865f5884529255d9810c6a783b..6c722a5d01ead384c706ba7d76ebc7ef661de54f 100644
--- a/src/decoder/goertzel.cpp
+++ b/src/decoder/goertzel.cpp
@@ -26,9 +26,9 @@ void Rew::Goertzel::init(const size_t blockSize, const float targetFrequency, co
     const auto floatN = static_cast<float>(blockSize);
 	const auto k = static_cast<int>(0.5 + ((floatN * targetFrequency) / sampleRate));
 	const auto omega = (2.0 * M_PI * k) / floatN;
-    sine = std::sin(omega);
-    cosine = std::cos(omega);
-    coeff = 2.0 * cosine;
+    sine = static_cast<float>(std::sin(omega));
+    cosine = static_cast<float>(std::cos(omega));
+    coeff = static_cast<float>(2.0 * cosine);
     reset();
 }
 
diff --git a/src/decoder/packet.cpp b/src/decoder/packet.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..13ac0f287ed75113834e68499b130ae514bb95af
--- /dev/null
+++ b/src/decoder/packet.cpp
@@ -0,0 +1,25 @@
+#include "../../include/decoder/packet.h"
+#include <iostream>
+
+///=============================================================================
+Rew::Packet::Packet() {
+
+}
+
+///=============================================================================
+Rew::Packet::Packet(Packet&& other) noexcept {
+	swap(other);
+}
+
+///=============================================================================
+void Rew::Packet::swap(Packet& other) noexcept {
+	using std::swap;
+}
+
+///=============================================================================
+Rew::Packet& Rew::Packet::operator = (Packet&& other) noexcept {
+	if (this != &other) {
+		swap(other);
+	}
+	return *this;
+}
diff --git a/src/decoder/packet_assembler.cpp b/src/decoder/packet_assembler.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f5e371799c02e00d31403bca138c7a5e05938fb6
--- /dev/null
+++ b/src/decoder/packet_assembler.cpp
@@ -0,0 +1,31 @@
+#include "../../include/decoder/packet_assembler.h"
+#include <iostream>
+
+///=============================================================================
+Rew::PacketAssembler::PacketAssembler() {
+
+}
+
+///=============================================================================
+Rew::PacketAssembler::PacketAssembler(PacketAssembler&& other) noexcept {
+	swap(other);
+}
+
+///=============================================================================
+void Rew::PacketAssembler::swap(PacketAssembler& other) noexcept {
+	using std::swap;
+	swap(buffer, other.buffer);
+}
+
+///=============================================================================
+Rew::PacketAssembler& Rew::PacketAssembler::operator = (PacketAssembler&& other) noexcept {
+	if (this != &other) {
+		swap(other);
+	}
+	return *this;
+}
+
+///=============================================================================
+void Rew::PacketAssembler::operator()(const unsigned char magnitude, const std::function<void(unsigned char)>& callback) {
+	
+}
diff --git a/src/emitter/CMakeLists.txt b/src/emitter/CMakeLists.txt
deleted file mode 100644
index e56ec2a9c035ddc27703b8d3a48f7d169b8e54a1..0000000000000000000000000000000000000000
--- a/src/emitter/CMakeLists.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-cmake_minimum_required(VERSION 3.1)
-project (emitter)
-
-# Common properties
-set_property(GLOBAL PROPERTY USE_FOLDERS ON)
-set (CMAKE_CXX_STANDARD 11)
-set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Select build type")
-set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
-
-# Grab the files
-file(GLOB SOURCES ${CMAKE_SOURCE_DIR}/src/emitter/*.cpp)
-file(GLOB HEADERS ${CMAKE_SOURCE_DIR}/include/emitter/*.h)
-
-# Create the library
-add_definitions(-DREW_EXPORTS)
-add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS})
-set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "com3001/libs") 
-
-set(EMITTER_PROJECT ${PROJECT_NAME} PARENT_SCOPE)
-set(EMITTER_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include/emitter PARENT_SCOPE)
-
-# Add install step
-if(BUILD_INSTALL)
-  install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/emitter DESTINATION include/emitter)
-
-  if(MSVC)
-    install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)
-  endif()
-  install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin COMPONENT library)
-endif()
-
diff --git a/src/emitter/emitter.cpp b/src/emitter/emitter.cpp
deleted file mode 100644
index 5f0d7964fc218a30437c3a542d8b8b87ecb06cff..0000000000000000000000000000000000000000
--- a/src/emitter/emitter.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "../../include/emitter/emitter.h"
-#include <algorithm>
-
-Rew::Emitter::Emitter() {
-
-}
-
-Rew::Emitter::Emitter(Emitter&& other) noexcept {
-    swap(other);
-}
-
-void Rew::Emitter::swap(Emitter& other) noexcept {
-    using std::swap;
-}
-
-Rew::Emitter& Rew::Emitter::operator = (Emitter&& other) noexcept {
-    if (this != &other) {
-        swap(other);
-    }
-    return *this;
-}
diff --git a/src/encoder/compressor.cpp b/src/encoder/compressor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e2f33a4386e4b4f4db3f4d14096b5180bb3614da
--- /dev/null
+++ b/src/encoder/compressor.cpp
@@ -0,0 +1,69 @@
+#include "../../include/encoder/compressor.h"
+#include <zlib.h>
+#include <memory>
+#include <iostream>
+
+///=============================================================================
+struct Rew::Compressor::Impl {
+	z_stream defstream;
+};
+
+///=============================================================================
+Rew::Compressor::Compressor():pimpl(new Impl) {
+	pimpl->defstream.zalloc = Z_NULL;
+	pimpl->defstream.zfree = Z_NULL;
+	pimpl->defstream.opaque = Z_NULL;
+}
+
+///=============================================================================
+Rew::Compressor::~Compressor() {
+	
+}
+
+///=============================================================================
+Rew::Compressor::Compressor(Compressor&& other) noexcept {
+	swap(other);
+}
+
+///=============================================================================
+void Rew::Compressor::swap(Compressor& other) noexcept {
+	using std::swap;
+	swap(pimpl, other.pimpl);
+}
+
+///=============================================================================
+Rew::Compressor& Rew::Compressor::operator = (Compressor&& other) noexcept {
+	if (this != &other) {
+		swap(other);
+	}
+	return *this;
+}
+
+///=============================================================================
+std::vector<unsigned char> Rew::Compressor::operator()(const unsigned char* data, const size_t length) const {
+	std::vector<unsigned char> ret;
+	ret.resize(32);
+
+	pimpl->defstream.avail_in = length;
+	pimpl->defstream.next_in = static_cast<Bytef*>(const_cast<unsigned char*>(data));
+	pimpl->defstream.avail_out = 32; // size of output
+	pimpl->defstream.next_out = static_cast<Bytef*>(&ret[0]); // output char array
+
+	deflateInit(&pimpl->defstream, Z_BEST_COMPRESSION);
+
+	while (true) {
+		const auto status = deflate(&pimpl->defstream, Z_FINISH);
+		if (status == Z_STREAM_END) break;
+
+		const auto oldSize = ret.size();
+		ret.resize(ret.size() + 32);
+		pimpl->defstream.avail_out = 32;
+		pimpl->defstream.next_out = reinterpret_cast<Bytef*>(&ret[oldSize]);
+	}
+
+	deflateEnd(&pimpl->defstream);
+
+	const auto size = pimpl->defstream.next_out - &ret[0];
+	ret.resize(size);
+	return ret;
+}
diff --git a/src/encoder/encoder.cpp b/src/encoder/encoder.cpp
index 5a55e380da0d8360deb269e325a0d36865b1bb23..786f1320e4a42cf78e27c1e6d0375a44da6fa3d0 100644
--- a/src/encoder/encoder.cpp
+++ b/src/encoder/encoder.cpp
@@ -15,13 +15,17 @@ nullTone(new float[highTone.getSamplesPerBlock()]) {
 }
 
 ///=============================================================================
-Rew::Encoder::Encoder(Encoder&& other) noexcept :lowTone(std::move(other.lowTone)), highTone(std::move(other.highTone)) {
+Rew::Encoder::Encoder(Encoder&& other) noexcept {
+	swap(other);
 }
 
 ///=============================================================================
 void Rew::Encoder::swap(Encoder& other) noexcept {
     using std::swap;
+	swap(lowTone, other.lowTone);
+	swap(highTone, other.highTone);
 	swap(nullTone, other.nullTone);
+	swap(compressor, other.compressor);
 }
 
 ///=============================================================================
@@ -34,11 +38,19 @@ Rew::Encoder& Rew::Encoder::operator = (Encoder&& other) noexcept {
 
 ///=============================================================================
 size_t Rew::Encoder::getNumOfSamples(const size_t length) const {
-	return (length * 8 + 1) * highTone.getSamplesPerBlock() + (length - 1) * highTone.getSamplesPerBlock();
+	return (length * 8 + 1) * highTone.getSamplesPerBlock() + (length) * highTone.getSamplesPerBlock();
 }
 
 ///=============================================================================
-float* Rew::Encoder::operator()(const unsigned char* data, const size_t length) const {
+float* Rew::Encoder::operator()(const unsigned char* data, size_t length, const bool compress) const {
+	std::vector<unsigned char> deflated;
+	if (compress) {
+		deflated = compressor(data, length);
+		std::cout << "compressed from: " << length << " to: " << deflated.size() << std::endl;
+		data = &deflated[0];
+		length = deflated.size();
+	}
+	
 	const auto total = getNumOfSamples(length);
 	std::unique_ptr<float[]> samples(new float[total]);
 	std::fill(samples.get(), samples.get() + total, 0.0f);
@@ -61,6 +73,8 @@ float* Rew::Encoder::operator()(const unsigned char* data, const size_t length)
 		dst += highTone.getSamplesPerBlock();
 	}
 
+	std::memcpy(dst, nullTone.get(), sizeof(float) * lowTone.getSamplesPerBlock());
+
 	const auto ret = samples.get();
 	samples.release();
 	return ret;
diff --git a/src/encoder/tone_synth.cpp b/src/encoder/tone_synth.cpp
index 8fcb6d17380a9c290b56a03be7b7aeb35bfe771d..7e64c3a40e32193428c48c2da4cbf75b0d806c0d 100644
--- a/src/encoder/tone_synth.cpp
+++ b/src/encoder/tone_synth.cpp
@@ -17,7 +17,7 @@ void Rew::ToneSynth::allocate(const size_t sampleRate, const double ms) {
     const auto cycleMs = (1.0 / static_cast<double>(frequency)) * 1000.0;
     const auto cycleNum = ms / cycleMs;
     const auto cycleSamples = sampleRate / frequency;
-    total = static_cast<size_t>(cycleNum * cycleMs * samplesPerMs);
+    total = static_cast<size_t>(std::ceil(cycleNum * cycleMs * samplesPerMs));
 
     src.reset(new float[total]);
     const auto samples = src.get();
@@ -28,10 +28,6 @@ void Rew::ToneSynth::allocate(const size_t sampleRate, const double ms) {
         samples[i] = static_cast<float>(std::sin(d * DEG_TO_RAD));
         d += step;
     }
-
-#ifdef _DEBUG
-    std::cout << "(Rew::ToneSynth::allocate) samplesPerMs: " << samplesPerMs << " cycleMs: " << cycleMs << " cycleSamples: " << cycleSamples << " cycleNum: " << cycleNum << " total: " << total << std::endl;
-#endif
 }
 
 ///=============================================================================
diff --git a/src/encoder/wav_writer.cpp b/src/encoder/wav_writer.cpp
index 4a4e89ab2c2e03013ea050cfdadb1042d1f03347..897467321f76faa5929de789ea8b5768504f9beb 100644
--- a/src/encoder/wav_writer.cpp
+++ b/src/encoder/wav_writer.cpp
@@ -69,7 +69,7 @@ bool Rew::WavWriter::open(const std::string& path, const size_t size,
     this->sampleRate = sampleRate;
     this->chunkSize = 4096 * numChannels * (bitsPerSample / 8);
 
-    dataOffset = output.tellg();
+    dataOffset = static_cast<size_t>(output.tellg());
 
     loaded = true;
     return true;
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt
deleted file mode 100644
index a8a5672c5ef48cd78f3794f93fd8732dd4ab4715..0000000000000000000000000000000000000000
--- a/src/server/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-cmake_minimum_required(VERSION 3.1)
-project (server)
-
-# Common properties
-set_property(GLOBAL PROPERTY USE_FOLDERS ON)
-set (CMAKE_CXX_STANDARD 11)
-set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Select build type")
-set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
-
-# Grab the files
-file(GLOB SOURCES ${CMAKE_SOURCE_DIR}/src/server/*.cpp)
-file(GLOB HEADERS ${CMAKE_SOURCE_DIR}/include/server/*.h)
-
-# Create the library
-add_definitions(-DREW_EXPORTS)
-add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS})
-set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "com3001/libs") 
-
-# Dependencies
-target_include_directories(${PROJECT_NAME} PRIVATE ${ASIO_INCLUDE_DIR})
-
-if(WIN32)
-    target_link_libraries(${PROJECT_NAME} wsock32 ws2_32)
-endif()
-
-set(SERVER_PROJECT ${PROJECT_NAME} PARENT_SCOPE)
-set(SERVER_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include/server PARENT_SCOPE)
-
-# Add install step
-if(BUILD_INSTALL)
-  install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/server DESTINATION include/server)
-
-  if(MSVC)
-    install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)
-  endif()
-  install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin COMPONENT library)
-endif()
diff --git a/src/server/server.cpp b/src/server/server.cpp
deleted file mode 100644
index 621139f62d1018ef8cd52a970bb4ebbc2bb0bd53..0000000000000000000000000000000000000000
--- a/src/server/server.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "../../include/server/server.h"
-#include <algorithm>
-#define ASIO_STANDALONE
-#define _WIN32_WINNT 0x0601
-#include <asio.hpp>
-
-Rew::Server::Server() {
-    threadRunner = std::thread(&Server::threadFunc, this);
-}
-
-Rew::Server::Server(Server&& other) noexcept {
-    swap(other);
-}
-
-Rew::Server::~Server() {
-    threadRunner.join();
-}
-
-void Rew::Server::swap(Server& other) noexcept {
-    using std::swap;
-    swap(threadRunner, other.threadRunner);
-}
-
-Rew::Server& Rew::Server::operator = (Server&& other) noexcept {
-    if (this != &other) {
-        swap(other);
-    }
-    return *this;
-}
-
-void Rew::Server::threadFunc() {
-    
-}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7195f7c60cdbb12a9106f8536ebf183062a91d34..199aa0ce93b5d1667eb76cb91c1af9a541984455 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -7,9 +7,9 @@ foreach(FILENAME ${TESTS})
     get_filename_component(FILENAME_NO_EXT ${FILENAME} NAME_WE)
     set(TEST_PROJ test_${FILENAME_NO_EXT})
     add_executable(${TEST_PROJ} ${FILENAME})
-    add_dependencies(${TEST_PROJ} ${DECODER_PROJECT} ${EMITTER_PROJECT} ${ENCODER_PROJECT} ${SERVER_PROJECT})
-    target_link_libraries(${TEST_PROJ} ${DECODER_PROJECT} ${EMITTER_PROJECT} ${ENCODER_PROJECT} ${SERVER_PROJECT})
-    target_include_directories(${TEST_PROJ} PRIVATE ${DECODER_INCLUDE_DIR} ${EMITTER_INCLUDE_DIR} ${ENCODER_INCLUDE_DIR} ${SERVER_INCLUDE_DIR})
+    add_dependencies(${TEST_PROJ} ${DECODER_PROJECT} ${ENCODER_PROJECT})
+    target_link_libraries(${TEST_PROJ} ${DECODER_PROJECT} ${ENCODER_PROJECT})
+    target_include_directories(${TEST_PROJ} PRIVATE ${DECODER_INCLUDE_DIR} ${ENCODER_INCLUDE_DIR})
     target_include_directories(${TEST_PROJ} PRIVATE ${CATCH2_INCLUDE_DIR})
     target_link_libraries(${TEST_PROJ} ${CMAKE_THREAD_LIBS_INIT})
 
@@ -19,13 +19,4 @@ foreach(FILENAME ${TESTS})
 
     set_property(TARGET ${TEST_PROJ} PROPERTY FOLDER "com3001/tests") 
     add_test(NAME ${TEST_PROJ} COMMAND ${TEST_PROJ})
-
-    # Copy DLL files
-    foreach(file_i $<TARGET_FILE:${DECODER_PROJECT}> $<TARGET_FILE:${EMITTER_PROJECT}> $<TARGET_FILE:${ENCODER_PROJECT}> $<TARGET_FILE:${SERVER_PROJECT}>)
-    add_custom_command(
-        TARGET ${TEST_PROJ}
-        POST_BUILD
-        COMMAND ${CMAKE_COMMAND}
-        -E copy ${file_i} $<TARGET_FILE_DIR:${TEST_PROJ}>)
-    endforeach(file_i)
 endforeach(FILENAME)
diff --git a/tests/decode.cpp b/tests/decode.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1348097c890c478357973f68a00123af0953e657
--- /dev/null
+++ b/tests/decode.cpp
@@ -0,0 +1,156 @@
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+#include <decoder.h>
+#include <encoder.h>
+#include <map>
+#include <array>
+
+#define DUMP_F32(path, data, length) \
+	{ \
+		std::fstream out(path, std::ios::out | std::ios::binary | std::ios::trunc); \
+		out.write(reinterpret_cast<const char*>(data.get()), length * sizeof(float)); \
+	}
+
+static const std::map<size_t, std::function<bool(float)>> expectedMagnitude01 = {
+    {1400, [](float v) -> bool {return v < 0.1f; }},
+    {1600, [](float v) -> bool {return v < 0.1f; }},
+    {1800, [](float v) -> bool {return v < 0.1f; }},
+    {2000, [](float v) -> bool {return v < 0.1f; }},
+    {2000, [](float v) -> bool {return v < 0.1f; }},
+    {2200, [](float v) -> bool {return v < 0.1f; }},
+    {2400, [](float v) -> bool {return v > 1.0f; }},
+    {2600, [](float v) -> bool {return v < 0.1f; }},
+    {2800, [](float v) -> bool {return v < 0.1f; }},
+    {3000, [](float v) -> bool {return v < 0.1f; }},
+    {3200, [](float v) -> bool {return v < 0.1f; }},
+    {3400, [](float v) -> bool {return v < 0.1f; }},
+};
+
+static const std::array<int, 10> frequencies01 = {
+    1000, 1200, 1800, 2400, 4800, 5000, 5200, 6200, 8000, 9600
+};
+
+static bool compare(const unsigned char* a, const unsigned char* b, const size_t length) {
+	for (size_t i = 0; i < length; i++) {
+		if (a[i] != b[i]) return false;
+	}
+	return true;
+}
+
+REW_NAMESPACE {
+    TEST_CASE("Decoder Test - API") {
+        auto decoder = std::move(Decoder());
+    }
+
+    TEST_CASE("Test Goertzel #1") {
+        auto synth = ToneSynth(2400, 48000, 100);
+
+        std::unique_ptr<float[]> samples(new float[4800]);
+		(void)synth(samples.get());
+
+        for (const auto& pair : expectedMagnitude01) {
+            auto goertzel = Goertzel(480, static_cast<float>(pair.first), 48000);
+            const auto mag = goertzel(samples.get());
+            std::cout << "target: " << pair.first << " source: " << 2400 << " magnitude: " << mag << std::endl;
+            REQUIRE(pair.second(mag));
+        }
+    }
+
+    TEST_CASE("Test Goertzel #2") {
+        for (const auto& i : frequencies01) {
+            auto synth = ToneSynth(i, 48000, 100);
+
+            std::unique_ptr<float[]> samples(new float[4800]);
+            (void)synth(samples.get());
+
+            
+            auto goertzel = Goertzel(480, static_cast<float>(i), 48000);
+            const auto mag = goertzel(samples.get());
+            CHECK(mag >= 1.0f);
+        }
+    }
+
+	TEST_CASE("Test decoding with simple data") {
+		static const unsigned char data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
+		const auto encoder = Encoder();
+		const std::unique_ptr<float[]> samples(encoder(data, sizeof(data)));
+		const auto total = encoder.getNumOfSamples(sizeof(data));
+
+		auto decoder = Decoder();
+		std::unique_ptr<float[]> lowSamplesArr(new float[total]);
+		std::unique_ptr<float[]> highSamplesArr(new float[total]);
+		auto lowSamples = lowSamplesArr.get();
+		auto highSamples = highSamplesArr.get();
+
+		decoder(samples.get(), total, [&](const float low, const float high) {
+			*lowSamples++ = low;
+			*highSamples++ = high;
+		});
+
+		DUMP_F32("decode_low_samples.bin", lowSamplesArr, total);
+		DUMP_F32("decode_high_samples.bin", highSamplesArr, total);
+	}
+
+	TEST_CASE("Test decoding and assemble bytes") {
+		static const unsigned char data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
+		const auto encoder = Encoder();
+		const std::unique_ptr<float[]> samples(encoder(data, sizeof(data)));
+		const auto total = encoder.getNumOfSamples(sizeof(data));
+
+		auto decoder = Decoder();
+
+		std::vector<unsigned char> assembled;
+
+		decoder(samples.get(), total, [&](const unsigned char byte) {
+			assembled.push_back(byte);
+		});
+
+		REQUIRE(assembled.size() == sizeof(data));
+		REQUIRE(compare(&data[0], &assembled[0], sizeof(data)));
+	}
+
+	TEST_CASE("Test decoding and assemble bytes deflated") {
+		static const unsigned char data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
+
+		const auto compressor = Compressor();
+		const auto deflated = compressor(&data[0], sizeof(data));
+
+		const auto encoder = Encoder();
+		const std::unique_ptr<float[]> samples(encoder(&deflated[0], deflated.size()));
+		const auto total = encoder.getNumOfSamples(deflated.size());
+
+		auto decoder = Decoder();
+
+		std::vector<unsigned char> assembled;
+		decoder(samples.get(), total, [&](const unsigned char byte) {
+			assembled.push_back(byte);
+		});
+
+		REQUIRE(assembled.size() == deflated.size());
+		REQUIRE(compare(&deflated[0], &assembled[0], deflated.size()));
+
+		const auto decompressor = Decompressor();
+		const auto inflated = decompressor(&assembled[0], assembled.size());
+
+		REQUIRE(inflated.size() == sizeof(data));
+		REQUIRE(compare(&inflated[0], &data[0], sizeof(data)));
+	}
+
+	TEST_CASE("Test decoding with different frequencies and sample lengths") {
+		static const unsigned char data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
+
+		for (auto lowToneFreq = 1000; lowToneFreq < 21000; lowToneFreq += 500) {
+			for (auto highToneFreq = 1000; highToneFreq < 21000; highToneFreq += 500) {
+				if (lowToneFreq == highToneFreq) continue;
+
+				for (auto sampleLengthMs = 1; sampleLengthMs < 200; sampleLengthMs ++) {
+					/*auto encoder = Encoder(lowToneFreq, highToneFreq, sampleLengthMs);
+					const std::unique_ptr<float[]> samples(encoder(data, sizeof(data)));
+					
+					auto decoder = Decoder(lowToneFreq, highToneFreq, sampleLengthMs);*/
+					
+				}
+			}
+		}
+    }
+};
diff --git a/tests/decoder.cpp b/tests/decoder.cpp
deleted file mode 100644
index 337fdb3f028262314563221e4776142edfb011b4..0000000000000000000000000000000000000000
--- a/tests/decoder.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#define CATCH_CONFIG_MAIN
-#include "catch.hpp"
-#include <decoder.h>
-#include <emitter.h>
-#include <encoder.h>
-#include <server.h>
-#include <map>
-#include <array>
-
-static const std::map<size_t, std::function<bool(float)>> expectedMagnitude01 = {
-    {1400, [](float v) -> bool {return v < 0.1f; }},
-    {1600, [](float v) -> bool {return v < 0.1f; }},
-    {1800, [](float v) -> bool {return v < 0.1f; }},
-    {2000, [](float v) -> bool {return v < 0.1f; }},
-    {2000, [](float v) -> bool {return v < 0.1f; }},
-    {2200, [](float v) -> bool {return v < 0.1f; }},
-    {2400, [](float v) -> bool {return v > 1.0f; }},
-    {2600, [](float v) -> bool {return v < 0.1f; }},
-    {2800, [](float v) -> bool {return v < 0.1f; }},
-    {3000, [](float v) -> bool {return v < 0.1f; }},
-    {3200, [](float v) -> bool {return v < 0.1f; }},
-    {3400, [](float v) -> bool {return v < 0.1f; }},
-};
-
-static const std::array<int, 10> frequencies01 = {
-    1000, 1200, 1800, 2400, 4800, 5000, 5200, 6200, 8000, 9600
-};
-
-REW_NAMESPACE {
-    TEST_CASE("Decoder Test - API") {
-        auto decoder = std::move(Decoder());
-    }
-
-    TEST_CASE("Test Goertzel #1") {
-        auto synth = ToneSynth(2400, 48000, 100);
-
-        std::unique_ptr<float[]> samples(new float[4800]);
-		(void)synth(samples.get());
-
-        for (const auto& pair : expectedMagnitude01) {
-            auto goertzel = Goertzel(480, pair.first, 48000);
-            const auto mag = goertzel(samples.get());
-            std::cout << "target: " << pair.first << " source: " << 2400 << " magnitude: " << mag << std::endl;
-            REQUIRE(pair.second(mag));
-        }
-    }
-
-    TEST_CASE("Test Goertzel #2") {
-        for (const auto& i : frequencies01) {
-            auto synth = ToneSynth(i, 48000, 100);
-
-            std::unique_ptr<float[]> samples(new float[4800]);
-            (void)synth(samples.get());
-
-            
-            auto goertzel = Goertzel(480, i, 48000);
-            const auto mag = goertzel(samples.get());
-            std::cout << "target: " << i << " source: " << i << " magnitude: " << mag << std::endl;
-            CHECK(mag >= 1.0f);
-        }
-    }
-};
diff --git a/tests/deflate.cpp b/tests/deflate.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2a0158f1e464167c6e77b55c2bbb049d5ad39abb
--- /dev/null
+++ b/tests/deflate.cpp
@@ -0,0 +1,41 @@
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+#include <decoder.h>
+#include <encoder.h>
+#include "decompressor.h"
+
+static bool compare(const unsigned char* a, const unsigned char* b, const size_t length) {
+	for (size_t i = 0; i < length; i++) {
+		if (a[i] != b[i]) return false;
+	}
+	return true;
+}
+
+REW_NAMESPACE{
+	TEST_CASE("Deflate and inflate") {
+		unsigned char data[256];
+		for (int i = 0; i < 256; i++) data[i] = i;
+
+		const auto compressor = Compressor();
+		const auto decompressor = Decompressor();
+
+		const auto deflated = compressor(data, sizeof(data));
+		const auto inflated = decompressor(&deflated[0], deflated.size());
+
+		REQUIRE(inflated.size() == sizeof(data));
+		REQUIRE(compare(&data[0], &inflated[0], sizeof(data)));
+	}
+
+	TEST_CASE("Deflate and inflate 2") {
+		static const unsigned char data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
+
+		const auto compressor = Compressor();
+		const auto decompressor = Decompressor();
+
+		const auto deflated = compressor(data, sizeof(data));
+		const auto inflated = decompressor(&deflated[0], deflated.size());
+
+		REQUIRE(inflated.size() == sizeof(data));
+		REQUIRE(compare(&data[0], &inflated[0], sizeof(data)));
+	}
+}
diff --git a/tests/emitter.cpp b/tests/emitter.cpp
deleted file mode 100644
index 709b968603293965c522fc98520311c5c3e1af39..0000000000000000000000000000000000000000
--- a/tests/emitter.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#define CATCH_CONFIG_MAIN
-#include "catch.hpp"
-#include <decoder.h>
-#include <emitter.h>
-#include <encoder.h>
-#include <server.h>
-
-REW_NAMESPACE {
-    TEST_CASE("Emitter Test - API") {
-        auto emitter = std::move(Emitter());
-    }
-};
-
diff --git a/tests/server.cpp b/tests/server.cpp
deleted file mode 100644
index fc81d571e4399d13d8b4b3e0310e1ef29e5cfd22..0000000000000000000000000000000000000000
--- a/tests/server.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#define CATCH_CONFIG_MAIN
-#include "catch.hpp"
-#include <decoder.h>
-#include <emitter.h>
-#include <encoder.h>
-#include <server.h>
-
-REW_NAMESPACE {
-    TEST_CASE("Server Test - API") {
-        auto server = Server();
-    }
-};
diff --git a/tests/encoder.cpp b/tests/synth.cpp
similarity index 93%
rename from tests/encoder.cpp
rename to tests/synth.cpp
index 6efe2d26a7877267ed5daca1b5cfb39f1ac8ff50..7f3432087a6c973665639662298c38b94b96e356 100644
--- a/tests/encoder.cpp
+++ b/tests/synth.cpp
@@ -1,9 +1,7 @@
 #define CATCH_CONFIG_MAIN
 #include "catch.hpp"
 #include <decoder.h>
-#include <emitter.h>
 #include <encoder.h>
-#include <server.h>
 
 #define DUMP_F32(path, data, length) \
 	{ \
@@ -12,10 +10,6 @@
 	}
 
 REW_NAMESPACE {
-    TEST_CASE("Encoder Test - API") {
-        auto encoder = std::move(Encoder());
-    }
-
     TEST_CASE("Encoder Test - Tone Synth") {
         auto synth = std::move(ToneSynth(4400, 48000, 100));