2012-01-02 62 views
0

我有这段代码,为了读取缓冲区样本,但我得到了一个奇怪的mach-o链接器错误, 音频单元的框架couldnt加载,所以我把audioTollBox和coreAudio作为我读。 我的代码是:音频错误单元代码-remoteIO iphone

#define kOutputBus 0 
#define kInputBus 1 
AudioComponentInstance audioUnit; 



@implementation remoteIO 


//callback function : 

    static OSStatus recordingCallback(void *inRefCon, 
             AudioUnitRenderActionFlags *ioActionFlags, 
             const AudioTimeStamp *inTimeStamp, 
             UInt32 inBusNumber, 
             UInt32 inNumberFrames, 
             AudioBufferList *ioData) 
    { 
     AudioBuffer buffer; 

     buffer.mNumberChannels = 1; 
     buffer.mDataByteSize = inNumberFrames * 2; 
     NSLog(@"%ld",inNumberFrames); 
     buffer.mData = malloc(inNumberFrames * 2); 


     AudioBufferList bufferList; 
     bufferList.mNumberBuffers = 1; 
     bufferList.mBuffers[0] = buffer; 



     OSStatus status; 
     status = AudioUnitRender(audioUnit, 
           ioActionFlags, 
           inTimeStamp, 
           inBusNumber, 
           inNumberFrames, 
           &bufferList); 
     checkStatus(status);      //here is the warnning+error 
     double *q = (double *)(&bufferList)->mBuffers[0].mData; 
     for(int i=0; i < strlen((const char *)(&bufferList)->mBuffers[0].mData); i++) 
     { 

      NSLog(@"%f",q[i]); 
     } 
    } 

和阅读方法:

-(void)startListeningWithFrequency:(float)freq; 
{ 
    OSStatus status; 

    AudioComponentDescription desc; 
    desc.componentType = kAudioUnitType_Output; 
    desc.componentSubType = kAudioUnitSubType_RemoteIO; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple; 

    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc); 
    status = AudioComponentInstanceNew(inputComponent, &audioUnit); 
    checkStatus(status); 

    UInt32 flag = 1; 
    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input,kInputBus, &flag, sizeof(flag)); 
    checkStatus(status); 

    AudioStreamBasicDescription audioFormat; 
    audioFormat.mSampleRate   = 44100.00;//44100.00; 
    audioFormat.mFormatID   = kAudioFormatLinearPCM; 
    audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    audioFormat.mFramesPerPacket = 1; 
    audioFormat.mChannelsPerFrame = 1; 
    audioFormat.mBitsPerChannel  = 16; 
    audioFormat.mBytesPerPacket  = 2; 
    audioFormat.mBytesPerFrame  = 2; 

    status = AudioUnitSetProperty(audioUnit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Output, 
            kInputBus, 
            &audioFormat, 
            sizeof(audioFormat)); 
    checkStatus(status); 

    checkStatus(status); 
    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = recordingCallback; 
    callbackStruct.inputProcRefCon = self; 
    status = AudioUnitSetProperty(audioUnit, 
            kAudioOutputUnitProperty_SetInputCallback, 
            kAudioUnitScope_Global, 
            kInputBus, &callbackStruct, sizeof(callbackStruct)); 
    checkStatus(status); 

    status = AudioOutputUnitStart(audioUnit); 

} 

和我所得到的是这样的错误,WARNNING:

Undefined symbols for architecture i386: 
    "_checkStatus", referenced from: 
     _recordingCallback in remoteIO.o 
     -[remoteIO startListeningWithFrequency:] in remoteIO.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 

什么错在这里,? 谢谢。

+0

please ??? ???任何人 ?我从这个音频事情中失去了我的想法!我现在可以看到,当我拿出所有的CheckStatus(状态)行,我可以编译它。我在想什么?我已经把所有的框架,为什么他不能识别checkStatus的东西? – Curnelious 2012-01-02 12:29:38

+0

我现在可以看到,checkStatus这个词在整个苹果文档中都没有提及,甚至一次。不止一次。在任何音频文件中,都没有这样的功能。并在每一个音频指南,每一个帖子在这里,无处不在,他们都使用这个checkStatus(状态)功能,这是他们没有宣布..我在这里失踪? – Curnelious 2012-01-02 12:58:10

回答

0

你必须编写自己的checkStatus()函数,就像它所做的那样(例如它如何报告错误:对话框,控制台输出,分析日志记录,崩溃转储等),或者是否做任何事情除了从音频代码返回外,特定于每个应用程序。

+0

我从我的代码中取出它 - 没有checkStatus,它工作。但我的问题是,我必须从样本中得到的数字是多少?我在-32700- +32700之间..是那个好吗? – Curnelious 2012-01-03 08:58:17

相关问题