我正在使用音频队列构建一个用于学习目的的简单录音机。回调函数接收一个指向结构体的指针,该结构体的定义如下:
typedef struct RecorderUserData {
AudioFileID outputFileID;
SInt64 recordPacket;
BOOL recording;
} RecorderUserData;
访问该结构的回调函数字段。这个回调函数被Core Audio异步调用。
static void RecorderAudioQueueInputCallback(void *inUserData,
AudioQueueRef inQueue,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription *inPacketDesc) {
UXAudioRecorderUserData *recorderUserData = (UXAudioRecorderUserData *)inUserData;
if (recorderUserData->recording) {
// do something while recording
}
// much more code
}
问题是,我想从外部方法调用开始/停止录制。当记录开始时,结构体准备好,记录字段设置为 YES。
当录制必须结束时,我必须将录制字段设置为 NO。
在 Kevin Avila 和 Chris Adamson 撰写的 Core Audio 书中,他们在一个巨大的单片主函数中完成了这一切,我仍然可以在脚下访问这个结构。
但是由于 Core Audio 正在异步访问这个结构,一旦我的 -stopRecording 方法被调用,我怎样才能安全地将录制字段设置为 NO?问题是我可能需要在我的记录器类中指向该结构的指针,但也需要一种锁定对它的访问的方法,因此我不会在回调函数读取它时将其更改为 NO。