Конкатенация буфера (unsigned char *) в C - PullRequest
2 голосов
/ 05 апреля 2011

Вероятно, это очень простой вопрос для разработчика на C, однако я новичок в C и еще не полностью понял все концепции, стоящие за ним. Итак, прямо сейчас я использую этот код для объединения двух буферов (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 ]

3 голосов
/ 05 апреля 2011

Вместо того, чтобы использовать цикл, вы можете использовать memcpy, что намного быстрее, т. Е .:

memcpy(beatData.data, audioData.data, audioData.size);
2 голосов
/ 06 апреля 2011

Я бы определенно использовал 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);
2 голосов
/ 05 апреля 2011

Имеет смысл заменить эти 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...