diff options
Diffstat (limited to 'src/encoder/wave_encoder.c')
-rw-r--r-- | src/encoder/wave_encoder.c | 56 |
1 files changed, 27 insertions, 29 deletions
diff --git a/src/encoder/wave_encoder.c b/src/encoder/wave_encoder.c index 8cf8912db..e66cc1917 100644 --- a/src/encoder/wave_encoder.c +++ b/src/encoder/wave_encoder.c @@ -20,17 +20,16 @@ #include "config.h" #include "encoder_api.h" #include "encoder_plugin.h" +#include "pcm_buffer.h" #include <assert.h> #include <string.h> -#define MAX_BUFFER 32768 - struct wave_encoder { struct encoder encoder; unsigned bits; - uint8_t buffer[MAX_BUFFER]; + struct pcm_buffer buffer; size_t buffer_length; }; @@ -93,6 +92,7 @@ wave_encoder_init(G_GNUC_UNUSED const struct config_param *param, encoder = g_new(struct wave_encoder, 1); encoder_struct_init(&encoder->encoder, &wave_encoder_plugin); + pcm_buffer_init(&encoder->buffer); return &encoder->encoder; } @@ -102,6 +102,7 @@ wave_encoder_finish(struct encoder *_encoder) { struct wave_encoder *encoder = (struct wave_encoder *)_encoder; + pcm_buffer_deinit(&encoder->buffer); g_free(encoder); } @@ -111,11 +112,14 @@ wave_encoder_open(struct encoder *_encoder, G_GNUC_UNUSED GError **error) { struct wave_encoder *encoder = (struct wave_encoder *)_encoder; + void *buffer; encoder->bits = audio_format->bits; + buffer = pcm_buffer_get(&encoder->buffer, sizeof(struct wave_header) ); + /* create PCM wave header in initial buffer */ - fill_wave_header((struct wave_header *) encoder->buffer, + fill_wave_header((struct wave_header *) buffer, audio_format->channels, audio_format->bits, audio_format->sample_rate, @@ -126,47 +130,43 @@ wave_encoder_open(struct encoder *_encoder, } static inline size_t -pcm16_to_wave(void *dst, const void *src, size_t length) +pcm16_to_wave(uint16_t *dst16, const uint16_t *src16, size_t length) { - uint32_t scnt; - const uint16_t *src16 = (const uint16_t *) src; - uint16_t *dst16 = (uint16_t *) dst; - - for(scnt = length >> 1; scnt>0; scnt--){ + size_t cnt = length >> 1; + while (cnt > 0) { *dst16++ = GUINT16_TO_LE(*src16++); + cnt--; } return length; } static inline size_t -pcm32_to_wave(void *dst, const void *src, size_t length) +pcm32_to_wave(uint32_t *dst32, const uint32_t *src32, size_t length) { - uint32_t scnt; - const uint32_t *src32 = (const uint32_t *) src; - uint32_t *dst32 = (uint32_t *) dst; - - for(scnt = length >> 2; scnt>0; scnt--){ + size_t cnt = length >> 2; + while (cnt > 0){ *dst32++ = GUINT32_TO_LE(*src32++); + cnt--; } return length; } static inline size_t -pcm24_to_wave(void *dst, const void *src, size_t length) +pcm24_to_wave(uint8_t *dst8, const uint32_t *src32, size_t length) { - uint32_t scnt, value; - const uint32_t *src32 = (const uint32_t *) src; - uint8_t *dst8 = (uint8_t *) dst; + uint32_t value; + uint8_t *dst_old = dst8; - for(scnt = length >> 2; scnt>0; scnt--){ + length = length >> 2; + while (length > 0){ value = *src32++; *dst8++ = (value) & 0xFF; *dst8++ = (value >> 8) & 0xFF; *dst8++ = (value >> 16) & 0xFF; + length--; } //correct buffer length - length = dst8 - ((uint8_t *)dst); - return length; + return (dst8 - dst_old); } static bool @@ -177,9 +177,7 @@ wave_encoder_write(struct encoder *_encoder, struct wave_encoder *encoder = (struct wave_encoder *)_encoder; void *dst; - assert(length + encoder->buffer_length < MAX_BUFFER); - - dst = encoder->buffer + encoder->buffer_length; + dst = pcm_buffer_get(&encoder->buffer, encoder->buffer_length + length); #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) switch (encoder->bits) { @@ -219,15 +217,15 @@ static size_t wave_encoder_read(struct encoder *_encoder, void *dest, size_t length) { struct wave_encoder *encoder = (struct wave_encoder *)_encoder; + uint8_t *buffer = pcm_buffer_get(&encoder->buffer, encoder->buffer_length ); if (length > encoder->buffer_length) length = encoder->buffer_length; - memcpy(dest, encoder->buffer, length); + memcpy(dest, buffer, length); encoder->buffer_length -= length; - memmove(encoder->buffer, encoder->buffer + length, - encoder->buffer_length); + memmove(buffer, buffer + length, encoder->buffer_length); return length; } |