diff options
author | Max Kellermann <max@duempel.org> | 2009-01-07 18:53:36 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-01-07 18:53:36 +0100 |
commit | b40428b3fd284f172da0ae630559176727026599 (patch) | |
tree | fd5399b38e5bf251e5459e01483bbc3cda01f832 /src/pcm_utils.c | |
parent | 8b19c74e8eb0036c697010d56ed1ee9b92facb72 (diff) | |
download | mpd-b40428b3fd284f172da0ae630559176727026599.tar.gz mpd-b40428b3fd284f172da0ae630559176727026599.tar.xz mpd-b40428b3fd284f172da0ae630559176727026599.zip |
pcm_utils: moved conversion code to pcm_convert.c
All what's left in pcm_utils.h is the pcm_range() utility function,
which is only used internally by pcm_volume and pcm_mix.
Diffstat (limited to 'src/pcm_utils.c')
-rw-r--r-- | src/pcm_utils.c | 158 |
1 files changed, 0 insertions, 158 deletions
diff --git a/src/pcm_utils.c b/src/pcm_utils.c deleted file mode 100644 index 69add6073..000000000 --- a/src/pcm_utils.c +++ /dev/null @@ -1,158 +0,0 @@ -/* the Music Player Daemon (MPD) - * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) - * This project's homepage is: 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "pcm_utils.h" -#include "pcm_channels.h" -#include "pcm_format.h" -#include "conf.h" -#include "audio_format.h" - -#include <assert.h> -#include <string.h> -#include <math.h> -#include <glib.h> - -#undef G_LOG_DOMAIN -#define G_LOG_DOMAIN "pcm" - -void pcm_convert_init(struct pcm_convert_state *state) -{ - memset(state, 0, sizeof(*state)); - - pcm_resample_init(&state->resample); - pcm_dither_24_init(&state->dither); -} - -static size_t -pcm_convert_16(const struct audio_format *src_format, - const void *src_buffer, size_t src_size, - const struct audio_format *dest_format, - int16_t *dest_buffer, - struct pcm_convert_state *state) -{ - const int16_t *buf; - size_t len; - size_t dest_size = pcm_convert_size(src_format, src_size, dest_format); - - assert(dest_format->bits == 16); - - buf = pcm_convert_to_16(&state->dither, src_format->bits, - src_buffer, src_size, &len); - if (!buf) - g_error("pcm_convert_to_16() failed"); - - if (src_format->channels != dest_format->channels) { - buf = pcm_convert_channels_16(dest_format->channels, - src_format->channels, - buf, len, &len); - if (!buf) - g_error("pcm_convert_channels_16() failed"); - } - - if (src_format->sample_rate == dest_format->sample_rate) { - assert(dest_size >= len); - memcpy(dest_buffer, buf, len); - } else { - len = pcm_resample_16(dest_format->channels, - src_format->sample_rate, buf, len, - dest_format->sample_rate, - dest_buffer, dest_size, - &state->resample); - } - - return len; -} - -static size_t -pcm_convert_24(const struct audio_format *src_format, - const void *src_buffer, size_t src_size, - const struct audio_format *dest_format, - int32_t *dest_buffer, - struct pcm_convert_state *state) -{ - const int32_t *buf; - size_t len; - size_t dest_size = pcm_convert_size(src_format, src_size, dest_format); - - assert(dest_format->bits == 24); - - buf = pcm_convert_to_24(src_format->bits, - src_buffer, src_size, &len); - if (!buf) - g_error("pcm_convert_to_24() failed"); - - if (src_format->channels != dest_format->channels) { - buf = pcm_convert_channels_24(dest_format->channels, - src_format->channels, - buf, len, &len); - if (!buf) - g_error("pcm_convert_channels_24() failed"); - } - - if (src_format->sample_rate == dest_format->sample_rate) { - assert(dest_size >= len); - memcpy(dest_buffer, buf, len); - } else { - len = pcm_resample_24(dest_format->channels, - src_format->sample_rate, buf, len, - dest_format->sample_rate, - (int32_t*)dest_buffer, dest_size, - &state->resample); - } - - return len; -} - -/* outFormat bits must be 16 and channels must be 1 or 2! */ -size_t pcm_convert(const struct audio_format *inFormat, - const char *src, size_t src_size, - const struct audio_format *outFormat, - char *outBuffer, - struct pcm_convert_state *convState) -{ - switch (outFormat->bits) { - case 16: - return pcm_convert_16(inFormat, src, src_size, - outFormat, (int16_t*)outBuffer, - convState); - case 24: - return pcm_convert_24(inFormat, src, src_size, - outFormat, (int32_t*)outBuffer, - convState); - - default: - g_error("cannot convert to %u bit\n", outFormat->bits); - } -} - -size_t pcm_convert_size(const struct audio_format *inFormat, size_t src_size, - const struct audio_format *outFormat) -{ - const double ratio = (double)outFormat->sample_rate / - (double)inFormat->sample_rate; - size_t dest_size = src_size; - - /* no partial frames allowed */ - assert((src_size % audio_format_frame_size(inFormat)) == 0); - - dest_size /= audio_format_frame_size(inFormat); - dest_size = ceil((double)dest_size * ratio); - dest_size *= audio_format_frame_size(outFormat); - - return dest_size; -} |