FormatConverter.cxx 2.25 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright (C) 2003-2014 The Music Player Daemon Project
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 * 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 "FormatConverter.hxx"
#include "PcmFormat.hxx"
23
#include "Domain.hxx"
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#include "util/ConstBuffer.hxx"
#include "util/Error.hxx"

#include <assert.h>

bool
PcmFormatConverter::Open(SampleFormat _src_format, SampleFormat _dest_format,
			 gcc_unused Error &error)
{
	assert(_src_format != SampleFormat::UNDEFINED);
	assert(_dest_format != SampleFormat::UNDEFINED);

	src_format = _src_format;
	dest_format = _dest_format;
	return true;
}

void
PcmFormatConverter::Close()
{
#ifndef NDEBUG
	src_format = SampleFormat::UNDEFINED;
	dest_format = SampleFormat::UNDEFINED;
#endif
}

ConstBuffer<void>
PcmFormatConverter::Convert(ConstBuffer<void> src, Error &error)
{
	switch (dest_format) {
	case SampleFormat::UNDEFINED:
		assert(false);
		gcc_unreachable();

	case SampleFormat::S8:
	case SampleFormat::DSD:
60 61 62 63 64
		error.Format(pcm_domain,
			     "PCM conversion from %s to %s is not implemented",
			     sample_format_to_string(src_format),
			     sample_format_to_string(dest_format));
		return nullptr;
65 66

	case SampleFormat::S16:
67 68 69
		return pcm_convert_to_16(buffer, dither,
					 src_format,
					 src).ToVoid();
70 71

	case SampleFormat::S24_P32:
72 73 74
		return pcm_convert_to_24(buffer,
					 src_format,
					 src).ToVoid();
75 76

	case SampleFormat::S32:
77 78 79
		return pcm_convert_to_32(buffer,
					 src_format,
					 src).ToVoid();
80 81

	case SampleFormat::FLOAT:
82 83 84
		return pcm_convert_to_float(buffer,
					    src_format,
					    src).ToVoid();
85 86
	}

87 88
	assert(false);
	gcc_unreachable();
89
}