4

Apple のドキュメントによると、AudioServices.h は AudioToolbox フレームワークの一部である必要があります。

Xcode プロジェクトに AudioToolbox フレームワークを追加しましたが、#import AudioServices を実行すると、AudioServices.h ファイルが見つかりませんというエラーが表示されます。

これは、#import "AudioServices.h" と入力しても発生します。

または #import "AudioToolbox/AudioServices.h" 。

念のため、AudioToolbox フレームワークを削除してから再度追加してみましたが、効果はありませんでした。AudioServices ファイルが破損している可能性はありますか? (もしそうなら、別のコピーをダウンロードできる場所を誰か知っていますか?)

XCode 4.2 を使用していますが、古いオープン ソース コードを変換しているため、プロジェクトは XCode 3.2 互換に設定されています。これが問題でしょうか?

私は単純なものが欠けていると確信しています。私はプログラミングにまったく慣れていません...どんな助けにも感謝します!

-----編集(以下の私のコメントを参照)-----

AudioServices.h で、問題の 2 つの関数:

extern OSStatus
AudioSessionInitialize( CFRunLoopRef                        inRunLoop, 
                        CFStringRef                         inRunLoopMode, 
                        AudioSessionInterruptionListener    inInterruptionListener, 
                        void                                *inClientData)              

extern OSStatus
AudioSessionAddPropertyListener(    AudioSessionPropertyID              inID,
                                    AudioSessionPropertyListener        inProc,
                                    void                                *inClientData)

SpeakHereController.mm (サンプルの Apple コードから) で、これを ARC に変換して、プロジェクト内の他のファイルとより適切に連携させようとしています。

- (void)awakeFromNib
{       

// Allocate our singleton instance for the recorder & player object
recorder = new AQRecorder();
player = new AQPlayer();


OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, self);
if (error) printf("ERROR INITIALIZING AUDIO SESSION! %ld\n", error);
else 
{
    UInt32 category = kAudioSessionCategory_PlayAndRecord;  
    error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
    if (error) printf("couldn't set audio category!");

    error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self);
    if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %ld\n", error);
    UInt32 inputAvailable = 0;
    UInt32 size = sizeof(inputAvailable);

    // we do not want to allow recording if input is not available
    error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
    if (error) printf("ERROR GETTING INPUT AVAILABILITY! %ld\n", error);
    btn_record.enabled = (inputAvailable) ? YES : NO;

    // we also need to listen to see if input availability changes
    error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self);
    if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %ld\n", error);

    error = AudioSessionSetActive(true); 
    if (error) printf("AudioSessionSetActive (true) failed");
}
4

2 に答える 2

16

問題は、ARC を使用している場合、システムがselfを void * に自動的にキャストできないことです。Self は、AudioSessionInitialize 関数 (およびその他) の最後のパラメーターで使用されます。

__bridge を使用してメモリを void * に手動でキャストすることにより、メモリの所有権を制御する方法を ARC に伝える必要があります。これは、「メモリの所有権を変更しないでください」と言っています。

したがって、AudioSession 関数の呼び出しで、self を (__bridge void *)self に変更します。

例えば

OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, (__bridge void*)self);
于 2012-08-09T14:47:31.293 に答える
1

" " を試し#import <AudioToolbox/AudioServices.h>て、問題が解決するかどうかを確認してください。

< と > の文字が違いを生みます。" "で二重引用符を使用#importすることは、コンパイラに "ユーザー ヘッダー" を検索させることを意味します。山括弧は、コンパイラにシステム フレームワークを検索させることを意味します。

于 2012-07-26T04:46:34.583 に答える