FlacTypes.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <malu.bertsch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Buffer.h"
  8. #include <AK/ByteBuffer.h>
  9. #include <AK/Types.h>
  10. #include <AK/Variant.h>
  11. namespace Audio {
  12. // Temporary constants for header blocksize/sample rate spec
  13. #define FLAC_BLOCKSIZE_AT_END_OF_HEADER_8 0xffffffff
  14. #define FLAC_BLOCKSIZE_AT_END_OF_HEADER_16 0xfffffffe
  15. #define FLAC_SAMPLERATE_AT_END_OF_HEADER_8 0xffffffff
  16. #define FLAC_SAMPLERATE_AT_END_OF_HEADER_16 0xfffffffe
  17. #define FLAC_SAMPLERATE_AT_END_OF_HEADER_16X10 0xfffffffd
  18. // Metadata block type, 7 bits.
  19. enum FlacMetadataBlockType : u8 {
  20. STREAMINFO = 0, // Important data about the audio format
  21. PADDING = 1, // Non-data block to be ignored
  22. APPLICATION = 2, // Ignored
  23. SEEKTABLE = 3, // Seeking info, maybe to be used later
  24. VORBIS_COMMENT = 4, // Ignored
  25. CUESHEET = 5, // Ignored
  26. PICTURE = 6, // Ignored
  27. INVALID = 127, // Error
  28. };
  29. // follows FLAC codes
  30. enum FlacFrameChannelType : u8 {
  31. Mono = 0,
  32. Stereo = 1,
  33. StereoCenter = 2, // left, right, center
  34. Surround4p0 = 3, // front left/right, back left/right
  35. Surround5p0 = 4, // front left/right, center, back left/right
  36. Surround5p1 = 5, // front left/right, center, LFE, back left/right
  37. Surround6p1 = 6, // front left/right, center, LFE, back center, side left/right
  38. Surround7p1 = 7, // front left/right, center, LFE, back left/right, side left/right
  39. LeftSideStereo = 8, // channel coupling: left and difference
  40. RightSideStereo = 9, // channel coupling: difference and right
  41. MidSideStereo = 10, // channel coupling: center and difference
  42. // others are reserved
  43. };
  44. // follows FLAC codes
  45. enum FlacSubframeType : u8 {
  46. Constant = 0,
  47. Verbatim = 1,
  48. Fixed = 0b001000,
  49. LPC = 0b100000,
  50. // others are reserved
  51. };
  52. // follows FLAC codes
  53. enum FlacResidualMode : u8 {
  54. Rice4Bit = 0,
  55. Rice5Bit = 1,
  56. };
  57. // Simple wrapper around any kind of metadata block
  58. struct FlacRawMetadataBlock {
  59. bool is_last_block;
  60. FlacMetadataBlockType type;
  61. u32 length; // 24 bits
  62. ByteBuffer data;
  63. };
  64. // An abstract, parsed and validated FLAC frame
  65. struct FlacFrameHeader {
  66. u32 sample_count;
  67. u32 sample_rate;
  68. FlacFrameChannelType channels;
  69. PcmSampleFormat bit_depth;
  70. };
  71. struct FlacSubframeHeader {
  72. FlacSubframeType type;
  73. // order for fixed and LPC subframes
  74. u8 order;
  75. u8 wasted_bits_per_sample;
  76. u8 bits_per_sample;
  77. };
  78. }