Audiobus:从sdk 1.0迁移到2.0

时间:2014-09-06 11:38:45

标签: ios objective-c audio core-audio

我正在从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, &timestamp1);
    }

    return result;
}

问题:没有以这种方式收到的音频

请尽早帮助或提出建议。

感谢。

2 个答案:

答案 0 :(得分:2)

好像你在这里处理多流。可能你需要区分声源。我无法解释代码。

答案 1 :(得分:0)

您是否看到此网站1.x-2.x迁移指南:http://developer.audiob.us/doc/_migration-_guide.html