這是可以成功 Real-time monitor 的程式碼,並且將6個輸入轉換成 mono 輸出
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include "portaudio.h"
#define FRAME_BLOCK_LEN 256
#define SAMPLING_RATE 44100
#define INPUT_CHANNEL 8 // 6mic + 2 AC108 ADC
#define OUTPUT_CHANNEL 1
PaStream *audioStream;
// Callback Function (DSP Here)
int audio_callback(const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData){
float *in = (float*) inputBuffer, *out = (float*)outputBuffer;
static double phase = 0;
unsigned long i;
for( i=0; i < framesPerBuffer; i++ ) {
float temp=0;
for(int j=0;j<INPUT_CHANNEL;j++){
temp+=*in++/6;
}
*out++ = temp;
}
return paContinue;
}
void init_stuff(){
int i,id;
const PaDeviceInfo *info;
const PaHostApiInfo *hostapi;
PaStreamParameters outputParameters, inputParameters;
Pa_Initialize(); // initialize portaudio
id = Pa_GetDefaultOutputDevice();
info = Pa_GetDeviceInfo(id);
hostapi = Pa_GetHostApiInfo(info->hostApi);
printf("output device [%s] %s\\n",hostapi->name, info->name);
outputParameters.device = id;
outputParameters.channelCount = OUTPUT_CHANNEL;
outputParameters.sampleFormat = paFloat32; // 都用float
outputParameters.suggestedLatency = 0;
outputParameters.hostApiSpecificStreamInfo = NULL; // no specific info
sleep(0.5);
id = Pa_GetDefaultInputDevice();
info = Pa_GetDeviceInfo(id);
hostapi = Pa_GetHostApiInfo(info->hostApi);
printf("input device [%s] %s\\n",
hostapi->name, info->name);
inputParameters.device = id;
inputParameters.channelCount = INPUT_CHANNEL; // 2 input
inputParameters.sampleFormat = paFloat32;
inputParameters.suggestedLatency = 0;
inputParameters.hostApiSpecificStreamInfo = NULL;
Pa_OpenStream(
&audioStream,
&inputParameters, // output parameters
&outputParameters, // input parameters
SAMPLING_RATE, // set sampling rate
FRAME_BLOCK_LEN, // set frames per buffer
paClipOff, // set no clip
audio_callback, // callback function
NULL ); // provide no data for the callback
Pa_StartStream(audioStream); // start the callback mechanism
printf("running. . . press space bar and enter to exit\\n");
printf("Latency: %f\\n",info->defaultLowInputLatency);
}
void terminate_stuff(){
Pa_StopStream( audioStream ); // stop the callback mechanism
Pa_CloseStream( audioStream ); // clear the audio stream object
Pa_Terminate(); // terminate portaudio
}
int main(){
init_stuff();
while(getchar() != ' ') Pa_Sleep(100);
terminate_stuff();
return 0;
}
#Compile and run
gcc filena.c -lportaudio -lm