버퍼 샘플을 읽으려는이 코드가 있는데, 이상한 mach-o 링커 오류가 발생합니다. audioTollBox 및 coreAudio를 넣을 수있는 오디오 장치 프레임 워크가 없습니다. 나는 읽었다. 내 코드는 다음과 같습니다오디오에서 오류가 발생했습니다. 유닛 코드 -remoteIO for iphone
#define kOutputBus 0
#define kInputBus 1
AudioComponentInstance audioUnit;
@implementation remoteIO
//callback function :
static OSStatus recordingCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioBuffer buffer;
buffer.mNumberChannels = 1;
buffer.mDataByteSize = inNumberFrames * 2;
NSLog(@"%ld",inNumberFrames);
buffer.mData = malloc(inNumberFrames * 2);
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0] = buffer;
OSStatus status;
status = AudioUnitRender(audioUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
&bufferList);
checkStatus(status); //here is the warnning+error
double *q = (double *)(&bufferList)->mBuffers[0].mData;
for(int i=0; i < strlen((const char *)(&bufferList)->mBuffers[0].mData); i++)
{
NSLog(@"%f",q[i]);
}
}
및 읽기 방법 :
-(void)startListeningWithFrequency:(float)freq;
{
OSStatus status;
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
status = AudioComponentInstanceNew(inputComponent, &audioUnit);
checkStatus(status);
UInt32 flag = 1;
status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input,kInputBus, &flag, sizeof(flag));
checkStatus(status);
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;//44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
status = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
kInputBus,
&audioFormat,
sizeof(audioFormat));
checkStatus(status);
checkStatus(status);
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = recordingCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(audioUnit,
kAudioOutputUnitProperty_SetInputCallback,
kAudioUnitScope_Global,
kInputBus, &callbackStruct, sizeof(callbackStruct));
checkStatus(status);
status = AudioOutputUnitStart(audioUnit);
}
와 내가 얻을 것은이 오류 및 warnning :
Undefined symbols for architecture i386:
"_checkStatus", referenced from:
_recordingCallback in remoteIO.o
-[remoteIO startListeningWithFrequency:] in remoteIO.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
무슨 잘못 여기에? 덕분에 .
제발 ??? 누구? 나는이 오디오 것에서 내 마음을 잃고있다 !!! 나는 모든 CheckStatus (상태) 라인을 꺼낼 때 컴파일 할 수 있음을 알 수있다. 내가 뭘 놓치고 있니? 모든 프레임 워크를 넣었습니다. 왜이 checkStatus를 인식하지 못합니까 ??? – Curnelious
checkStatus라는 단어가 사과 사과 전체에서 언급되지 않았 음을 알 수 있습니다. 한번도. 모든 오디오 문서에는 그와 같은 기능이 없습니다. 그리고 모든 오디오 가이드, 모든 게시물 여기, 사방에, 그들은 모두 그들에 의해 선언 wasnt이 checkStatus (상태) 기능을 사용합니다 .. 내가 무엇을 놓치고 여기 ??? – Curnelious