FormatConverter.hxx 2.03 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright 2003-2017 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 23
 * 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_FORMAT_CONVERTER_HXX
#define MPD_PCM_FORMAT_CONVERTER_HXX

#include "check.h"
24
#include "SampleFormat.hxx"
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
#include "PcmBuffer.hxx"
#include "PcmDither.hxx"

#ifndef NDEBUG
#include <assert.h>
#endif

template<typename T> struct ConstBuffer;

/**
 * A class that converts samples from one format to another.
 */
class PcmFormatConverter {
	SampleFormat src_format, dest_format;

	PcmBuffer buffer;
	PcmDither dither;

public:
#ifndef NDEBUG
	PcmFormatConverter()
		:src_format(SampleFormat::UNDEFINED),
		 dest_format(SampleFormat::UNDEFINED) {}

	~PcmFormatConverter() {
		assert(src_format == SampleFormat::UNDEFINED);
		assert(dest_format == SampleFormat::UNDEFINED);
	}
#endif

	/**
	 * Opens the object, prepare for Convert().
	 *
58 59
	 * Throws std::runtime_error on error.
	 *
60 61 62
	 * @param src_format the sample format of incoming data
	 * @param dest_format the sample format of outgoing data
	 */
63
	void Open(SampleFormat src_format, SampleFormat dest_format);
64 65 66 67

	/**
	 * Closes the object.  After that, you may call Open() again.
	 */
68
	void Close() noexcept;
69 70 71 72 73

	/**
	 * Convert a block of PCM data.
	 *
	 * @param src the input buffer
74
	 * @return the destination buffer
75 76
	 */
	gcc_pure
77
	ConstBuffer<void> Convert(ConstBuffer<void> src) noexcept;
78 79 80
};

#endif