870920 Menu

AudioIODeviceCallback详解

抽象基类,本类被AudioIODevice类的start()函数内部调用,可将程序内部的音频数据连续不断的发送到AudioIODevice,并可获取AudioIODevice输入端口的录音数据。该类是实现音频播放和录制的最核心环节。播放方面通常利用AudioDeviceManager类的有关函数和本类的派生类来实现。AudioIODeviceCallback有三个派生类:

AudioIODeviceCallback

图 3 13 AudioIODeviceCallback及其派生类

而音频录音,则需自定义AudioIODeviceCallback的派生类,实现其3个纯虚函数。其中最核心的函数为:

// 处理音频数据块的输出和输入
audioDeviceIOCallback (
// 输入通道的数据,二维数组。每个通道为一个数组
const float** inputChannelData,
int numInputChannels, // 输入通道的数量
float** outputChannelData, // 输出通道的数据,二维数组。每个通道为一个数组
int numOutputChannels, // 输出通道的数量
int numSamples) // 每个输入和输出通道的采样数(子数组的元素个数)

audioDeviceIOCallback()的5个参数,其实是提供了两个总数组(每个总数组的首地址和元素个数),这两个总数组的元素为子数组,每个子数组代表一个输入通道或输出通道中的采样数据,每个采样数据则是一个float数值。总数组的元素个数相当于有几个通道。而子数组的元素个数则是该通道有多少个采样值。该值也需要提供给本函数,此即本函数的5参。

可把1参视为输入数据,即声卡输入端口所接收的数据保存到此参数中。而3参则可视为输出数据,即程序内部的音频数据。

audioDeviceIOCallback()由程序内部不间断的重复回调,如需实现播放功能,则回调3参数据,即:将3参数据发送给声卡(音频驱动)。如需实现录音功能,则把1参收到的数据转到程序内部,或直接写入磁盘文件中。

派生类继承基类AudioIODeviceCallback后,其对象可被AudioDeviceManager的addAudioCallback()函数所添加。添加后,系统内部自动完成对派生类对象的不间断调用,即不间断地调用audioDeviceIOCallback()函数,从而实现播放和录音功能 。
AudioDeviceIOCallback()的示例代码(录音的核心语句):

AudioIODeviceCallback的派生类需实现的另两个纯虚函数:
 audioDeviceAboutToStart () 启动本函数的参数(AudioIODevice),使之开始回调
 audioDeviceStopped () AudioIODevice停止后,系统自动调用此方法

若派生类用于音频录音,则可在这两个函数中设置AudioFormatWriter所需的采样率,或实现其他目的。示例代码:

AudioIODeviceCallback类还有一个非纯虚函数,派生类可根据所需来重写:
 audioDeviceError () 如果设备出现问题,可生成一条错误消息