C中的缓冲区(unsigned char *)连接

时间:2011-04-05 19:45:38

标签: objective-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];
                }

这很好用,但我觉得必须有更好的方法来做,有些内置功能可能吗?

3 个答案:

答案 0 :(得分:3)

一次,而不是使用循环,你可以使用更快的memcpy,即:

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

答案 1 :(得分:2)

for替换这些memcpy循环是有意义的。否则没关系。

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);

答案 2 :(得分:2)

我肯定会使用memcpy() ...它会更快,因为标准库函数使用编译器内在函数或手动编码汇编,以便大大加快将一个字节缓冲区复制到另一个缓冲区的速度在某种程度上,它可以针对您的处理器平台进行优化。这比for-loop要快得多......

例如:

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);