2018年4月8日日曜日

PulseAudioで音量表示

はじめに


PulseAudioを使って録音しながらリアルタイムで音量を表示します。

方法とコード


PulseAudioのSimple API [1] を使って録音し、音量を表示します。音量の計算はざっくりです。20秒間録音して終了します。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <pulse/simple.h>

std::string getbar(double v)
{
  v = 10*(v-4); // 10 and -4 are determined by heuristic
  if(v < 0){v = 0;}
  return std::string(v, '*');
}

int main(void)
{
  pa_sample_spec ss;
  ss.format = PA_SAMPLE_S16LE; // Signed, 16bits, Little endian
  ss.channels = 1;
  ss.rate = 8000; // Sampling frequency is 8kHz
  pa_simple *s = pa_simple_new(NULL, "Volume meter", PA_STREAM_RECORD, NULL, "Microphone vm",
          &ss, NULL, NULL, NULL);
  std::vector<short> buffer(800); // For 100ms
  for(int i=0; i<200; ++i) // Record for 20s
  {
    // Read audio for 100ms
    pa_simple_read(s, &buffer[0], buffer.size()*sizeof(short), nullptr);

    // Calculate power for the range of 100ms
    double power = 0;
    for(auto &v : buffer)
    {
      power += v*v;
    }
    // Output a result with a bar
    double logp = log10(power/buffer.size());
    std::cout << logp << "\t" << getbar(logp) << std::endl;
  }
  pa_simple_free(s);
  return 0;
}
このコードのファイル名をrec.cppとすると、コンパイルは、
g++ --std=c++14 -lpulse-simple rec.cpp
で行えます。g++はバージョン4.9.2を利用しています。libpulse-dev が必要ですので、コンパイルする前にapt-getやaptitudeを使ってインストールしておきましょう。

マイクがリモートにある場合は、リモート側でPulseAudioのサーバの設定を行い、

PULSE_SERVER=192.168.1.2 ./a.out
のようにして実行します。ここでは、リモートマシンのIPアドレスが192.168.1.2であるとしています。 リモートマシンの設定は前の記事を参照ください。

結果


実行すると録音が始まり、コンソールに音量がバーで表示されます。
5.09851 **********
4.93314 *********
4.76426 *******
4.96767 *********
6.26456 **********************
6.17523 *********************
5.34311 *************
6.9875 *****************************
4.98664 *********
7.23169 ********************************
5.60815 ****************
6.16099 *********************
5.55161 ***************
5.16174 ***********
5.62978 ****************
5.19768 ***********
5.73633 *****************
5.85854 ******************
6.54446 *************************
5.53201 ***************
5.42636 **************
5.40482 **************
5.77586 *****************
4.9568 *********
4.82601 ********
7.56319 ***********************************
8.19005 *****************************************

参考


[1] https://freedesktop.org/software/pulseaudio/doxygen/simple.html

0 件のコメント :