我正在从audiobus sdk 1.0迁移到2.0以支持ios8。但我在功能代码方面遇到了一些问题。
我想要实现的目标:我的应用是一个接收器,我想用ABReceiverPortReceive方法播放收到的音频。
在旧的sdk中,当音频可用时在ABInputPort中有回调方法但在sdk 2.0中没有ABReceiverPort中的回调方法
以下是我的旧代码sdk 1.0
_inputPort.audioInputBlock = ^(ABInputPort *inputPort, UInt32 lengthInFrames, AudioTimeStamp *nextTimestamp, ABPort *sourcePortOrNil) {
// get samples from audiobus
AudioBufferList* receiveBufferList = alloca(sizeof(AudioBufferList) + (_receiveBufferList->mNumberBuffers - 1) * sizeof(AudioBuffer));
memcpy(receiveBufferList, _receiveBufferList, sizeof(AudioBufferList) + (_receiveBufferList->mNumberBuffers - 1) * sizeof(AudioBuffer));
ABInputPortReceive(inputPort, sourcePortOrNil, receiveBufferList, &lengthInFrames, nextTimestamp, NULL);
// put samples into buffer
if (lengthInFrames > 0)
{
ABMultiStreamBufferEnqueue([ABPlugin plugin].inputBuffer, sourcePortOrNil, receiveBufferList, lengthInFrames, nextTimestamp);
}
};
这里我调用了ABInputPortReceive,当调用了calback方法并且音频可用但在新的sdk中没有回调方法。
所以我在我的音频引擎回调方法中调用了ABReceiverPortReceive方法。
- (OSStatus)render:(AudioBufferList *)buffer frames:(NSUInteger)numFrames timestamp:(const AudioTimeStamp *)timestamp flags:(AudioUnitRenderActionFlags *)ioFlags
{
// NSLog(@"%s", __PRETTY_FUNCTION__);
if (nil == self.source)
{
*ioFlags |= kAudioUnitRenderAction_OutputIsSilence;
return noErr;
}
// read previously enqueued by plugin samples from buffer into output buffer
UInt32 totalFrames = 0;
UInt32 framesFromBuffer = numFrames;
// get samples from input buffer
AudioBufferList* receiveBufferList = alloca(sizeof(AudioBufferList) + (_receiveBufferList->mNumberBuffers - 1) * sizeof(AudioBuffer));
memcpy(receiveBufferList, _receiveBufferList, sizeof(AudioBufferList) + (_receiveBufferList->mNumberBuffers - 1) * sizeof(AudioBuffer));
AudioTimeStamp bufferTimestamp = *timestamp;
ABMultiStreamBufferDequeueSingleSource([ABPlugin plugin].inputBuffer, self.source, receiveBufferList, &framesFromBuffer, &bufferTimestamp);
totalFrames += framesFromBuffer;
_framesPlayed += numFrames;
[ABPlugin plugin].framesPlayed = MAX([ABPlugin plugin].framesPlayed, _framesPlayed);
ABMultiStreamBufferMarkSourceIdle([ABPlugin plugin].inputBuffer, self.source);
// convert AB format to output stream format
OSStatus result = AudioConverterConvertComplexBuffer(_formatConverter, totalFrames, receiveBufferList, buffer);
AudioTimeStamp timestamp1 = *timestamp;
if ( ABReceiverPortIsConnected([ABPlugin plugin].inputPort) ) {
// Receive audio from Audiobus
ABReceiverPortReceive([ABPlugin plugin].inputPort, self.source, _receiveBufferList, numFrames, ×tamp1);
}
return result;
}
问题:没有以这种方式收到的音频
请尽早帮助或提出建议。
感谢。
答案 0 :(得分:2)
好像你在这里处理多流。可能你需要区分声源。我无法解释代码。
答案 1 :(得分:0)
您是否看到此网站1.x-2.x迁移指南:http://developer.audiob.us/doc/_migration-_guide.html