Search code examples
ios8avfoundationcore-audionsstreammultipeer-connectivity

iOS8 AVAudioEngine how to send microphone data over Multipeer Connectivity?


I want to send microphone audio data over Multipeer Connectivity (iOS 8) and play it through the speaker of the receiving peer. I've also setup the AVAudioEngine and I can hear the microphone data from the (upper) speaker output, but I don't know how to send AVAudioPCMBuffer over the network. Here's my code snippet:

AVAudioInputNode *inputNode =[self.engine inputNode];
AVAudioMixerNode *mainMixer = [self.engine mainMixerNode];
[self.engine connect:inputNode to:mainMixer format:[inputNode inputFormatForBus:0]];

[mainMixer installTapOnBus:0 bufferSize:4096 format:[mainMixer outputFormatForBus:0] 
    block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {

    //==== How to send the PCMBuffer ?? ======//
}];

NSError *error = nil;
[self.engine startAndReturnError:&error];

if(error)
{
    NSLog(@"error: %@", [error localizedDescription]);
}

Do I send it as NSData or NSStream ?

Appreciate for the help. Thx.


Solution

  • I haven't tried this solution:

    - (NSOutputStream *)startStreamWithName:(NSString *)streamName
                                     toPeer:(MCPeerID *)peerID
                                      error:(NSError **)error
    

    You can receive a float array by using the property buffer.floatChannelData. Now you can pack this float array into NSOutputStream and send it.

    On client side you can try to receive a stream:

    - (void)session:(MCSession *)session
    didReceiveStream:(NSInputStream *)stream
           withName:(NSString *)streamName
           fromPeer:(MCPeerID *)peerID
    {
        stream.delegate = self;
        [stream scheduleInRunLoop:[NSRunLoop mainRunLoop] 
                          forMode:NSDefaultRunLoopMode];
        [stream open];
    }
    

    But before you try this, you could try to send random values (therefore white noise) instead of the float array, so you can make sure, that the time slot for sending these buffers (we are talking about real-time) is wide enough.

    Update 15.10.2014 I found exactly what you need: http://robots.thoughtbot.com/streaming-audio-to-multiple-listeners-via-ios-multipeer-connectivity