Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. CheckError(NewAUGraph(&audioGraph), @"Creating graph");
  2. CheckError(AUGraphOpen(audioGraph), @"Opening graph");
  3.  
  4. AUNode micNode, converterNode;
  5. AudioUnit micUnit, converterUnit;
  6.  
  7. makeMic(&audioGraph, &micNode, &micUnit);
  8.  
  9. // get the Input/inputBus's stream description
  10. UInt32 sizeASBD = sizeof(AudioStreamBasicDescription);
  11. AudioStreamBasicDescription hwASBDin;
  12. AudioUnitGetProperty(micUnit,
  13. kAudioUnitProperty_StreamFormat,
  14. kAudioUnitScope_Input,
  15. kInputBus,
  16. &hwASBDin,
  17. &sizeASBD);
  18. makeConverter(&audioGraph, &converterNode, &converterUnit, hwASBDin);
  19.  
  20. // connect mic output to converterNode
  21. CheckError(AUGraphConnectNodeInput(audioGraph, micNode, 1, converterNode, 0),
  22. @"Connecting mic to converter");
  23.  
  24. // set callback on the output? maybe?
  25. AURenderCallbackStruct callbackStruct;
  26. callbackStruct.inputProc = audioCallback;
  27. callbackStruct.inputProcRefCon = (__bridge void*)self;
  28. CheckError(AudioUnitSetProperty(micUnit,
  29. kAudioOutputUnitProperty_SetInputCallback,
  30. kAudioUnitScope_Global,
  31. kInputBus,
  32. &callbackStruct,
  33. sizeof(callbackStruct)),
  34. @"Setting callback");
  35.  
  36. CheckError(AUGraphInitialize(audioGraph), @"AUGraphInitialize");
  37.  
  38. // activate audio session
  39. NSError *err = nil;
  40. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  41. if (![audioSession setActive:YES error:&err]){
  42. [self error:[NSString stringWithFormat:@"Couldn't activate audio session: %@", err]];
  43. }
  44. CheckError(AUGraphStart(audioGraph), @"AUGraphStart");
  45.  
  46. void makeMic(AUGraph *graph, AUNode *micNode, AudioUnit *micUnit) {
  47. AudioComponentDescription inputDesc;
  48. inputDesc.componentType = kAudioUnitType_Output;
  49. inputDesc.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
  50. inputDesc.componentFlags = 0;
  51. inputDesc.componentFlagsMask = 0;
  52. inputDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
  53.  
  54. CheckError(AUGraphAddNode(*graph, &inputDesc, micNode),
  55. @"Adding mic node");
  56.  
  57. CheckError(AUGraphNodeInfo(*graph, *micNode, 0, micUnit),
  58. @"Getting mic unit");
  59.  
  60. // enable microphone for recording
  61. UInt32 flagOn = 1; // enable value
  62. CheckError(AudioUnitSetProperty(*micUnit,
  63. kAudioOutputUnitProperty_EnableIO,
  64. kAudioUnitScope_Input,
  65. kInputBus,
  66. &flagOn,
  67. sizeof(flagOn)),
  68. @"Enabling microphone");
  69. }
  70.  
  71. void makeConverter(AUGraph *graph, AUNode *converterNode, AudioUnit *converterUnit, AudioStreamBasicDescription inFormat) {
  72. AudioComponentDescription sampleConverterDesc;
  73. sampleConverterDesc.componentType = kAudioUnitType_FormatConverter;
  74. sampleConverterDesc.componentSubType = kAudioUnitSubType_AUConverter;
  75. sampleConverterDesc.componentFlags = 0;
  76. sampleConverterDesc.componentFlagsMask = 0;
  77. sampleConverterDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
  78.  
  79. CheckError(AUGraphAddNode(*graph, &sampleConverterDesc, converterNode),
  80. @"Adding converter node");
  81. CheckError(AUGraphNodeInfo(*graph, *converterNode, 0, converterUnit),
  82. @"Getting converter unit");
  83.  
  84. // describe desired output format
  85. AudioStreamBasicDescription convertedFormat;
  86. convertedFormat.mSampleRate = 16000.0;
  87. convertedFormat.mFormatID = kAudioFormatLinearPCM;
  88. convertedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
  89. convertedFormat.mFramesPerPacket = 1;
  90. convertedFormat.mChannelsPerFrame = 1;
  91. convertedFormat.mBitsPerChannel = 16;
  92. convertedFormat.mBytesPerPacket = 2;
  93. convertedFormat.mBytesPerFrame = 2;
  94.  
  95. // set format descriptions
  96. CheckError(AudioUnitSetProperty(*converterUnit,
  97. kAudioUnitProperty_StreamFormat,
  98. kAudioUnitScope_Input,
  99. 0, // should be the only bus #
  100. &inFormat,
  101. sizeof(inFormat)),
  102. @"Setting format of converter input");
  103. CheckError(AudioUnitSetProperty(*converterUnit,
  104. kAudioUnitProperty_StreamFormat,
  105. kAudioUnitScope_Output,
  106. 0, // should be the only bus #
  107. &convertedFormat,
  108. sizeof(convertedFormat)),
  109. @"Setting format of converter output");
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement