Home | History | Annotate | Download | only in common_audio
      1 /*
      2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_COMMON_AUDIO_WAV_HEADER_H_
     12 #define WEBRTC_COMMON_AUDIO_WAV_HEADER_H_
     13 
     14 #include <stddef.h>
     15 #include <stdint.h>
     16 
     17 namespace webrtc {
     18 
     19 static const size_t kWavHeaderSize = 44;
     20 
     21 class ReadableWav {
     22  public:
     23   // Returns the number of bytes read.
     24   size_t virtual Read(void* buf, size_t num_bytes) = 0;
     25   virtual ~ReadableWav() {}
     26 };
     27 
     28 enum WavFormat {
     29   kWavFormatPcm   = 1,  // PCM, each sample of size bytes_per_sample
     30   kWavFormatALaw  = 6,  // 8-bit ITU-T G.711 A-law
     31   kWavFormatMuLaw = 7,  // 8-bit ITU-T G.711 mu-law
     32 };
     33 
     34 // Return true if the given parameters will make a well-formed WAV header.
     35 bool CheckWavParameters(size_t num_channels,
     36                         int sample_rate,
     37                         WavFormat format,
     38                         size_t bytes_per_sample,
     39                         size_t num_samples);
     40 
     41 // Write a kWavHeaderSize bytes long WAV header to buf. The payload that
     42 // follows the header is supposed to have the specified number of interleaved
     43 // channels and contain the specified total number of samples of the specified
     44 // type. CHECKs the input parameters for validity.
     45 void WriteWavHeader(uint8_t* buf,
     46                     size_t num_channels,
     47                     int sample_rate,
     48                     WavFormat format,
     49                     size_t bytes_per_sample,
     50                     size_t num_samples);
     51 
     52 // Read a WAV header from an implemented ReadableWav and parse the values into
     53 // the provided output parameters. ReadableWav is used because the header can
     54 // be variably sized. Returns false if the header is invalid.
     55 bool ReadWavHeader(ReadableWav* readable,
     56                    size_t* num_channels,
     57                    int* sample_rate,
     58                    WavFormat* format,
     59                    size_t* bytes_per_sample,
     60                    size_t* num_samples);
     61 
     62 }  // namespace webrtc
     63 
     64 #endif  // WEBRTC_COMMON_AUDIO_WAV_HEADER_H_
     65