OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
raw_stretcher.hpp
1#pragma once
2#include <ossia/dataflow/audio_port.hpp>
3#include <ossia/dataflow/graph_node.hpp>
4#include <ossia/dataflow/nodes/media.hpp>
5#include <ossia/dataflow/token_request.hpp>
6
7namespace ossia
8{
9
10struct raw_stretcher
11{
12 int64_t next_sample_to_read{};
13 raw_stretcher() noexcept = default;
14 raw_stretcher(const raw_stretcher&) noexcept = default;
15 raw_stretcher(raw_stretcher&&) noexcept = default;
16 raw_stretcher& operator=(const raw_stretcher&) noexcept = default;
17 raw_stretcher& operator=(raw_stretcher&&) noexcept = default;
18 raw_stretcher(int64_t pos) noexcept
19 : next_sample_to_read{pos}
20 {
21 }
22
23 [[nodiscard]] static constexpr int64_t start_delay() noexcept { return 0; }
24
25 void transport(int64_t date) { next_sample_to_read = date; }
26
27 template <typename T>
28 void
29 run(T& audio_fetcher, const ossia::token_request& t, const ossia::exec_state_facade e,
30 double tempo_ratio, double rate_ratio, const std::size_t chan,
31 const int64_t len, const int64_t samples_to_read, const int64_t samples_to_write,
32 const int64_t samples_offset, const ossia::mutable_audio_span<double>& ap) noexcept
33 {
34 // 1:1; only selected when material and graph rates match.
35 (void)rate_ratio;
36
37 if(t.forward())
38 {
39 double** output = (double**)alloca(sizeof(double*) * chan);
40 for(std::size_t i = 0; i < chan; i++)
41 output[i] = ap[i].data() + samples_offset;
42
43 audio_fetcher.fetch_audio(next_sample_to_read, samples_to_write, output);
44 next_sample_to_read += samples_to_write;
45 }
46 else
47 {
48 // Backward playback
49 double** output = (double**)alloca(sizeof(double*) * chan);
50 for(std::size_t i = 0; i < chan; i++)
51 output[i] = ap[i].data() + samples_offset;
52
53 audio_fetcher.fetch_audio_backward(next_sample_to_read, samples_to_write, output);
54 next_sample_to_read -= samples_to_write;
55 }
56 }
57};
58
59}
Definition git_info.h:7