2013-03-08 27 views
0

我在迈克尔的code工作有点麻烦。下面你会看到我的实现,我试图让它在iOS 6.1上运行,但我得到一个EXC_BAD_ACCESS在:iOS:EXC_BAD_ACCESS当试图获取audioframe值

AudioBuffer buffer = bufferList.mBuffers [i];

我从appdelegate文件运行下面的代码时applicationfinishloading

_rec = [[AU的alloc] INIT];

[_rec initializeAudio];

[_rec start];

在此先感谢.. :)

#define kOutputBus 0 
#define kInputBus 1 


@implementation AU 

AudioComponentInstance audioUnit; 
AudioStreamBasicDescription audioFormat; 
float *convertedSampleBuffer; 
-(id)init{ 
    self = [super init]; 
    if (self){ 

    } 
    return self; 
} 
-(OSStatus)start{ 
    NSLog(@"start"); 
    OSStatus status = AudioOutputUnitStart(audioUnit); 
    return status; 
} 

-(OSStatus)stop{ 
    OSStatus status = AudioOutputUnitStop(audioUnit); 
    return status; 
} 

-(void)cleanUp{ 
    AudioUnitUninitialize(audioUnit); 
} 
static OSStatus recordingCallback(void *inRefCon, 
            AudioUnitRenderActionFlags *actionFlags, 
            const AudioTimeStamp *audioTimeStamp, 
            UInt32 inBusNumber, 
            UInt32 numFrames, 
            AudioBufferList *buffers) { 
    AudioBufferList bufferList;  


    for (int i = 0; i < bufferList.mNumberBuffers; i++) 
    { 
     AudioBuffer buffer = bufferList.mBuffers[i]; 
     SInt16 *audioFrame = (SInt16*)buffer.mData; 
    } 
    return noErr; 
} 
-(void)initializeAudio{ 
    NSLog(@"init"); 
    OSStatus status; 


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

    // Get component 
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc); 

    // Get audio units 
    status = AudioComponentInstanceNew(inputComponent, &audioUnit); 

    // Enable IO for recording 
    UInt32 flag = 1; 
    status = AudioUnitSetProperty(audioUnit, 
            kAudioOutputUnitProperty_EnableIO, 
            kAudioUnitScope_Input, 
            kInputBus, 
            &flag, 
            sizeof(flag)); 

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

    // Apply format 
    status = AudioUnitSetProperty(audioUnit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Output, 
            kInputBus, 
            &audioFormat, 
            sizeof(audioFormat)); 

    // Set input callback 
    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = recordingCallback; 
    callbackStruct.inputProcRefCon = (__bridge void *)(self); 
    status = AudioUnitSetProperty(audioUnit, 
            kAudioOutputUnitProperty_SetInputCallback, 
            kAudioUnitScope_Global, 
            kInputBus, 
            &callbackStruct, 
            sizeof(callbackStruct)); 

    status = AudioUnitInitialize(audioUnit); 

} 
@end 
+1

究竟是哪个变量导致坏访问? – 2013-03-08 05:17:56

+0

bufferList.mNumberBuffers; – Roskvist 2013-03-08 10:06:01

回答

0

需要调用AudioUnitRender首先得到的音频数据(从页面中取代码链接到您)

AudioUnitRender([audioInterface audioUnit], 
          ioActionFlags, 
          inTimeStamp, 
          inBusNumber, 
          inNumberFrames, 
          bufferList); 

当心在某些情况下,您可能还需要使用malloc自己的bufferList。

+0

我仍然得到不好的访问.. – Roskvist 2013-03-08 10:10:59

+0

你也malloc的缓冲区? – 2013-03-08 23:10:10

相关问题