diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | src/pcm_byteswap.c | 75 | ||||
-rw-r--r-- | src/pcm_byteswap.h | 67 | ||||
-rw-r--r-- | src/pcm_export.c | 26 | ||||
-rw-r--r-- | src/pcm_export.h | 8 | ||||
-rw-r--r-- | test/test_pcm_all.h | 6 | ||||
-rw-r--r-- | test/test_pcm_byteswap.c | 64 | ||||
-rw-r--r-- | test/test_pcm_main.c | 2 |
8 files changed, 24 insertions, 226 deletions
diff --git a/Makefile.am b/Makefile.am index 8a014f13e..ecfb27de2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -405,7 +405,6 @@ libpcm_a_SOURCES = \ src/pcm_dsd.c src/pcm_dsd.h \ src/pcm_volume.c src/pcm_volume.h \ src/pcm_mix.c src/pcm_mix.h \ - src/pcm_byteswap.c src/pcm_byteswap.h \ src/pcm_channels.c src/pcm_channels.h \ src/pcm_pack.c src/pcm_pack.h \ src/pcm_format.c src/pcm_format.h \ @@ -1277,7 +1276,6 @@ test_test_pcm_SOURCES = \ test/test_pcm_dither.c \ test/test_pcm_pack.c \ test/test_pcm_channels.c \ - test/test_pcm_byteswap.c \ test/test_pcm_all.h \ test/test_pcm_main.c test_test_pcm_LDADD = \ diff --git a/src/pcm_byteswap.c b/src/pcm_byteswap.c deleted file mode 100644 index 0a7e2fbb6..000000000 --- a/src/pcm_byteswap.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2003-2012 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" -#include "pcm_byteswap.h" -#include "pcm_buffer.h" -#include "util/byte_reverse.h" - -#include <assert.h> - -const int16_t *pcm_byteswap_16(struct pcm_buffer *buffer, - const int16_t *src, size_t len) -{ - int16_t *buf = pcm_buffer_get(buffer, len); - - assert(buf != NULL); - - const uint8_t *src8 = (const uint8_t *)src; - const void *src_end = src8 + len; - - reverse_bytes_16((uint16_t *)buf, (const uint16_t *)src, src_end); - return buf; -} - -const int32_t *pcm_byteswap_32(struct pcm_buffer *buffer, - const int32_t *src, size_t len) -{ - int32_t *buf = pcm_buffer_get(buffer, len); - - assert(buf != NULL); - - const uint8_t *src8 = (const uint8_t *)src; - const void *src_end = src8 + len; - - reverse_bytes_32((uint32_t *)buf, (const uint32_t *)src, src_end); - return buf; -} - -const void * -pcm_byteswap(struct pcm_buffer *buffer, enum sample_format format, - const void *_src, size_t size) -{ - const uint8_t *const src = _src; - - if (size <= 1) - return src; - - size_t sample_size = sample_format_size(format); - if (sample_size <= 1) - return src; - - assert(size % sample_size == 0); - - uint8_t *dest = pcm_buffer_get(buffer, size); - assert(dest != NULL); - - reverse_bytes(dest, src, src + size, sample_size); - return dest; -} diff --git a/src/pcm_byteswap.h b/src/pcm_byteswap.h deleted file mode 100644 index 0836a2512..000000000 --- a/src/pcm_byteswap.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2003-2011 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPD_PCM_BYTESWAP_H -#define MPD_PCM_BYTESWAP_H - -#include "audio_format.h" - -#include <stdint.h> -#include <stddef.h> - -struct pcm_buffer; - -/** - * Changes the endianness of 16 bit PCM data. - * - * @param buffer the destination pcm_buffer object - * @param src the source PCM buffer - * @param src_size the number of bytes in #src - * @return the destination buffer - */ -const int16_t *pcm_byteswap_16(struct pcm_buffer *buffer, - const int16_t *src, size_t len); - -/** - * Changes the endianness of 32-bit (or 24-bit) PCM data. - * - * @param buffer the destination pcm_buffer object - * @param src the source PCM buffer - * @param src_size the number of bytes in #src - * @return the destination buffer - */ -const int32_t *pcm_byteswap_32(struct pcm_buffer *buffer, - const int32_t *src, size_t len); - -/** - * Changes the endianness of PCM data. - * - * @param buffer the destination pcm_buffer object - * @param format the sample format (both input and output) - * @param src the source PCM buffer - * @param src_size the number of bytes in #src - * @return the destination buffer, or NULL if the sample format is not - * supported - */ -G_GNUC_MALLOC -const void * -pcm_byteswap(struct pcm_buffer *buffer, enum sample_format format, - const void *src, size_t size); - -#endif diff --git a/src/pcm_export.c b/src/pcm_export.c index 4c08394ea..68b94b10a 100644 --- a/src/pcm_export.c +++ b/src/pcm_export.c @@ -19,7 +19,7 @@ #include "config.h" #include "pcm_export.h" -#include "pcm_byteswap.h" +#include "util/byte_reverse.h" void pcm_export_init(struct pcm_export_state *state) @@ -37,17 +37,31 @@ pcm_export_open(struct pcm_export_state *state, enum sample_format sample_format, bool reverse_endian) { - state->sample_format = sample_format; - state->reverse_endian = reverse_endian; + state->reverse_endian = 0; + if (reverse_endian) { + size_t sample_size = sample_format_size(sample_format); + assert(sample_size <= 0xff); + + if (sample_size > 1) + state->reverse_endian = sample_size; + } } const void * pcm_export(struct pcm_export_state *state, const void *data, size_t size, size_t *dest_size_r) { - if (state->reverse_endian) - data = pcm_byteswap(&state->reverse_buffer, - state->sample_format, data, size); + if (state->reverse_endian > 0) { + assert(state->reverse_endian >= 2); + + void *dest = pcm_buffer_get(&state->reverse_buffer, size); + assert(dest != NULL); + + const uint8_t *src = data, *src_end = src + size; + reverse_bytes(dest, src, src_end, state->reverse_endian); + + data = dest; + } *dest_size_r = size; return data; diff --git a/src/pcm_export.h b/src/pcm_export.h index 198b1d6a8..570092eb9 100644 --- a/src/pcm_export.h +++ b/src/pcm_export.h @@ -41,12 +41,12 @@ struct pcm_export_state { */ struct pcm_buffer reverse_buffer; - enum sample_format sample_format; - /** - * Export the samples in reverse byte order? + * Export the samples in reverse byte order? A non-zero value + * means the option is enabled and represents the size of each + * sample (2 or bigger). */ - bool reverse_endian; + uint8_t reverse_endian; }; /** diff --git a/test/test_pcm_all.h b/test/test_pcm_all.h index 2217baf39..14e4c2980 100644 --- a/test/test_pcm_all.h +++ b/test/test_pcm_all.h @@ -38,10 +38,4 @@ test_pcm_channels_16(void); void test_pcm_channels_32(void); -void -test_pcm_byteswap_16(void); - -void -test_pcm_byteswap_32(void); - #endif diff --git a/test/test_pcm_byteswap.c b/test/test_pcm_byteswap.c deleted file mode 100644 index f49991606..000000000 --- a/test/test_pcm_byteswap.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2003-2011 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" -#include "test_pcm_all.h" -#include "pcm_byteswap.h" -#include "pcm_buffer.h" -#include "test_glib_compat.h" - -#include <glib.h> - -void -test_pcm_byteswap_16(void) -{ - enum { N = 256 }; - int16_t src[N]; - - for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) - src[i] = g_random_int(); - - struct pcm_buffer buffer; - pcm_buffer_init(&buffer); - - const int16_t *dest = pcm_byteswap_16(&buffer, src, sizeof(src)); - g_assert(dest != NULL); - for (unsigned i = 0; i < N; ++i) - g_assert_cmpint(dest[i], ==, - (int16_t)GUINT16_SWAP_LE_BE(src[i])); -} - -void -test_pcm_byteswap_32(void) -{ - enum { N = 256 }; - int32_t src[N]; - - for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) - src[i] = g_random_int(); - - struct pcm_buffer buffer; - pcm_buffer_init(&buffer); - - const int32_t *dest = pcm_byteswap_32(&buffer, src, sizeof(src)); - g_assert(dest != NULL); - for (unsigned i = 0; i < N; ++i) - g_assert_cmpint(dest[i], ==, - (int32_t)GUINT32_SWAP_LE_BE(src[i])); -} diff --git a/test/test_pcm_main.c b/test/test_pcm_main.c index 4e64b443f..7047b5251 100644 --- a/test/test_pcm_main.c +++ b/test/test_pcm_main.c @@ -32,8 +32,6 @@ main(int argc, char **argv) g_test_add_func("/pcm/pack/unpack24", test_pcm_unpack_24); g_test_add_func("/pcm/channels/16", test_pcm_channels_16); g_test_add_func("/pcm/channels/32", test_pcm_channels_32); - g_test_add_func("/pcm/byteswap/16", test_pcm_byteswap_16); - g_test_add_func("/pcm/byteswap/32", test_pcm_byteswap_32); g_test_run(); } |