簡體   English   中英

C中的緩沖區(無符號char *)連接

[英]Buffer (unsigned char *) concatenation in C

對於C開發人員來說,這可能是一個非常簡單的問題,但是,我是C的新手,我還沒有完全掌握C背后的所有概念。 因此,現在,我使用以下代碼來連接2個緩沖區(audioData和silenceData),然后使用它們來傳輸一些音頻:

typedef struct {
    unsigned char * data;
    UInt32 size;    
} SoundData;

    SoundData audioData;
            audioData.data = audioFiles[currentSoundDataIndex];
            audioData.size = audioFilesSize[currentSoundDataIndex];

    SoundData silenceData;
                silenceData.size = 44100*2*fabs(silenceDuration-0.049f);
                silenceData.data = malloc(silenceData.size);        
                memset(silenceData.data,0,silenceData.size);

                //beat data
    SoundData beatData;
                beatData.size = (audioData.size + silenceData.size);    
                beatData.data = malloc(beatData.size);

                for (int i=0; i<audioData.size; i++) {
                    beatData.data[i] = audioData.data[i];
                }

                for (int i=audioData.size; i<beatData.size; i++) {
                    beatData.data[i] = silenceData.data[i-audioData.size];
                }

這可以正常工作,但是我感覺必須有更好的方法來實現,也許某些內置函數?

一次,您可以使用memcpy,而不是使用循環,這要快得多,即:

memcpy(beatData.data, audioData.data, audioData.size);

memcpy替換for循環是有意義的。 否則沒關系。

memcpy(beatData.data, audioData.data, audioData.size);
memcpy(beatData.data + audioData.size, silenceData.data, silenceData.size);

實際上,您正在創建的靜音數據只是一堆零。 應該真正存儲它,以便稍后再附加到另一個緩沖區。 因此,應將第二個memcpy替換為memset

memcpy(beatData.data, audioData.data, audioData.size);
memcpy(beatData.data + audioData.size, 0, beatData.size - audioData.size);

我肯定會使用memcpy() …它會快得多,因為該標准庫函數使用編譯器內部函數或手工編碼的程序集,以最大程度地加快將一個字節緩沖區復制到另一個緩沖區的速度。可以針對您的處理器平台進行優化。 這比for循環快得多...

例如:

unsigned char* temp_buffer_loc = beatData.data;
memcpy(temp_buffer_loc, audioData.data, audioData.size);

//now put silence data at the end of the buffer
temp_buffer_loc += audioData.size;
memset(temp_buffer_loc, 0, silenceData.size);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM