Skip to content

Commit 84eeb34

Browse files
committed
- Restructured project to use CMake
- Moved tests to doctest
1 parent 01ab4e2 commit 84eeb34

59 files changed

Lines changed: 7088 additions & 1035 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ xcuserdata/
2424

2525

2626
*.pyc
27+
.vscode/
2728

2829
audio-write-tests

CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#===============================================================================
2+
cmake_minimum_required (VERSION 3.12)
3+
4+
project ("AudioFile" VERSION 1.0.7
5+
DESCRIPTION "A simple C++ library for reading and writing audio files."
6+
HOMEPAGE_URL "https://github.com/adamstark/AudioFile")
7+
8+
#===============================================================================
9+
include (GNUInstallDirs)
10+
11+
#===============================================================================
12+
add_library (${PROJECT_NAME} INTERFACE)
13+
14+
#===============================================================================
15+
target_include_directories (
16+
${PROJECT_NAME}
17+
INTERFACE $<BUILD_INTERFACE:${${PROJECT_NAME}_SOURCE_DIR}>
18+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
19+
20+
#===============================================================================
21+
target_compile_features (${PROJECT_NAME} INTERFACE cxx_std_11)
22+
23+
#===============================================================================
24+
add_subdirectory (examples)
25+
26+
enable_testing()
27+
add_subdirectory (tests)
28+
29+
#===============================================================================
30+
set (CMAKE_SUPPRESS_REGENERATION true)

examples/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
include_directories (${AudioFile_SOURCE_DIR})
2+
3+
add_definitions (-DPROJECT_BINARY_DIR="${CMAKE_CURRENT_BINARY_DIR}")
4+
file (COPY test-audio.wav DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
5+
6+
add_executable (Examples examples.cpp)
7+
target_link_libraries (Examples AudioFile)

examples/examples.cpp

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#include <iostream>
2+
#include <filesystem>
3+
#include <AudioFile.h>
4+
5+
//=======================================================================
6+
namespace examples
7+
{
8+
void writeSineWaveToAudioFile();
9+
void loadAudioFileAndPrintSummary();
10+
void loadAudioFileAndProcessSamples();
11+
}
12+
13+
//=======================================================================
14+
int main()
15+
{
16+
//---------------------------------------------------------------
17+
/** Writes a sine wave to an audio file */
18+
examples::writeSineWaveToAudioFile();
19+
20+
//---------------------------------------------------------------
21+
/** Loads an audio file and prints key details to the console*/
22+
examples::loadAudioFileAndPrintSummary();
23+
24+
//---------------------------------------------------------------
25+
/** Loads an audio file and processess the samples */
26+
examples::loadAudioFileAndProcessSamples();
27+
28+
return 0;
29+
}
30+
31+
//=======================================================================
32+
namespace examples
33+
{
34+
//=======================================================================
35+
void writeSineWaveToAudioFile()
36+
{
37+
//---------------------------------------------------------------
38+
std::cout << "**********************" << std::endl;
39+
std::cout << "Running Example: Write Sine Wave To Audio File" << std::endl;
40+
std::cout << "**********************" << std::endl << std::endl;
41+
42+
//---------------------------------------------------------------
43+
// 1. Let's setup our AudioFile instance
44+
45+
AudioFile<float> a;
46+
a.setNumChannels (2);
47+
a.setNumSamplesPerChannel (44100);
48+
49+
//---------------------------------------------------------------
50+
// 2. Create some variables to help us generate a sine wave
51+
52+
const float sampleRate = 44100.f;
53+
const float frequencyInHz = 440.f;
54+
55+
//---------------------------------------------------------------
56+
// 3. Write the samples to the AudioFile sample buffer
57+
58+
for (int i = 0; i < a.getNumSamplesPerChannel(); i++)
59+
{
60+
for (int channel = 0; channel < a.getNumChannels(); channel++)
61+
{
62+
a.samples[channel][i] = sin ((static_cast<float> (i) / sampleRate) * frequencyInHz * 2.f * M_PI);
63+
}
64+
}
65+
66+
//---------------------------------------------------------------
67+
// 4. Save the AudioFile
68+
69+
std::string filePath = "sine-wave.wav"; // change this to somewhere useful for you
70+
a.save ("sine-wave.wav", AudioFileFormat::Wave);
71+
}
72+
73+
//=======================================================================
74+
void loadAudioFileAndPrintSummary()
75+
{
76+
//---------------------------------------------------------------
77+
std::cout << "**********************" << std::endl;
78+
std::cout << "Running Example: Load Audio File and Print Summary" << std::endl;
79+
std::cout << "**********************" << std::endl << std::endl;
80+
81+
//---------------------------------------------------------------
82+
// 1. Set a file path to an audio file on your machine
83+
const std::string filePath = std::string (PROJECT_BINARY_DIR) + "/test-audio.wav";
84+
85+
//---------------------------------------------------------------
86+
// 2. Create an AudioFile object and load the audio file
87+
88+
AudioFile<float> a;
89+
bool loadedOK = a.load (filePath);
90+
91+
/** If you hit this assert then the file path above
92+
probably doesn't refer to a valid audio file */
93+
assert (loadedOK);
94+
95+
//---------------------------------------------------------------
96+
// 3. Let's print out some key details
97+
98+
std::cout << "Bit Depth: " << a.getBitDepth() << std::endl;
99+
std::cout << "Sample Rate: " << a.getSampleRate() << std::endl;
100+
std::cout << "Num Channels: " << a.getNumChannels() << std::endl;
101+
std::cout << "Length in Seconds: " << a.getLengthInSeconds() << std::endl;
102+
std::cout << std::endl;
103+
}
104+
105+
//=======================================================================
106+
void loadAudioFileAndProcessSamples()
107+
{
108+
//---------------------------------------------------------------
109+
std::cout << "**********************" << std::endl;
110+
std::cout << "Running Example: Load Audio File and Process Samples" << std::endl;
111+
std::cout << "**********************" << std::endl << std::endl;
112+
113+
//---------------------------------------------------------------
114+
// 1. Set a file path to an audio file on your machine
115+
const std::string inputFilePath = std::string (PROJECT_BINARY_DIR) + "/test-audio.wav";
116+
117+
//---------------------------------------------------------------
118+
// 2. Create an AudioFile object and load the audio file
119+
120+
AudioFile<float> a;
121+
bool loadedOK = a.load (inputFilePath);
122+
123+
/** If you hit this assert then the file path above
124+
probably doesn't refer to a valid audio file */
125+
assert (loadedOK);
126+
127+
//---------------------------------------------------------------
128+
// 3. Let's apply a gain to every audio sample
129+
130+
float gain = 0.5f;
131+
132+
for (int i = 0; i < a.getNumSamplesPerChannel(); i++)
133+
{
134+
for (int channel = 0; channel < a.getNumChannels(); channel++)
135+
{
136+
a.samples[channel][i] = a.samples[channel][i] * gain;
137+
}
138+
}
139+
140+
//---------------------------------------------------------------
141+
// 4. Write audio file to disk
142+
143+
std::string outputFilePath = "quieter-audio-filer.wav"; // change this to somewhere useful for you
144+
a.save (outputFilePath, AudioFileFormat::Aiff);
145+
}
146+
}

tests/AudioFileTests/test-audio/wav_stereo_16bit_44100.wav renamed to examples/test-audio.wav

File renamed without changes.

tests/AiffLoadingTests.cpp

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
#include "doctest.h"
2+
#include <iostream>
3+
#include <vector>
4+
#include <AudioFile.h>
5+
6+
// --------------------------------------------
7+
// Test audio files: 44.1kHz Stereo
8+
#include "test-headers/aiff_stereo_8bit_44100.h"
9+
#include "test-headers/aiff_stereo_16bit_44100.h"
10+
#include "test-headers/aiff_stereo_24bit_44100.h"
11+
#include "test-headers/aiff_stereo_32bit_44100.h"
12+
13+
// --------------------------------------------
14+
// Test audio files: 48kHz Stereo
15+
#include "test-headers/aiff_stereo_8bit_48000.h"
16+
#include "test-headers/aiff_stereo_16bit_48000.h"
17+
#include "test-headers/aiff_stereo_24bit_48000.h"
18+
#include "test-headers/aiff_stereo_32bit_48000.h"
19+
20+
//=============================================================
21+
const std::string projectBuildDirectory = PROJECT_BINARY_DIR;
22+
23+
//=============================================================
24+
TEST_SUITE ("AiffLoadingTests")
25+
{
26+
//=============================================================
27+
TEST_CASE ("AiffLoadingTests_Stereo_8bit_44100")
28+
{
29+
AudioFile<double> audioFile;
30+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_8bit_44100.aif");
31+
32+
CHECK (loadedOK);
33+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_8bit_44100::numSamplesPerChannel);
34+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_8bit_44100::bitDepth);
35+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_8bit_44100::sampleRate);
36+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_8bit_44100::numChannels);
37+
38+
for (size_t i = 0; i < aiff_stereo_8bit_44100::testBuffer[0].size(); i++)
39+
{
40+
for (int k = 0; k < audioFile.getNumChannels(); k++)
41+
{
42+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_8bit_44100::testBuffer[k][i]).epsilon (0.00001));
43+
}
44+
}
45+
}
46+
47+
//=============================================================
48+
TEST_CASE ("AiffLoadingTests_Stereo_16bit_44100")
49+
{
50+
AudioFile<double> audioFile;
51+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_16bit_44100.aif");
52+
53+
CHECK (loadedOK);
54+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_16bit_44100::numSamplesPerChannel);
55+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_16bit_44100::bitDepth);
56+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_16bit_44100::sampleRate);
57+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_16bit_44100::numChannels);
58+
59+
for (size_t i = 0; i < aiff_stereo_16bit_44100::testBuffer[0].size(); i++)
60+
{
61+
for (int k = 0; k < audioFile.getNumChannels(); k++)
62+
{
63+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_16bit_44100::testBuffer[k][i]).epsilon (0.00001));
64+
}
65+
}
66+
}
67+
68+
//=============================================================
69+
TEST_CASE ("AiffLoadingTests_Stereo_24bit_44100")
70+
{
71+
AudioFile<double> audioFile;
72+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_24bit_44100.aif");
73+
74+
CHECK (loadedOK);
75+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_24bit_44100::numSamplesPerChannel);
76+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_24bit_44100::bitDepth);
77+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_24bit_44100::sampleRate);
78+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_24bit_44100::numChannels);
79+
80+
for (size_t i = 0; i < aiff_stereo_24bit_44100::testBuffer[0].size(); i++)
81+
{
82+
for (int k = 0; k < audioFile.getNumChannels(); k++)
83+
{
84+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_24bit_44100::testBuffer[k][i]).epsilon (0.00001));
85+
}
86+
}
87+
}
88+
89+
//=============================================================
90+
TEST_CASE ("AiffLoadingTests_Stereo_32bit_44100")
91+
{
92+
AudioFile<double> audioFile;
93+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_32bit_44100.aif");
94+
95+
CHECK (loadedOK);
96+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_32bit_44100::numSamplesPerChannel);
97+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_32bit_44100::bitDepth);
98+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_32bit_44100::sampleRate);
99+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_32bit_44100::numChannels);
100+
101+
for (size_t i = 0; i < aiff_stereo_32bit_44100::testBuffer[0].size(); i++)
102+
{
103+
for (int k = 0; k < audioFile.getNumChannels(); k++)
104+
{
105+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_32bit_44100::testBuffer[k][i]).epsilon (0.00001));
106+
}
107+
}
108+
}
109+
110+
//=============================================================
111+
TEST_CASE ("AiffLoadingTests_Stereo_8bit_48000")
112+
{
113+
AudioFile<double> audioFile;
114+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_8bit_48000.aif");
115+
116+
CHECK (loadedOK);
117+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_8bit_48000::numSamplesPerChannel);
118+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_8bit_48000::bitDepth);
119+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_8bit_48000::sampleRate);
120+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_8bit_48000::numChannels);
121+
122+
for (size_t i = 0; i < aiff_stereo_8bit_48000::testBuffer[0].size(); i++)
123+
{
124+
for (int k = 0; k < audioFile.getNumChannels(); k++)
125+
{
126+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_8bit_48000::testBuffer[k][i]).epsilon (0.00001));
127+
}
128+
}
129+
}
130+
131+
//=============================================================
132+
TEST_CASE ("AiffLoadingTests_Stereo_16bit_48000")
133+
{
134+
AudioFile<double> audioFile;
135+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_16bit_48000.aif");
136+
137+
CHECK (loadedOK);
138+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_16bit_48000::numSamplesPerChannel);
139+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_16bit_48000::bitDepth);
140+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_16bit_48000::sampleRate);
141+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_16bit_48000::numChannels);
142+
143+
for (size_t i = 0; i < aiff_stereo_16bit_48000::testBuffer[0].size(); i++)
144+
{
145+
for (int k = 0; k < audioFile.getNumChannels(); k++)
146+
{
147+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_16bit_48000::testBuffer[k][i]).epsilon (0.00001));
148+
}
149+
}
150+
}
151+
152+
//=============================================================
153+
TEST_CASE ("AiffLoadingTests_Stereo_24bit_48000")
154+
{
155+
AudioFile<double> audioFile;
156+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_24bit_48000.aif");
157+
158+
CHECK (loadedOK);
159+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_24bit_48000::numSamplesPerChannel);
160+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_24bit_48000::bitDepth);
161+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_24bit_48000::sampleRate);
162+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_24bit_48000::numChannels);
163+
164+
for (size_t i = 0; i < aiff_stereo_24bit_48000::testBuffer[0].size(); i++)
165+
{
166+
for (int k = 0; k < audioFile.getNumChannels(); k++)
167+
{
168+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_24bit_48000::testBuffer[k][i]).epsilon (0.00001));
169+
}
170+
}
171+
}
172+
173+
//=============================================================
174+
TEST_CASE ("AiffLoadingTests_Stereo_32bit_48000")
175+
{
176+
AudioFile<double> audioFile;
177+
bool loadedOK = audioFile.load (projectBuildDirectory + "/test-audio/aiff_stereo_32bit_48000.aif");
178+
179+
CHECK (loadedOK);
180+
CHECK_EQ (audioFile.getNumSamplesPerChannel(), aiff_stereo_32bit_48000::numSamplesPerChannel);
181+
CHECK_EQ (audioFile.getBitDepth(), aiff_stereo_32bit_48000::bitDepth);
182+
CHECK_EQ (audioFile.getSampleRate(), aiff_stereo_32bit_48000::sampleRate);
183+
CHECK_EQ (audioFile.getNumChannels(), aiff_stereo_32bit_48000::numChannels);
184+
185+
for (size_t i = 0; i < aiff_stereo_32bit_48000::testBuffer[0].size(); i++)
186+
{
187+
for (int k = 0; k < audioFile.getNumChannels(); k++)
188+
{
189+
CHECK (audioFile.samples[k][i] == doctest::Approx (aiff_stereo_32bit_48000::testBuffer[k][i]).epsilon (0.00001));
190+
}
191+
}
192+
}
193+
}

0 commit comments

Comments
 (0)