39 template <
typename InputBufferFormat,
typename OutputBufferFormat,
typename ContextType>
43 static_assert((InputBufferFormat::ChannelCount == OutputBufferFormat::ChannelCount) || (InputBufferFormat::ChannelCount == 1),
"Multiple input channels not matching multiple output channels.");
56 BindOperatorChains<>(buffer, range);
71 TransferSamples<>(buffer + bufferIndex, index);
74 return rangeToIterate;
79 UnbindOperatorChains<>();
87 template <
size_t Index = 0>
90 using OperatorChainToBind = std::tuple_element_t<Index, OperatorChainTuple>;
93 BindOperatorChains<Index + 1>(buffer, range);
96 template <
size_t Index = 0>
101 template <
typename Operator,
typename Enable =
void>
109 template <
typename Operator>
114 op.Bind(buffer, range);
118 template <
typename Operator,
typename Enable =
void>
128 template <
typename Operator>
135 using InputSourceType = std::remove_reference_t<decltype(op.GetInputSource())>;
141 template <
size_t Index = 0>
142 std::enable_if_t<(Index < std::tuple_size<OperatorChainTuple>::value) && (std::tuple_size<OperatorChainTuple>::value == 1)>
TransferSamples(
OutputSampleType* buffer,
size_t inputIndex)
152 template <
size_t Index = 0>
153 std::enable_if_t<(Index < std::tuple_size<OperatorChainTuple>::value) && (std::tuple_size<OperatorChainTuple>::value > 1)>
TransferSamples(
OutputSampleType* buffer,
size_t inputIndex)
156 TransferSamples<Index + 1>(buffer, inputIndex);
160 template <
size_t Index = 0>
165 template <
size_t Index = 0>
166 std::enable_if_t<Index < std::tuple_size<OperatorChainTuple>::value> UnbindOperatorChains()
168 using OperatorChainToUnbind = std::tuple_element_t<Index, OperatorChainTuple>;
171 UnbindOperatorChains<Index + 1>();
175 template <
size_t Index = 0>
176 std::enable_if_t<Index >= std::tuple_size<OperatorChainTuple>::value> UnbindOperatorChains()
180 template <
typename Operator,
typename Enable =
void>
183 static void UnbindOperator(Operator& op)
188 template <
typename Operator>
189 struct Unbinder<Operator,
std::enable_if_t<std::is_void<decltype(std::declval<Operator>().Unbind())>::value>>
197 template <
typename Operator,
typename Enable =
void>
202 Unbinder<Operator>::UnbindOperator(op);
206 template <
typename Operator>
211 Unbinder<Operator>::UnbindOperator(op);
213 using InputSourceType = std::remove_reference_t<decltype(op.GetInputSource())>;
220 template <
typename InputBufferFormat,
typename OutputBufferFormat,
typename ContextType>
static void RecurseAndUnbind(Operator &op)
Definition: audioconvertpipeline.h:209
typename OperatorChainTupleBuilder< ContextType, InputBufferFormat, OutputBufferFormat, InputBufferFormat::ChannelCount >::Type BuildOperatorChainTuple
Definition: operatorchainbuilder.h:263
SampleRange GetOutputSampleRange() const
Definition: audioconvertpipeline.h:59
Definition: audioconvertpipeline.h:119
BuildOperatorChainTuple< AudioConvertContext< AudioConvertOptions >, InputBufferFormat, OutputBufferFormat > OperatorChainTuple
Definition: audioconvertpipeline.h:83
AudioConvertPipeline(ContextType &context)
Definition: audioconvertpipeline.h:50
Definition: cpp11transition.h:22
static constexpr size_t OutputChannelCount
Definition: audioconvertpipeline.h:45
static void BindOperator(Operator &op, const InputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:112
size_t sampleCount
Definition: dsputilities.h:80
Definition: audioconvertpipeline.h:198
std::enable_if_t<(Index< std::tuple_size< OperatorChainTuple >::value) &&(std::tuple_size< OperatorChainTuple >::value > 1)> TransferSamples(OutputSampleType *buffer, size_t inputIndex)
Definition: audioconvertpipeline.h:153
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
OperatorChainTuple mOperatorChains
Definition: audioconvertpipeline.h:85
typename InputBufferFormat::SampleType InputSampleType
Definition: audioconvertpipeline.h:47
typename OutputBufferFormat::SampleType OutputSampleType
Definition: audioconvertpipeline.h:48
Definition: dsputilities.h:60
static constexpr size_t InputChannelCount
Definition: audioconvertpipeline.h:44
static void RecurseAndBind(Operator &op, const InputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:121
void BindInputBuffer(const InputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:54
size_t startIndex
Definition: dsputilities.h:75
auto MakeAudioConvertPipeline(ContextType &context)
Definition: audioconvertpipeline.h:221
static void RecurseAndUnbind(Operator &op)
Definition: audioconvertpipeline.h:200
SampleRange IntersectSampleRanges(SampleRange firstRange, SampleRange secondRange)
Definition: dsputilities.h:87
static void UnbindOperator(Operator &op)
Definition: audioconvertpipeline.h:191
std::enable_if_t<(Index< std::tuple_size< OperatorChainTuple >::value) &&(std::tuple_size< OperatorChainTuple >::value==1)> TransferSamples(OutputSampleType *buffer, size_t inputIndex)
Definition: audioconvertpipeline.h:142
static void BindOperator(Operator &op, const InputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:104
std::enable_if_t< Index< std::tuple_size< OperatorChainTuple >::value > BindOperatorChains(const InputSampleType *buffer, SampleRange range) { using OperatorChainToBind=std::tuple_element_t< Index, OperatorChainTuple >;RecursiveBinder< OperatorChainToBind >::RecurseAndBind(std::get< Index >mOperatorChains), buffer, range);BindOperatorChains< Index+1 >buffer, range);} template< size_t Index=0 > std::enable_if_t< Index >=std::tuple_size< OperatorChainTuple >::value > BindOperatorChains(const InputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:97
Definition: audioconvertpipeline.h:40
typename MakeVoid< Arg >::Type VoidType
Definition: coreutilities.h:175
Definition: audioconvertpipeline.h:102
SampleRange TransferToOutputBuffer(OutputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:64
void UnbindInputBuffer()
Definition: audioconvertpipeline.h:77
static void RecurseAndBind(Operator &op, const InputSampleType *buffer, SampleRange range)
Definition: audioconvertpipeline.h:131