File: TempoChange.cpp

package info (click to toggle)
audacity 3.7.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 125,252 kB
  • sloc: cpp: 358,238; ansic: 75,458; lisp: 7,761; sh: 3,410; python: 1,503; xml: 1,385; perl: 854; makefile: 122
file content (55 lines) | stat: -rw-r--r-- 1,496 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
/*  SPDX-License-Identifier: GPL-2.0-or-later */
/*!********************************************************************

  Audacity: A Digital Audio Editor

  TempoChange.cpp

  PaulLicameli

**********************************************************************/
#include "TempoChange.h"
#include "Channel.h"

namespace {
struct ProjectTempo : ClientData::Cloneable<> {
   ~ProjectTempo() = default;
   std::unique_ptr<ClientData::Cloneable<>> Clone() const override
   { return std::make_unique<ProjectTempo>(*this); }

   static ProjectTempo &Get(ChannelGroup &group);
   static const ProjectTempo &Get(const ChannelGroup &group);

   std::optional<double> mProjectTempo;
};

const ChannelGroup::Attachments::RegisteredFactory
projectTempoDataFactory{
   [](auto &) { return std::make_unique<ProjectTempo>(); } };

ProjectTempo &ProjectTempo::Get(ChannelGroup &group)
{
   return group.Attachments::Get<ProjectTempo>(projectTempoDataFactory);
}

const ProjectTempo &ProjectTempo::Get(const ChannelGroup &group)
{
   return Get(const_cast<ChannelGroup&>(group));
}
}

void DoProjectTempoChange(ChannelGroup &group, double newTempo)
{
   auto &oldTempo = ProjectTempo::Get(group).mProjectTempo;
   OnProjectTempoChange::Call(group, oldTempo, newTempo);
   oldTempo = newTempo;
}

const std::optional<double>& GetProjectTempo(const ChannelGroup &group)
{
   return ProjectTempo::Get(group).mProjectTempo;
}

DEFINE_ATTACHED_VIRTUAL(OnProjectTempoChange) {
   return [](auto&, auto&, auto){ };
}