release 2.61
Fix 7.1ch PCE: was incorrectly writing object_type(2) instead of profile(1). AFAIK, this doesn't seem to actually affect decoders because decoders are only interested in channel layouts in PCE, but still it was incorrect, and should be fixed.

release 2.60
Fix: combination of --adts and --concat was generating invalid AAC file.
Changed 7.1ch rear channel layout in favor of Apple QuickTime.
Support new Wavpack v5 64bit API
Update: libsoxr
Update: taglib
qaac was using 3 front + 2 side + 2 back for 7.1ch rear output. However, it turned out that Apple QuickTime cannot handle this, and only recognizes 3 front + 4 back. OTOH, libavcodec couldn't recognize the latter until this patch http://ffmpeg.org/pipermail/ffmpeg-cvslog/2015-June/090556.html. Anyway it now handles both, so I decided to change 7.1ch rear layout to 3 front + 4 back, which is supported by both of them.

release 2.59
Fix: Was failing encoding mono AAC to AAC.
Support Wavpack v5 interface (with large file support)
Wavpack version 5 is still in alpha state, and DLL is not officially provided. If you want to try it, you have to build it yourself from the source code.

This version of qaac supports both of old and new Wavpack DLL (they are binary compatible). When new functions provided in version 5 library are detected, qaac will use them.


release 2.58
Fixed: mono files couldn't be encoded to AAC since 2.56.

release 2.57
New option: --tag-from-file. This option is similar to --tag, but tag value is read from a file. Character encoding is guessed, but you can specify it by --text-codepage.
New option: --copy-artwork. When specified, front cover art is copied from source file. When --artwork is also specified, this option is ignored. Artwork can be resized by --artwork-size.
Better support of tags in files referred from a cuesheet. Now they are also imported.
Disallow decoding FLAC file via libsndfile. If you want FLAC, use libFLAC.
Ogg Vorbis decoding support via libsndfile.


release 2.56
Allow path separators (slash or back slash) in --fname-format, and automatically create directory hierarchy according to the spec given by --fname-format.
Fixed a typo (--tag:geID tag was ignored because of this).
Added debugger output.


release 2.55
Yet another UniversalCRT compatibility issue. Since 2.52, qaac couldn't read file formats other than WAV on Windows XP.


release 2.54
Fix: Since 2.52, qaac has been compiled with MSVC14, and couldn't open non WAV files larger than 2GB, because of the C runtime change on MSVC14.


release 2.53
Add support of AAC decoding in ADTS/CAF container.
MP4: Fix an decoding issue after seek.
Add support of SBR/PS decoding.


release 2.52
Increased MSVC runtime limit of open files to 2048.
qaac tries to open all the input files before encoding. Previously, qaac couldn't open more than 512 files at once due to CRT limit. Now limit is increased to 2048.
Show meaningful error message on CRT level file open error.


release 2.51
Always write zero into avgBitrate field in esds decConfigDescriptor to be spec compliant. Was writing actual average bitrate before (this was automatically done by libmp4v2). The spec says that in case of VBR, is should be zero.
Write iTunes compatible "Encoding Params" tag.
Details on Encoding Params tag.
In this (binary) tag, encoding mode(CBR/ABR/CVBR/TVBR), bitrate, and the codec version is written. As far as I know, this tag is only used by iTunes to show bitrate and show if it is VBR or not.

For the sake of compatibility with iTunes, qaac writes nominal (target) bitrate into this tag, and iTunes will show this value when "Encoding Params" tag is present. Therefore, now the result of -v 256 encoding will always look like "256kbps (VBR)" in iTunes.

On the other hands, other (spec compliant) tools will show actual bitrate.


release 2.50
Better support for embedded cuesheet.

When cuesheet is embedded in an input file, qaac was encoding it into an single output file with chapters.

From this version, qaac now splits into multiple tracks by default (same as the case of external cuesheet). If you still want single output, use --concat.


release 2.49
Fixed issues on MP4Source:

Fixed handling of Nero style chapters starting from non-zero timestamp (typically inserted by fb2k and old neroaacenc).
Fixed handling of reading MP4 files with multiple elst entries.


release 2.48
Fixed an issue on MP4Source: trailing samples were discarded under certain conditions.


release 2.47
Large file (>= 4GB) output is now supported. Very long duration (beyond 32bit limit) is also supported, but the latter is not compatible with QuickTime 7.

On very large files, container optimization can take several minutes. You can disable it by --no-optimize.


release 2.46
Fixed an issue on DLL loading: when a DLL qaac tries to load depends on other missing DLLs, OS was showing a modal dialog which effectively stopped the process until it is closed.
Allow -A option for refalac to be compatible with qaac.


release 2.45
Added qaac64.exe that works with iTunes 64bit (ver 12.1).
Switched to static C runtime linking. Now you don't need msvcr120.dll and msvcp120.dll anymore.
Minor bug fixes.


release 2.44
Support avisynth script (avs) input. Like x264 or avs2pipemod, AVS is directly supported through avisynth C interface, not via VfW.


release 2.43 
Fix: Write actual number of channels to mp4a box in MP4 container.


release 2.42
Add --start and --end option to specify start, end point of the input for partial encode. --start, --end (and --delay) supports 3 ways to describe the point. 
[[hh:]mm:]ss[.sss..] : Timestamp described in hours, minutes, and seconds. Parts enclosed by brackets can be omitted. Seconds are parsed as double precision number (64bit float), and you can place arbitrary numbers of digits under the decimal point. You will need enough digits to achieve sample accuracy, depending on the sample rate. 
ns : Number of samples, followed by 's'. 
mm:ss:fff : Cuepoint in minutes, seconds, and frames(1/75 second), followed by 'f'. 
Re-linked 32bit libsoxr.dll not to depend on libgcc_s_sjlj-1.dll. Now it is not included in the archive and you don't need it anymore.


release 2.41
Add --limiter. --limiter applies smart limiter that softly clips portions where peak exceeds (near) 0dBFS. Softly means that it applies non-linear filter to surrounding half cycles (nearest zero crossing point to zero crossing point) so that the result fits in under 0dBFS but still is smoothly connected to other parts, resulting in much smaller audible distortion than dumb hard clips. 
For CVBR/ABR/CBR mode, bitrate value less than 8 is now treated as "bits per sample". Bitrate is computed as the following:
   Bitrate = bits_per_sample * number_of_channels * sample_rate
 For example, --cvbr 2 is now equivalent for --cvbr 192 (=2*2*48000) for 2ch, 48kHz case. This can be useful when you want to use CVBR/ABR/CBR and want constant quality setting for varying number of channels or sample rate. 
Other minor changes.


release 2.40
Fixed new MP4 decoder introduced at 2.39 (found seek related bug, and ALAC has been trimmed too much).


release 2.39
Added dedicated MP4 reader, which supports:
Deconding AAC-LC, MP1/2/3, ALAC (qaac), ALAC (refalac). 


Perfectly support files with iTunSMPB and multiple edits. In files with multiple edits, there exist multiple valid spans to be played back. In other words, there are multiple gaps to be skipped. As far as I know, there is NO such software that supports it properly. If you are interested, try https://sites.google.com/site/qaacpage/cabinet/Multiple-edits.zip. 

This file contains 3 edits in it. When properly decoded/played, it contains exactly 30 seconds music. However, in this file there are very short 2 gaps to be skipped in the middle as well as first delay and end padding. Therefore, no software other than qaac should play it correctly without pops/clicks exactly in 30 seconds.



release 2.38
Allow nesting of ${} in --fname-format.
 Now you can write something like ${albumartist|${artist}} for example, which means:
When album artist tag is present and non-empty, it evaluates to album artist tag's value. 
Otherwise, it evaluates to artist tag's value. 



release 2.37
Fixed a bug: AAC in CAF generated by qaac --caf was not playable due to bogus kuki chunk (Descriptors inside of esds box are expected, but qaac was writing bare AudioSpecificConfig).



release 2.36
2.36 includes some minor fixes:
Improved accuracy of seeking on MP3 files by increased amount of preroll. Still doesn't count how many frames required due to bit-reservoir, but prerolling of 9 frames should be enough... 
Fixed bitrate formatting on --format. Has been printing in decimals for 3ch only. 
Fixed --stat. Incorrect values were written at the beginning (regression introduced by --num-priming or something). 
Updated taglib.



release 2.35 
    Insert PCE in AAC payload on ADTS output when non standard channel layout such as 4ch(quad), 6ch, 6.1ch is in use.
    Support 7.1ch rear for AAC (m4a/adts) by inserting PCE on qaac side. Mapping of 7.1ch rear input to 7.1ch front is dropped. 

When non standard channel layout is used, PCE (program config element) is required to describe the channel layout. For MP4 container it is embedded in GASpecificConfig. For ADTS, since there's no such place in the header, PCE has to be periodically inserted in the AAC payload.

Since Apple codec doesn't support ADTS transmux, it does not insert PCE in AAC payload but writes PCE into "magic cookie" that contains GASpecificConfig. On the other hand, qaac has not been modifying AAC bitstream produced by the codec. As a natural consequence, ADTS output with non standard channel layout was lacking PCE support. This issue is fixed on this version.

As a good side effect, I also added support for 7.1ch rear. Before this version, 7.1ch rear input has been mapped to 7.1ch front as a compromise, that is not a very right thing to do. Since 7.1ch front and 7.1ch rear are the same in the AAC channel elements level (both of them are encoded as SCE+PCE+PCE+PCE+LFE), 7.1ch rear can be achieved by encoding as 7.1ch front and inserting PCE afterwards.

Since automatic mapping from 7.1ch rear to 7.1ch front is note dropped, 7.1ch rear input cannot be encoded as ALAC. It is not supported for CAF output too.

If you are a ffmpeg user, note that standard 7.1ch front AAC requires "-strict 1" to decode in the correct channel layout. It is due to historical reason that AAC encoders (including Nero and qaac) has been wildly mapping 7.1ch rear to 7.1ch front.


release 2.34 (refalac 1.34)
Added experimental option --num-priming to specify arbitrary number of priming samples between 0 and 2112. This option can only be applicable to AAC LC.
2112 is the default number of priming samples (delay) of Apple encoder. By specifying smaller value, you get shorter delay. --num-priming=0 is equivalent to --no-delay, and in fact, --no-delay is now re-implemented by --num-priming.
1024 or greater should be safe. In many cases, it seems that you can go as low as 576 (=448 + 128, where 448 is the number of borrowed samples from the previous frame for short block case, and 128 is the size of short block) and still be able to achieve perfect gapless playback. However, considering long block case and also the fact that faad (CLI frontend) discards first 1024 samples, setting smaller value than 1024 cannot be said to be always safe.
When number of priming samples is X where X < 576, decoder should not be able to reconstruct first 576 - X samples at least. Therefore, you should avoid it unless that portion of input is known to be silent.

release 2.33 (refalac 1.33)
    Implemented smart padding (same as fdkaac) that minimizes the possibility of gapless playback issue.
    You can disable this feature by new option --no-smart-padding. However, --no-smart-padding also disables additional padding at the end of HE-AAC stream that has been implemented as a workaround for CoreAudio encoder bug.
    Although I don't recommend using --no-smart-padding, it is mandatory when you want bit-identical bitstream output as iTunes (including it's bugs).
    Fixed fallback sample rate conversion when libsoxr is not present (was not working exactly as intended).
    Improved error messages for the attempt to encode non supported PCM format to ALAC.
    Minor fixes and rewriting. 


release 2.32 (refalac 1.32)
Fixed: --tag apID and --tag akID were written in the long tag format.


release 2.31 (refalac 1.31)
    Switch to MSVC12 (Visual Studio 2013). Now you need msvc[r|p]120.dll instead ( included in the zip archive). For the time being you can still able to build qaac with MSVC10, but I may drop MSVC10 support in future in favor of improved C++11 support in MSVC12.
    Fixed crash when unknown fourcc was passed to --tag option.
    Support --tag purd (purchase date), which seems to have been missing recently (perhaps around 2.28 or so).
    Don't write raw ID3v1 genre number to CAF.
    Don't write iTunes specific metadata to CAF.
    Other minor code rewrites regarding metadata handling. 


release 2.30 (refalac 1.30)
Fixed regression on 2.29, that was causing miserable failure (ERROR: invalid vector<T> subscript) when reading TAK files.


release 2.29 (refalac 1.29)
    Fixed regression on 2.28: Tags were not properly copied when --concat was specified on cuesheet input.
    Fixed not to exit with failure requesting output filename when --concat was specified with --peak or --play (in which case "output filename" is nonsense).
    Some minor improvement and code refactoring. 
    
    
release 2.28 (refalac 1.28)
    Add new option: --caf. As the name implies, --caf tells qaac to output to CAF container. (HE-)AAC, ALAC, PCM (-D) are supported. Pipe streaming is supported in case of PCM, that can be used to pass audio as well as tags to fdkaac through pipeline.
    (Hopefully) better handling of metadata. Non-standard tags such as performer or ISRC are now copied from input (However, some tags such as replaygain related metadata, ripping log, and cuesheet are blacklisted and not copied).
    Support ALAC in CAF input from libsndfile. This will only be used by refalac + very recent libsndfile. qaac has already been supporting input of ALAC in CAF through CoreAudio API.
    Fix: take care of zero byte text file input, which resulted in MLang text encoding detection failure. 
    
    
release 2.27 (refalac 1.27)
posted 6 hours ago by nu 774

Now you can set --drc option twice or more, with different parameters. This can be used to obtain more complex effect.

For example, you can use --drc for normal compression, then as a limiter (--drc with high thresh + high ratio + zero attack/release will work something like a limiter, that effectively kills remaining peaks).


release 2.26 (refalac 1.26)
posted Nov 6, 2013, 7:44 AM by nu 774

    Disabled --no-delay on SBR. --no-delay removes several frames at beginning to compensate encoder delay, but it turns out to be problematic for SBR since sbr_header is not present on every frame, and decoder cannot decode SBR until seeing it. Anyway, you should be using LC when delay is important.
    I guess VLC cannot decode SBR at the beginning of HE-AAC file having edts because of similar reason. It really needs to read sbr_header -- but probably it just skips to the position described in edts.
    Added --drc for dynamic range compression. 

About new dynamic range compressor

This is implemented based on "Digital Dynamic Range Compressor Design -- A Tutorial and Analysis", JAES2012.

Takes 5 parameters (threshold, ratio, knee width, attack, release), all of them are common among compressors, so you should be familiar with them.

Note that in this implementation, actual release time will be approximately equals to attack + release. This is by nature of "smooth, decoupling peak detector" in the paper, used by this compressor.

If you want what is called "makeup gain" to compensate attenuation by this compressor, just use --gain.


release 2.25 (refalac 1.25)
posted Oct 26, 2013, 3:03 AM by nu 774

Fixed HE-AAC gapless playback issue

It seems that CoreAudio HE-AAC encoder finishes too early on HE-AAC encoding, and can result in too small amount of enc_padding. When enc_padding is smaller than 481 (which is the additional decoder delay for SBR), there's no way for decoder to reproduce complete samples, so decoded result will be get shorter.

This is actually a bug of CoreAudio encoder. I can see the very same behavior using iTunes, and when decoding resulting HE-AAC file by iTunes, decoded result is shorter than original.

You can see this by arbitrary 44.1khz 11 sec sample (number of samples=485100), which result in number of padding samples=74, and about 10ms at ending is dropped.

Since I'm using somewhat older iTunes (10.5.3.3) and I'm reluctant to upgrading it, I don't know if it's still true for new iTunes, but I believe so since I'm using recent CoreAudioToolbox.

As a workaround, qaac now feeds additional 2048 samples of silence to HE-AAC encoder and edit iTunSMPB so that it reflects original length. As a result, HE-AAC file encoded by qaac will now play gaplessly by iTunes, but it's no more bit-identical with the result of iTunes in case of HE-AAC.

Note that you cannot still play HE-AAC files outside Apple softwares because of this: http://www.hydrogenaudio.org/forums/index.php?showtopic=98450&mode=threaded&pid=817997. I'm sorry I should have noticed earlier of this.


release 2.24 (refalac 1.24)
posted Oct 22, 2013, 4:18 AM by nu 774

    Fix crash on reading unsigned 8bit PCM through libsndfile (for example, Wave64 format).
    Fix bogus (non-compliant) sgpd box written on gaplessmode 1 or 2. However, I don't still recommend using it. As far as I know, only iTunes is known to support it well. VLC also supports edts, but it seems VLC decodes first few frames of HE-AAC without SBR when edts is being used.
    Support float16 and float24 WAV and Wavpack file. float16 is assumed to be normalize in range [-65536, 65536], which is different from normal [-1,1] for floating point PCM. For details, read this thread on HA: http://www.hydrogenaudio.org/forums/index.php?showtopic=90770&st=50
    Show PCM sample format (int8 or something) when --verbose is specified. Both input format and resulting format are shown, the latter might be different due to DSP chain.
    Disabled automatic quantization to integer when sample format is converted to float by DSP chain and encoding to ALAC.
    Repackaged 64bit libsoxr.dll as libsoxr64.dll. Now refalac64 supports both names (of course it cannot use 32bit version of DLL, so be careful).
    Show more meaningful message on write error (MSVCRT assigns EINVAL for broken pipe error, resulting in "invalid parameter" message, which is not quite helpful).
    Some code clean up.
    

release 2.23 (refalac 1.23)
posted Oct 14, 2013, 8:50 AM by nu 774

    Switched from libsoxrate to libsoxr and new libsoxconvolver. Like libsoxr, libsoxconvolver uses SIMD optimized DFT/convolution routine when SSE is available. This library is used for --lowpass, --matrix-preset and --matrix-file. Unlike libsoxrate, libsoxconvolver is 32bit float based.
    Add --peak and --play option.
    Both doesn't produce output to a file, and cannot be used with other encoding option such as -V, -v, -a, -c, -A, and -D. However, DSP options such as --rate or --lowpass can be used.
    --peak just scans input and print peak. Might be useful when you apply some DSP (especially mixing), and want to know resulting peak value before encoding.
    --play does what it's name implies (play files using Wave Mapper device). Since qaac is an encoder and not a music player, don't expect much from it. It's just intended for cases when you want to test new custom matrix coefficients or something. --play doesn't automatically convert sample format, nor does remix.
    Changed random number generator (used for TPDF dither) to LCG, which is known to be poor in randomness but quite fast, and is enough for just generating white noise for dither.
    Don't flush immediately after writing WAV header when writing WAV file to a pipe. This makes pipe rewinding hack of SoX happier, but it seems not perfect. Basically speaking, SoX's pipe rewinding on win32 is nothing but a hack, so don't expect automatic format detecting of SoX to always work. Just use -t wav - or something to avoid unnecessary pipe rewinding.
    Some code cleanup.
    Fix help messages.
    Updated taglib (again).


release 2.22

    Fixed not to write tag when value of tag is empty.
    Support loading of libFLAC_dynamic.dll (this name is used by v1.3.0 DLL distributed at www.rarewares.org). Currently, qaac searches libFLAC dll in the following order.
    libFLAC_dynamic.dll -> libFLAC.dll -> libFLAC-8.dll
    Since 1.3.0 and 1.2.1 DLL are binary compatible within range of use by qaac, you can use any of them.
    Tags given by command line option now take precedence over default tool tag written by qaac. As a result, you can override tool tag if you want to (with --tag too:value).
    Updated TagLib to github current HEAD. 

release 2.21
Fixed an issue of --threading option. There was a possibility of non sample aligned read on the pipe, similar to the problem that was fixed on 2.04 and 2.05.


release 2.20
    Add optional libsoxr support. It's basically the same as libsoxrate (both derives from SoX), but is more optimized (fast), and is maintained by a developer of SoX.
    When libsoxr.dll is present, now qaac/refalac will use it for sample rate conversion. libsoxr binary is on the cabinet page. Note that you still need libsoxrate when you want --lowpass or mixing option.
    libsoxr binary built with GCC doesn't usually work with qaac/refalac due to a few ABI compatibility issues. The binary at cabinet page is built with GCC _with care_.
    I have reported this issue to author of libsoxr, so it might be fixed in the future.
    Decreased refresh rate of progress on title bar of console window.
    Explicitly check presence of BOM when reading text files, since MLang often does a wrong guess even when BOM is present.



release 2.19
Fixed: attempt to set one of stik, rtng, akID, sfID tags caused qaac hang.
Well, actually not hanging but waiting for console input in vain... due to a silly bug calling scanf() instead of sscanf().
Fixed: --tag akID:fra was writing USA country code (not France).

release 2.18
Added --sort-args option by request, which sorts filenames given by command line before processing them. Sorting is done simply by Unicode character code, in ascending order. 
Fixed to test seekability before estimating input length of raw input. Seems like _filelengti64() doesn't return error on a named pipe.


release 2.17
Fixed github issue 27 (regression on 1.26). --decode was writing invalid wav file. 
Added --gapless-mode option (same as fdkaac). 

Interestingly, iTunes seems to support both of iTunSMPB and ISO standard gapless mode. QuickTime supports only the latter. In the past, I thought QT silently assumes 2112 samples of delay. However, it turned out that QT actually looks elst media_time when sbgp and sgpd are present, so it can be used generally (as described in QTFF spec).

As far as I know, iTunes is the only music player that supports gapless playback in both way.


release 2.16
Read and handle multichannel layout of TAK files. 
Write fact chunk when decoding into WAVEFORMATEXTENSIBLE format. As far as I can see, even WMP is not in honor of the fact chunk, so this would be pretty much useless. However, since it looks like RIFF/WAV spec require it in WAVEFORMATEXTENSIBLE, this was implemented to be more spec compliant. fact chunk is not written on piped output or WAVEFORMATEX format. 
Automatically kill progress message when stderr is connected to nothing. 


release 2.15
Fixed an awful bug of refalac of 2.xx branch. It wasn't encoding in correct frame length (4096 samples) on some cases.
 I noticed it when I encoded directly from lossyFLAC (not piped input), which resulted 512 samples-per-frame ALAC file. It seemed playable, but apparently is not a normal/sane ALAC file;
 WAV input will be usually fine (including piped input), if none DSP is applied. Direct input from FLAC or other formats might be affected, and Re-encoding is recommended. Only refalac of 2.xx branch is affected. qaac is fine. 
Use more strict sharing mode when opening files. Now qaac/refalac doesn't allow other processes to open the output file when qaac/refalac is writing to it. Reading can be shared, but now qaac/refalac cannot open a file for reading when another process is writing to it. 


release 2.14
Add --cue-track option to limit tracks to extract from cuesheet, and fixed several minor bugs.


release 2.13
Gracefully shutdown on console interrupt event (such as Ctrl+C, Ctrl+Break or closing console window).

Gracefully means that it stops encoding immediately as if it were the end of input, and properly finalize the container, therefore resulting file will be playable (until that point).

Of course, it is not that qaac can terminate gracefully in every possible situations. You can always forcefully kill qaac using task manager or something.



release 2.12
Add --no-delay option. (Read the discussion at HA thread from here).

--no-delay will compensate encoder delay (2112 samples) by prepending silence of 960 samples before sending input to encoder, then trimming 3 AAC frames at beginning (2112 + 960 = 3072 = 1024 * 3, where 1024 is the frame length of AAC. So total amount of delay will be exactly equals to length of 3 AAC frames). Note that these numbers are doubled in case of SBR.

This option is meant for video as a mean to resolve A/V sync issue. The resultant AAC will have exactly zero-delay, but might have pops/clicks at the beginning. Use with care.



release 2.11
Changed --tag option behavior to be strict. Formerly, when fourcc passed by --tag is unknown, qaac accepted it and wrote it as UTF8 string tag. Now --tag accepts only known tags. This is considered to be more foolproof, since iTunes is known to refuse editing tags when a file contains unknown tag atoms. 
Read vorbis comment "WAVEFORMATEXTENSIBLE_CHANNEL_MASK" of FLAC and treat as channel layout. 
Fixed a bug: mono AIFF/CAF file with kAudioChannelLabel_Mono in chan chunk could not be read.



release 2.10 
Changed --delay option spec. --delay now accepts either duration in time or number of samples. If you are used to timespec of sox, you should be already familiar with it. The format is as following:
--delay=[hh:[mm:]]ss[.sss]...
--delay=<integer>s

In the first case, parts surrounded by brackets can be omitted. So, --delay=100 means 100 seconds, --delay=-10.72 means -10.72 seconds, --delay=02:53.1 means 2 minutes and 53.1 seconds, and so on.

Second case is for number of samples. You just put an integer followed by "s" (means "samples"). --delay=-2112s or something.
HTOA support. Now index 00 of first track in cue sheet is encoded into track 0. 
Fixed a bug of cue sheet parser. Last line of cue was ignored if the last line is ending with a white space character other than LF. 



release 1.47
This is a release of previous 1.xx branch, several bug fix back ported from 2.xx. The most critical one is box order layout fix for iTunes custom metadata (which affects iTunSMPB and --longtag, and has been quite long standing ... probably from 0.xx era).



[release 2.09
Fixed a regression on 2.06, which resulted in failure when non-canonical path was passed by -o option (reported by this post at HA). 
Added --fname-from-tag option to generate output file names based on the tags of input files. You can configure output file name more precisely by additionally using --fname-format (which has been an option for cuesheet input only). 



release 2.08
Now copy chapters from ALAC/m4a input (when available). 


Delay Nero style chapter point as much as the encoder delay (2112 samples). It seems that Nero AAC encoder was previously using Nero style chapter to signal encoder delay this way, and fb2k is in honor of it.

Note that Nero style chapter is a list of <title, start time> pairs, therefore first chapter can start at arbitrary point, while last chapter goes until the end of the track.

On the other hand, QuickTime style chapter is a list of <title, duration> pairs, therefore first chapter always starts from the beginning of the track, while last chapter can end at arbitrary point.

qaac will write both style chapters (for the sake of compatibility), but these two have subtle difference and incompatibility.


Now writes actual duration into edts. This is done mainly for QuickTime which doesn't look iTunSMPB thingy. Now QuickTime can trim zero-padding and decode sample accurately (whole song / each sub-chapters).

Technically, there's no way to tell the value of encoder delay to QuickTime player. It just silently assumes implicit AAC delay of 2112 samples, and automatically crops that amount from the beginning --- it just works with qaac because qaac is using their encoder. edts is used here in order to just let them trim the trailing zero paddings.



release 2.07
Fixes for 2.00 regression again.
WAV parser was ignoring data chunk length even if --ignorelength was not specified. 
Bogus total length was printed on libsndfile input due to int64_t -> int8_t typo. 



release 2.06
Fixed a bug: when opening non-supported input file, there was a chance that ridiculously too much memory gets allocated and OS hangs (refalac only). This is regression on 2.00, but is basically coming from a weakness of libmp4v2 which can allocate HUGE memory when mp4 box structure is corrupt.


Rewritten 24bit PCM bit packing/unpacking code.
qaac -D 24bit.wav -o - >NUL

is about 3 times faster than before.



release 2.05
Sorry, 2.04 fix was flawed. Re-fixed it.

BTW, The problem on 2.00 was usually quite audible. If you are anxious about it, the apparent evidence of the bug is less number of samples compared to the original.

If you were using simply 16/32bit 2ch input, you might not have met any troubles so far (like me). In this case, sample size (in bytes) is power of 2, and probably there's less possibility of partial read breaking in the middle of sample boundary.


release 2.04
Fixed broken pipe input (regression on 2.00).

When feeding from pipe, there was always a chance that output from some arbitrary point become white noise like.

This was due to switch to lower level I/O routine on 2.00, which can result in "partial read" in case of pipe input. When it is still aligned to sample size boundary, it does no harm. However, when it is not aligned, the succeeding samples get completely out of sync, and result in white noise or something.

The possibility of this problem depends on how sender pushes audio to pipe, and sample size (16bit, 24bit, etc). I didn't notice it until today, but I could reproduce this using cat command as feeder.



release 2.03
Fixed box layout of iTunes custom metadata (long tag). It was written as name-> mean -> data (should be mean -> name -> data).

This was a long standing bug, and I am somewhat surprised that no one has ever reported me of this. This should fix the interoperability problem with TagLib.



release 2.02
Fixed refalac to properly finalize the MP4 container: regression on 2.00.



release 2.01
Fixed a regression on 2.00: --threading was broken.



release 2.00
This is an experimental (might be unstable) release with many updates, so version was bumped up to 2.00.
Enabled MP3 decoding. 
--concat + --adts now accepts multiple inputs with different sample format. Explained later. 
Removed --concat-cuesheet, since it's mostly similar to --concat. 
Added --no-dither, which turns off automatic dither on quantization. 
-b now accepts arbitrary value in 2-32 range. -b32 for WAV output means float format. All other cases are integer. 
-N(--normalize) now doesn't use temporary file if the input is seekable. 
FLAC file with ID3v2 tag is now accepted (ID3 tag is just skipped and ignored). 
Fix crash on reading TAK file with binary tag. 
Improve ID3v2 tag handling. 
Many refactoring of source code has been done. 
Multiple format stream generated by --concat and --adts

Since this requires complete reset of the encoder, zero padding is added at the stream change point.

As far as I know, almost no software player on PC can continue to play such file after the stream format change. In my environment, Windows Media Player 12 is the only exception I know of.



release 1.46 
Fixed a regression on 1.45: due to a subttle bug in option parsing code, --concat-cuesheet and --native-resampler were misinterpreted and not working. 
Automatic RF64 output on -D (wav output), when file size is unknown or larger than 4G, and output is not connected to a pipe.
 In these cases, at first "JUNK" chunk is written to where ds64 chunk goes, and if the file is actually beyond 4G limit at the end of writing, it is rewritten to ds64 chunk. Therefore, if it was actually smaller than 4G, JUNK chunk remains before "fmt " chunk. This is completely valid and legal in RIFF/WAV spec, but some software might get confused when seeing this. 
Slight improvement on channel mapping code. 
Additional search to mingw DLLs (libFLAC-8.dll and libwavpack-1.dll) When official win32 binaries are not found, these names are also searched.

release 1.45
Add --tag and --long-tag option as generic ways to set tags.
--genre is now translated into "gnre" atom with a ID3v1 genre number if possible. 
Replaced libsoxrate.dll binary (for 32bit) to mingw compiled version (--rate runs 10% or so faster in my environment). This is ABI compatible and source code is not changed, so you can use older one. However, due to the nature of floating point math, the resulting data won't be bit-identical between the two binary. 
About new tagging options
--tag <fcc>:<value>
writes iTunes defined tag specified by four-char-code. For details of four-char-code, read mp4v2 document. For example, the following:
--tag "soar:suzanne vega"
will put "Sort Artist" tag.
Some tags such as stik or sfID have value of ID numbers. You can set these tags by explicitly giving the number, or corresponding string name. In the case of sfID (country code of iTMS), you can use country name or ISO 3166-1 alpha-3 Code described on the mp4v2 document.
Alternatively,
--long-tag <name>:<value>
can be used for arbitrary custom tag.

release 1.44
 posted Oct 19, 2012 3:36 AM by nu 774 
Fix type_code of iTunSMPB tag data (was using 0, and should be 1). Explained later. 
Write up-sampled rate of HE-AAC to moov.trak.mdia.minf.stbl.stsd.mp4a box. This won't affect anything seriously (especially playback). Before this modification, down-sampled rate was written. This modification was done just to imitate the output of iTunes. 
Better support on input files whose bit depth are not multiple of 8. 
Removed raw printf() message in Apple reference ALAC library, which is a bad design as a library, generally speaking. 
First issue is important for those who are using iTunes or iSomething and not using foobar2000. It turned out that:
iTunes doesn't read iTunSMPB with typecode 0. So, gapless playback doesn't work. 
foobar2000 fixes typecode of iTunSMPB to 1 when it edits tags. Therefore, if you are encoding via fb2k GUI, or edit tags with fb2k (scan replaygain or something), your files are already get fixed. 
There might be other softwares which do the same as foobar2000, but I don't know (not investigated). I wrote a program named fixiTunSMPB (it's on cabinet page) to scan m4a and fix the problem. In order to just check if your file needs fix, try something like the following:
fixiTunSMPB -d -p"*.m4a" "path to your music folder"
This will print the number of files which needs fix like "fix: 10 skip: 20", which means that 10 files needs to be fixed. Alternatively, the following:
fixiTunSMPB -d -v -p"*.m4a" "path to your music folder"
will print with each file names (so output message will be quite long, but you can know which files are exactly affected)
If you actually want to fix it, remove "-d" switch from the command line. But before doing so, it's strongly recommend to make a backup of your scanning folder. Alternatively, of course you can simply install fb2k and let it fix the files (by scanning replaygain or something

release 1.43
Fixed passband of --rate (sample rate converter of libsoxrate). Regression on 1.40. Default passband was not properly set, and resulted in audibly muffled sound when you do --rate=32000 or something. 
Modified transition band width of --lowpass (was unnecessarily small). 
Support CAF tag reading (qaac only).

release 1.42
MP4 container minor fix: added "isom" to compatible brands.

release 1.41
Handle format change of ALAC magic cookie on CoreAudioToolbox 7.9.8.1 (shipped with iTunes 10.7.0.21). "qaac -A" didn't work with the new CoreAudioToolbox. qaac 1.41 automatically takes care of both old and new format. 
Updated taglib to version 1.8.

release 1.40
Update libsoxrate to 0.30 (merged update on rate effect of SoX: Speed up on down sampling).
Due to ABI change on libsoxrate.dll, new qaac/refalac is incompatible with older libsoxrate.dll versions.

release 1.39
Support "REM DISCNUMBER" "REM TOTALDISCS" in cuesheet. 
Flush stdio buffer when stdout is connected to a pipe. 
Update mp4v2 to svn rev 496.

release 1.38
 posted Jun 9, 2012 1:22 AM by nu 774    [  updated Jun 9, 2012 4:23 AM ] 
Updated libsoxrate to 0.21 (merged upstream update on SoX rate effect). 
Fixed not to write WAVE_FORMAT_EXTENSIBLE header unnecessarily on WAV output.


release 1.37
Allow optional argument on --compilation. Now --compilation=1 is the same as --compilation, and --compilation=0 is the same as not setting --compilation option.

--compilation=0|1 style will be suited for placeholder and scripting.


release 1.36
Fixed a bug: qaac ../../foo/bar/bazz.cue didn't work (seems PathCombine API doesn't like these kind of relative paths). 
Set current active code page as default text encoding for text files (cue sheets or something).


release 1.35
Updated libsoxrate to 0.2.0 (merged recent upstream update on rate effect). lsx_design_lpf() function decl is changed.

Due to ABI change, new qaac/refalac is incompatible with older libsoxrate.dll and vice versa. Please use the one in the new archive.



release 1.34
Added optional argument to --native-resampler option of qaac. Without argument, it uses codec default sample rate converter. With argument specified, it uses dedicate AudioConverter of CoreAudio for sample rate conversion. You can configure sample rate converter complexity (line/norm/bats) and quality (0-127). Without --native-resampler specified, and if you have libsoxrate installed, SoX resampler is used. 
Changed order of sample rate conversion and lowpass filter. Now lowpass filter is applied before sample rate conversion. 
Updated libmp4v2 to svn r490 (the latest). 



release 1.33
Fix to accept EXIF artworks.

From 1.26, qaac didn't accept JPEG artworks in EXIF format. This was due to image type checking code of libmp4v2, which only accepts JFIF format with AP0 marker as JPEG image.



release 1.32
When encoding to ALAC and when final internal input format is float, now it will automatically down sampled to 16bit integer format.

Some of DSP options such as --matrix-preset, --matrix-file, --rate, --lowpass will change internal sample format to 32bit float. Since ALAC doesn't support float format, this could not be encoded without converting to integer format with -b.

You can still use -b, but when you don't, from this version it will be automatically converted to 16bit integer format by default. If you want 24 bit output instead of 16, just use -b 24.



release 1.31
Added --no-matrix-normalize by request. This disables automatic normalization(scaling) on mixer matrix coefficients. 
Changed to fetch CoreAudioToolbox.dll version from en-US version resource.

qaac has been showing the same version number as Windows Explorer, with user default locale setting. However, version resource of CoreAudioToolbox has not been properly updated recently on many locales other than en-US (As far as I know, it stays 7.9.7.3 on these locales, even if AAC encoder inside is updated).

From this version, you might see different (newer) version number than before, and it might be also different from what Explorer would show, but it's not a bug.



release 1.30
Fixed typo of --bits-per-sample(-b) option, and other option explanation. 
Fixed/improved some minor Unicode handling.



release 1.29
Fixed chapter length of HE-AAC (they were all doubled from the correct value).



release 1.28
Fixed a bug of the tag processing for --concat on release 1.27.


release 1.27 (refalac 0.38)
--concat now insert chapters. Album-related tags are fetched from the first input, and chapters are generated from title tag of each track. If (one of) input is a cuesheet or has embedded cuesheet in it, tracks in the cuesheet are taken into account.

When input is a single cuesheet, --concat works the same as --concat-cuesheet.



release 1.26
Added --concat option. When qaac/refalac take multiple input files (tracks), qaac will encode each of them separately. When --concat is specified, it will encode into a single file. 
Unicode console output. Now console message and log file is Unicode. Character encoding of log file and redirected stdout/stderr is UTF-8.
 You don't have to change console code page with chcp command. You can stay default codepage, and you can still display unicode character in your console window, if your command prompt is configured to use truetype font. 
Fixed a crash on reading bogus chapter file. 
Check artwork image file type. 

By the way, on HA qaac thread iTunSMPB of QuickTime HE-AAC was reported to be problematic/broken. iTunSMPB is a tag where encoder delay, actual length of content, and padding are described, and is essential for gapless playback. It's not fixable on qaac side.

release 1.25 
Added --concat-cuesheet option.

By default, qaac/refalac encodes into multiple files for cuesheet input (one file per track). When this option is specified, qaac/refalac will now encode into single file, embedding chapter for tracks.

qaac/refalac has been able to handle cuesheet which refers to multiple input files. This remains the same for --concat-cuesheet.



release 1.24
Added --bits-per-sample(-b) option. Convert bits per sample to the specified value (16 or 24). Available for ALAC or WAV output. 
Added named pipe support. When the pipe name such as "\\.\pipe\foo.wav" is specified as output filename with -o option, qaac now creates the named pipe, and wait for connection. On the other hand, when pipe name is specified as input filename, it's just simply opened (if it is really a named pipe, pipe will be connected by this). This is available for WAV or ADTS output. 
More strict syntax sanity checking on cuesheet. 
Fix some bug on option handling. --rate was usable but -r was not on refalac. Also, when multiple input file is specified, tagging options didn't work as intended. 

In windows, named pipe is created via a special API, and must be created by an end point process ("server"). Name of pipe must start with "\\.\pipe\".

On the other hand, another endpoint ("client") can connect to the pipe by just opening it as if it were an ordinary file. Therefore, many software will be able to connect to it. You can use this feature like this:
At first, on one command prompt window, run qaac(or refalac): 
qaac -D --matrix-preset=dpl2 5.1ch.flac -o \\.\pipe\foo.wav
On another command prompt window, run some client: 
lame \\.\pipe\foo.wav -o foo.mp3

This is basically the same as just chaining with ordinary (anonymous) pipe. However, it will be useful when passing by named argument is preferred by the client software.

How well named pipe is supported depends on softwares. For example, it seems that mp4box cannot handle named pipe with -add argument.

Basically, if it needs seeking, or is doing some special things on passed file names, named pipe won't work.



release 1.23
Fixed bogus total number of samples printed to the console when sample rate conversion is done. 
Refined error/warning messages. 
Fixed to refuse files with invalid bits per sample for ALAC.


release 1.22
Fixed a regression on 1.10: qaac -D/refalac -D was writing corrupted channel mask on WAVEFORMATEXTENSIBLE header (when it is used), when input has no channel mask (or value of zero).



release 1.21
Fix: proper handling of zero-length input.



release 1.20 (refalac 0.31)
Improved text encoding detection.
 mlang seems generally chooses single byte local charset in the first place even if it is actually encoded in UTF-8. Latin-1 case is already taken care of, but in this release I generalized it. 
Changed --text-codepage behavior. It has been treated as a "hint", and passed to mlang encoding detector. Now qaac directly use it for converting to Unicode, without any detection/guess.
 This is because I found a sample where mlang returns wrong guess even if given correct hint. 

Generally speaking, text encoding detection will never be perfect, and sometimes fails. If you have trouble, use --text-codepage. Available codepages are listed at MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

If you don't get the point -- as long as you don't use any of --lyrics, --chapters, cuesheet input, or you are just working with ASCII alphabets, you won't have any troubles.



release 1.19
Fixed a crash on write error inside of destructor (Strictly speaking, abort() is called from C++ runtime, in unhandled exception handler). 
Updated libsoxrate.dll to 0.1.2 (Not a functional change. It was just rewritten to be more portable).



release 1.18
Refactored channel layout processing again. Enabled channel layout printing for refalac.

Formerly, channel layout was converted to human readable form via QuickTime/CoreAudio API. I rewrote it on qaac side to be usable from refalac. As a side effect, it became locale-independent. Layout printed on --format is also affected.



release 1.17
Happy new year!

Print channel layout information to console output (qaac, and --verbose only). This feature was missing since 1.00.



release 1.16
Changed "qaac --check" to exit with errorlevel 2 when CoreAudioToolbox not found. 
Fixed byteswapping bug of double floating point number, which was causing qaac -D to crash with 64bit big endian input. 
Re-enabled ALAC in mov reading with refalac (refalac only). 



release 1.15
Added --tmpdir by request. By default qaac uses TMP environment variable. You could override it by changing it, but now you can use this option instead. 
Enabled --check on refalac.



release 1.15
Added --tmpdir by request. By default qaac uses TMP environment variable. You could override it by changing it, but now you can use this option instead. 
Enabled --check on refalac. 



release 1.14
Fixed incorrect definition of 3ch layout in Apple's ALAC implementation, which resulted in incorrect chan chunk on 3ch case. 
Improved wave muxer: support sample format conversion on muxer, fixed condition to use WAVEFORMATEXTENSIBLE. 
Add some missing input channel layouts defined in CoreAudio. They cannot be directly encoded into AAC or ALAC anyway, but matrix mixer and --chanmask are usable. Of course -D will work. 



release 1.13
Fixed matrix mixer to work again (regression on 1.11). Was failing when number of channels changed.

Refined progress message display code.



release 1.12
Sorry, fixed a trivial mistake in release 1.11



release 1.11
Add decoding mode to qaac (qaac -D) 
Generic channel remapping from non-Microsoft order input. 
Add ExtAudioFile importer (qaac, and for ALAC codec only). 
Add --subtitle. This is iTMF "©st3" tag and documented in iTMF spec. However, it seems even iTunes doesn't use it, and I don't know if anybody using this. I just added this since it is documented in the spec, and TIT3 of ID3 is rather popular. 
Fixed refalac to support 3ch encoding 
Fixed a bug on progress display: when --native-resampler is on and resampling is done, displayed time was incorrect. 

qaac/refalac first reorder channels to Microsoft wave order before DSP chain, then reorder channels again to AAC order, when encoding to AAC/ALAC. This means that when you use --chanmap, --matrix-preset, --matrix-file options, you have to think in Microsoft order.

qaac accepts Apple AIFF/CAF files as well as ALAC in MP4 (for CAF, only LPCM and ALAC are supported). These files can have channel layouts other than Microsoft wave order, and is properly handled. Of course, if it isn't acceptable layout by AAC/ALAC, you can't encode it into AAC/ALAC. Transcoding to WAV will work.



release 1.10
--chanmask and --chanmap are now usable from refalac -D. 

AAC and ALAC requires channel layout to be defined. Therefore, when input channel layout is not recognizable, qaac/reflac picks some default depending on the number of channels. Read usage page for more details about this.

On the other hand, refalac -D now preserves the original channel layout information (if it can). If channel mask is not present in the source, output channel mask stays zero.

Of course, when you remix with matrix mixer, layout information is lost. If you want them, you have to explicitly provide it with --chanmask.
Added ad-hoc anti-denormal processing in libsoxrate when down-converting double to float. 

Since qaac currently doesn't use IIR filters, I think this would not be of much importance anyway, at least for usual cases.release 1.09
Merged modifications by Peter (author of foobar2000) into ALAC encoder/decoder. 
Fixed usage message of refalac (--no-optimize, --gain, --normalize were usable, but missing from usage message). 
Support for Wavpack correction file (*.wvc) of hybrid mode. 
Make threading optional, and add --threading. Threading is disabled by default.
 Even if --threading is specified, refalac -D doesn't use threads for encoding. Also, if your PC has only one core, threading is not enabled. 



release 1.08
Add --gain option. You can specify gain adjustment in decibel. "--gain -3.5" decreases gain by 3.5dB. 
Automatic sample format conversion to integer (and decreasing bit depth) on ALAC encoding. 
Decoding(+ DSP) and encoding run in separated thread on multi-core machine. 
--verbose now outputs some verbose message (mostly concerning DSP options) 
Allow id3v1 genre number for --genre option 

If you enable one of DSP options (--gain, --rate, --lowpass, --matrix-preset, --matrix-file), audio sample format will be automatically converted to 32bit float. On AAC encoding, it's just passed to the encoder, and it's transparent to users' point of view. However, if you encode into ALAC, now it will be down-converted to integer format (bit depth will be either 16 or 24, depending on the original input format). 16bit case will be dithered with TPDF. On the other hand, refalac -D will just output 32bit float WAV in this case.

Anyway, these DSP usually has a possibility of clipping. Since --normalize will adjust each track differently, --gain will be more preferable for music, when you want to prevent clipping.

Threading introduced on this version is rather simple. As said above, just decoding and encoding run in parallel... it might get 1.5x or so faster than before (when decoding is slow or some DSP is enabled), but no more.



release 1.07
Added configurable matrix mixer. 
Now DSP options are usable on refalac (--rate, --lowpass, --normalize, --delay, --matrix-preset, --matrix-file). These are not usefull for ALAC encoding, but you might want to use with refalac -D. Please not that --rate, --lowpass, --normalize and remixing will all produce 32bit float PCM. 
Fixed automatic wave ignorelength detection. It was not working as intended.



release 1.06
Fixed a vulnerability in Apple ALAC decoder, which might lead to heap exploitation. 
Reinstated --rate auto|keep. Now --rate auto will work again. Default is --rate keep. 



release 1.05
Fixed a bug: --rate without libsoxrate.dll was not working, and causing immediate crash (regression since 1.00). 
Added --lowpass option. Use this when you want lower cutoff than Apple encoder default. This is based on SoX sinc filter, and processed before passing audio to the encoder. Works only when libsoxrate.dll is installed. 
libsoxrate is updated to 0.08. 
Other minor refactoring to code.



release 1.04
Added --delay option. Take delay amount in integer milliseconds. When positive, specified amount of silence is prepended. When negative, specified length is truncated from the beginning. 
--normalize (-N) now works as general normalization function independent from --rate. This forces two pass, and creates HUGE temporary file for large input. This is just a simple peak normalization, and usually not recommended for music (EBU R128 or replaygain is much better). 
Switched to use taglib for parsing APEv2 tag in tak file. 



release 1.03
Fixed --format. Printed bitrate range was incorrect since 1.00.

Fixed wave muxer (for refalac -D) to properly update riff/data chunk size when finishing write, in case of length is not predictable beforehand. Also fixed to pad data chunk when it's size is not even.

Updated to automatically work in ignorelength mode when wave input data chunk size is equal to zero. At least ffmpeg seems to set zero as data chunk size, when sending to pipe and length is not predictable.



release 1.02
 posted Nov 11, 2011 10:31 PM by nu 774    [  updated Nov 11, 2011 10:42 PM ] 
Add CoreAudio AudioFile API importer, as a replacement of QuickTime importer. Now you can directly read AIFF and Sun/AU files without libsndfile-1.dll. As a bonus, AIFF CHAN chunk (undocumented feature used by Apple, to specify channel layout) is properly handled. 
refalac -D now accepts input formats other than ALAC.
 refalac -D is decoding mode, but actually, you can think of this as wave encoding mode (Though I don't know it has any use). 
Better handling of UTF-8 encoded text file, which consists of latin characters only. It seems mlang tends to pick latin-1 code page first for this kind of text file. 
Fixed to remove BOM from mlang decoded result. This is basically regression introduced when mlang text encoding detector was applied. mlang doesn't remove BOM from the beginning. 
Add --text-codepage option. When automatic character encoding detection by mlang fails and you get something wrong in the resulting tags, you can use this to give hint to it. Code page is a number used in MS Windows to specify character encoding. 1252 is for Latin-1, 65001 for UTF-8. 
 By the way, from 1.00, qaac doesn't support mingw compilation (probably nobody cares, I think). qaac 1.00 uses implicit lazy loading (delay-load) feature of recent MSVC, for CoreAudio DLLs.



release 1.01 + 0.99

Fixed a bug: When you encode from wave file, reported length is way longer than the actual length, and looks as if encoding has finished in the middle (Actually, encoding finishes at correct length, and the result file is correctly encoded).

1.01 is the newest CoreAudio version, and 0.99 is back-ported QuickTime version.



release 1.00
This is a very experimental release.

In this version, qaac directly accesses CoreAudioToolbox, and doesn't depend on QuickTime anymore. However, qaac still requires "Apple Application Support" libraries (This is the same as iTunes 10.5).

You need the most recent Apple Application Support, which is shipped with QuickTime 7.7.1, or iTunes 10.5. AAC-HE encoder is not available with older versions.

Since QuickTime importer is not usable, you need libsndfile-1.dll for directly reading AIFF files or something (This restriction might be removed in future). Also, if you want --artwork-size, you need Windows Imaging Component.

--remix was removed, since matrix mixer was a builtin feature of SCAudio, and not CoreAudio.

Older QuickTime version is in "qt" branch at github repository.



release 0.98
Fixed sampling rate index of ADTS header (regression on 0.95).

The most significant bit of sampling rate index in the ADTS header was always 0 since 0.95. As a result, incorrect ADTS header was generated in the following case:
32000Hz in AAC-HE 
8000Hz, 11025Hz, 12000Hz, 16000Hz in AAC-LC 



release 0.97
Fixed handling of continuous carriage returns in text files or lyrics tag. 
Use mlang for text character encoding detection. This is used for cue sheets, lyrics, and chapter files. 

In windows world, you will rarely see text files with CR as line terminator. However, iTunes uses CR for lyrics by default.

qaac accepts CR, LF, and CR+LF for line terminator of text file or lyrics tag, and normalizes lyrics to CR+LF. This is different from default of iTunes, but iTunes seems to be able to handle it fine, and it's more friendly to many of Windows tag editors.

mlang is a multi-language support library used by Internet Explorer. It should be better than previous ad-hoc character encoding detection.


release 0.96 
Added decoding mode to refalac (-D option). ALAC decoding code change also affects qaac, so qaac is also updated.



release 0.95
 posted 7 hours ago by nu 774 
Fixed crash on MP4 file creation failure. 
A bit of optimization of reference ALAC encoder implementation (Just replaced leading zero bit counter to asm-based one). 
Modified to generate ADTS header from magic cookie.



release 0.94
Removed alacdec.exe. 
Included refalac.exe. This is an ALAC encoder based on opensource ALAC reference implementation by Apple. This works without QuickTime, and of course ALAC only. refalac shares source code with qaac, so many (not all) features of qaac are available. 
Allow multichannel ALAC encoding. However, this is only experimental, so please don't use this feature. In fact, I don't even know if it is playable (I know even QuickTime player doesn't recognize channel layout of this multichanel ALAC in m4a). Information welcome. 
Fixed long standing random file opening error due to silly misusage of sf_open_fd() things of libsndfile. 
Raised priority of built-in wave parser. It will be always tried first, if --raw is not specified. 
Modified built-in wave parser to automatically ignore length when data chunk length is not multiple of blockalign (=bytes per audio frame. 4 for 2ch 16bit PCM).
For example, when you input from foobar2000 via pipe, foobar2000 sets 4294967295 as data chunk length -- which is a fake value, and usually not multiple of blockalign. Therefore, qaac will now work the same as if --ignorelength was specified. However, don't rely on this feature too much. 
Added --chapter option to add chapter from a text file. Chapter text format is same as mp4chaps or subler. It's described at here. Both of QT style/Nero style chapters are inserted. 
Removed --rate keep/auto. --rate auto was not working recently anyway. This is because sample rate setting affects available bitrate, and qaac at first sets up sample rate (before setting bitrate).
 Therefore, now --rate only accepts literal sample rate in Hz. If you want to down sample for low bit-rate settings, use --rate 32000 or something. 
Updated console title display/progress display message. 



release 0.93
[NEW] Added --artwork-size option to specify artwork size (in pixels). If the artwork (passed by --artwork) is larger than this, it's scaled down to this size.
 For image processing, WIC(Windows Imaging Component) is first tried. If it's not present in your system, QuickTime graphics importer/exporter component is used. Usually either of the two will work, unless you are using QTportable and running on Windows XP without WIC installation. 
[MOD] Removed needless write to intermediate file after MP4 optimizing has finished.



release 0.92
Fixed --tvbr -q1. This was not working properly on 0.91, and now it works. 
Fixed reported crash on 0.91. 
lyrics and artworks loading error are now non-fatal (qaac doesn't stop on it). 
Fixed slight memory leaks when working on CoreFoundation dictionaries. 
Use QT official QTMetaData API for ALAC metadata parsing (formerly qaac was using mp4v2). 
More proper Magic Cookie parsing code as ES descripter. 

0.91 had very strange behavior (from my point of view). -q setting (0,1,2) is just the same as QT internal value. Therefore, qaac just passes the value to QuickTime as it is. In other words, it's transparent to qaac, and qaac doesn't handle each cases specially. I could reproduce -q1 bug with debug build, therefore I could use debugger. Of course quality/TVBR setting value was not broken on qaac's side.

Therefore, on 0.91, for some reason SCAudio's internal state is very likely broken on -q1 setting. This might have something to do with another crash report on 0.91 (I received a crash dump from the reporter, and it was crashing in the CoreAudioToolBox.dll, when kQTSCAudioPropertyID_CodecSpecificSettingsArray property is set. This property is used to configure AAC encoder (strategy, bitrate, quality).

On 0.92, qaac resets SCAudio's internal state before setting CodecSpecificSettingsArray, using SCGetSettingsAsAtomContainer() and SCSetSettingsAsAtomContainer() API. These API is usually used to save/load encoder configuration, but can be used for my purpose.



release 0.91
Added support for 7.1ch (FL FR FC LFE FLC FRC SL SR) 
Print input and output channel layout. 
Changed the way to handle bitrate option. Now qaac doesn't deny invalid bitrate, but choose closest value. 
Changed TAK CPU flag to CPU_Any. 
For mono output, changed value of channel property in moov.trak.mdia.minf.stbl.stsd.mp4a to 1 . For stereo and multichannel cases, the value is 2 (same as previous versions). As far as I can see, no AAC decoder is using this value. According to ISO 14496-12, this property is said to be either 1 or 2. Therefore, this is not a very useful property anyway (though neroaacenc seems to set real number of channels here). 
More minor changes and refactoring to code. 



release 0.90
Refined QuickTime importer (MovieAudioExtraction). Now qaac and alacdec can decode multichannel ALAC in MOV container (if you have such files). 
Refined parsing code for magic cookie of ALAC. 



release 0.89
re-fixed side channel assignment for --remix.

I was informed that in DTS-HD core stream, SL/SR are simply mapped to BL/BR, respectively. Therefore, qaac --remix will obey it. 7.1 to 5.1 remix will be now the same with DTS-HD.

New rule will be like the following:
SL, SR are mapped to BL and BR. 
If side channels are not present, BL and BR stay the same. Otherwise, they are mapped to Rls and Rrs, respectively. 

In fact, this mapping scheme is the same with 7.0 and 8.0 treatment by qaac. Therefore it's simple and consistent.
Technical details (you don't have to read this)

QuickTime/CoreAudio uses a struct named AudioChannelLayout to specify input, and output channel layouts.

It has a member named mChannelLayoutTag, and mChannelBitmap. mChannelLayoutTag holds a named tag like kAudioChannelLayoutTag_Quadraphonic (which stands for quad), or other tag to indicate how the struct describes channel layout. mChannelBitmap contains the channel bitmap (channel mask). It's the same with wave channel mask, and it's used when mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap.

These are enough for usual cases to describe the layout. Therefore, qaac has been using these members only. However, AudioChannelLayout has more flexible way to describe the layout using a member named mChannelDescriptions array.

I observed and found the following facts (though this is not documented):
Basically, mChannelDescriptions array is ignored when mChannelLayoutTag is not kAudioChannelLayoutTag_UseChannelDescriptions. 
However, even if mChannelLayoutTag is like kAudioChannelLayoutTag_AAC_7_1 (which completely describes the layout), the remixer looks into mChannelDescriptions array. If it is present, remixer uses them rather than the mChannelLayoutTag. 

As you know, qaac reorders input to AAC layout before feeding it to QT encoder, and lets QT know that input layout is (already) in AAC layout.

Therefore, mChannelLayoutTag must be one of the named AAC layout, for both input and output channel layout. In this way, QT doesn't do any channel mapping job if it is buggy version or not. However, AAC layout is rather restricted, and cannot describe the exact layout of input.

Using mChannelDescriptions array, I can pass more exact layout to QuickTime -- at least to the remixer, as I have observed. I noticed better remix result can be obtained by this. Therefore, I started to tweak around it. Recent changes were about mChannelDescriptions array setting.

So, qaac now sets both of mChannelLayoutTag, and mChannelDescriptions. The latter is used only when you do --remix.



release 0.88
TAK input support. 
Rewrite channel mapping code again, to provide better --remix result. 

You need tak_deco_lib.dll to use TAK inport (as other inputs, this is optional).

--remix now works slightly better than 0.87. When you remix 7.1ch source into 5.1ch with a mask FL FR FC LFE BL BR SL SR, it will be like the following:
 FL -> L, FR -> R, FC -> C, LFE -> Lfe, BL -> Ls, BR -> Rs, SL -> L, SR -> R

Basically, --remix follows the rule like this:
All channels other than SL/SR are passed to QT as they are. 
If BL/BR are not present in the input, SL/SR are mapped to BL/BR. 
If BL/BR are present in the input, SL/SR are mapped to "Wide Left" and "Wide Right". 

Wide Left, Wide Right are predefined channel label in QuickTime; They don't collide with other common channel labels, and simply rendered as L/R in the remixed result.



release 0.87
Added --remix option, and removed old --downmix. I will explain this later. 
Fixed to use prefixed pathname only when path is really long. 
Fixed to correctly handle a line starting with @ in the qaac.reg file. @ means default value entry in the key. 
Updated taglib to 1.7.0 
About --remix option

With --downmix, you could remix into mono or stereo. With --remix, you can remix into arbitary channel layout which QuickTime AAC encoder allows.

However, you can't increase number of channels with --remix, except for --remix stereo (You can use --remix stereo to mono input).

Also, remixing to a layout with same number of channels is not allowed. That is, --remix 4.0 for quad input is not allowed. Also, --remix 5.1 for 6.0ch input is not allowed (both have 6 channels). 

Possible output channel layout is the following:

mono, stereo, quad, 4.0, 5.0, 5.1, 6.0, 6.1, 7.0, 7.1, 8.0, auto

Most of the above should be obvious. "4.0" means "C L R Cs".

"auto" is a magic option. When you say --remix auto, qaac automatically picks 5.1 or stereo, depending on the source.
Known problems/restrictions

QuickTime doesn't use "side" channels. In QuickTime world, 7.0 and 8.0 uses rear surround, while 7.1 uses front center.

That is, 7.1 uses 5ch on front, 2ch on rear, plus LFE. This is different from the most common 7.1ch layout, and this also affects remixing.

You can feed 7.1ch input with the layout "FL FR FC LFE BL BR SL SR" to qaac. However, as I have said, it is encoded as "C Lc Rc L R Ls Rs Lfe".

You might not notice any problem from this 7.1ch AAC. It will depend on decoder and your speaker settings.

However, when you do remix, you will notice the problem. If you do "--remix 5.1" to this input, the result will be like the following:
FL/FR is mapped to C+L/C+R 
SL/SR is mapped to L/R 
BL/BR is mapped to Ls/Rs 

Yes, no real side channels here. You might expect SL is mapped to L+Ls, but it is wrong... This is due to the QuickTime spec, and inevitable.


release 0.86
Accept WAVE_FORMAT_EXTENSIBLE with dwChannelMask 0 with builtin wave parser. 
Accept LPCM format with QuickTime importer. By this change, you can now read AIFF by default, without libsndfile-1.dll. 
Some minor changes concerning command line option handling and error message. 

QuickTime importer (MovieAudioExtraction) can also read formats like MP3 and AAC, but qaac explicitly denies them. That's because QT importer seems no to take care about encoder delays and padding of lossy formats. Therefore, silece are padded at the beginning and ending for formats like MP3.

Anyway, I don't want to encourage people to re-encode from lossy formats, so I won't implement these things.



release 0.85
By request from an user, added --lyrics option to import lyrics from a file.

Like iTunes, only unsynchronized lyrics are supported. That is, just a simple text without timestamp information. In ID3, USLT tag is used for that purpose.

This file can be encoded in UTF-8/UTF-16 (with BOM), UTF-8 (without BOM), or the default encoding in your locale (codepage). qaac simply tries in this order. I haven't explained before, but cue sheet is treated the same way.

As you can see, default locale encoding (like Windows-1252) is only tried after UTF-8 has failed. If your input is not actually in Unicode, and contains invalid byte sequence for UTF-8, it's OK. Otherwise, you will get something wrong.



release 0.84
Fixed -A to work again (regression on 0.83; command line option parser was *always* denying -A, sigh...).



release 0.83
Added --formats option. "qaac --formats" prints available AAC formats (LC/HE, sample rate, channel layout, available bitrate for CBR/ABR/CVBR) to stdout, and exits. I'm sorry but this takes several seconds. 
Added support for 6ch FL FR FC BC SL SR. 
Enabled upsampling for AAC with --rate. It's ridiculous to upsample and encode to AAC , but I removed the (technically unnecessary) restriction. Though you can't change sample rate to arbitrary value anyway... see the result of qaac --formats. 
Fixed minor bug concerning command line option handling. 
Use QT API to check channel layout availability for AAC encoder (especially for HE). 



release 0.82
Fixed ALAC --downmix stereo to work again (regression on 0.81)



release 0.81

0.80 fix was incomplete; --he --downmix still was not working for 5ch and 7ch, so fixed it. Also added more proper error message when you try to feed input whose channel layout is not supported by HE encoder.

Sorry for recent unstable status. Automatic channel mapping is like two guys (QuickTime and qaac) working/racing on the same thing. This is really bad software design... If QT mixer was doing his job, this was unnecessary. Moreover, what QT does is completely undocumented, therefore something like boxing in the darkness.

Anyway, I rewrote mapping code again to be more cleaner and saner, at least to me.



release 0.80
Fixed default mapping for 7.1ch without channel mask (regression on v0.77)



release 0.79
Fixed HE downmixing; 5ch, 6ch, 6.1ch, 7ch, 8ch is not directly supported by HE encoder. However, it was also failing even *with* downmixing (regression on recent changes). 
Enabled qaac channel mapper for downmixing, and ALAC. 
libsoxrate.dll is updated to 0.07. 

It seems that QT downmixer doesn't work properly for arbitrary channel layout -- even for ALAC.

When you feed 8ch FL FR FC BL BR BC SL SR with --downmix stereo, SL and SR disappears and muted from the result. Same effect with AAC encoder (this is the reason why qaac is not only reordering channels but is actually remapping for AAC).

On the other hand, qaac-remapped layout (for AAC) seems also good for QT downmixer, and also works for ALAC. Therefore, I enabled qaac channel mapper for downmixing, and ALAC.

Of course, When you specify --native-chanmapper, these features are disabled.

release 0.78
Output DLL versions on --check. 
Fixed sattle problem in libsoxrate.dll, which was causing crash on some cases (now it is 0.06). 



release 0.77 reupload
Binary in the qaac_0.77.zip archive was a bit old, and printed old version (0.76).

Please download qaac_0.77a.zip.



release 0.77
Added --chanmask option. --chanmask takes integer mask value, or 0. If mask value is specified, channel mask in the source is overriden with the specified value. If value is 0, it means channel mask in the source is ignored, and qaac picks the default channel layout. You can specify mask value by ordinary decimal digits, or hex digits prefixed with 0x. 
Fixed 3ch automatic downmix to work again (regression in 0.75) 
Fixed 7ch and 8ch layout. SL, SR goes to Ls and Rs, while BL, BR goes to Rls and Rrs, respectively. This may sound strange, but by this modification, at least qaac -> neroaacdec roundtrip preserves the original order. 
Accept 4ch FC FLC FRC BC, and 6.1ch FL FR FC LFE BC SL SR. 

qaac has now implemented much of channel mapping; It does not only rearrange to AAC order, but also map channels to be coherent with QT layout (like SL, SR -> BL, BR).

Therefore, even if you are using older CoreAudioToolbox.dll, you are now encouraged not to use --native-chanmapper.



about 7ch and 8ch
It seems Implementation of 7ch and 8ch in release 0.76 is problematic, so don't use them. In the future I will disable them.

QuickTime assigns FLC(Lc) and FRC(Rc) for 7.1ch, while Rls and Rrs are assigned for 7ch and 8ch. Rls and Rrs are abbrev for RearSurroundLeft and RearSurroundRight, respectively.

Rls and Rrs have no corresponding values in commonly used chanmask(bitmap). They are just different.

The following is the current problem:
qaac only accepts as SL and SR, but SL and SR are mapped to Rls and Rrs. Therefore, it *always* breaks layout. This seems to be inevitable from the spec or limitation of QT. 
with --native-chanmapper, currently qaac directly passes original channel bitmap to QT with kAudioChannelLayoutTag_UseChannelBitmap specified. Usually, if corresponding WAV/AC3 layout constant exists in the CoreAudioType.h, qaac rather uses it (like kAudioChannelLayoutTag_MPEG_5_1_A). However, in this case, no suitable constant exists, therefore bitmap is used.
 As SL and SR are not used for 6ch/8ch AAC by QT, they just disappears (muted) from the result. 
without --native-chanmapper, qaac reorders layout before encoding and passes kAudioChannelLayoutTag_AAC_[7|8]_0 to QT. Therefore, all channels are at least audible. However, resulting layout is doubtful. 



release 0.76
Added support for 6.0ch (FL FR FC BL BR BC), 7.0ch (FL FR FC BL BR SL SR), 8.0ch (FL FR FC BL BR BC SL SR). Number of channels for these layout are the same with 5.1ch, 6.1ch, and 7.1ch, respectively. Therefore, you need explicit channel mask for these input. Without channel mask, qaac assumes 5.1ch, 6.1ch, and 7.1ch. 
Updated libsoxrate.dll (v0.04). 
Updated progress display code. 



release 0.75
Added --normalize (-N) option, and changed default behavior not to normalize in 2-pass after sample rate conversion. If you want to normalize, use -N. Anyway, normalize is done only when sample rate conversion with libsoxrate takes place. 
Re-enabled 4ch L R C Cs. Now it works correctly. 
libsoxrate.dll was also updated to 0.03. Just overwrite with the one in the 0.75 archive. 
About 4ch layout(technical details)

I said 4ch default layout is not supported by QT, but I was wrong. QT selects 4ch quad as it's output layout by default, even if you set C L R Cs as input layout. It seems that QT takes only number of channels into account, when it selects output layout as a default mapping.

However, by manually resetting the output layout after that, C L R Cs was accepted, and resulting bitstream was correct.

This might sound like having to do with the 7.6.9 channel mapping problem, but this was a different monster.
About 6.0ch an 8.0ch

In CoreAudioTypes.h, AAC_6_0 and AAC_Octagonal constants are also defined. Therefore they seems to be supported by QT AAC encoder.

However, corresponding constants of MPEG side (WAV/AC3 layout) are not defined, therefore they are not currently supported by qaac (might be supported in the future).



libsoxrate updated

If you have already downloaded qaac_0.74.zip, please download libsoxrate_0.02.zip and replace the old libsoxrate.dll. If you haven't yet, qaac_0.74a.zip is the new archive.

From this version, I have included version resource in the libsoxrate.dll. Therefore, it's version number is visible from explorer property window.



release 0.74
Fixed ADTS channel config for 4ch(quad) from 4 to 0.



release 0.73
Accept L R SL SR as 4ch quad. 
Changed resampler implementation from libspeexdsp to sox. If you want to try it, place libsoxrate.dll to the same directory with qaac. If you don't want it, just don't install it, or use --native-resampler option as before. libspeexdsp is not needed , or working anymore. 

The following is technical details, therefore you don't have to read it.

Official libsox seems to be built as only static lib for Win32, therefore qaac cannot link to it (for license issue). I heard that it is by implementation reason (such as massive usage of global variables).

Therefore, I picked only rate converter part from sox, and built DLL as libsoxrate. It's code is on my github repos (independent from qaac repos).

Original sox source was using OpenMP. However, my implementation is just for qaac and portability is not important (though you can use it if you want). Therefore, I directly implemented with Win32 native thread for parallel filter processing for each channels, in order to minimize thread spawning overhead of OpenMP implementation. Also, I had to rewrite FFT caching code (originally it was using global variables).



release 0.72
Disabled 4ch L R C S and 6.1ch L R C LFE BC SL SR, as I said in the previous post. 
Divided two 7.1ch mapping (chanmask 0xff and chanmask 0x63f). 

chanmask 0xff uses FLC and FRC, while chanmask 0x63f uses SL and SR.

chanmask 0xff is compatible with ISO's implicit 7.1ch layout. Therefore, if input has explicit chanmask 0xff, qaac now maps to FC FLC FRC FL FR BL BR LFE, as before.

QT only allows ISO's implicit layout for 7.1ch AAC, therefore strictly speaking chanmask 0x63f cannot be correctly encoded. However, chanmask 0x63f (SL/SR instead of FLC/FRC) is so common, therefore qaac allows it, and reorder as FC FL FR SL SR BL BR LFE. If input doesn't have explicit chanmask, qaac treats it as chanmask 0x63f. 

In short, when chanmask of input is 0xff, qaac will behave the same with before 0.69. Otherwise, behavior remains the same with recent versions. Yes, this may seem inconsistent, but this is a current compromise plan. Anyway, thanks to b66pak for suggestions.



release 0.71
Fixed resampling to work again (regression on 0.66) 
Added --check option (show QT version, etc.) 
Updated mp4v2 to r485 
Refined usage of intermediate file for container optimization. Now qaac doesn't re-open intermediate file. Therefore retry code introduced in 0.70 has become unnecessary.
 Also, now qaac uses real temporary file (with FILE_ATTIBUTE_TEMPORARY and FILE_FLAG_DELETE_ON_CLOSE) for intermediate file. They are written under Windows temp dir (Users/$user/AppData/Local/Temp or somewhere). As FILE_FLAG_DELETE_ON_CLOSE is set, they are removed even when qaac crashes.
 For this modification, qaac currently cannot use vanilla libmp4v2. 



release 0.70
Refined mp4 muxing code, and added retry when re-opening intermediate tmp file.

By default (without --no-optimize), when you run qaac like:
qaac foo.wav

qaac first encodes foo.wav into foo.m4a.tmp, then copies to foo.m4a with optimized order.

I suspect re-opening the intermediate file (foo.m4a.tmp) after encoding could have failed. Therefore, I simply added retry for it (though in my environment I haven't met such failure).

Ideally, this re-opening is not necessary. This is done just for implementation reason... libmp4v2 just requires it for optimizing.



release 0.69
Fixed 7.1ch mapping. It seems to have been wrong. 
Treat bitrate 0 as "higest bitrate available", for ABR, CBR, and CVBR. Actual bitrate value would vary on the other settings (LC or HE, number of channels...). 
Changed --he default to --cvbr 0 
Relaxed DLL loading directory. qaac now just forbids current directory as DLL search target, therefore you can place them anywhere in the PATH environment. 
Removed CR from console title message (which was appeared as square in Windows XP). 
Added percent to progress message. 
About 7.1ch mapping

In QT SDK's CoreAudioTypes.h, constants named kAudioChannelLayoutTag_MPEG_7_1_B and kAudioChannelLayoutTag_AAC_7_1 are defined for 7.1ch AAC, and commented as "C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC Table 3.1)".

qaac has been following this. However, C L R Lc Rc Ls Rs LFE seems to be correct... (Front L/R and Side L/R are swapped). I couldn't find table 3.1 commented in the header, but it seems AAC channel configuration should be ordered as center -> front -> side -> back -> LFE.

Some informations:
Using foobar2000/neroaacdec as AAC decoder, WAV -> AAC -> WAV round trip preserves 7.1ch channel mapping with this modification. 
CoreAudioToolbox 7.9.3.0 (older one) seems to have been also broken with 7.1ch mapping. Therefore, even if you are using older CoreAudioToolbox, you'd better not to use --native-chanmapper for 7.1ch encoding. 

If you are in doubt, you can still use your own mapping with --chanmap. Suggestions or informations are welcome.



release 0.68
It seems that QT7.7 can properly downmix multichannel audio, therefore disabled auto channel remapping of AAC when --downmix is specified, so as to reduce remapping cost. Downmixing is done with QuickTime native mixer.

Fixed 7.1ch source's layout again. This modification has an impact only when you use --downmix with 7.1ch sources.

On this version, when downmixing to stereo, side left will be positioned at left, side right will be at right. On Previous version, they were positioned more near around center.



release 0.67
Changed default chanmap for 7.1ch source without explicit channel mask. This doesn't affect AAC encoding. However, by this change, position of side left / side right changes when you are encoding 7.1ch source without explicit channel mask into 2ch ALAC with --downmix option. 
Fixed console title progress to work when --silent specified. 


release 0.66
Enabled "--downmix stereo" for ALAC. You could encode only stereo files into ALAC. However, from this version, you can at least use --downmix. For mono files, --downmix stereo will also work to produce dual-mono result. 
Refined progress message of resampling (when rate conversion with libspeexdsp takes place). 
Update console window title with encoding progress. 


release 0.65
Fixed importing problem with Mono file with ext wav header, channel mask 0x04 (center). ALAC can only work on 2ch anyway, but this problem seems to have been long standing there (though such file would be rather rare).

Added ETA to progress message.


release 0.64
Enabled tagging options to work for cuesheet input (Previously they were just ignored).

Now, you can give any of tagging options when you are feeding cuesheet or multiple input files. However, same value is applied to all songs, therefore use this feature with care. Probably --artwork option will be the one useful case.


release 0.63
Fixed problem in --downmix option. Thanks to b66pak, as always, for reporting this.

This was found only when you specified --downmix to downmix multichannel source into mono/stereo, and source contains explicit channel mask (for WAV files, this means that it's in extensible format).

Also I have uploaded fixed qaac_sample.reg, which contains qaac.reg. Previous one didn't work for HE encoding.


release 0.62
Fixed cuesheet importing to work again (regression on 0.58).


release 0.61
Sorry for inconvenience, fixed bugs in previous releases.
Channel remapping of 0.58 was insufficient for 7.1ch, and fixed now. 7.1 audio has two similar mapping (L R C LFE Ls Rs Lc Rc) and (L R C LFE Ls Rs Rls Rrs), and only the latter with explicit channel mask was working. 
0.59 and 0.60 cannot live without qaac.reg. Now qaac works fine without it. 

I have not explained much, but qaac.reg is basically for portable QuickTime, which is recently discussed in hydrogenaudio's qtaacenc topic. It was developed by lvqcl, and my modification basically do the same with his modification to qtaacenc/qaac side, except that mine depends on the external registry setting (qaac.reg). 

lvqcl's hack is an interesting idea, but very fragile to QuickTime version changes. I'm not willing to pay effort to portabilize every version of QuickTime, therefore I don't support portable QuickTime itself. However, *you* can build such environment at your own risk, with registry overriding hack.

You might be required different registry settings for different versions of QuickTime, therefore I introduced more generic solution with qaac.reg. 


release 0.60
Added PID to volatile registry tree (came in release 0.59).


release 0.59
Added registry overriding feature. This is very tricky and dangerous, so I strongly recommend you not to use this feature, if you don't know what you are doing, and what for.
What is done

When a file named qaac.reg is found in the same directory with qaac.exe, qaac loads it. Then, mirrors them under HKEY_CURRENT_USER\SOFTWARE\qaac of the system registry. They are marked volatile, and usually removed when qaac.exe finishes.

Then, qaac redirects all access to HKEY_LOCAL_MACHINE from qaac process to HKEY_CURRENT_USER\SOFTWARE\qaac. This redirection is limited to qaac process, therefore it doesn't do any harm to others.
About qaac.reg file

qaac.reg is an ordinary Windows registry export file, which you can obtain using export command of regedit.exe. 

This is something like the following:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Apple Computer, Inc.\QuickTime]
"InstallASU"="1"
"ProResDecoderPath"="C:\\Program Files (x86)\\QuickTime\\QTSystem\\AppleProResDecoder.qtx"
"ProResDecoderVersion"="2.0.0.3"
"Shortcuts"="0"
"InstallDir"="C:\\Program Files (x86)\\QuickTime\\"
"InstallState"=hex:00,00,00,00
"ProgramFolder"="QuickTime\\"
"QuickTime.qts folder"="C:\\Program Files (x86)\\QuickTime\\QTSystem\\"
"Version"=dword:07708000

As you can see, this is very similar to ordinary ini files. Registry key name is described in [], and value name, data pair follows.

Value name is enclosed with double quotes. Value data is also enclosed with double quotes when it is an ordinary string and has type REG_SZ. Otherwise, type identifier (like hex or dword) comes, and data follows after colon.

In value name or data, backslash (\) is used as an escape character. Therefore, you must write twice when you want backslash.

Finally, you can use non-official type identifier. You can write like the following:
"QTSysDir"=eval:"${qaacdir}QTfiles"

Here, "eval" is the qaac-specific identifier. When qaac sees this, qaac evaluates this as if it were written like the following:
"QTSysDir"="C:\\path\\to\\qaac\\QTfiles"

That is, qaac expand the word enclosed in ${}. Only "qaacdir" is supported for now, and this evaluates to directory of qaac.exe. 


release 0.58
Added workaround for multichannel audio problem.

From this version, qaac rearranges input to AAC order, tells QuickTime that channel layout is (already) in AAC order, and feeds them to QuickTime.

This new behavior can be disabled with --native-chanmapper option.

You can use with/without --native-chanmapper for older, non-buggy version of QuickTime.

Newer QuickTime doesn't re-order channels, therefore it works fine.

Older QuickTime checks channel layout passed via API, but it's already in AAC order, therefore QuickTime doesn't reorder by itself. This is what you want.


release 0.57
Added --chanmap option to force channel order. For example, "--chanmap 2,1" swaps L and R channel of 2ch stereo.

You can use "--chanmap 3,1,2,5,6,4" to force 5.1ch AC3 ordered input (L R C LFE Ls Rs) to AAC order (C L R Ls Rs LFE), in case you are using newer CoreAudioToolbox.dll (>= 7.9.4.0). 

In 7.1 case, you can use "--chanmap 3,7,8,1,2,5,6,4".

This was introduced as a workaround for recent channel mapping problem of CoreAudioToolbox. I strongly recommend you to confirm/test your result when you try this option.


release 0.56
Re-implemented --log and --silent behavior to be more sane.
When you specify --silent, console message will be killed except when you specified wrong options (usage message is shown in this case). 
When you specify --log FILENAME, log message (basically the same with console message) will be written to the file with FILENAME. This will be always written, even if you specified --silent. 


release 0.55
Added support for other than 44.1k inputs via cue sheets. Time formats of cue sheet is MM:SS:FF, where FF is 1/75 seconds, and 588 samples for CDDA (588 = 44100 / 75). Previously qaac was using constant 588 for cue sheet inputs, therefore it didn't work with non-CDDA inputs. 
A little modification to console progress message. Encoding speed (5.1x or something) was added to working progress too.


release 0.54
Fixed: display proper encoding speed on --ignorelength (Bug in 0.53)


release 0.53
Added codec name/codec component version info to console message and tool tag. This is localized for implementation reason (QuickTime returns localized strings depending on the system locale, and qaac just uses it). 
Added elapsed time to console message (This is pure AAC/ALAC encoding time, not including mp4 muxing). 


release 0.52
Better Vorbis tag support (for FLAC inputs). Accepts both of "albumartist" /"album artists", "totaltracks"/"tracktotal", "totaldiscs"/"disctotal".

Added encoded samples/total samples to log output (when --log specified).

By the way, about multichannel encoding and CoreAudioToolBox.dll issue, you may find useful reading Hydrogenaudio's qtaacenc topic.

In short, 
Different version of CoreAudioToolbox.dll produces different AAC output (not binary identical), therefore you'd better use newer version for ordinary 2ch encoding. I also found that older CoreAudioToolbox.dll doesn't work with new iTunes. 
You can place CoreAudioToolbox.dll to the same directory with qtaacenc/qaac (instead of public AppleApplicationSupport directory) to force loading it. This depends on MS Windows' DLL search order, and somewhat like the well-known DLL hijacking technic, but it should at least work. 

There also written how to get and extract CoreAudioToolbox.dll itself in the forum.


release 0.51
Added --artwork option to add cover arts.
You can specify --artwork more than two times to embed multiple artworks. Artworks are embedded in the specified order.


release 0.50
Removed unwanted progress message with carriage returns from logfile (when --log option is given).


release 0.49
Improved progress display message on console (number of audio samples to HH:MM:SS format).


release 0.48 
Added better embedded cuesheet support (FLAC/Wavpack source).

If the given flac/wavpack file has a CUESHEET tag,
qaac generates Nero/QuickTime compatible chapters according to cuesheet information (song title/length). 
qaac copies the original album related tags from the original flac/wavpack tags, and then overwrite them with metadata in the cuesheet (new feature implemented in this release). 

Currently, This kind of all-songs-in-one-file-with-chapters encoding is only activated for the file with CUESHEET tag.

It seems that at least QuickTime player and foobar2000 can read chapters written by qaac. However, iTunes can only read AAC chapters (The chapter menu is disabled for ALAC).


release 0.47

Finally fixed to properly handle resampling filter latency of libspeexdsp. It's a bit of pain, as libspeexdsp seems to lack well-defined way of signaling end of input... Thanks to lvqcl, who helped me out about this.

In the new achive, libspeexdsp_vc10.dll is included. Somehow, the official dll doesn't export functions named speex_resampler_get_{input|output}_latency(), which provide latency informations produced by the filters. On the other hand, this custom built one in the archive exports them (just added their name to def file, and compiled).

Therefore, I recommend you to use libspeexdsp_vc10.dll in the archive. However, if you want, the official one still works. qaac v0.47 searches libspeexdsp_vc10.dll first, and if it doesn't exist, just fallback to the official libspeexdsp.dll.

When running with official dll, qaac uses "guess" approach to obtain latency, instead of calling speex_resampler_get_input_latency() function. Therefore, output length of two approaches might slightly differ by one or few samples. It's resampled from the original anyway, and I don't think this difference is important, nor audible.


release 0.46

Fixed the bug addressed in the previous post (zero samples were needlessly appended at the beginning with the new resampler, which caused slight delay..)

Better handling of temporary files used in the resampler code. Modified to directly call CreateFileW() with FILE_ATTRIBUTE_TEMPORARY, FILE_FLAG_DELETE_ON_CLOSE flags. With this modification, they will be removed even when qaac was killed or something.

Temporary files are also used for the MP4 box optimization purpose, but this remains unchanged, therefore has probability to leave garbage tempfile remained in the encoding target directory.


release 0.45
Added libspeexdsp resampler. To activate this, download win32 binary from http://www.speex.org/downloads/, and place libspeexdsp.dll (not libspeex.dll) to the same directory with qaac.

Also added mp4v2 project.h to github repos, which was long missing... If you have experienced build issue or difficulty, please let me know.


release 0.44
Fixed to write more proper value to sample description(stsd) box for ALAC encoding.
samplesize property now reflects audio's bit depth (16 or 24). 
samplerate property is a 16bit integer value, therefore not large enough to hold real sample rate greater than 65535. qaac has been setting least significant bits there (by just letting it overflow), and now set most significant bits. That is, for 96k sample, previously 30464 (= 0xffff & 96000) was set, and now 48000 is set. (iTunes seems to always set 44100 for ALAC, so I believe nobody refers this property anyway...).


release 0.43

Re-enabled FLAC metadata reading.

This is degradation at release 0.40; The official libsndfile-1.dll is FLAC enabled, therefore qaac was reading FLAC files with not libFLAC.dll but libsndfile-1.dll since release 0.40, when both DLLs are installed.


release 0.42
Fixed a degradation: ADTS streaming to stdout was not working since 0.38.


release 0.41
Supported command line argument globbing(wildcard) for mingw build. 
Fixed to re-encode libmp4v2 origin utf-8 error messages. 
alacdec: Refined usage message. 
alacdec: Fixed to call setlocale() (Couldn't properly handle non-ascii char messages without setlocale()...) 
alacdec: Supported mingw build.


release 0.40
Dropped libsamplerate due to license incompatibility issue. 
Removed DLLs from the qaac-x.xx.zip. When you want to input files with these libraries, please read usage page, and follow the instruction. You cant use DLLs in the 0.39 distribution, as at least file names are different. 
(For example, qaac 0.39 loads libFLAC_vc10.dll, while qaac 0.40 loads libFLAC.dll).


release 0.39
Updated libmp4v2 to svn-r458 
Updated libsndfile to 1.0.24 
Updated sources to be compatible with mingw, and added Makefile for it (though not much tested, and I don't recommend you to build qaac with mingw...)


release 0.38 
Supported path names longer than MAX_PATH limit.

Technically, qaac has been using unicode path names with no limitation with path name length internally. However, qaac couldn't handle very long file name due to Windows API limitation.

In API level, very long file names are required to be prefixed with "\\?\" for ordinary path names, or "\\?\UNC\" for UNC path names. qaac has not been taking care of that.

I implemented the prefix handling in this release, so most of functions now allow very long path names.

However, QuickTime's QTNewDataReferenceFromFullPathCFString() API denies such long paths and result in pathTooLongErr. Therefore, ALAC decoding still doesn't work for very long path names.


release 0.37
Updated mp4v2 to newest svn-r455.

release 0.36
Fixed alacdec.exe to load libFLAC_vc10.dll (FLAC encoding feature was broken since qaac has swiched to VC10...) 
Better vorbis comment support. 
Now qaac/alacdec handles totaltracks, totaldiscs tag. 
Now alacdec converts m4a gnre atom (which contains integer index) into named genre comment. 



release 0.35
release 0.34 modification was insufficient. dropped still remaining libid3tag code, and fixed up AIFF ID3 genre importing. 
Fixed to write "gnre" atom as BT_IMPLICIT (compatibility with iTunes) 



release 0.34
Dropped libid3tag(GPL) and switched to TagLib, due to GPL's incompatibility with MPLv1.1 (which is mp4v2's license).


release 0.33
Fixed the way to pick AAC encoder bit rate table entry.

Technically, QuickTime AAC encoder uses not literal bit rate value, but index of bit rate table, for configuring the encoder.

You can see this table by specifing CBR/ABR/CVBR and impossible bit rate value (say, 0) like:
qaac --cvbr 0 foo.wav

CVBR bit rate table consists of bit rate ranges, and each ranges has some overlaps, therefore has ambiguity:
1: 64 - 72
2: 72 - 82
3: 80 - 91
4: 96 - 109
5: 112 - 127
6: 128 - 145
7: 144 - 164
8: 160 - 182
9: 192 - 228
10: 224 - 266
11: 256 - 305
12: 288 - 343
13: 320 - 381

See? when you specify
qaac --cvbr 256 ,...

qaac has been selecting the index 10 (224 - 266). However, it seems to be 11 (256 - 305) is proper selection (iTunes and qtaacenc seems to choose the latter).

Therefore, I fixed qaac to follow them. This impacts only the CVBR case. TVBR doesn't use bit rate. CBR and ABR use different table, and there's no ambiguity with them.

However, if you were using with CVBR, be careful.



release 0.32
Modified to abort when detected FLAC decoder error (formerly, qaac just silently treated FLAC decoder error as end of file). 
Switched to BSD's getopt implementation (due to incompatibility of MPL and GPL). As before, I've modified it to use wchar_t for Unicode capability. 
Fixed usage message. 



release 0.31
Implemented resampler using libsamplerate (SecretRabbitCode).

This is activated by placing libsamplerate_vc10.dll in the same directory with qaac.exe. If you don't want this, just don't install this dll, or specify --native-resampler command line option.

Resampling is usually not recommended. However, resampling happens on the following cases:
QuickTime cannot encode with the source's sample rate (due to AAC spec limitation). 
You specified --rate 48000 or something. 
You specified --rate auto, and the target bit rate or TVBR quality is low enough for QuickTime to decide down-sampling.



release 0.30
Inportant bug fix with ALAC encoder

Fixed issue #13 at github:
When the source's total sample length is exactly multiple of 4096, qaac produced 4096 samples longer output (silence was added to the last) -- that is, it was not bit-exact.

I'm sorry, I introduced this bug from Apple's sample program named "scaudiocompress", which I referred to.

In the above special case, the way used by scaudiocompress (and qaac) misjudged final ALAC encoder ouput.

Encoder API named SCAudioFillBuffer() tells the caller how many samples are contained in the encoded packet, via a struct member named AudioStreamPacketDescription.mVariableFramesInPacket. It's usally more than zero for ALAC, and zero for AAC.

However, in the above special case, ALAC finally puts zero to it. And seeing zero, qaac chose AAC's logic to find out the number of sample frames in the packet (it's always constant for AAC). Of course, it was completely wrong -- It's ALAC, and not AAC.


release 0.29
Enabled 3ch input for AAC encoding. QuickTime AAC encoder doesn't accept 3ch sources, therefore qaac has also denied them.
From this version, qaac just accepts 3ch sources, and automatically down-mix them into 2ch, with warning message. 
Without libsndfile and --ignorelength not specified, qaac couldn't encode WAV sources, and this was not what I meant.
Fixed to handle WAV sources without libsndfile when --ignorelength is not specified.


release 0.28
This is very important bug fix for ALAC encoder

ALAC encoder randomly crashed due to heap corruption, for some input sources. It seems this is triggered by some specific sources, which contain hard part for ALAC encoder, and the output packet size is very close to uncompressed raw PCM size.

If I believe the QuickTime's property kQTSCAudioPropertyID_MaximumOutputPacketSize, ALAC encoder's maximum output bytes for ordinary 2ch 16bit audio, 4096 sample frame is 16392. This is 4096 * 2 * 2, and equals to uncompressed PCM size. Therefore, when it reaches to 16392, it means that this packet could not be compressed at all, in size.

In my observation, ALAC doesn't exceed the limit. It always stays under 16388 or so. However, when it is near around that, it *does* overwrite the output buffer beyond the size, and result in the caller process's heap corruption (when the output buffer is allocated in the heap).

In this release, I doubled the buffer size, and this version is using 32784, instead of 16392. This is not a *good* work around, but it seems to work for now...


release v0.27a
libFLAC_vc10.dll in the release 0.27 package was problematic, so replaced with new one. If you have already installed v0.27, you can just download qaac_libflac_vc10.zip and replace older one with it.
The problem is: libFLAC_vc10.dll in 0.27 was implicitly linked to ogg_vc71.dll (which was used in the previous version, but not in the new archive).


release 0.27
Switched to MSVC10. Source codes are slightly modified to work with MSVC10. However, in function, this is the same with v0.26.
I put C/C++ runtime DLLs of MSVC10 in the archive, so now you don't have to worry about them.
msvcr100.dll and msvcp100.dll are generally installed under System32 (or SysWOW64) directory, but you can place them in the same directory with qaac.exe.


release 0.26
Fixed issue #6 in github: when source file contains a tag, and the same tag value is supplied with command line option, source's one was taken and embedded in the result file. 
Included new version of libsndfile(1.0.23) 
Invalid path characters list was incomplete, therefore some characters like ">", "|" were added (for cuesheet encoding + automatic path name generation).


release 0.25 
posted Nov 28, 2010 12:43 PM by n u Enabled 24bit ALAC encoding. 
Added FLAC output support in alacdec.exe (use -F option). This might be handy when you want to keep tags in the original ALAC file. alacdec copies most of the major tags into result FLAC file.


release 0.24
posted Nov 23, 2010 5:47 PM by n u 

Fixed the issue #3 (at github):
Combination of --ignorelength + cuesheet input was buggy. In this case, encoded song started from wrong position, and had wrong length.



release 0.23
posted Nov 22, 2010 8:20 PM by n u 

I'm sorry, release 0.21 didn't fixed the tool tag duplication bug for cue sheet input case. Therefore, I re-fixed the problem.



release 0.22
posted Nov 22, 2010 5:04 PM by n u 

Enabled simple user-defined file name formatting for cue sheet input. You can specify format with new --fname-format option.

By default, format "${tracknumber}${title& }{$title}" is used, and this will generate file named like previous versions.

I will explain format strings spec in the usage page.



release 0.21
posted Nov 22, 2010 10:57 AM by n u 

Bugfix.
When encoding multiple files at once, encoder settings like "TVBR 127" were repeated in the "tool" tag.



release 0.20
posted Nov 20, 2010 10:38 AM by n u 

DLLs like libsndfile_vc71.dll are now optional and dynamically loaded. They are still in the release archive, but You don't have to put them if you don't need them (especially when you are using qaac via foobar2000 or something).

qaac now load DLLs from it's install directory only, therefore if you want them, place them in the same directory with qaac.exe.

I cleaned up the source tree, added VisualStudio project file, and placed them at github repository. Now the building process would be much easier, I hope.



release 0.19
posted Nov 17, 2010 5:15 AM by n u 
Fixed a bug:
When processing CUE sheet as an input, which contains a track named like "Mr. bug",  qaac produces "Mr.m4a".

I mean, the track name's part after dot was treated as an extension, and replaced with "m4a".


release 0.18
posted Oct 11, 2010

Updated libmp4v2 to svn trunk r399. I have rewritten some modules due to the libmp4v2's interface change.

Thanks to Jeremy Noring -- libmp4v2's developer, some of my patches were merged into libmp4v2's trunk.

r399 needs a slight modification to work with qaac, therefore qaac 0.18 still depends on my custom build of libmp4v2. However, I hope I will soon be able to use vanilla libmp4v2.



release 0.17
posted Oct 8, 2010

I'm sorry, I've written but forgot to open the change log for the previous release (0.16).

New release 0.17 fixed a bug in 0.16 --adts mode:

0.16, with --adts option specified, generated a file named like foo.aac.tmp, not foo.aac



release 0.16
posted Aug 29, 2010
Added --no-optimize option. By default, qaac optimizes the MP4 container after encoding has finished. "optimize" means arranging MP4 box in a better order for playing and eliminating unneeded free areas. However, when you run qaac from foobar2000(or something), it will rewrite the MP4 container afterward. In this case, optimizing with qaac will be useless and just a time consuming process. 
Fixed a problem:
When running from dbPoweramp, qaac produced 8.3 DOS-like filename. 

It seems that dbPoweramp uses some trick to pass the outfilename to the CLI encoder.

dbPoweramp first creates 0 bytes file with usual long file name, then pass 8.3 DOS format short file name to CLI encoder as a command line. This is maybe in order to avoid the trouble around unicode filenames, which many CLI encoder can't handle correctly.

Therefore, CLI encoder tries to open the file using the 8.3 DOS file name. In Windows file system, this is considered to be identical with the original long file name, therefore original file -- which dbPoweramp has created -- is opened for writing. This is what dbPoweramp expects.

As for qaac, qaac uses a temporary file to optimize the MP4 container file after encoding. Therefore, qaac finally "renames" to the file name passed as a command line (which is a 8.3 DOS-like short file name). And, this result in the 8.3 filename problem, which you don't expect.


release 0.15
posted Aug 11, 2010

Important bug fix release.

libmp4v2's MP4 optimize function was using temporary file in an inadequate manner by default, and causing problems below:
Same temporary filename was used between multiple instances of qaac, which resulted in a failure at the end of the encoding stage. 
Tempfile's directory was fixed to "..", which means you might have failed encoding if ".." was not writable.


release 0.14
posted Aug 9, 2010 4:34 AM by n u   [ updated Aug 9, 2010 4:36 AM ] 

Added --downmix option for downmixing multichannel source into mono/stereo.


release 0.13
posted Jul 28, 2010 4:52 AM by n u 

Adopted qtaacenc's new feature -- Encoder configs are embedded into metadata.



release 0.12
posted Jul 1, 2010 7:24 PM by n u 

Fixed a bug in the wav parser for --ignorelength option.



release 0.11
posted Jun 29, 2010 10:42 AM by n u 

Added --nice option for setting lower process priority. In fact, qaac ran at the lowest(idle) priority up to this version. From now on, normal priority is the default, and you can specify --nice if you want qaac run at idle priority. 
Added --ignorelength option. This is for PCM wav source only, and ignore the "data" chunk size. Sometimes you may have to set this if you want to feed qaac from pipeline. 



release 0.10
posted Jun 4, 2010 1:53 PM by n u 

Removed junk MP4 box(trak.udta.name) from the MP4 output, which was produced by libmp4v2.

By this fix, now aacgain can open qaac's MP4 output (Programs like foobar2000, QuickTime and mp4box could open MP4 files produced by qaac with no problem, but I found aacgain couldn't open it).



release 0.09
posted May 22, 2010 6:02 AM by n u 

Now I fixed the problematic "--rate" code.

In release 0.08 post, I've written of QT 7.6.5 specific problem, but it was not. Therefore, I think this version will work in QT 7.6.5 (although I can't test it).



Don't use release 0.08
posted May 22, 2010 5:26 AM by n u 

I'm sorry. I'm working to fix it now. Please use 0.07.



release 0.08
posted May 21, 2010 5:13 AM by n u 

Bugfix: Enabled "--rate" option on TVBR mode.

By this fix, on QuickTime 7.6.5, you might get lower quality output than you specified by "--tvbr" option. On 7.6.6, it should work OK. Therefore, I strongly recommend upgrading QuickTime if you are using 7.6.5.

(I've already upgraded to 7.6.6 and I have no working environment with 7.6.5, so I can't reproduce the problem on 7.6.5, sorry. This is why I used the wording... "might".)



re-uploaded qaac_0.07.zip
posted May 13, 2010 5:05 AM by n u 

I'm sorry. Yesterday's qaac_0.07.zip package didn't include qaac.exe and alacdec.exe. I have re-uploaded it now.



release 0.07
posted May 12, 2010 8:45 AM by n u 

Fixed a bug: -d option didn't work for cuesheet input.



release 0.06
posted May 11, 2010 6:10 PM by n u 

Added ADTS output mode(AAC only). This can be used for streaming output to stdout, but tagging is not supported here.



release 0.05
posted May 9, 2010 3:06 PM by n u 

Added cue sheet(*.cue) input support(experimental).
qaac foo.cue

will encode each track into separate m4a files.

release 0.04
posted Apr 21, 2010 2:05 PM by n u   [ updated Apr 21, 2010 2:26 PM ] 

Now qaac can handle files when the current directory name contains unicode characters.

I found QuickTime for Windows intentionally changes caller process's current working directory, when it containes some of unicode characters. It makes caller process's path handling really CONFUSED, and I think this is really EVIL.

More acculatly, QuickTime dislikes characters which can't be dealt with ANSI version of Windows API under the current codepage. For example, 
C:\Music\flac\Mum> qaac foo.flac
resulted in failure if you are using Japanese version of Windows. 

I tried to take care of it, but it might be incomplete. You can avoid this problem by not running qaac in such current-dirs.



release 0.03
posted Mar 16, 2010 6:51 PM by n u   [ updated Mar 16, 2010 7:02 PM ] 

Added embedded Cuesheet support for FLAC/Wavpack one-file-per-album source. foobar2000 style is expected (global metadeta are embedded as ordinary tags, others are embedded in "cuesheet" tag).

Read song titles and durations from embedded cuesheet, and write into M4A as MP4 chapters, like foobar2000 does. qaac writes both QT style and Nero style chapters, therefore foobar2000 and QuickTime / iTunes will handle them alright.



release 0.02
posted Mar 7, 2010 3:23 PM by n u   [ updated Mar 7, 2010 3:35 PM ] 
Added simple ALAC decoder, alacdec.exe. Can decode ALAC into WAV, using QuickTime API. 
Divided BIG import libs for the source tree into an extra zip archive. 
Modified progress message display code (not important).