在构建之前配置App Sandbox

时间:2012-07-16 17:50:49

标签: ios core-audio sandbox audioqueue

我认为我的问题是如何预先配置我的iOS沙箱以在其中包含音频文件,因此在构建之后我可以立即测试我的音频队列结构。

我正在开发一个iOS应用程序,用于播放我在服务器上托管的流中的音频。在我解决如何从HTTP流中获取数据之前,我想我会先使用音频队列服务从手机播放文件。我的理解是,如果你想一次播放多个音频流,你必须使用音频队列而不是AVPlayer或任何其他服务。

我遇到的问题是我无法配置我的CFURLRef,因为找不到我的文件。

AudioBufferPlayer *player = (AudioBufferPlayer*) inUserData;

if (player.playing) {

    NSString *path = @"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/";
    const char *filePath = [path cStringUsingEncoding:[NSString defaultCStringEncoding]];
    CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)filePath, strlen(filePath), false);

    OSStatus result = AudioFileOpenURL(audioFileURL, kAudioFileReadPermission, kAudioFileCAFType, player.mAudioFile); 

    UInt32 numBytesReadFromFile;
    UInt32 numPackets = player.mNumPacketsToRead;

    AudioFileReadPackets(
                         *(player.mAudioFile),
                         false,
                         &numBytesReadFromFile,
                         NULL,
                         player.mCurrentPacket,
                         &numPackets,
                         inBuffer->mAudioData
                         );

    if (numPackets > 0) {
        inBuffer->mAudioDataByteSize = numBytesReadFromFile;
        AudioQueueEnqueueBuffer(inAudioQueue, inBuffer, 0, NULL);
        player.mCurrentPacket += numPackets;
    }

我收到错误,说我的AudioFileReadPackets上有EXC_BAD_ACCESS,此时我的OSStatus结果设置为-50,所以我认为我的AudioFileOpenURL调用失败了。

我认为我的问题是我的*路径在这一点上并没有真正指向任何东西。问题是我去

@"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/"

我的四个选项是Demo3,Documents,Library和temp。这些都没有我添加到项目中的quick.caf文件。

TL,DR - 除非我忽略了某些内容,否则我相信我会在构建之前询问如何将音频文件添加到我的沙箱中,以便我可以在iPhone模拟器上测试我的代码。

2 个答案:

答案 0 :(得分:0)

您添加到项目中的文件最终会出现在应用程序的Bundle目录中,而不是文档或库/缓存中。对于模拟器,此应用程序包通常位于Xcode Build或DerivedData目录中,而不是模拟器应用程序支持区域。

获得良好路径的一种简单方法是,在应用程序的第一次运行期间,在应用程序的沙箱文档或库/缓存目录中创建一些微小的虚拟文件,并使用一些唯一的名称。退出应用程序,删除此文件创建代码,然后在Mac上使用Spotlight查找虚拟文件。替换你想要的任何东西。然后运行应用程序,使用相同路径的代码读取来创建虚拟文件。

答案 1 :(得分:0)

您可以使用:

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];

获取项目中包含的文件。