Audio Stream Input/Output 实例程序
时间: 2023-10-25 07:23:54 浏览: 128
以下是一个简单的Audio Stream Input/Output示例程序,使用PortAudio库来实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include "portaudio.h"
#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER (1024)
#define NUM_SECONDS (5)
static int paCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
float *out = (float*)outputBuffer;
unsigned int i;
for (i = 0; i < framesPerBuffer; i++) {
*out++ = rand() / (float)RAND_MAX;
}
return paContinue;
}
int main(void)
{
PaStream *stream;
PaError err;
err = Pa_Initialize();
if (err != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
exit(1);
}
err = Pa_OpenDefaultStream(&stream, 0, 1, paFloat32,
SAMPLE_RATE, FRAMES_PER_BUFFER,
paCallback, NULL);
if (err != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
exit(1);
}
err = Pa_StartStream(stream);
if (err != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
exit(1);
}
printf("Recording...\n");
Pa_Sleep(NUM_SECONDS * 1000);
err = Pa_StopStream(stream);
if (err != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
exit(1);
}
err = Pa_CloseStream(stream);
if (err != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
exit(1);
}
Pa_Terminate();
printf("Done.\n");
return 0;
}
```
此示例程序使用`Pa_OpenDefaultStream`函数打开一个默认的音频流,并使用`paFloat32`格式进行采样。它使用`paCallback`函数来填充输出缓冲区,该函数实际上是一个回调函数,每当流需要输出新的数据时就会被调用。在此示例程序中,回调函数简单地填充了输出缓冲区,使其包含随机的浮点数。
程序启动后,它将开始录制,并在5秒钟后停止。在此期间,它将不断调用回调函数以填充输出缓冲区。在程序结束时,它将关闭音频流并终止PortAudio库。
阅读全文