OSSIA
Open Scenario System for Interactive Application
sound_impl.hpp
1 #pragma once
2 #include <ossia/dataflow/audio_stretch_mode.hpp>
3 #include <ossia/dataflow/nodes/timestretch/raw_stretcher.hpp>
4 #include <ossia/dataflow/nodes/timestretch/repitch_stretcher.hpp>
5 #include <ossia/dataflow/nodes/timestretch/rubberband_stretcher.hpp>
6 #include <ossia/detail/variant.hpp>
7 
8 namespace ossia
9 {
10 struct resampler
11 {
12  void reset(
13  time_value date, ossia::audio_stretch_mode mode, std::size_t channels,
14  std::size_t fileSampleRate)
15  {
16  // TODO use the date parameter to buffer ! else transport won't work
17  switch(mode)
18  {
19  case audio_stretch_mode::None: {
20  if(auto s = ossia::get_if<ossia::raw_stretcher>(&m_stretch))
21  {
22  s->next_sample_to_read = date.impl;
23  }
24  else
25  {
26  m_stretch.emplace<raw_stretcher>(date.impl);
27  }
28  break;
29  }
30  case audio_stretch_mode::Repitch: {
31  if(auto s = ossia::get_if<ossia::repitch_stretcher>(&m_stretch);
32  s && s->repitchers.size() == channels)
33  {
34  s->next_sample_to_read = date.impl;
35  }
36  else
37  {
38  m_stretch.emplace<repitch_stretcher>(channels, 1024, date.impl);
39  }
40  break;
41  }
42  case audio_stretch_mode::RubberBandStandard:
43  case audio_stretch_mode::RubberBandPercussive:
44  case ossia::audio_stretch_mode::RubberBandStandardHQ:
45  case ossia::audio_stretch_mode::RubberBandPercussiveHQ: {
46  m_stretch.emplace<rubberband_stretcher>(
47  get_rubberband_preset(mode), channels, fileSampleRate, date.impl);
48  break;
49  }
50  }
51  }
52 
53  template <typename T>
54  void
55  run(T& audio_fetcher, const ossia::token_request& t, ossia::exec_state_facade e,
56  double tempo_ratio, std::size_t chan, std::size_t len, int64_t samples_to_read,
57  int64_t samples_to_write, int64_t samples_offset, ossia::audio_port& ap)
58  {
59  ossia::visit([&](auto& stretcher) {
60  stretcher.run(
61  audio_fetcher, t, e, tempo_ratio, chan, len, samples_to_read, samples_to_write,
62  samples_offset, ap);
63  });
64  }
65 
66  ossia::variant<raw_stretcher, rubberband_stretcher, repitch_stretcher> m_stretch;
67 };
68 
69 }
Definition: git_info.h:7