Advertisement
Guest User

Untitled

a guest
Jul 25th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. //
  2. // MyAudioUnit3AudioUnit.m
  3. // MyAudioUnit3
  4. //
  5. // Created by Alexander Bollbach on 7/23/17.
  6. // Copyright © 2017 Alexander Bollbach. All rights reserved.
  7. //
  8.  
  9. #import "MyAudioUnit3.h"
  10. #import <AVFoundation/AVFoundation.h>
  11.  
  12. typedef struct FreqParam {
  13. float value;
  14. } FreqParam;
  15.  
  16. @interface MyAudioUnit3 ()
  17. @property (nonatomic, readwrite) AUParameterTree *parameterTree;
  18. @property AUAudioUnitBusArray *outputBusArray;
  19. @property (nonatomic, assign) FreqParam * freqParam;
  20. @end
  21.  
  22. @implementation MyAudioUnit3 {
  23. float * freqTest;
  24. }
  25. @synthesize parameterTree = _parameterTree;
  26.  
  27. AudioBufferList renderABL;
  28. AUAudioUnitBus *_outputBus; // was BufferedInputBus in sample code
  29. AVAudioPCMBuffer* pcmBuffer;
  30.  
  31.  
  32. AudioBufferList const* originalAudioBufferList;
  33. const AudioUnitParameterID frequencyAddress = 0;
  34.  
  35.  
  36.  
  37. - (instancetype)initWithComponentDescription:(AudioComponentDescription)componentDescription options:(AudioComponentInstantiationOptions)options error:(NSError **)outError {
  38. self = [super initWithComponentDescription:componentDescription options:options error:outError];
  39.  
  40. if (self == nil) { return nil; }
  41.  
  42. FreqParam * freqParam = malloc(sizeof(FreqParam));
  43. freqParam->value = 200;
  44.  
  45. self.freqParam = freqParam;
  46.  
  47. float a = 22;
  48. freqTest = &a;
  49.  
  50.  
  51.  
  52.  
  53. AudioUnitParameterOptions flags = kAudioUnitParameterFlag_IsWritable |
  54. kAudioUnitParameterFlag_IsReadable;
  55.  
  56. AUParameter *param1 = [AUParameterTree createParameterWithIdentifier:@"frequency"
  57. name:@"Frequency"
  58. address:frequencyAddress
  59. min:100
  60. max:1000
  61. unit:kAudioUnitParameterUnit_Hertz
  62. unitName:nil
  63. flags:flags
  64. valueStrings:nil
  65. dependentParameters:nil];
  66. param1.value = 201;
  67.  
  68. _parameterTree = [AUParameterTree createTreeWithChildren:@[ param1 ]];
  69.  
  70.  
  71. __block float * freqVal = freqTest;
  72.  
  73. _parameterTree.implementorValueProvider = ^(AUParameter *param) {
  74.  
  75. MyAudioUnit3 * selfP = self;
  76.  
  77. FreqParam * freqParam = self.freqParam;
  78.  
  79. switch (param.address) {
  80. case frequencyAddress:
  81.  
  82. return (AUValue)*freqVal;
  83. // return (AUValue)freqParam->value;
  84.  
  85. default:
  86. return (AUValue) 0.0;
  87. }
  88. };
  89.  
  90.  
  91.  
  92.  
  93. _parameterTree.implementorValueObserver = ^(AUParameter *param, AUValue value) {
  94.  
  95. FreqParam * freqParam = self.freqParam;
  96. MyAudioUnit3 * selfP = self;
  97.  
  98. *freqVal = 4;
  99.  
  100. switch (param.address) {
  101. case frequencyAddress:
  102. *freqVal = value;
  103. freqParam->value = value;
  104. break;
  105. default:
  106. break;
  107. }
  108. };
  109.  
  110.  
  111. AVAudioFormat *defaultFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100.0 channels:2];
  112.  
  113. _outputBus = [[AUAudioUnitBus alloc] initWithFormat:defaultFormat error:nil];
  114. _outputBusArray = [[AUAudioUnitBusArray alloc] initWithAudioUnit:self busType:AUAudioUnitBusTypeOutput busses: @[_outputBus]];
  115.  
  116. self.maximumFramesToRender = 512;
  117.  
  118. return self;
  119. }
  120.  
  121. - (AUAudioUnitBusArray *)outputBusses { return _outputBusArray; }
  122.  
  123.  
  124. - (BOOL)allocateRenderResourcesAndReturnError:(NSError **)outError {
  125.  
  126. if (![super allocateRenderResourcesAndReturnError:outError]) { return NO; }
  127. renderABL.mNumberBuffers = 2; // this is actually needed
  128. pcmBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:_outputBus.format frameCapacity: 512];
  129. originalAudioBufferList = pcmBuffer.audioBufferList;
  130. return YES;
  131. }
  132.  
  133. - (void)deallocateRenderResources { [super deallocateRenderResources]; }
  134.  
  135. void prepareOutputBufferList(AudioBufferList* outBufferList, AVAudioFrameCount frameCount, bool zeroFill) {
  136. UInt32 byteSize = frameCount * sizeof(float);
  137. for (UInt32 i = 0; i < outBufferList->mNumberBuffers; ++i) {
  138. outBufferList->mBuffers[i].mNumberChannels = originalAudioBufferList->mBuffers[i].mNumberChannels;
  139. outBufferList->mBuffers[i].mDataByteSize = byteSize;
  140. if (outBufferList->mBuffers[i].mData == NULL) {
  141. outBufferList->mBuffers[i].mData = originalAudioBufferList->mBuffers[i].mData;
  142. }
  143. if (zeroFill) { memset(outBufferList->mBuffers[i].mData, 0, byteSize); }
  144. }
  145. }
  146.  
  147. #pragma mark - AUAudioUnit (AUAudioUnitImplementation)
  148. - (AUInternalRenderBlock)internalRenderBlock {
  149.  
  150. FreqParam * freqParam = self.freqParam;
  151.  
  152. __block float phase = 0.0;
  153.  
  154.  
  155. AUValue *frequencyCapture = freqTest;
  156.  
  157. return ^AUAudioUnitStatus(AudioUnitRenderActionFlags *actionFlags, const AudioTimeStamp *timestamp, AVAudioFrameCount frameCount, NSInteger outputBusNumber, AudioBufferList *outputData, const AURenderEvent *realtimeEventListHead, AURenderPullInputBlock pullInputBlock) {
  158.  
  159. prepareOutputBufferList(outputData, frameCount, true);
  160.  
  161. float* outL = (float*)outputData->mBuffers[0].mData;
  162. float* outR = (float*)outputData->mBuffers[1].mData;
  163.  
  164. float freq1 = freqParam->value;
  165.  
  166. float freq2 = *frequencyCapture;
  167.  
  168. float phaseIncrement = freq2 * (3.14159 * 3.0) / 44100;
  169.  
  170. for (int frame = 0; frame < frameCount; frame++) {
  171. outL[frame] = outR[frame] = sin( phase );
  172. phase += phaseIncrement;
  173. }
  174. return noErr;
  175. };
  176. };
  177.  
  178. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement