ios - 如何在新项目中使用ExtAudioFileConvert示例

时间:2011-07-04 22:26:33

标签: iphone ios audio caf extaudiofile

我想要的只是读取一个caf文件并将其写入另一个文件,希望我可以操作它,例如将多个文件合并为一个或修剪。所以我找到了苹果公司自己的 iPhoneExtAudioFileConvertTest 示例,这看起来非常具有挑战性,但我想,一旦我将这些部分放入我自己的项目中,那么我可以玩它,这被证明是相当麻烦的。

现在,经过几个不眠之夜的挖掘信息和大量的试验和错误运行; 我相信我已经设法在我自己的项目中使用 iPhoneExtAudioFileConvertTest 示例。我以为我会发布这个来节省一个同伴睡眠。

步骤:

  • iPublicUtility 文件夹和 iPhoneAxtAileFileConvertTest 示例中的 ExtAudioFileConvert.cpp 文件添加到我的项目中。
  • 将3个新的.cpp文件的扩展名重命名为.mm(.h文件保持不变)。这允许xcode将cpp文件视为客观的c ++文件。
    • ExtAudioFileConvert.mm
    • iPublicUtility / CAStreamBasicDescription.mm
    • iPublicUtility / CAXException.mm
  • 在计划调用
    DoConvertFile(sourceURL, destinationURL, outputFormat, sampleRate);方法的 myViewController.m (UIViewController)类中,我添加了一行以使DoConvertFile方法可见
    extern OSStatus DoConvertFile(CFURLRef sourceURL, CFURLRef destinationURL, OSType outputFormat, Float64 outputSampleRate);
  • 还将myViewController.m重命名为 myViewController.mm ,因为它使用.cpp文件进行convertFile方法调用
  • 在目标/构建设置下的项目设置中,我搜索了关键字“标题搜索路径”并添加了以下内容,其值为 / Developer / Extras / CoreAudio / PublicUtility / $(已继承)没有这一行,编译器会给我30多个错误,例如'DebugPrintfFile '未在此范围内声明*
  • 我注意到该示例还在app delegate中有代码
    • 所以我将2个方法的代码直接从示例的appDelegate复制到我自己的appDelegate中,namly
      • static void interruptionListener(void *inClientData, UInt32 inInterruption)
      • static void propertyListener(void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData)
    • 并在原始#import语句后添加了以下4行
      • #import“CAXException.h”
      • extern void ThreadStateInitalize();
      • extern void ThreadStateBeginInterruption();
      • extern void ThreadStateEndInterruption();
    • 当然还将示例applicationDidFinishLaunching中的代码添加到我的didFinishLaunchingWithOptions
    • 并再次将我的appDelegate.m重命名为appDelegate.mm

现在,当我编译时,我没有得到任何错误,只有当我在ExtAudioFileConvert.mm中注释掉断言时,运行时才有效

    // in this sample we should never be on the main thread here
    assert(![NSThread isMainThread]);

同样在启动时,我收到一个错误,这不会导致任何问题,但我更愿意删除它。任何人?

    Error: couldn't set audio category (-50)

似乎来自我的appDelegate中的此调用

    // our default category -- we change this for conversion and playback appropriately
    UInt32 audioCategory = kAudioSessionCategory_SoloAmbientSound;
    XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category");

除了这些警告/错误,我可以写/转换一个caf文件:)。 我将不胜感激任何反馈。

0 个答案:

没有答案