Sprout/sprout/compost/sources/source.hpp

90 lines
2.7 KiB
C++
Raw Normal View History

2013-08-08 09:54:33 +00:00
/*=============================================================================
Copyright (c) 2011-2013 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_COMPOST_SOURCES_SOURCE_HPP
#define SPROUT_COMPOST_SOURCES_SOURCE_HPP
#include <cstddef>
#include <sprout/config.hpp>
2013-02-07 14:12:57 +00:00
#include <sprout/array/array.hpp>
//
// COMPOST_LOAD_SOURCE
//
#define COMPOST_LOAD_SOURCE <sprout/compost/load/source.hpp>
//
// COMPOST_SRC_VERSION
//
#define COMPOST_SRC_VERSION(NUM) NUM
namespace sprout {
namespace compost {
namespace sources {
//
// version_type
//
typedef unsigned long version_type;
//
// info_type
//
struct info_type {
public:
std::uint16_t format_tag; // <20>t<EFBFBD>H<EFBFBD>[<5B>}<7D>b<EFBFBD>gID
std::uint16_t channels; // <20>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD>
std::uint32_t samples_per_sec; // <20>T<EFBFBD><54><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD>[<5B>g
std::uint32_t bytes_per_sec; // <20>f<EFBFBD>[<5B>^<5E><><EFBFBD>x (Byte/sec)
std::uint16_t block_size; // <20>u<EFBFBD><75><EFBFBD>b<EFBFBD>N<EFBFBD>T<EFBFBD>C<EFBFBD>Y (Byte/sample*<2A>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD>)
std::uint16_t bits_per_sample; // <20>T<EFBFBD><54><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃r<CC83>b<EFBFBD>g<EFBFBD><67> (bit/sample)
std::size_t size; // <20>v<EFBFBD>f<EFBFBD><66>
};
//
// sound_type
//
template<std::size_t Size, typename Elem = double>
struct sound_type {
public:
typedef Elem element_type;
typedef element_type value_type;
typedef std::size_t size_type;
SPROUT_STATIC_CONSTEXPR size_type static_size = Size;
typedef sprout::array<value_type, static_size> elements_type;
private:
elements_type elements_;
public:
template<typename... Elems>
SPROUT_CONSTEXPR sound_type(info_type const& info, Elems const&... elems)
: elements_{{
2012-11-24 06:57:50 +00:00
(info.bits_per_sample == 8 ? elems / static_cast<value_type>(0x80) - 1
: elems / static_cast<value_type>(0x8000)
)...
}}
{
static_assert(sizeof...(Elems) == static_size, "sound_type<>: unmatch source size");
}
SPROUT_CONSTEXPR value_type const&
operator()(size_type x) const {
return elements_[x];
}
SPROUT_CONSTEXPR size_type
size() const {
return static_size;
}
SPROUT_CONSTEXPR elements_type const&
elements() const {
return elements_;
}
};
template<std::size_t Size, typename Elem>
SPROUT_CONSTEXPR_OR_CONST typename sprout::compost::sources::sound_type<Size, Elem>::size_type
sprout::compost::sources::sound_type<Size, Elem>::static_size;
} // namespace sources
} // namespace compost
} // namespace sprout
#endif // #ifndef SPROUT_COMPOST_SOURCES_SOURCE_HPP