博多キャナルシティでやるイベントでマイクを入力にしたのですが、何度やっても、すぐopenFrameworksでマイク入力を取るとき忘れるので、覚書きです。

まず、testApp.hofSoundStreamの変数とaudioIn関数、ボリュームを格納する変数curVolを宣言します。

[code lang=cpp]
#include "ofMain.h"

class testApp : public ofBaseApp{

public:
void setup();
void update();
void draw();

void keyPressed (int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
void audioIn(float * input, int bufferSize, int nChannels);

ofSoundStream soundStream;
float curVol;
};
[/code]

次にtestApp.cppsetup内に

[code lang=text]
void testApp::setup(){
ofBackground(0);
ofSetFrameRate(60);
//setup(this, outChannels, inChannels, SamplingRate, BufferSize, nBuffer);
soundStream.setup(this, 0, 1, 44100, 256, 4);
}
[/code]

今回は音は入力だけに使うので、アウトは0, インを1にしています。サンプリングレート等はだいたい標準的な設定です。

さらにaudioIn()関数に、

[code lang=cpp]
void testApp::audioIn(float * input, int bufferSize, int nChannels){
curVol = 0.0;

for (int i = 0; i < bufferSize; i++){
curVol += input[i]*input[i]; // 聴覚上は出力の2乗に比例するので、2乗しています。
}

curVol /= bufferSize; // 平均を取ります。
}
[/code]

あとは、updatedrawの中でcurVolを使うだけです。

ただ、注意しなくてはいけないのは、audioIn関数はupdatedrawとは独立に呼ばれるようで、配列をaudioIn関数の中で使うと、配列処理のタイミングが合わず、EXC_BAD_ACCESSとかで落ちたりします。なので、変数に値を格納して、updateやdrawで配列処理を行うようにしましょう。