在AudioUnit播放回调中播放来自AudioBuffer-> mdata的音频

问题描述:

我一直在寻找并试图解决以下问题,因为一整天。没有成功但在AudioUnit播放回调中播放来自AudioBuffer-> mdata的音频

好了,我一直在使用苹果的示例代码项目名称WiTap使用NSInputStreamsNSOutputStreams我已经能够将数据(音频数据)B/W设备成功传输通信通过WiFi /黑白两台设备。

然而目的地设备我接收数据和在音频缓冲器填写上,如下所示:

bytesRead = [self.inputStream read:anAudioBuffer.mData maxLength:anAudioBuffer.mDataByteSize]; 

anAudioBuffer本身声明如下

anAudioBuffer.mNumberChannels = 1; 
anAudioBuffer.mDataByteSize = 512 * 2; 
anAudioBuffer.mData = malloc(512 * 2); 

现在我访问此音频缓冲器作为someObject.anAudioBuffer在AudioUnit中从Apple的示例代码回调

其中如下

static OSStatus playbackCallback(void *inRefCon, 
           AudioUnitRenderActionFlags *ioActionFlags, 
           const AudioTimeStamp *inTimeStamp, 
           UInt32 inBusNumber, 
           UInt32 inNumberFrames, 
           AudioBufferList *ioData) {  
    // Notes: ioData contains buffers (may be more than one!) 
    // Fill them up as much as you can. Remember to set the size value in each buffer to match how 
    // much data is in the buffer. 

    for (int i=0; i < ioData->mNumberBuffers; i++) { // in practice we will only ever have 1 buffer, since audio format is mono 
     AudioBuffer buffer = ioData->mBuffers[i]; 

     // copy temporary buffer data to output buffer 
     UInt32 size = min(buffer.mDataByteSize, someObject.anAudioBuffer.mDataByteSize); // dont copy more data then we have, or then fits 
     memcpy(buffer.mData, someObject.anAudioBuffer.mData, size); 
     buffer.mDataByteSize = size; // indicate how much data we wrote in the buffer 

     // uncomment to hear random noise 
     /* 
     UInt16 *frameBuffer = buffer.mData; 
     for (int j = 0; j < inNumberFrames; j++) { 
      frameBuffer[j] = arc4random(); 
     } 
     */ 

    } 

    return noErr; 
} 

现在我想玩,我从someObject.anAudioBuffer复制到一个局部变量中的字节buffer

我也注意到,该代码的这一部分具有播放音频

/* 
UInt16 *frameBuffer = buffer.mData; 
for (int j = 0; j < inNumberFrames; j++) { 
    frameBuffer[j] = arc4random(); 
} 
*/ 

现在使用arc4random播放静态噪音。尽我的努力和搜索整个互联网我无法弄清楚如何发挥自己的字节,也是这段代码B/W /* */

例如,这条线的目的是什么?

UInt16 *frameBuffer = buffer.mData; 

以及如何填写此frameBuffer用我自己的数据发挥。

任何人都可以请指导我。我太多的时间都浪费在这个看似微不足道的问题上。

如果需要,我可以提供更多的细节。

在期待中等待......

你必须填写内存(或阵列)的mBuffer.mData指出,[0]音频采样帧恰好inNumberFrames(你是否有那些可提供样品与否) 。你可以在你的噪音发生器中这样做,但不是在你的记忆体代码中。

也保持mDataByteSize不变,因为它是回调的输入,而不是inout。音频回调是需求,而不是可选请求。

+0

我从源数据填充'someObject.anAudioBuffer'你能指导我如何完成任务填充填充,即在'FRAMEBUFFER [J]' – Umair

+0

同你的方式在你的for循环中做了,除了使用来自someObject而不是rnd()的数据。 – hotpaw2

+0

对不起,如果我听起来太新手,但我收集,你建议在循环 'frameBuffer [j] = someObject.anAudioBuffer.mData' 如果是这样的话,我仍然不成功 – Umair

所以我已经找到了答案

很简单,但我并没有读的C指针数组知识。所有我要做的就是:

UInt16 *frameBuffer = buffer.mData; 
for (int j = 0; j < inNumberFrames; j++) { 
    frameBuffer[j] = *(frameBuffer + j); 
} 

虽然这UInt16 *frameBuffer = buffer.mData;使得frameBuffer点开始的buffer.mData指数,以下

*(frameBuffer + j);是读取下一个指针C'S方式。

在写完frameBuffer[j] = *(frameBuffer + j);之后,我从流中播放的音频就像魅力一样。

很高兴知道这是否也有助于其他人。

测定C指针数组信息从here