No idea if this brings a noticeable improvement, but it probably makes
better sense to only do the division step one time instead of doing it
twice interleaved when processing stereo files, which are the most
common scenario anyway.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Replace libsoxr dylib with a static library, and also build the two
architectures separately, to allow for platform-specific optimizations
to be employed for both. This also reduces the size of the CogAudio
framework by a few hundred kilobytes, as we eliminate unused code paths
better this way.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Now Cog supports freeformat MP3 once again. The plugin has been extended
to include sample accurate seeking, accurate length probing of files
missing headers, and iTunes gapless info reading using libid3tag.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Artwork deduplication should be done with hashes, not by full data
comparison. This should be a lot faster loading artwork from files now,
especially if the playlist already contains a lot of unique artwork.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
If starting playback from a given playlist entry, or selection, then
start shuffle mode from that track. Otherwise, start shuffle from the
beginning of the shuffle list.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
When in shuffle mode, start playback on the first item in the shuffle
list, rather than the selection, or the start of the playlist.
Fixes#241
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Added commands to control playback: play, pause, stop, previous, next.
Also added a spam property to PlaylistEntry, to return the formatted
spam string for the playlist entry, which is currently limited to the
playing item.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
When the option is enabled, and playback comes to a completion, the
player will quit on its own.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This stupid setLevel default was something suggested when making a
window a drag target, and I was observing a setLevel for a window
control, not for a window itself. I should not have set that in the
first place.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Since 10.13 doesn't want to observe the auto sizing attribute of the
field properly, gotta use the tiny font size that the field is already
configured to use.
Should fix#243
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Updated the FLAC library to what is the official release of 1.3.4,
although I already had all the commits from that version prior to this
update.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This small change brings the decoding more in line with what ffplay
does, and allows, for example, John McLaughlin.wma to play without
interruption from the stream warnings throughout the file.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This fixes#126 and brings back basic automation support. The basic
currentEntry object will return an object that can enumerate the track
metadata or the file URL of the currently playing track. More automation
suggestions are welcome, including playlist manipulation, or playback
control.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Xcode touched the Info.plist and fixed these, and I changed the file
type association definitions to print the correct thing in the future.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Apparently, the sort descriptors are going by data members of the array,
not by the column identifiers, or their textual contents.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Unfortunately, the track number column will always bug out and pop the
indicator back over to the Album Artist column. No way around it. The
control is just buggy like that.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This is a more correct method of identifying the supported classes to
coalesce into unique pointers through the storage array. I completely
forgot about this method, oops.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This allows for TagLib to handle artwork reading where the file built-in
readers fail, such as the FFmpeg reader, which would require parsing the
stream data for artwork packets, a really wacky convention to have.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Strings read from the database were not being stashed in the memory
store, which caused things like blank tags instead of correct metadata.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
IN A.D. 2101, WAR WAS BEGINNING. *boom*
Yeah, this was a dumb bug, I didn't realize that AUAudioUnit would just
arbitrarily ignore my configured block size and request a different one.
The AirPods Pro will just request 480 instead of the 512 I ask for, so
let's instead support variable block sizes, and only take up to the last
4096 samples of the chunk fed to the output device.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Significantly reduce the memory footprint of adding tracks to the
playlist, by coalescing the NSString and NSData objects in the info
dictionaries as they are being loaded in the background, into a common
data set which will then be discarded when the whole job is completed.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Added a string dictionary for deduplication of metadata, and actually
initialize both it and the art dictionary on startup, so they actually
work like they should.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Art read from external files supports more formats than previously
listed here. Amend the list accordingly.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Stream metadata could be in any encoding, not necessarily UTF-8. Handle
this in an appropriate way.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
The new spectrum mode is linear frequency. Both modes also now have a
lower range of 10Hz, where possible.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Downmixing should no longer be necessary, unless someone actually tries
to emit up to 64 channels, while we support only 32 channels, but really
only 18 channels. Also read the channel layout field from the decoder,
so that the speaker layout will propagate from the files to the player.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
The equalizer needs to apply its presets to the new settings variables
every time the preset changes, even when it happens with no dialog open.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
vDSP functions expect their input and output pointers to be aligned to
an even four values. Correct this by aligning all pointers. The
allocated buffers used for one parameter should already be aligned
somewhat, but align the incremented positions used on some of them so
that the vDSP functions don't misbehave. Also align the volume scaler
input by doing scalar math until the pointer is aligned prior to calling
vDSP_vsmul. Also, change 16-bit and 32-bit scale to use vsdiv instead of
vsmul with a really small number already divided into one.
Fixes the test vectors that were sent in extrapolating incorrectly due
to their final blocks having uneven sample counts, resulting in
unaligned pointers.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This doesn't fix an outstanding issue which will be fixed by the next
commit, but it does fulfill a request.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
A bad sample scanner and cleaner will point out in the log whenever a
bad sample, such as infinity, or Not a Number, or even huge values over
±2.0, in case some piece of code, or a decoder, or even a bad file, has
taken over the output.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
The original didn't really handle backwards versus forwards differently,
as far as the predictor coefficients should have been, as they probably
should have been reversed for a different direction window.
This didn't fix my problem, though, but did possibly expose something
else to mess with.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
In the rare event that we're somehow playing decimated DSD at full
sample rate instead of resampling, only the start needs to be skipped,
and the end needs the input to the decimator padded to flush it, but
nothing needs to be truncated from the end of the output in that case.
Still, mostly pointless, since next to nobody will be outputting 384 kHz
from their Macs, in any case, much less unprocessed DSD.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
We should be extrapolating right over top of the DSD decimator latency,
rather than in front of it. Yeah, that'll do.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
For streams offering a three way split in their ICY metadata blocks,
support album/artist/title using that three way split. Otherwise do the
usual of artist/title, or blank artist if there's no hyphen to split on.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
For some reason, this sometimes gets set to nil. Fix to refer to the
current track in that case.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Building libogg, libvorbis, libvorbisfile, libFLAC, libopus, and
libopusfile out of tree, to utilize their projects' CMake build scripts,
and also enable any platform optimizations that may have been missing.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
Reduce the virtual resolution to match the actual resolution, and set
the analyzere frequency to Nyquist of the audio input, as it seems to
behave as if the entire range of the input FFT bands are up to the
specified frequency, rather than half of it. Otherwise, we lose half of
the frequency range provided by the input data.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
The system AIFF reader seems unable to read some really old files, so
enable FFmpeg to do so instead.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>