iPhone SDK中是否有FSRef,或者有什么东西可以作为FSRef的替代品?

时间:2009-07-22 08:17:21

标签: iphone audioqueueservices

问题可能听起来很愚蠢,但问题是这样的:我正在学习如何使用音频队列,我采取的例子(aqtest)对我来说一直很好,直到我最近发现aqtest是不适用于iPhone。 (愚蠢的我)我在互联网上服务,发现iPhone没有FSRef。

如果可能的话,我想找到一种解决FSRef问题的方法。所以问题就出现了:我可以使用其他东西而不是iPhone SDK上存在的FSRef吗?或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

手机上根本没有FSRefs。 FSRefs是一种重新调用文件引用的方法,对于大多数用途,首选的替换是带有​​file:scheme的NSURL。

话虽如此,iPhone肯定有一个SpeakHere示例,它不使用FSRefs。

至于aqtest,我认为你遇到问题的代码是:

FSRef fsref;    
XThrowIfError(FSPathMakeRef(filePath, &fsref, NULL), "Input file not found");

XThrowIfError(AudioFileOpen(&fsref, fsRdPerm, 0, &myInfo.mAudioFile), "AudioFileOpen failed");

就像我说的,FSRef不再是处理文件引用的首选方式,并且在手机上不可用,NSURL是。因此,请切换到基于URL的版本:

NSString *pathString = [NSString stringWithCString: filePath];
if (!pathString) { printf("can't parse file path\n"); return; }

NSURL *url = [NSURL fileURLWithPath:pathString];
if (! url) { printf("can't make file url\n"); return; }

XThrowIfError(AudioFileOpenURL (url, kAudioFileReadPermission, 0/*inFileTypeHint*/, &myInfo.mAudioFil), "can't open file");

那应该在手机上工作,当然很多aqtest本身都无法在手机上运行,​​毕竟不支持在设备上运行命令行工具。

答案 1 :(得分:1)

你看过aqplay.cpp中的代码了吗?这是我从中抓取的一些示例代码 核心音频 - > SimpleSDK - > AudioQueueTools。

它使用CFURLRef打开其AudioFileID

大多数代码看起来应该为iPhone编译。