繁体   English   中英

在AudioUnit播放回调中从AudioBuffer-> mdata播放音频

[英]Playing audio from AudioBuffer->mdata in AudioUnit playback callback

一整天以来,我一直在寻找并尝试解决以下问题的人们。 尚未成功

好的,所以我一直在使用Apple示例代码项目名称WiTap使用NSInputStreamsNSOutputStreams通过wifi通过WiTap通信两个设备,我已经能够成功传输数据(音频数据)黑白设备。

但是,在目标设备上,我接收数据并将其填充到音频缓冲区中,如下所示:

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

anAudioBuffer本身声明如下

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

现在,我从Apple的示例代码中,通过AudioUnit回调中的someObject.anAudioBuffer来访问此音频缓冲区。

如下

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复制到本地var 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。 音频回调是需求,而不是可选请求。

所以我找到了答案

这很简单,但是我不了解读取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读取下一个指针的方式。

写入frameBuffer[j] = *(frameBuffer + j); 我的音频流就像魅力一样。

我们将很高兴知道这是否对您有所帮助。

这里找到C指针数组信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM