2010-03-21 77 views
2

我想寫使用AudioFileWriteBytes()原始音頻字節的文件。下面是我在做什麼:AudioFileWriteBytes失敗,錯誤代碼-40

void writeSingleChannelRingBufferDataToFileAsSInt16(AudioFileID audioFileID, AudioConverterRef audioConverter, ringBuffer *rb, SInt16 *holdingBuffer) { 
// First, figure out which bits of audio we'll be 
// writing to file from the ring buffer 

    UInt32 lastFreshSample = rb->lastWrittenIndex; 
    OSStatus status; 
    int numSamplesToWrite; 
    UInt32 numBytesToWrite; 


    if (lastFreshSample < rb->lastReadIndex) { 
     numSamplesToWrite = kNumPointsInWave + lastFreshSample - rb->lastReadIndex - 1; 
    } 
    else { 
     numSamplesToWrite = lastFreshSample - rb->lastReadIndex; 
    } 
    numBytesToWrite = numSamplesToWrite*sizeof(SInt16); 

然後我們的音頻數據(存儲爲花車)複製到將直接寫入文件保持緩衝(SInt16)。複製看起來很時髦,因爲它來自環形緩衝區。

UInt32 buffLen = rb->sizeOfBuffer - 1; 
    for (int i=0; i < numSamplesToWrite; ++i) { 
     holdingBuffer[i] = rb->data[(i + rb->lastReadIndex) & buffLen]; 
    } 

好的,現在我們嘗試從SInt16緩衝區「holdingBuffer」寫入音頻到音頻文件。該的NSLog會吐出一個錯誤-40,但還聲稱,它的寫入字節。沒有數據寫入文件。

status = AudioFileWriteBytes(audioFileID, NO, 0, &numBytesToWrite, &holdingBuffer);  
    rb->lastReadIndex = lastFreshSample; 

    NSLog(@"Error = %d, wrote %d bytes", status, numBytesToWrite); 

    return; 

什麼是這個錯誤-40?順便說一句,一切如果我寫,直接從ringBuffer到文件工作正常。當然,這聽起來像垃圾,因爲我寫的花車,沒有SInt16s,但AudioFileWriteBytes不抱怨。

回答

2

的關鍵是輸入數據的字節序明確更改爲大端。我所要做的就是包裝CFSwapInt16HostToBig在我的數據獲取:

float audioVal = rb->data[(i + rb->lastReadIndex) & buffLen]; 
holdingBuffer[i] = CFSwapInt16HostToBig((SInt16) audioVal); 
相關問題