- Add Book.IsSpatial property and add it to search index - Read audio format of actual output files and store it in UserDefinedItem. Now works with MP3s. - Store last downloaded audio file version - Add IsSpatial, file version, and Audio Format to library exports and to template tags. Updated docs. - Add last downloaded audio file version and format info to the Last Downloaded tab - Migrated the DB - Update AAXClean with some bug fixes - Fixed error converting xHE-AAC audio files to mp3 when splitting by chapter (or trimming the audible branding from the beginning of the file) - Improve mp3 ID# tags support. Chapter titles are now preserved. - Add support for reading EC-3 and AC-4 audio format metadata
71 lines
1.9 KiB
C#
71 lines
1.9 KiB
C#
#nullable enable
|
|
using Newtonsoft.Json;
|
|
|
|
namespace DataLayer;
|
|
|
|
public enum Codec : byte
|
|
{
|
|
Unknown,
|
|
Mp3,
|
|
AAC_LC,
|
|
xHE_AAC,
|
|
EC_3,
|
|
AC_4
|
|
}
|
|
|
|
public class AudioFormat
|
|
{
|
|
public static AudioFormat Default => new(Codec.Unknown, 0, 0, 0);
|
|
[JsonIgnore]
|
|
public bool IsDefault => Codec is Codec.Unknown && BitRate == 0 && SampleRate == 0 && ChannelCount == 0;
|
|
[JsonIgnore]
|
|
public Codec Codec { get; set; }
|
|
public int SampleRate { get; set; }
|
|
public int ChannelCount { get; set; }
|
|
public int BitRate { get; set; }
|
|
|
|
public AudioFormat(Codec codec, int bitRate, int sampleRate, int channelCount)
|
|
{
|
|
Codec = codec;
|
|
BitRate = bitRate;
|
|
SampleRate = sampleRate;
|
|
ChannelCount = channelCount;
|
|
}
|
|
|
|
public string CodecString => Codec switch
|
|
{
|
|
Codec.Mp3 => "mp3",
|
|
Codec.AAC_LC => "AAC-LC",
|
|
Codec.xHE_AAC => "xHE-AAC",
|
|
Codec.EC_3 => "EC-3",
|
|
Codec.AC_4 => "AC-4",
|
|
Codec.Unknown or _ => "[Unknown]",
|
|
};
|
|
|
|
//Property | Start | Num | Max | Current Max |
|
|
// | Bit | Bits | Value | Value Used |
|
|
//-----------------------------------------------------
|
|
//Codec | 35 | 4 | 15 | 5 |
|
|
//BitRate | 23 | 12 | 4_095 | 768 |
|
|
//SampleRate | 5 | 18 | 262_143 | 48_000 |
|
|
//ChannelCount | 0 | 5 | 31 | 6 |
|
|
public long Serialize() =>
|
|
((long)Codec << 35) |
|
|
((long)BitRate << 23) |
|
|
((long)SampleRate << 5) |
|
|
(long)ChannelCount;
|
|
|
|
public static AudioFormat Deserialize(long value)
|
|
{
|
|
var codec = (Codec)((value >> 35) & 15);
|
|
var bitRate = (int)((value >> 23) & 4_095);
|
|
var sampleRate = (int)((value >> 5) & 262_143);
|
|
var channelCount = (int)(value & 31);
|
|
return new AudioFormat(codec, bitRate, sampleRate, channelCount);
|
|
}
|
|
|
|
public override string ToString()
|
|
=> IsDefault ? "[Unknown Audio Format]"
|
|
: $"{CodecString} ({ChannelCount}ch | {SampleRate:N0}Hz | {BitRate}kbps)";
|
|
}
|