2016-08-22 80 views
0

我一直在尋找並試圖解決以下問題,因爲一整天。沒有成功但在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用我自己的數據發揮。

任何人都可以請指導我。我太多的時間都浪費在這個看似微不足道的問題上。

如果需要,我可以提供更多的細節。

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

回答

0

你必須填寫內存(或陣列)的mBuffer.mData指出,[0]音頻採樣幀恰好inNumberFrames(你是否有那些可提供樣品與否) 。你可以在你的噪音發生器中這樣做,但不是在你的記憶體代碼中。

也保持mDataByteSize不變,因爲它是回調的輸入,而不是inout。音頻回調是需求,而不是可選請求。

+0

我從源數據填充'someObject.anAudioBuffer'你能指導我如何完成任務填充填充,即在'FRAMEBUFFER [J]' – Umair

+0

同你的方式在你的for循環中做了,除了使用來自someObject而不是rnd()的數據。 – hotpaw2

+0

對不起,如果我聽起來太新手,但我收集,你建議在循環 'frameBuffer [j] = someObject.anAudioBuffer.mData' 如果是這樣的話,我仍然不成功 – Umair

-1

所以我已經找到了答案

很簡單,但我並沒有讀的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