Skip to content

Commit f1da1c3

Browse files
committed
add music support
1 parent 022a1ca commit f1da1c3

15 files changed

Lines changed: 687 additions & 32 deletions

src/AudioDataStream.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#include "stdafx.h"
2+
#include "AudioDataStream.h"
3+
#include "wave_utils.h"
4+
#include "FileSystem.h"
5+
6+
//////////////////////////////////////////////////////////////////////////
7+
8+
const char* AudioFileExtWAVE = ".wav";
9+
10+
//////////////////////////////////////////////////////////////////////////
11+
12+
// wave file stream implementation
13+
14+
class WaveFileStream: public AudioDataStream
15+
{
16+
public:
17+
WaveFileStream()
18+
: mWaveReader(mFileStream)
19+
{
20+
}
21+
bool OpenFileStream(const std::string& fileName)
22+
{
23+
if (!gFiles.OpenBinaryFile(fileName, mFileStream))
24+
return false;
25+
26+
return mWaveReader.parse_audio();
27+
}
28+
29+
int GetChannelsCount() const override { return mWaveReader.mChannelsCount; }
30+
int GetSampleRate() const override { return mWaveReader.mSampleRate; }
31+
int GetSampleBits() const override { return mWaveReader.mSampleBits; }
32+
int GetSamplesCount() const override { return mWaveReader.mSamplesCount; }
33+
34+
int ReadPCMSamples(int samples, void* buffer) override
35+
{
36+
return mWaveReader.read_pcm_samples(samples, buffer);
37+
}
38+
bool SeekPCMFromBeg(int samples) override
39+
{
40+
return mWaveReader.seek_pcm_beg(samples);
41+
}
42+
bool SeekPCMFromEnd(int samples) override
43+
{
44+
return mWaveReader.seek_pcm_end(samples);
45+
}
46+
bool SeekPCMFromCur(int samples) override
47+
{
48+
return mWaveReader.seek_pcm_cur(samples);
49+
}
50+
bool EndOfStream() const override
51+
{
52+
return mWaveReader.end_of_stream();
53+
}
54+
55+
private:
56+
std::ifstream mFileStream;
57+
cxx::wave_reader mWaveReader;
58+
};
59+
60+
//////////////////////////////////////////////////////////////////////////
61+
62+
extern AudioDataStream* OpenAudioFileStream(const char* fileName)
63+
{
64+
std::string fileNameWithExt;
65+
std::string fileExt = cxx::get_file_extension(fileName);
66+
// detect file extension
67+
if (fileExt.empty())
68+
{
69+
static const char* knownAudioExtensions[] =
70+
{
71+
AudioFileExtWAVE
72+
};
73+
74+
for (const char* currExt: knownAudioExtensions)
75+
{
76+
std::string currFileName = cxx::va("%s%s", fileName, currExt);
77+
if (gFiles.IsFileExists(currFileName))
78+
{
79+
fileExt = currExt;
80+
fileNameWithExt = currFileName;
81+
break;
82+
}
83+
}
84+
85+
if (fileExt.empty())
86+
return nullptr;
87+
}
88+
else
89+
{
90+
fileNameWithExt = fileName;
91+
92+
std::transform(fileExt.begin(), fileExt.end(), fileExt.begin(), ::tolower);
93+
}
94+
95+
AudioDataStream* audioDataStream = nullptr;
96+
97+
if (fileExt == AudioFileExtWAVE)
98+
{
99+
WaveFileStream* waveFileStream = new WaveFileStream;
100+
if (!waveFileStream->OpenFileStream(fileNameWithExt))
101+
{
102+
SafeDelete(waveFileStream);
103+
}
104+
audioDataStream = waveFileStream;
105+
}
106+
return audioDataStream;
107+
}
108+

src/AudioDataStream.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
// Interface class of streaming audio data
4+
class AudioDataStream: public cxx::noncopyable
5+
{
6+
public:
7+
virtual ~AudioDataStream()
8+
{
9+
}
10+
11+
// get media format info
12+
virtual int GetChannelsCount() const = 0;
13+
virtual int GetSampleRate() const = 0;
14+
virtual int GetSampleBits() const = 0;
15+
virtual int GetSamplesCount() const = 0;
16+
17+
// reading pcm samples data from stream
18+
virtual int ReadPCMSamples(int samples, void* buffer) = 0;
19+
virtual bool SeekPCMFromBeg(int samples) = 0;
20+
virtual bool SeekPCMFromEnd(int samples) = 0;
21+
virtual bool SeekPCMFromCur(int samples) = 0;
22+
virtual bool EndOfStream() const = 0;
23+
};
24+
25+
// open audio stream
26+
extern AudioDataStream* OpenAudioFileStream(const char* fileName);

src/AudioListener.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ class AudioListener final: public cxx::noncopyable
55
{
66
friend class AudioDevice;
77

8+
public:
9+
// readonly
10+
glm::vec3 mPosition;
11+
812
public:
913
AudioListener()
1014
: mPosition(0.0f, 0.0f, 1.0f)
@@ -20,6 +24,4 @@ class AudioListener final: public cxx::noncopyable
2024
mPosition.x = position.x;
2125
mPosition.y = position.y;
2226
}
23-
private:
24-
glm::vec3 mPosition;
2527
};

0 commit comments

Comments
 (0)