2012-07-26 47 views
4

根据苹果的文档没有发现,AudioServices.h应该是AudioToolbox框架的一部分。AudioServices.h在Objective-C的iOS项目,包括AudioToolbox框架

即使我已将AudioToolbox框架添加到我的Xcode项目中,但当我#import AudioServices出现错误时:AudioServices.h文件未找到。

出现这种情况我是否键入 #进口 “AudioServices.h”

或 #进口 “AudioToolbox/AudioServices.h” 。

为了以防万一,我尝试删除,然后重新添加AudioToolbox框架,它没有任何效果。 AudioServices文件是否会被破坏? (如果是的话,是否有人知道我可以在哪里下载另一个副本?)

我使用的是XCode 4.2,但由于我正在转换一些旧的开源代码,因此项目设置为与XCode 3.2兼容。这可能是问题吗?

我敢肯定,我失去了一些东西简单。我对编程完全陌生......任何帮助表示赞赏!

----- EDIT(见下面我的评论)-----

在AudioServices.h

,所讨论的两个功能:

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

extern OSStatus 
AudioSessionAddPropertyListener( AudioSessionPropertyID    inID, 
            AudioSessionPropertyListener  inProc, 
            void        *inClientData) 
在SpeakHereController.mm

(从样本苹果公司代码),而我试图转换到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"); 
} 

回答

16

问题是系统无法投射self当您使用ARC时会自动失效*。 Self用于AudioSessionInitialize函数(及其他)的最后一个参数。

您需要告诉ARC如何通过使用__bridge手动将其转换为void来控制内存的所有权。这说'不要改变内存的所有权'。

因此,在调用AudioSession函数时将self改为(__bridge void *)self。

例如

OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, (__bridge void*)self); 
1

尝试“#import <AudioToolbox/AudioServices.h>”,看看您的问题就会消失。

<和>字符有所不同。在“#import”中使用双引号意味着您希望编译器搜索“用户头文件”,其中尖括号意味着您希望编译器在系统框架中进行搜索。

+0

哎呀,谢谢! – Jeanne 2012-07-26 17:03:21

+0

看来,这只是我的问题的一部分,其余的与转换为自动引用计数有关。我仍然收到与此框架中的函数有关的错误:没有用于调用'AudioSessionInitialize'的匹配函数,但现在在公开三角形中存在其他信息:候选函数不可行:不能隐式地将类型'SpeakHereController * const__strong'的参数转换为'ARC *'下的第四个参数'void *'。我不知道如何解决这个问题,因为它在我没有写的文件中,并且不太明白。我将在上面添加代码。 – Jeanne 2012-07-26 17:12:39