1 /*
2  *  Copyright (c) 2012 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_MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
13 
14 #include "webrtc/base/constructormagic.h"
15 #include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
16 #include "webrtc/typedefs.h"
17 
18 namespace webrtc {
19 
20 // Forward declarations.
21 class DecoderDatabase;
22 class SyncBuffer;
23 struct Packet;
24 
25 // This class acts as an interface to the CNG generator.
26 class ComfortNoise {
27  public:
28   enum ReturnCodes {
29     kOK = 0,
30     kUnknownPayloadType,
31     kInternalError,
32     kMultiChannelNotSupported
33   };
34 
ComfortNoise(int fs_hz,DecoderDatabase * decoder_database,SyncBuffer * sync_buffer)35   ComfortNoise(int fs_hz, DecoderDatabase* decoder_database,
36                SyncBuffer* sync_buffer)
37       : fs_hz_(fs_hz),
38         first_call_(true),
39         overlap_length_(5 * fs_hz_ / 8000),
40         decoder_database_(decoder_database),
41         sync_buffer_(sync_buffer),
42         internal_error_code_(0) {
43   }
44 
45   // Resets the state. Should be called before each new comfort noise period.
46   void Reset();
47 
48   // Update the comfort noise generator with the parameters in |packet|.
49   // Will delete the packet.
50   int UpdateParameters(Packet* packet);
51 
52   // Generates |requested_length| samples of comfort noise and writes to
53   // |output|. If this is the first in call after Reset (or first after creating
54   // the object), it will also mix in comfort noise at the end of the
55   // SyncBuffer object provided in the constructor.
56   int Generate(size_t requested_length, AudioMultiVector* output);
57 
58   // Returns the last error code that was produced by the comfort noise
59   // decoder. Returns 0 if no error has been encountered since the last reset.
internal_error_code()60   int internal_error_code() { return internal_error_code_; }
61 
62  private:
63   int fs_hz_;
64   bool first_call_;
65   size_t overlap_length_;
66   DecoderDatabase* decoder_database_;
67   SyncBuffer* sync_buffer_;
68   int internal_error_code_;
69   RTC_DISALLOW_COPY_AND_ASSIGN(ComfortNoise);
70 };
71 
72 }  // namespace webrtc
73 #endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
74