2017-03-31 3 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:を確認する必要があります。 error in/outパラメーターは、メソッドの戻り値がNOの場合にのみ有効であることが保証されています。 (実際には、エラーがないとチェックするのはおそらく大抵の場合うまくいきますが、そのように動作することは文書化されていませんので、それに頼るべきではありません)。

+0

私が現在使ってきた処理は、チュートリアルのビデオからです。プログラムの基本的な機能を使いたいと思っています.1万語のレポートを完成させてから、ハードな作業が終わったら、実行可能なアプリケーションにしましょう!あなたの助けをもう一度ありがとう! – ChrisBearBaker

+0

問題ありません!それと幸運! –