读取 AudioFileInitializeWithCallbacks 所需的回调?苹果音频文件 API
Posted
技术标签:
【中文标题】读取 AudioFileInitializeWithCallbacks 所需的回调?苹果音频文件 API【英文标题】:Read callbacks needed by AudioFileInitializeWithCallbacks? Apple AudioFile API 【发布时间】:2012-06-16 13:23:28 【问题描述】:我正在尝试使用 AudioFile 和 ExtAudioFile API 编写一个低级音频编写器。我正在使用 AudioFileInitializeWithCallbacks 创建一个新的音频文件,但似乎这需要实现读取和获取大小回调。为什么这不能只接受一个写入回调并相信数据已成功写入。
如果我正在写入我无法找到的流(例如 CD 或网络套接字)怎么办?
当然,这应该只是不断地将数据推送到写入回调,如果操作不成功,我有责任在需要返回错误代码的地方写入这些数据。
AudioFile_SetSizeProc 和 AudioFile_WriteProc 的文档似乎不正确,因为它们都谈到了读取操作“inPosition 要读取的数据的偏移量。”、“@result 回调应该返回数据的大小。”。
目前我已经通过仅写入文件来解决这个问题,但在第一次写入过程后我得到了一个 kExtAudioFileError_InvalidOperationOrder。这是什么意思?文档中没有关于它的 cmets。
任何指点或帮助将不胜感激。
【问题讨论】:
如果你不想要回调,为什么要使用这个基于回调的 API? 因为另一个选项 AudioFileCreateWithURL 采用指向物理文件的 CFURLRef。我需要能够写入任何类型的流,因此需要 AudioFileInitializeWithCallbacks ,它将 AudioFile_WriteProc (函数指针)作为参数。当有数据需要写入流时,AudioFile 对象会调用此函数。我只是不明白为什么我还需要指定 AudioFile_ProcProc 或者是否有任何解决方法。 【参考方案1】:Apple 文档在这里是错误的。检查头文件AudioFile.h:
/*!
@typedef AudioFile_SetSizeProc
@abstract A callback for setting the size of the file data. used with AudioFileOpenWithCallbacks or AudioFileInitializeWithCallbacks.
@discussion a function that will be called when AudioFile needs to set the size of the file data. This size is for all of the
data in the file, not just the audio data. This will only be called if the file is written to.
@param inClientData A pointer to the client data as set in the inClientData parameter to AudioFileXXXWithCallbacks.
@result The callback should return the size of the data.
*/
typedef OSStatus (*AudioFile_SetSizeProc)(
void * inClientData,
SInt64 inSize);
【讨论】:
写入回调也不同 - 输入缓冲区为 const void*。以上是关于读取 AudioFileInitializeWithCallbacks 所需的回调?苹果音频文件 API的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:无法在 gitlab 中读取未定义的属性(读取“读取”)