ManagedBass returns v2.4.16.1 for BassEnc
I'm on Linux (Garuda)
Here's a full encoding sample that crashes
var pitch = 432.0 / 440;
var source = "SourceShort.mp3";
var destination = "SourceShort_out.wav";
var speed = 1.0;
var rate = 1.0;
var v = BassEnc.Version;
// Create channel.
Bass.Init();
var chan = Bass.CreateStream(source, Flags: BassFlags.Float | BassFlags.Decode);
var chanInfo = Bass.ChannelGetInfo(chan);
var srcDuration = GetDuration(chan);
_output.WriteLine($"Pitch: {pitch}");
_output.WriteLine($"Source duration: {srcDuration.TotalSeconds:F3} seconds");
// Add tempo effects.
chan = BassFx.TempoCreate(chan, BassFlags.Decode).Valid();
Bass.Configure(Configuration.SRCQuality, 4);
// In BASS, 2x speed is 100 (+100%), whereas our Speed property is 2. Need to convert.
// speed 1=0, 2=100, 3=200, 4=300, .5=-100, .25=-300
var speedShift = speed / pitch;
var tempo = speedShift >= 1 ? -100.0 / speedShift + 100 : 100.0 * speedShift - 100;
var freq = chanInfo.Frequency * rate * pitch;
Bass.ChannelSetAttribute(chan, ChannelAttribute.Tempo, tempo);
Bass.ChannelSetAttribute(chan, ChannelAttribute.TempoFrequency, freq);
// Create encoder.
BassEnc.EncodeStart(chan, destination, EncodeFlags.PCM | EncodeFlags.Dither | EncodeFlags.AutoFree, null);
var length = Bass.ChannelGetLength(chan, PositionFlags.Bytes);
// Process file.
var buffer = new byte[32 * 1024];
while (true)
{
// Reading data moves the encoder forward, no need to use the buffer ourselves.
var read = Bass.ChannelGetData(chan, buffer, buffer.Length);
if (read == -1) { break; }
}
Bass.StreamFree(chan);