| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_MEDIA_AUDIO_TOOLS_AUDIO_DRIVER_CTL_WAV_COMMON_H_ |
| #define SRC_MEDIA_AUDIO_TOOLS_AUDIO_DRIVER_CTL_WAV_COMMON_H_ |
| |
| #include <endian.h> |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| |
| namespace internal { |
| static inline constexpr uint32_t make_fourcc(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { |
| return (static_cast<uint32_t>(d) << 24) | (static_cast<uint32_t>(c) << 16) | |
| (static_cast<uint32_t>(b) << 8) | static_cast<uint32_t>(a); |
| } |
| } // namespace internal |
| |
| class WAVCommon { |
| public: |
| WAVCommon() {} |
| virtual ~WAVCommon() { Close(); } |
| |
| protected: |
| struct __PACKED RIFFChunkHeader { |
| uint32_t four_cc; |
| uint32_t length; |
| |
| void FixupEndian() { |
| four_cc = htole32(four_cc); |
| length = htole32(length); |
| } |
| }; |
| |
| struct __PACKED WAVHeader { |
| uint32_t wave_four_cc; |
| uint32_t fmt_four_cc; |
| uint32_t fmt_chunk_len; |
| uint16_t format; |
| uint16_t channel_count; |
| uint32_t frame_rate; |
| uint32_t average_byte_rate; |
| uint16_t frame_size; |
| uint16_t bits_per_sample; |
| |
| void FixupEndian() { |
| wave_four_cc = htole32(wave_four_cc); |
| fmt_four_cc = htole32(fmt_four_cc); |
| fmt_chunk_len = htole32(fmt_chunk_len); |
| format = htole16(format); |
| channel_count = htole16(channel_count); |
| frame_rate = htole32(frame_rate); |
| average_byte_rate = htole32(average_byte_rate); |
| frame_size = htole16(frame_size); |
| bits_per_sample = htole16(bits_per_sample); |
| } |
| }; |
| |
| enum class InitMode { SOURCE, SINK }; |
| zx_status_t Initialize(const char* filename, InitMode mode); |
| |
| static constexpr uint32_t RIFF_FOUR_CC = internal::make_fourcc('R', 'I', 'F', 'F'); |
| static constexpr uint32_t WAVE_FOUR_CC = internal::make_fourcc('W', 'A', 'V', 'E'); |
| static constexpr uint32_t FMT_FOUR_CC = internal::make_fourcc('f', 'm', 't', ' '); |
| static constexpr uint32_t DATA_FOUR_CC = internal::make_fourcc('d', 'a', 't', 'a'); |
| |
| // WAV/AVI format codes are defined in RFC 2361. Also, the list goes on for |
| // 55 pages, so we don't list the vast majority of them here. |
| static constexpr uint16_t FORMAT_UNKNOWN = 0x0000; |
| static constexpr uint16_t FORMAT_LPCM = 0x0001; |
| static constexpr uint16_t FORMAT_MSFT_ADPCM = 0x0002; |
| static constexpr uint16_t FORMAT_IEEE_FLOAT = 0x0003; |
| static constexpr uint16_t FORMAT_MSFT_ALAW = 0x0006; |
| static constexpr uint16_t FORMAT_MSFT_MULAW = 0x0007; |
| |
| void Close(); |
| zx_status_t Read(void* buf, size_t len); |
| zx_status_t Write(const void* buf, size_t len); |
| zx_status_t Seek(off_t abs_pos); |
| |
| int fd_ = -1; |
| }; |
| |
| #endif // SRC_MEDIA_AUDIO_TOOLS_AUDIO_DRIVER_CTL_WAV_COMMON_H_ |