WavParser.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AudioInput/AudioInputFile.h>
  10. namespace Audio
  11. {
  12. /**
  13. * A RIFF format chunk header.
  14. */
  15. struct ChunkHeader
  16. {
  17. AZ::u8 tag[4];
  18. AZ::u32 size;
  19. };
  20. /**
  21. * A WAVE format "fmt" chunk.
  22. */
  23. struct FmtChunk
  24. {
  25. ChunkHeader header;
  26. AZ::u16 audioFormat;
  27. AZ::u16 numChannels;
  28. AZ::u32 sampleRate;
  29. AZ::u32 byteRate;
  30. AZ::u16 blockAlign;
  31. AZ::u16 bitsPerSample;
  32. };
  33. /**
  34. * A WAVE format header.
  35. */
  36. struct WavHeader
  37. {
  38. ChunkHeader riff;
  39. AZ::u8 wave[4];
  40. FmtChunk fmt;
  41. ChunkHeader data;
  42. static const size_t MinSize = 44;
  43. };
  44. static_assert(sizeof(WavHeader) == WavHeader::MinSize, "WavHeader struct size is not 44 bytes!");
  45. /**
  46. * Type of AudioFileParser for Wav File Format.
  47. * Parses header information from Wav files and stores it for retrieval.
  48. */
  49. class WavFileParser
  50. : public AudioFileParser
  51. {
  52. public:
  53. AUDIO_IMPL_CLASS_ALLOCATOR(WavFileParser)
  54. WavFileParser();
  55. ~WavFileParser() override;
  56. size_t ParseHeader(AZ::IO::FileIOStream& fileStream) override;
  57. bool IsHeaderValid() const override;
  58. AudioInputSampleType GetSampleType() const override;
  59. AZ::u32 GetNumChannels() const override;
  60. AZ::u32 GetSampleRate() const override;
  61. AZ::u32 GetByteRate() const override;
  62. AZ::u32 GetBitsPerSample() const override;
  63. AZ::u32 GetDataSize() const override;
  64. private:
  65. static bool ValidTag(const AZ::u8 tag[4], const AZ::u8 name[4]);
  66. WavHeader m_header;
  67. bool m_headerIsValid = false;
  68. static const AZ::u8 riff_tag[4];
  69. static const AZ::u8 wave_tag[4];
  70. static const AZ::u8 fmt__tag[4];
  71. static const AZ::u8 data_tag[4];
  72. };
  73. ///////////////////////////////////////////////////////////////////////////////////////////////
  74. AZ_INLINE bool WavFileParser::IsHeaderValid() const
  75. {
  76. return m_headerIsValid;
  77. }
  78. ///////////////////////////////////////////////////////////////////////////////////////////////
  79. AZ_INLINE AZ::u32 WavFileParser::GetNumChannels() const
  80. {
  81. return m_header.fmt.numChannels;
  82. }
  83. ///////////////////////////////////////////////////////////////////////////////////////////////
  84. AZ_INLINE AZ::u32 WavFileParser::GetSampleRate() const
  85. {
  86. return m_header.fmt.sampleRate;
  87. }
  88. ///////////////////////////////////////////////////////////////////////////////////////////////
  89. AZ_INLINE AZ::u32 WavFileParser::GetByteRate() const
  90. {
  91. return m_header.fmt.byteRate;
  92. }
  93. ///////////////////////////////////////////////////////////////////////////////////////////////
  94. AZ_INLINE AZ::u32 WavFileParser::GetBitsPerSample() const
  95. {
  96. return m_header.fmt.bitsPerSample;
  97. }
  98. ///////////////////////////////////////////////////////////////////////////////////////////////
  99. AZ_INLINE AZ::u32 WavFileParser::GetDataSize() const
  100. {
  101. return m_header.data.size;
  102. }
  103. } // namespace Audio