tracktion-engine 3.0-10-g034fdde4aa5
Tracktion Engine — High level data model for audio applications

« « « Anklang Documentation
Loading...
Searching...
No Matches
tracktion_AudioFormatManager.cpp
Go to the documentation of this file.
1 /*
2 ,--. ,--. ,--. ,--.
3 ,-' '-.,--.--.,--,--.,---.| |,-.,-' '-.`--' ,---. ,--,--, Copyright 2024
4 '-. .-'| .--' ,-. | .--'| /'-. .-',--.| .-. || \ Tracktion Software
5 | | | | \ '-' \ `--.| \ \ | | | |' '-' '| || | Corporation
6 `---' `--' `--`--'`---'`--'`--' `---' `--' `---' `--''--' www.tracktion.com
7
8 Tracktion Engine uses a GPL/commercial licence - see LICENCE.md for details.
9*/
10
11namespace tracktion { inline namespace engine
12{
13
14AudioFileFormatManager::AudioFileFormatManager()
15{
17
18 // NB default must be first!
19
21 readFormats.add (wavFormat.get());
22 writeFormats.add (wavFormat.get());
23
25 readFormats.add (aiffFormat.get());
26 writeFormats.add (aiffFormat.get());
27
29 readFormats.add (floatFormat.get());
30
32 readFormats.add (oggFormat.get());
33 writeFormats.add (oggFormat.get());
34
36 readFormats.add (flacFormat.get());
37 writeFormats.add (flacFormat.get());
38
39 #if TRACKTION_ENABLE_REX
41 readFormats.add (rexFormat.get());
42 #endif
43
44 #if JUCE_MAC || JUCE_IOS
45 nativeAudioFormat = std::make_unique<juce::CoreAudioFormat>();
46 readFormats.add (nativeAudioFormat.get());
47 #elif JUCE_WINDOWS
49 readFormats.add (nativeAudioFormat.get());
50 #endif
51
52 #if JUCE_USE_MP3AUDIOFORMAT
54 readFormats.add (mp3ReadFormat.get());
55 #endif
56
57 // NB when adding new formats -
58 // this bit assumes all writable formats are also readable
59 allFormats = readFormats;
60
61
62 readFormatManager.registerFormat (new juce::WavAudioFormat(), true);
63 readFormatManager.registerFormat (new juce::AiffAudioFormat(), false);
64 readFormatManager.registerFormat (new FloatAudioFormat(), false);
65 readFormatManager.registerFormat (new juce::OggVorbisAudioFormat(), false);
66 readFormatManager.registerFormat (new juce::FlacAudioFormat(), false);
67
68 #if TRACKTION_ENABLE_REX
69 readFormatManager.registerFormat (new RexAudioFormat(), false);
70 #endif
71
72 #if JUCE_MAC || JUCE_IOS
73 readFormatManager.registerFormat (new juce::CoreAudioFormat(), false);
74 #elif JUCE_WINDOWS
75 readFormatManager.registerFormat (new juce::WindowsMediaAudioFormat(), false);
76 #endif
77
78 #if JUCE_USE_MP3AUDIOFORMAT
79 readFormatManager.registerFormat (new juce::MP3AudioFormat(), false);
80 #endif
81
82 writeFormatManager.registerFormat (new juce::WavAudioFormat(), true);
83 writeFormatManager.registerFormat (new juce::AiffAudioFormat(), false);
84 writeFormatManager.registerFormat (new FloatAudioFormat(), false);
85 writeFormatManager.registerFormat (new juce::OggVorbisAudioFormat(), false);
86 writeFormatManager.registerFormat (new juce::FlacAudioFormat(), false);
87
88 memoryMappedFormatManager.registerFormat (new juce::WavAudioFormat(), true);
89 memoryMappedFormatManager.registerFormat (new juce::AiffAudioFormat(), false);
90 memoryMappedFormatManager.registerFormat (new FloatAudioFormat(), false);
91}
92
93AudioFileFormatManager::~AudioFileFormatManager()
94{
96}
97
98void AudioFileFormatManager::addLameFormat (std::unique_ptr<juce::AudioFormat> lameForArray,
100{
101 if (lameFormat != nullptr || lameForArray == nullptr || lameForAccess == nullptr)
102 return;
103
104 lameFormat = std::move (lameForAccess);
105 writeFormats.add (lameForArray.get());
106 writeFormatManager.registerFormat (lameForArray.release(), false);
107}
108
109void AudioFileFormatManager::addFormat (std::function<juce::AudioFormat*()> formatCreator, bool isWritable, bool isMemoryMappable)
110{
111 jassert (formatCreator);
112
113 auto* af = additionalFormats.add (formatCreator());
114 readFormats.add (af);
115 allFormats.add (af);
116
117 readFormatManager.registerFormat (formatCreator(), false);
118
119 if (isWritable)
120 writeFormatManager.registerFormat (formatCreator(), false);
121
122 if (isMemoryMappable)
123 memoryMappedFormatManager.registerFormat (formatCreator(), false);
124}
125
126juce::AudioFormat* AudioFileFormatManager::getFormatFromFileName (const juce::File& f) const
127{
128 for (auto format : allFormats)
129 if (format->canHandleFile (f))
130 return format;
131
132 return {};
133}
134
135bool AudioFileFormatManager::canOpen (const juce::File& f) const
136{
137 return getFormatFromFileName (f) != nullptr;
138}
139
140juce::String AudioFileFormatManager::getValidFileExtensions() const
141{
142 return "wav;aiff;aif;ogg;mp3;mid;midi;flac;au;voc;caf;w64;rx2;rcy;rex;m4a;wfaf";
143}
144
145juce::AudioFormat* AudioFileFormatManager::getNamedFormat (const juce::String& formatName) const
146{
147 for (auto format : allFormats)
148 if (format->getFormatName() == formatName)
149 return format;
150
151 return getDefaultFormat();
152}
153
154}} // namespace tracktion { inline namespace engine
void add(const ElementType &newElement)
void registerFormat(AudioFormat *newFormat, bool makeThisTheDefaultFormat)
ObjectClass * add(ObjectClass *newObject)
T format(T... args)
T get(T... args)
T is_pointer_v
#define jassert(expression)
T release(T... args)
#define CRASH_TRACER
This macro adds the current location to a stack which gets logged if a crash happens.