4

私が欲しかったのは、複数のファイルを 1 つに結合したりトリミングしたりするなど、おそらくそれを操作できることを期待して、caf ファイルを読み取って別のファイルに書き込むことだけでした。それで、私は Apples 独自のiPhoneExtAudioFileConvertTest Sample を見つけました。これは非常に難しそうに見えますが、自分のプロジェクトにピースを取り込んでから、それで遊ぶことができると考えました。これはかなり面倒であることがわかりました。

さて、眠れぬ夜を数晩かけて情報を探し、多くの試行錯誤を繰り返した後。自分のプロジェクトでiPhoneExtAudioFileConvertTestサンプルを使用することができたと思います。これを投稿して、仲間のコーダーの睡眠を節約しようと思いました。

手順:

  • iPublicUtilityフォルダーとExtAudioFileConvert.cppファイルをiPhoneExtAudioFileConvertTestサンプルからプロジェクトに追加しました。
  • 3 つの新しい .cpp ファイルの拡張子を .mm に変更しました (.h ファイルは同じままです)。これにより、xcode は cpp ファイルを目的の c++ ファイルとして表示できます。
    • ExtAudioFileConvert.mm
    • iPublicUtility/CAStreamBasicDescription.mm
    • iPublicUtility/CAXException.mm
  • メソッドを呼び出す予定のmyViewController.m (UIViewController) クラスで
    DoConvertFile(sourceURL, destinationURL, outputFormat, sampleRate);、DoConvertFile メソッドを表示するために 1 行追加しました。
    extern OSStatus DoConvertFile(CFURLRef sourceURL, CFURLRef destinationURL, OSType outputFormat, Float64 outputSampleRate);
  • また、convertFile メソッドの呼び出しに .cpp ファイルを使用しているため、myViewController.mの名前を myViewController.mm に変更しました。
  • ターゲット/ビルド設定の下のプロジェクト設定で、キー「ヘッダー検索パス」を検索し、その値に次を追加しました/Developer/Extras/CoreAudio/PublicUtility/ $(inherited)この行がないと、コンパイラは 30 以上を提供します「DebugPrintfFile 」などのエラーは、このスコープで宣言されていませんでした*
  • サンプルにはアプリのデリゲートにもコードがあることに気付きました
    • そのため、2 つのメソッドのコードをサンプルの appDelegate から自分の appDelegate に直接コピーしました。
      • 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 ファイルを作成/変換できます :)。フィードバックをいただければ幸いです。

4

0 に答える 0