前提・実現したいこと
マイクから入力した音声をスピーカーからリアルタイム出力するシステムをつくっています。
エラーが多々発生してしまい、困っています。いろいろ調べたのですが、わかりません。解決方法を教えてください。お願いします。
発生している問題・エラーメッセージ
行番号19において、 エラーメッセージ:cannot invoke initalizer for type ‘AudioUnit‘ with no arguments 行番号28において、 エラーメッセージ:value of optional type "AudioComponent?" (aka"optional<OpaquePointer>") must be unwrapped toa value of type "AudioComponent"(aka"opaquePointer") 行番号30において、 エラーメッセージ:use of unresolved identifier "RecordingCallback": did you mean "SecTrustCallback"? 行番号36において、 エラーメッセージ:use of unresolved identifier "sizeofValue" 行番号44において、 エラーメッセージ:use of unresolved identifier "sizeofValue" 行番号52において、 エラーメッセージ:use of unresolved identifier "sizeof" 行番号59において、 エラーメッセージ:use of unresolved identifier "sizeof" 行番号76において、 エラーメッセージ:use of unresolved identifier "sizeof" 行番号83において、 エラーメッセージ:use of unresolved identifier "sizeof" 行番号91において、 エラーメッセージ:use of unresolved identifier "sizeof" 行番号139において、 エラーメッセージ:cannot call value of non-function type "Ulnt32"
### 該当のソースコード swiftを使用 import Foundation 10 import AVFoundation 11 12 /** 13 * 14 */ 15 class LooperModel { 16 var audioUnit: AudioUnit?; 17 let kOutputBus: UInt32 = 0; 18 let kInputBus: UInt32 = 1; 19 20 func initialize() { 21 audioUnit = AudioUnit() 22 var acd = AudioComponentDescription(); 23 acd.componentType = kAudioUnitType_Output; 24 acd.componentSubType = kAudioUnitSubType_RemoteIO; 25 acd.componentManufacturer = kAudioUnitManufacturer_Apple; 26 acd.componentFlags = 0; 27 acd.componentFlagsMask = 0; 28 29 let ac = AudioComponentFindNext(nil, &acd); 30 AudioComponentInstanceNew( ac, &audioUnit! ); 31 32 var input = AURenderCallbackStruct( inputProc: RecordingCallback, inputProcRefCon: &audioUnit ); 33 AudioUnitSetProperty(audioUnit!, 34 kAudioOutputUnitProperty_SetInputCallback, 35 kAudioUnitScope_Global, 36 kInputBus, 37 &input, 38 UInt32(sizeofValue(input))); 39 40 input.inputProc = RenderCallback; 41 AudioUnitSetProperty(audioUnit!, 42 kAudioUnitProperty_SetRenderCallback, 43 kAudioUnitScope_Global, 44 kOutputBus, 45 &input, 46 UInt32(sizeofValue(input))); 47 48 var flag: UInt32 = 1; 49 AudioUnitSetProperty(audioUnit!, 50 kAudioOutputUnitProperty_EnableIO, 51 kAudioUnitScope_Input, 52 kInputBus, 53 &flag, 54 UInt32( sizeof( UInt32 ) ) ); 55 56 AudioUnitSetProperty(audioUnit!, 57 kAudioOutputUnitProperty_EnableIO, 58 kAudioUnitScope_Output, 59 kOutputBus, 60 &flag, 61 UInt32( sizeof( UInt32 ) ) ); 62 63 var audioFormat: AudioStreamBasicDescription = AudioStreamBasicDescription(); 64 audioFormat.mSampleRate = 44100.00; 65 audioFormat.mFormatID = kAudioFormatLinearPCM; 66 audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 67 audioFormat.mFramesPerPacket = 1; 68 audioFormat.mChannelsPerFrame = 1; 69 audioFormat.mBitsPerChannel = 16; 70 audioFormat.mBytesPerPacket = 2; 71 audioFormat.mBytesPerFrame = 2; 72 73 AudioUnitSetProperty( audioUnit!, 74 kAudioUnitProperty_StreamFormat, 75 kAudioUnitScope_Output, 76 kInputBus, 77 &audioFormat, 78 UInt32( sizeof( AudioStreamBasicDescription ) ) ); 79 80 AudioUnitSetProperty( audioUnit!, 81 kAudioUnitProperty_StreamFormat, 82 kAudioUnitScope_Input, 83 kOutputBus, 84 &audioFormat, 85 UInt32( sizeof( AudioStreamBasicDescription ) ) ); 86 87 flag = 0; 88 AudioUnitSetProperty( audioUnit!, 89 kAudioUnitProperty_ShouldAllocateBuffer, 90 kAudioUnitScope_Output, 91 kInputBus, 92 &flag, 93 UInt32( sizeof( UInt32 ) ) ); 94 95 AudioUnitInitialize( audioUnit! ); 96 } 97 98 func start() { 99 if(( audioUnit ) == nil) { 100 return; 101 } 102 NSLog("start"); 103 AudioOutputUnitStart( audioUnit! ); 104 } 105 106 func end() { 107 if(( audioUnit ) == nil) { 108 return; 109 } 110 NSLog("end"); 111 AudioOutputUnitStop( audioUnit! ); 112 } 113 } 114 115 var bufs: AudioBufferList?; 116 117 //func RecordingCallback( 118 // inRefCon: UnsafeMutablePointer<Void>, 119 // ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 120 // inTimeStamp: UnsafePointer<AudioTimeStamp>, 121 // inBusNumber: UInt32, 122 // inNumberFrames: UInt32, 123 // ioData: UnsafeMutablePointer<AudioBufferList>) -> (OSStatus) 124 //{ 125 // var err :OSStatus? = nil 126 // 127 // let buffer = allocateAudioBuffer(1 ,size: inNumberFrames) 128 // bufs = AudioBufferList.init(mNumberBuffers: 1, mBuffers: buffer) 129 // let au = UnsafeMutablePointer<AudioUnit>(inRefCon).memory; 130 // 131 // err = AudioUnitRender(au, 132 // ioActionFlags, 133 // inTimeStamp, 134 // inBusNumber, 135 // inNumberFrames, 136 // &bufs!) 137 // 138 // return err! 139 //} 140 141 func allocateAudioBuffer(let numChannel: UInt32, let size: UInt32) -> AudioBuffer { 142 let dataSize = UInt32(numChannel * UInt32(sizeof(Float64)) * size) 143 let data = malloc(Int(dataSize)) 144 let buffer = AudioBuffer.init(mNumberChannels: numChannel, mDataByteSize: dataSize, mData: data) 145 146 return buffer 147 } 148 149 func checkStatus( status: OSStatus ) { 150 if( status != 0 ) { 151 NSLog("Error: %ld\n", status); 152 } 153 } 154 155 /** 156 音声の再生中に呼ばれるコールバック関数です 157 */ 158 //func RenderCallback ( 159 // inRefCon: UnsafeMutablePointer<Void>, 160 // ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 161 // inTimeStamp: UnsafePointer<AudioTimeStamp>, 162 // inBusNumber: UInt32, 163 // inNumberFrames: UInt32, 164 // ioData: UnsafeMutablePointer<AudioBufferList>) -> (OSStatus) 165 //{ 166 // let data=UnsafePointer<Int16>(bufs!.mBuffers.mData) 167 // 168 // let dataArray = UnsafeBufferPointer<Int16>(start:data, count: Int(bufs!.mBuffers.mDataByteSize)/sizeof(Int16)) 169 // 170 // let io = UnsafeMutablePointer<Int16>( ioData.memory.mBuffers.mData ); 171 // 172 // let ioDataArr = UnsafeMutableBufferPointer<Int16>(start: io, count: Int(bufs!.mBuffers.mDataByteSize)/sizeof(Int16)); 173 // 174 // for i in 0...dataArray.count-1 175 // { 176 // ioDataArr[ i ] = dataArray[ i ]; 177 // } 178 // 179 // bufs?.mBuffers.mData.dealloc(1); 180 // 181 // 182 // return noErr; 183 //}
補足情報(FW/ツールのバージョンなど)
swift xcord10ベータ版
ちょっと調べてみたところ、こちらの記事を参考にしているようですね。古いコードなので書き換えが必要そうです。https://qiita.com/kojiro_ueda/items/85160e1b354f1281309c
わからないので、参考につくろうとして、エラーで困っています。
