C: mem. for audio: optimize; use the same function
Memory allocation for the audio buffer: 1. Instant mode: Use `malloc` instead of `calloc` 2. Allocate heap memory before the loop to speed up audio generation, free the memory after the loop 3. Extract the memory allocation into a macro
This commit is contained in:
parent
edd95e5af0
commit
551933cddd
@ -52,6 +52,17 @@ const char* ANSI_CLEAR = __ANSI_CLEAR_STRING;
|
||||
#define unsigned_to_signed(x) (x - PCM_COEFFICIENT)
|
||||
#define signed_to_unsigned(x) (x + PCM_COEFFICIENT)
|
||||
|
||||
// macros
|
||||
#define ALLOCATE_MEMORY(nmemb) \
|
||||
SAMPLE_TYPE* buffer = malloc( \
|
||||
(size_t) nmemb * sizeof(SAMPLE_TYPE) \
|
||||
); \
|
||||
\
|
||||
if (buffer == NULL) { \
|
||||
perror("malloc"); \
|
||||
return EXIT_FAILURE; \
|
||||
}
|
||||
|
||||
// global variables
|
||||
#define SILENT_MODE `silent_mode`
|
||||
#define VERBOSE_MODE `verbose_mode`
|
||||
@ -198,28 +209,24 @@ main(void)
|
||||
}
|
||||
|
||||
const size_t MAX = (PRODUCT + (BLOCK_SIZE - 1)) / BLOCK_SIZE;
|
||||
#endif
|
||||
|
||||
// * allocate heap for sample data
|
||||
#if SEQUENTIAL_MODE
|
||||
size_t calc_block_size = BLOCK_SIZE;
|
||||
ALLOCATE_MEMORY(calc_block_size)
|
||||
#else
|
||||
ALLOCATE_MEMORY(PRODUCT)
|
||||
#endif
|
||||
|
||||
#if SEQUENTIAL_MODE
|
||||
size_t w = 0;
|
||||
for (size_t seq = 0; seq < MAX; seq++) {
|
||||
size_t calc_block_size = BLOCK_SIZE;
|
||||
if ((w + BLOCK_SIZE) >= PRODUCT)
|
||||
calc_block_size = PRODUCT - w;
|
||||
#else
|
||||
do {
|
||||
#endif
|
||||
// * allocate heap for sample data
|
||||
SAMPLE_TYPE* buffer =
|
||||
#if SEQUENTIAL_MODE
|
||||
malloc((size_t) calc_block_size *
|
||||
#else
|
||||
calloc(PRODUCT,
|
||||
#endif
|
||||
sizeof(SAMPLE_TYPE));
|
||||
|
||||
if (buffer == NULL) {
|
||||
perror("calloc");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// * bytebeat generating loop
|
||||
const uintmax_t product_minus_1 = PRODUCT - 1,
|
||||
@ -324,14 +331,14 @@ main(void)
|
||||
#if SEQUENTIAL_MODE
|
||||
fflush(output_file);
|
||||
#endif
|
||||
|
||||
// * free allocated heap
|
||||
free(buffer);
|
||||
}
|
||||
#if !SEQUENTIAL_MODE
|
||||
while (0);
|
||||
#endif
|
||||
|
||||
// * free allocated heap
|
||||
free(buffer);
|
||||
|
||||
// 6. close file
|
||||
fclose(output_file);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user