Skip to main content

Notice

Please note that most of the software linked on this forum is likely to be safe to use. If you are unsure, feel free to ask in the relevant topics, or send a private message to an administrator or moderator. To help curb the problems of false positives, or in the event that you do find actual malware, you can contribute through the article linked here.
Recent Posts
4
Support - (fb2k) / Re: Foobar2000 v2.* playback sound quality lower than v1.X
Last post by Case -
WASAPI is supported natively in both foobar2000 v1.6.x and 2.x. All the default outputs are WASAPI. The ones without extra marking use shared mode, the ones with [exclusive] in the name use WASAPI exclusive mode. Thus the old component is obsolete. It has been kept online mainly for people with older foobar2000 versions.

The separate WASAPI Shared mode component you downloaded is my first attempt of making an output component. It was created in the time when default foobar2000 output used DirectSound and had poorly working smoothing for sudden sound changes. For it to work correctly the sound card drivers need to support event based reporting when buffers need filling - something that has been WHQL requirement for drivers since Windows Vista days.

The ASIO output picks best supported sample format automatically, you are correct. You should probably know that the ASIO output is done completely in the output component. It's the exact same code doing all the heavy work in all foobar2000 versions. There can be no audible differences.
6
Support - (fb2k) / Re: Foobar2000 v2.* playback sound quality lower than v1.X
Last post by Globares -
Hi Case,
First of all thank you for some details regarding the v2/v1 differences. I really appreciate it.
I’ve installed the WASAPI plugin to try this option and I’m happy to say that we have the first thing we can agree on 😉. F2k v1 and v2 sound the same to me thru WASAPI. Unfortunately it means “really bad” when using the WASAPI shared output 0.6.24 plugin, which is the only one supporting 64 bits (sound seems to miss a micro-period from time to time). The old WASAPI output support 3.4 doesn’t have such problem, but it works on f2k v1, only, and it’s quality is worse than ASIO.
All my tests are done using the WAV files, “CD quality”, i.e. 44.1khz/16 bit, or Codec: PCM, 1411kbps, 16 bit, 2 channel, as reported by Foobar.

The bit depth cannot be set for ASIO drivers (the only available option is “Automatic”). As far as I can see Foobar2 v1.6 supports the same depth - just the interface is different (Playback->Output->Output data format). Interestingly, 32 bits provide better sound quality than 16 bits, even if I use 16 bits sources.
Running f2k v2 with output set to “Default – exclusive” and 32 bits depth provides the highest quality I can get from v2, better than v2 ASIO, but still behind v1 ASIO.

Small note - binary output comparison on a driver level is a mandatory quality test – if bits differ there’s an obvious difference, but it doesn’t cover timing and more subtle differences.
8
3rd Party Plugins - (fb2k) / Re: Resampler plugin
Last post by Case -
ardftsrc filter have superior quality & speed compared to sox resamplers.
I compiled librempeg, I think there is a bug in the code as it keeps insisting on using CLAP audio stuff even though documentation claims it doesn't do dependencies by default.
Anyway, with default settings and commandline
Code: [Select]
ffmpeg -i source.wav -af "ardftsrc=48000" -acodec pcm_f32le out.wav
my binary was slower than existing ffmpeg with '-af "aresample=48000:resampler=soxr"'. And it produced worse quality and the file length changed.
9
3rd Party Plugins - (fb2k) / Re: foo_skip: skip tracks that match a specified search query
Last post by Case -
Audio format shouldn't matter at all, the component does its work as a decoder shim and can work with everything. Note that M4A doesn't tell me what audio format your file actually is, M4A is just a name for MP4 container that contains audio. It can be AAC anything, MP3, ALAC, FLAC, probably more. I tried with typical AAC in MP4 container and couldn't replicate any issues.

Do you see on the console a message "Skip Track found partial skip info from tags"? The component prints that when it is enabled and  detects a SKIP tag present.
10
General Audio / Re: Album Art Downloader XUI
Last post by AlexVallat -
I will do a worked example with you. Looking at, for example mastermixdj, I can do a test search on it and see that the search URL is https://mastermixdj.com/?s=

Running with the network inspector devtool open I can see that it's dynamically creating the results HTML by calling an API, it calls:
https://mastermixdj.com/wp-json/api/v1/get/search/results?type=albums&search=TheSearchTerm&limit=4 and also the same API with type singles and limit 10. When writing your script you can customise this to whatever you want, but for now let's just do albums and keep the same limit they have.

The JSON returned is nice and easy to deal with, we don't even have to do HTML scraping, so great.

For JSON, the idea is to create a class that matches the bits structure of the JSON returned that we are interested in, and then do:
Code: [Select]
json = JavaScriptSerializer()
searchResults = json.Deserialize[of (SearchResults)](jsonSearchResults)
on it to parse it. SearchResult is wrapped in () because in the case of MasterMixDj it's an array of results retuned. If it was a single object, it wouldn't have those parenthesis. The JSON structure returned by MasterMixDj is an array of objects, where the interesting bits of the object (for us) are labelled title, artwork and link, so this would mean a class like:

Code: [Select]
	class SearchResult:
public title as String
public artwork as String
public link as String

Now we've parsed the results, they must be reported to AlbumArtDownloader. This is done using the results.Add method, which takes the parameters object thumbnail, string name, string infoUri, int fullSizeImageWidth, int fullSizeImageHeight, object fullSizeImageCallback, CoverType coverType, string suggestedFilenameExtension. There are overloads with fewer parameters you can see at IScriptResults.cs. For our case, we know the artwork, title (name) and link (infoUri). For artwork, this source doesn't provide separate small thumbnail images, it just shows the full size images resized. So we won't bother with thumbnails and just provide the artwork as the thumbnail.

As we don't have a separate full size image, we can just ignore fullSizeImageCallback and pass null to that. It's what gets given back to us in the RetrieveFullSizeImage method, which again, as we don't have separate full size images, we don't care about.

For size, we don't know it. the source doesn't provide that info, so just use -1, -1 for "unknown". For cover type, it looks like they are all just front covers, so we can pass CoverType.Front for that and end up with:

Code: [Select]
		for searchResult in searchResults:
results.Add(searchResult.artwork, searchResult.title, searchResult.link, -1, -1, null, CoverType.Front)

Final result is attached.

There's more that could be done with this source. For example, looking at the album page I can see that there is a facility for getting thumbnails, by appending "-100x100" to the artwork between "primary" and "jpg" so we could use that for faster results without downloading the full size one for every result. I can also see that there are additional images that could be found by replacing primary with "additional-1" (and presumably numbers past 1 if they existed). I'll leave all of that as an exercise for the reader, though.

This should give you enough of an idea as to how to do it that you can work on other scripts. If you produce any, please post them here for others to enjoy too!

Alex