pub package


Add noise_meter as a dependency in pubspec.yaml. For help on adding as a dependency, view the documentation.

On Android you need to add a permission to AndroidManifest.xml:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

On iOS enable the following:

  • Capabilities > Background Modes > Audio, AirPlay and Picture in Picture
  • In the Runner Xcode project edit the Info.plist file. Add an entry for 'Privacy - Microphone Usage Description'



Keep these three variables accessible:

bool _isRecording = false;
StreamSubscription<NoiseReading> _noiseSubscription;
NoiseMeter _noiseMeter;

Start listening

The easiest thing to do is to create a new instance of the NoiseMeter every time a new recording is started.

void startRecorder() async {
  try {
    _noiseMeter = new NoiseMeter();
    _noiseSubscription = _noiseMeter.noiseStream.listen(onData);
  } on NoiseMeterException catch (exception) {

On data

When data comes in through the stream, it will be caught by the onData method, specified when the subscription was created. The incoming data points are of type NoiseReading which have a single field with a getter, namely the db value of type double.

void onData(NoiseReading noiseReading) {
  this.setState(() {
    if (!this._isRecording) {
      this._isRecording = true;
  /// Do someting with the noiseReading object

Stop listening

To stop listening, the .cancel() method is called on the subscription object.

void stopRecorder() async {
  try {
    if (_noiseSubscription != null) {
      _noiseSubscription = null;
    this.setState(() {
      this._isRecording = false;
  } catch (err) {
    print('stopRecorder error: $err');

Technical documentation

Sample rate

The sample rate for both native implementations is 44,100.

Microphone data

The native implementations record PCM data using the microphone of the device, and uses an audio buffer array to store the incoming data. When the buffer is filled, the contents are emitted to the Flutter side. The incoming floating point values are between -1 and 1 which is the PCM values divided by the max amplitude value which is 2^15.

Conversion to Decibel

Firstly an average of the absolute value of the two highest peaks (usually a negative and a positive peak) is computed in order to reduce the window of data into a the maximum amplitude

avg = 0.5*abs(min) + 0.5*abs(max)

Thereafter computing the decibel value is performed as follows:

db = 20 * log10(2**15 * avg)





Foreign Function Interface for interoperability with the C programming language. [...]


HTML elements and other resources for web-based applications that need to interact with the browser and the DOM (Document Object Model). [...]
Low-level support for interoperating with JavaScript. [...]
Utility methods to efficiently manipulate typed JSInterop objects in cases where the name to call is not known at runtime. You should only use these methods when the same effect cannot be achieved with @JS annotations. These methods would be extension methods on JSObject if Dart supported extension methods.