2017-03-31 87 views
0

嘿,在这里我肯定没有深度,但不幸的是,由于我是由讲师提供了项目,所以太迟了。初始化AVAudio会话模式测量

我试图通过在我的项目中使用AVAudio会话模式测量来禁用应用于我的输入的系统提供的信号处理。

但是我很努力地找到任何消息来源。

我希望的结果是,通过启用此功能,我将能够在我的应用程序中制作更准确的读数。

下面是代码:

#import "ViewController.h" 

@import AudioToolbox; 
@import AVFoundation; 


#define kOutputBus 0 
#define kInputBus 1 

@interface ViewController() 

@property (nonatomic, weak) IBOutlet UILabel *dBSPLView2; 

@end 



@implementation ViewController 

static AudioComponentInstance audioUnit; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 


    [self setupAudio]; 
} 

- (void) setupAudio { 


    AudioComponentDescription desc; 


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

    AudioComponent comp = AudioComponentFindNext(NULL, &desc); 

    OSStatus status = AudioComponentInstanceNew(comp, &audioUnit); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 

    AudioStreamBasicDescription audioFormat; 

    audioFormat.mSampleRate = 96000.00; 
    audioFormat.mFormatID = kAudioFormatLinearPCM; 
    audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    audioFormat.mFramesPerPacket = 1; 
    audioFormat.mChannelsPerFrame = 1; 
    audioFormat.mBitsPerChannel = 16; 
    audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(SInt16); 
    audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame; 


    UInt32 flag = 1; 
    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, kInputBus, &flag, sizeof(flag)); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 

    flag = 0; 
    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &flag, sizeof(flag)); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 

    status = AudioUnitSetProperty(audioUnit , kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, kInputBus, &audioFormat, sizeof(audioFormat)); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 

    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = recordingCallback; 
    callbackStruct.inputProcRefCon = (__bridge void*)self; 

    status = AudioUnitSetProperty(audioUnit , kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, kInputBus, &callbackStruct, sizeof(callbackStruct)); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 

    status = AudioUnitInitialize(audioUnit); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 

} 

static OSStatus recordingCallback(

            void *inRefCon, 
            AudioUnitRenderActionFlags *ioActionFlags, 
            const AudioTimeStamp *inTimeStamp, 
            UInt32 inBusNumber, 
            UInt32 inNumberFrames, 
            AudioBufferList *ioData 

          ) { 

    AudioBuffer buffer; 

    buffer.mNumberChannels = 1; 
    buffer.mDataByteSize = inNumberFrames * sizeof(SInt16); 
    buffer.mData = malloc(buffer.mDataByteSize); 

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

    OSStatus status = AudioUnitRender(audioUnit , ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList); 
    if (status != noErr) { 
     printf("Error\n"); 
     return -1; 
    } 

    SInt16 *frameBuffer = buffer.mData; 

    double totalAmplitude = 0; 

    for (int i = 0; i < inNumberFrames; i++) { 
     // printf("%i\n",frameBuffer[i]); 

     totalAmplitude += frameBuffer[i] * frameBuffer[i]; 
    } 

    totalAmplitude /= inNumberFrames; 

    totalAmplitude = sqrt(totalAmplitude); 

    //Creates a negative number that goes no higher than zero 
    //float SPLFloat = totalAmplitude/(float)SHRT_MAX * 2; 

    float dBFloat = (20 * log10(totalAmplitude)) + 11; 



    dispatch_async(dispatch_get_main_queue(), ^{ 
     ViewController *viewController = (__bridge ViewController*)inRefCon; 
     viewController.dBSPLView2.text = [NSString stringWithFormat:@"%.f", dBFloat]; 
    }); 

    return noErr; 
} 

- (IBAction)recordButtonPressed:(id)sender { 
    NSError *error; 
    [[AVAudioSession sharedInstance] setActive:YES error:&error]; 
    if (error != nil) { 
     NSAssert(error == nil, @"Error"); 
    } 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error]; 
    if (error != nil) { 
     NSAssert(error == nil, @"Error"); 
    } 

    [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { 
     if (granted) { 
      OSStatus status = AudioOutputUnitStart(audioUnit); 
      if (status != noErr) { 
       NSAssert(status == noErr,@"Error"); 
      } 
     } else { 
      NSAssert(NO, @"Error"); 
     } 
    }]; 
} 



- (IBAction)stopButtonPressed:(id)sender { 
    OSStatus status = AudioOutputUnitStop(audioUnit); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 
    NSError *error; 
    [[AVAudioSession sharedInstance] setActive:NO error:&error]; 
    if (error != nil) { 
     NSAssert(error == nil, @"Error"); 
    } 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void) dealloc { 
    OSStatus status = AudioComponentInstanceDispose(audioUnit); 
    if (status != noErr) { 
     NSAssert(status == noErr,@"Error"); 
    } 
} 

@end 

回答

0

配置的类别后的会话:

[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeMeasurement error:&error]; 
if (error != nil) { 
    NSAssert(error == nil, @"Error"); 
} 

此外,您的错误处理不遵循既定的模式。您应该检查setMode:error:的返回值。当方法的返回值为NO时,error输入/输出参数仅保证有效。 (实际上,在大多数情况下,检查错误为零可能工作正常,但它没有记录工作的方式 - 所以你不应该依靠它。)

+0

感谢你几乎相当明显/简单,是的错误我目前使用的处理方式是来自我跟随的教程视频,希望能够完成程序的基本功能,以便我可以完成10,000个单词的报告,然后在难以实现的情况下将它变成一个可行的应用程序!再次感谢你的帮助! – ChrisBearBaker

+0

没问题!祝你好运! –