在AudioUnit播放回调中播放来自AudioBuffer-> mdata的音频
我一直在寻找并试图解决以下问题,因为一整天。没有成功但在AudioUnit播放回调中播放来自AudioBuffer-> mdata的音频
好了,我一直在使用苹果的示例代码项目名称WiTap
使用NSInputStreams
和NSOutputStreams
我已经能够将数据(音频数据)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。音频回调是需求,而不是可选请求。
所以我已经找到了答案
很简单,但我并没有读的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
我从源数据填充'someObject.anAudioBuffer'你能指导我如何完成任务填充填充,即在'FRAMEBUFFER [J]' – Umair
同你的方式在你的for循环中做了,除了使用来自someObject而不是rnd()的数据。 – hotpaw2
对不起,如果我听起来太新手,但我收集,你建议在循环 'frameBuffer [j] = someObject.anAudioBuffer.mData' 如果是这样的话,我仍然不成功 – Umair