iphone 的音频单元代码错误 -remoteIO
Posted
技术标签:
【中文标题】iphone 的音频单元代码错误 -remoteIO【英文标题】:error in audio Unit code -remoteIO for iphone 【发布时间】:2012-01-02 10:43:59 【问题描述】:我有这段代码,为了读取缓冲区样本,但我得到一个奇怪的 mach-o 链接器错误, 无法加载音频单元的框架,所以我在阅读时放置了 audioTollBox 和 coreAudio。 我的代码是:
#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);
我得到的是这个错误和警告:
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(status) 行时,我可以编译它。我错过了什么?我把所有的框架都放了,为什么他不能识别这个checkStatus的东西??? 我现在可以看到整个苹果文档中都没有提到 checkStatus 这个词,甚至一次。不止一次。在任何音频文件中,都没有这样的功能。在每个音频指南,这里的每个帖子,每个地方,他们都使用这个 checkStatus(status) 函数,这不是他们声明的..我在这里错过了什么??? 【参考方案1】:您必须编写自己的 checkStatus() 函数,就像它所做的那样(例如,它如何报告错误:对话框、控制台输出、分析日志记录、故障转储等),或者它是否在所有其他方面做任何事情而不是从音频代码返回,是特定于每个应用程序的。
【讨论】:
我从我的代码中取出了它——没有 checkStatus,它起作用了。但我的问题是,我必须从样本中得到多少?我在 -32700- +32700 之间。可以吗?以上是关于iphone 的音频单元代码错误 -remoteIO的主要内容,如果未能解决你的问题,请参考以下文章